<?xml version="1.0" encoding="UTF-8"?>
<Export generator="Cache" version="25">
<Routine name="PCATUARG001" type="MAC" languagemode="0"><![CDATA[
PCATUARG001	; 10/2012 - REGRAS PARA IMPORTAÇÃO DE PATCH EM CACHÉ 5
	;
	;
	; Importar Patch
	;
ImportarPatch(idPatch,codAtualizacao)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,autor,codTerm,data,flgTag,horolog,repositorioRef,revisao,rotinaVersao,sistema,caminhoPatch,caminhoBackup
	new tabInfoPatch,tipoPatch,versaoAfetada,versaoFontesPatch,versaoLog,versaoOrigemRef,versaoSistemaCliente
	new flgExcluirCod
	;
	set codTerm=$job
	;
	set (codAtualizacao,versaoLog)=""
	;
	lock +^Src2PatchImport:0
	else  quit $$Error^%CSUTICSP(10000,"Importação de patch sendo realizada por outro usuário!")
	;
	set horolog=$horolog
	;
	set sc=##class(Src2.Patch).PrepararImportacaoPatch(codTerm,idPatch,.caminhoPatch,.caminhoBackup,.tabInfoPatch,.versaoSistemaCliente,.flgExcluirCod)
	if ('sc) {
	  kill ^mtempSrc2PatchImport(codTerm)
	  lock -^Src2PatchImport
	  quit sc
	}
	;
	set tipoPatch=$get(tabInfoPatch("tipo"))
	set sistema=$get(tabInfoPatch("sistema"))
	set versaoOrigemRef=$get(tabInfoPatch("versaoOrigemRef"))
	set versaoFontesPatch=$get(tabInfoPatch("versaoFontesPatch"))
	set versaoAfetada=$get(tabInfoPatch("versaoAfetada"))
	set repositorioRef=$get(tabInfoPatch("repositorioRef"))
	set rotinaVersao=$get(tabInfoPatch("rotinaVersao"))
	set revisao=$get(tabInfoPatch("revisao"))
	set autor=$get(tabInfoPatch("autor"))
	set data=$get(tabInfoPatch("data"))
	set flgTag=$get(tabInfoPatch("flgTag"))
	;
	set codAtualizacao=$order(^%CSW1ATULOG(1,""),-1) + 1
	;
	set $piece(^%CSW1ATULOG(1,codAtualizacao),z,1)=horolog
	set $piece(^%CSW1ATULOG(1,codAtualizacao),z,3)=tipoPatch
	set $piece(^%CSW1ATULOG(1,codAtualizacao),z,4)=sistema
	set $piece(^%CSW1ATULOG(1,codAtualizacao),z,5)=versaoSistemaCliente
	set $piece(^%CSW1ATULOG(1,codAtualizacao),z,6)=versaoFontesPatch
	set $piece(^%CSW1ATULOG(1,codAtualizacao),z,7)=idPatch
	set $piece(^%CSW1ATULOG(1,codAtualizacao),z,8)=versaoAfetada
	set $piece(^%CSW1ATULOG(1,codAtualizacao),z,9)=##class(Src2.Patch).ObterVersaoPatchSrc()
	set $piece(^%CSW1ATULOG(1,codAtualizacao),z,10)=revisao
	;
	set ^%CSW1ATULOG(2,+horolog,codAtualizacao)=""
	;
	set versaoLog=versaoFontesPatch
	if (flgTag)&((tipoPatch=4)!(tipoPatch=5)) {
	  set versaoLog=versaoAfetada
	}
	;
	if (tipoPatch=1) {
	  set sc=##class(Src2.PatchUtils2).EliminarVersoesLog(codTerm,sistema,versaoOrigemRef,versaoFontesPatch)
	}
	;
	set sc=$$ImportarRotinasClasses(codTerm,codAtualizacao,sistema,flgExcluirCod,tipoPatch,versaoLog,revisao,caminhoBackup)
	;
	if (tipoPatch=1) {
	  set sc=##class(Src2.PatchUtils).AlterarVersaoSistema(sistema,versaoFontesPatch,codAtualizacao)
	  set sc=$$GerarRotinaVersao(sistema,rotinaVersao,versaoFontesPatch,revisao,autor,data,repositorioRef)
	}
	;
	if (tipoPatch=5),(revisao>$piece(^%CSW1ATUCONF(3,sistema),z,2)) {
	  set $piece(^%CSW1ATUCONF(3,sistema),z,2)=revisao
	}
	;
	set $piece(^%CSW1ATULOG(1,codAtualizacao),z,2)=$horolog
	;
	kill ^mtempSrc2PatchImport(codTerm)
	;
	lock -^Src2PatchImport
	;
	quit 1
	;
	; Importar Rotinas/Classes
	;
ImportarRotinasClasses(codTerm,codAtualizacao,sistema,flgExcluirCod,tipo,versaoLog,revisao,caminhoBackup)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,flag,namespace,namespaceOrigem
	;
	set namespaceOrigem=$znspace
	;
	set namespace=""
	for {
	  set namespace=$order(^%CSW1ATUCONF(3,sistema,1,namespace))
	  if (namespace="") quit
	  znspace namespace
	  set sc=$$BackupRotinasClasses(codTerm,caminhoBackup,namespace)
	}
	;
	set namespace=""
	for {
	  set namespace=$order(^%CSW1ATUCONF(3,sistema,1,namespace))
	  if (namespace="") quit
	  znspace namespace
	  set sc=$$ExcluirRotinasClasses(codTerm,codAtualizacao,sistema,tipo,versaoLog,revisao,namespace)
	}
	;
	set namespace=""
	for {
	  set namespace=$order(^%CSW1ATUCONF(3,sistema,1,namespace))
	  if (namespace="") quit
	  znspace namespace
	  set sc=$$ImportarClasses(codTerm,codAtualizacao,sistema,tipo,versaoLog,revisao,namespace)
	}
	;
	set namespace=""
	for {
	  set namespace=$order(^%CSW1ATUCONF(3,sistema,1,namespace))
	  if (namespace="") quit
	  znspace namespace
	  set sc=$$ImportarRotinas(codTerm,codAtualizacao,sistema,tipo,versaoLog,revisao,namespace)
	}
	;
	set namespace=""
	for {
	  set namespace=$order(^%CSW1ATUCONF(3,sistema,1,namespace))
	  if (namespace="") quit
	  znspace namespace
	  set sc=$$GerarPaginasCSPRotinas(codTerm,codAtualizacao,namespace)
	}
	;
	if (flgExcluirCod) {
	  set namespace=""
	  for {
	    set namespace=$order(^%CSW1ATUCONF(3,sistema,1,namespace))
	    if (namespace="") quit
	    znspace namespace
	    set sc=$$ExcluirFontesRotinas(codTerm,codAtualizacao,namespace,flgExcluirCod)
	  }
	}
	;
	znspace namespaceOrigem
	;
	quit 1
	;
	; Gerar Paginas CSP Rotinas
	;
GerarPaginasCSPRotinas(codTerm,codAtualizacao,namespace)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,flgValidarRetErro,msgsc,rotina,tabErros
	;
	set flgValidarRetErro=$$ValidarTesteErroCsp()
	;
	set rotina=""
	for {
	set rotina=$order(^mtempSrc2PatchImport(codTerm,"rotinas",namespace,4,rotina))
	if (rotina="") quit
	  ;
	  if ($data(^mtempSrc2PatchImport(codTerm,"rotinasBloquedas",rotina))) {
	    continue
	  }
	  ;
	  set msgsc=$$GerarPaginaCSP(rotina,.tabErros,,flgValidarRetErro)
	  if (msgsc'=1) {
	    set sc=$$GerarLogErro(codAtualizacao,1,"Geração da página csp da rotina "_rotina,.tabErros)
	    continue
	  }
	  ;
	  set sc=$$GerarLogOK(codAtualizacao,1,"Geração da página csp da rotina "_rotina)
	}
	;
	quit 1
	;
	; Gerar a Pagina CSP de uma Rotina
	;
GerarPaginaCSP(rotina,tabErrosCsp,displayLog,flgValidarRetErro)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,InternalName,flgErroCSP
	;
	if $get(displayLog)="" set displayLog=0
	if $get(flgValidarRetErro)="" set flgValidarRetErro=1
	;
	kill tabErrosCsp
	set flgErroCSP=""
	;
	set InternalName=rotina_".mac"
	;
	if (flgValidarRetErro) {
	  set sc=$$GerarCSP^%CSW1(InternalName,displayLog,,.tabErrosCsp,,,,,.flgErroCSP)
	} else {
	  set sc=$$GerarCSP^%CSW1(InternalName,displayLog,,.tabErrosCsp)
	}
	;
	zkill ^%CSW1CSPGEN(InternalName)
	if (+sc) set ^%CSW1CSPGEN($piece(InternalName,".",1))=""
	;
	if (flgErroCSP) quit "Erro ao gerar a página csp da rotina "_rotina
	;
	quit 1
	;
	; Gerar Log de OK
	;
GerarLogOK(codAtualizacao,origem,mensagem,tabDetalhes)	;
	set tabDetalhes=$get(tabDetalhes)
	quit $$GerarLog(codAtualizacao,origem,1,mensagem,.tabDetalhes)
	;
	; Gerar Log de Erro
	;
GerarLogErro(codAtualizacao,origem,mensagem,tabDetalhes)	;
	set tabDetalhes=$get(tabDetalhes)
	quit $$GerarLog(codAtualizacao,origem,2,mensagem,.tabDetalhes)
	;
	; Gerar Log de Aviso
	;
GerarLogAviso(codAtualizacao,origem,mensagem,tabDetalhes)	;
	set tabDetalhes=$get(tabDetalhes)
	quit $$GerarLog(codAtualizacao,origem,3,mensagem,.tabDetalhes)
	;
	; Gerar Log de Erro
	;
	; origem = 1 - Rotinas
	;          2 - Classes
	;          3 - Ajuda
	;          4 - Relatórios
	;          5 - Utilitários
	;          6 - Procedimento
	;          7 - Páginas/Objetos da Aplicação CSP
GerarLog(codAtualizacao,origem,tipo,mensagem,tabDetalhes)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,codSeq
	;
	set tabDetalhes=$get(tabDetalhes)
	;
	set codSeq=$order(^%CSW1ATULOG(1,codAtualizacao,1,tipo,""),-1)+1
	;
	set ^%CSW1ATULOG(1,codAtualizacao,1,tipo,codSeq)=origem_z_$znspace
	set ^%CSW1ATULOG(1,codAtualizacao,1,tipo,codSeq,1)=mensagem
	;
	if (tabDetalhes'=""),($order(tabDetalhes(""))="") {
	  set tabDetalhes(1)=tabDetalhes
	}
	;
	if ($order(tabDetalhes(""))'="") {
	  zkill tabDetalhes
	  merge ^%CSW1ATULOG(1,codAtualizacao,1,tipo,codSeq,2)=tabDetalhes
	}
	;
	quit 1
	;
	; Excluir Fontes das Rotinas
	;
ExcluirFontesRotinas(codTerm,codAtualizacao,namespace,flag)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,msgsc,rotina
	;
	if $get(flag)="" set flag=0
	;
	set rotina=""
	for {
	  set rotina=$order(^mtempSrc2PatchImport(codTerm,"rotinas",namespace,1,rotina))
	  if (rotina="") quit
	  ;
	  if ($data(^mtempSrc2PatchImport(codTerm,"rotinasBloquedas",rotina))) {
	    continue
	  }
	  ;
	  set msgsc=$$ExcluirRotina(rotina,,,flag)
	}
	;
	quit 1
	;
	; Exclui uma Rotina
	; flag = 0 - Mata (MAC / INT / OBJ) - Opção Padrão
	;        1 - Mata (MAC)
	;        2 - Mata (MAC / INT)
ExcluirRotina(rotina,tabErros,flgLog,flag)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc
	;
	if $get(flgLog)="" set flgLog=0
	;
	if $get(flag)="" set flag=0
	;
	kill tabErros
	;
	set sc=##class(%Library.Routine).Delete(rotina_".MAC",flag)
	if (sc'=1) {
	  quit "Erro ao excluir a rotina "_rotina
	}
	;
	quit 1
	;
	; Importa Rotinas do Patch
	;
ImportarRotinas(codTerm,codAtualizacao,sistema,tipo,versaoLog,revisao,namespace)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,arquivo,msgsc,rotina,tabErros,tabOK,tabTemp
	;
	set rotina=""
	for {
	  set rotina=$order(^mtempSrc2PatchImport(codTerm,"rotinas",namespace,1,rotina))
	  if (rotina="") quit
	  set arquivo=$piece($get(^mtempSrc2PatchImport(codTerm,"rotinas",namespace,1,rotina)),z,1)
	  ;
	  set msgsc=$$GerarLogAtualizacaoItem(codAtualizacao,tipo,sistema,1,rotina,versaoLog,revisao)
	  if (msgsc'=1) {
	    set msgsc=$$GerarLogAviso(codAtualizacao,2,msgsc)
	    set ^mtempSrc2PatchImport(codTerm,"rotinasBloquedas",rotina)=""
	    continue
	  }
	  ;
	  set msgsc=$$GerarRotinaArquivo(arquivo,rotina,,.tabErros,.tabOK)
	  if (msgsc'=1)&('$data(tabErros)) {
	    set sc=$$GerarLogErro(codAtualizacao,1,"Importação da rotina "_rotina,msgsc)
	    continue
	  }
	  if ($data(tabErros(2))) {
	    kill tabTemp
	    merge tabTemp=tabErros(2)
	    set sc=$$GerarLogErro(codAtualizacao,1,"Compilação da rotina "_rotina,.tabTemp)
	    continue
	  }
	  ;
	  set sc=$$GerarLogOK(codAtualizacao,1,"Importação da rotina "_rotina)
	}
	;
	quit 1
	;
	; Gerar Log de Atualizacao do Item
	;
GerarLogAtualizacaoItem(codAtualizacao,tipoPatch,sistema,tipoItem,item,versao,revisao)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc
	;
	set sc=$$ValidarAtualizacaoItem(codAtualizacao,tipoPatch,sistema,tipoItem,item,versao,revisao)
	if (sc'=1) quit sc
	;
	kill ^%CSW1ATUCONF(6,sistema,tipoItem,item)
	;
	if (tipoPatch=1)!(tipoPatch=2) quit 1
	;
	set ^%CSW1ATUCONF(6,sistema,tipoItem,item)=versao_z_revisao_z_codAtualizacao_z_tipoPatch_z_$horolog
	;
	quit 1
	;
	; Validar Atualização do Item
	;
ValidarAtualizacaoItem(codAtualizacao,tipoPatch,sistema,tipoItem,item,versao,revisao)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,dsTipo,identificador,identificadorLog,revisaoLog,var,versaoLog
	;
	if (tipoPatch=2)!(tipoPatch=3) quit 1
	;
	if '$data(^%CSW1ATUCONF(6,sistema,tipoItem,item)) quit 1
	;
	set var=$get(^%CSW1ATUCONF(6,sistema,tipoItem,item))
	;
	set versaoLog=$piece(var,z,1)
	set revisaoLog=$piece(var,z,2)
	;
	set sc=$$ObterVersao(versao,,,,,,.identificador)
	;
	set sc=$$ObterVersao(versaoLog,,,,,,.identificadorLog)
	;
	if (identificador>identificadorLog) quit 1
	;
	if (tipoItem=1) set dsTipo="Rotina"
	else  set dsTipo="Classe"
	;
	if (identificador<identificadorLog) quit dsTipo_" "_item_" atualizada por versão futura! (Release: "_versaoLog_")"
	;
	if (revisao<revisaoLog) quit dsTipo_" "_item_" atualizada por versão futura! (Release: "_versaoLog_" Revisão: "_revisaoLog_")"
	;
	quit 1
	;
	; Cria uma Rotina a Partir de um Arquivo
	;   strOpcoes = csp       - Gera página CSP
	;               todo      - Validar TODOs nas rotinas
	;               workspace - Atualizar Workspace
	;   
	;   tabErros = Em fixas conforme lista abaixo
	;              1 - Outros erros
	;              2 - Erro de compilação da rotina
	;              3 - Erro na geração da página csp
	;              4 - TODOs pendentes de implementação
	;   
	;   tabOK = 1 - Importou
	;           2 - Compilou
	;           3 - Gerou CSP
	;           4 - Sem TODOs
GerarRotinaArquivo(arquivoRotina,rotina,strOpcoes,tabErros,tabOK,tabRotina,flgSubversion,username,password,flgLog)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,msgError,msgsc,nrLinhas,objRotina,tabErros2,linha
	;
	set arquivoRotina=$get(arquivoRotina)
	;
	set strOpcoes=$get(strOpcoes)
	;
	set username=$get(username)
	;
	set password=$get(password)
	;
	if $get(tabErros)="" set tabErros=0
	;
	if $get(tabOK)="" set tabOK=0
	;
	if $get(flgSubversion)="" set flgSubversion=0
	;
	if $get(flgLog)="" set flgLog=0
	;
	kill tabErros,tabOK
	;
	if (arquivoRotina'="") {
	  set msgsc=$$ObterTabRotinaArquivo(rotina,arquivoRotina,.tabRotina)
	  if ('msgsc) { quit msgsc }
	}
	;
	if ('$data(tabRotina)) {
	  quit "Dados para geração da rotina "_rotina_" não encontrados"
	}
	;
	set objRotina=##class(%Library.Routine).%New(rotina_".MAC")
	;
	set nrLinhas=$order(tabRotina(""),-1)
	;
	for linha=1:1:(nrLinhas-1) {
	  do objRotina.WriteLine($get(tabRotina(linha)))
	}
	do objRotina.Write($get(tabRotina(nrLinhas)))
	;
	do objRotina.Save()
	;
	set tabOK(1)=""
	;
	set sc=objRotina.Compile("k-d")
	;
	set msgError=1
	;
	set objRotina=""
	;
	if (sc'=1) {
	  set sc=$$ObterTabErrosCompilacaoRotina(sc,.tabErros2)
	  set msgError="Erro ao compilar a rotina "_rotina
	  merge tabErros(2)=tabErros2
	} else {
	  set tabOK(2)=""
	}
	;
	if (msgError'=1) {
	  quit msgError
	}
	;
	quit 1
	;
	; Valida a Existencia do Parametro de Erro do Gerador CSP
	;
ValidarTesteErroCsp()	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,flgErroCSP
	set $ztrap="ValidarTesteErroCspErro"
	set sc=$$GerarCSP^%CSW1("XXTESTE",0,,,,,,,.flgErroCSP)
	set $ztrap=""
	quit 1
ValidarTesteErroCspErro	;
	set $ztrap=""
	quit 0
	;
	; Obter Tabela de Erros da Compilacao de uma Rotina
	;
ObterTabErrosCompilacaoRotina(string,tabErros)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,cont,erro,msgErro,quebra
	;
	kill tabErros
	;
	do $system.Status.DecomposeStatus(string,.erro)
	;
	set quebra=$char(13)_$char(10)_$char(32)
	;
	set msgErro=$get(erro(1,"param",2))
	;
	set $extract(msgErro,1,2)=""
	;
	for cont=1:1:$length(msgErro,quebra) {
	  set tabErros($order(tabErros(""),-1)+1)=$piece(msgErro,quebra,cont)
	}
	;
	quit 1
	;
	; Obtem uma Tabela com o Fonte de uma Rotina a Partir de um Arquivo
	;
ObterTabRotinaArquivo(rotina,arquivoRotina,tabRotina)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,file,linhaFile,nrLinhas,tam
	;
	kill tabRotina
	;
	if ('##class(%Library.File).Exists(arquivoRotina)) {
	  quit "Arquivo '"_arquivoRotina_"' para importação da rotina "_rotina_" não encontrado"
	}
	;
	set file=##class(%Library.File).%New(arquivoRotina)
	do file.Open("R")
	;
	set nrLinhas=0
	;
	for {
	  set tam=32000
	  set linhaFile=file.Read(.tam)
	  if (tam=-1) quit
	  set nrLinhas=nrLinhas + 1
	  set tabRotina(nrLinhas)=$zconvert(linhaFile,"I","UTF8")
	}
	;
	do file.Close()
	set file=""
	;
	if ('$data(tabRotina)) quit "Arquivo '"_arquivoRotina_"' para importação da rotina "_rotina_" sem dados"
	;
	quit 1
	;
	; Obter Versao/Release
	;
ObterVersao(versaoInf,versao,versaoRelease,versaoRelease2,beta,release,identificador,flgBeta)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc
	set flgBeta=0
	set (beta,release)=""
	set versao=$piece(versaoInf,".",1,2)
	set release=$piece(versaoInf,".",3)
	set (versaoRelease,versaoRelease2)=$piece(versaoInf,".",1,3)
	if ($piece(versaoInf,".",3)["b") {
	  set beta=$piece($piece(versaoInf,".",3),"b",2)
	  set release=$piece($piece(versaoInf,".",3),"b",1)
	  set $piece(versaoRelease2,".",3)=release
	  set flgBeta=1
	}
	set identificador=$translate($justify($piece(versao,".",1),3)," ","0")
	set identificador=identificador_$translate($justify($piece(versao,".",2),3)," ","0")
	set identificador=identificador_$translate($justify(+release,6)," ","0")
	set identificador=identificador_$translate($justify($select(beta="":999,1:beta),3)," ","0")
	quit 1
	;
	; Importa Classes do Patch
	;
ImportarClasses(codTerm,codAtualizacao,sistema,tipo,versaoLog,revisao,namespace)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,arquivo,classe,errorLog,lin,msgsc,tabClasses,tabErros,tabTemp,flagCompClasses,tabOK,flgEstEsn
	;
	set flagCompClasses="-d"
	;
	set flgEstEsn=""
	;
	set classe=""
	for {
	  set classe=$order(^mtempSrc2PatchImport(codTerm,"classes",namespace,1,classe))
	  if (classe="") quit
	  set arquivo=$piece($get(^mtempSrc2PatchImport(codTerm,"classes",namespace,1,classe)),z,1)
	  set msgsc=$$GerarLogAtualizacaoItem(codAtualizacao,tipo,sistema,2,classe,versaoLog,revisao)
	  if (msgsc'=1) {
	    set msgsc=$$GerarLogAviso(codAtualizacao,2,msgsc)
	    continue
	  }
	  ;
	  set msgsc=$$GerarClasseArquivo(arquivo,classe,flagCompClasses,.tabErros,.tabOK)
	  if (msgsc'=1)&('$data(tabErros)) {
	    set sc=$$GerarLogErro(codAtualizacao,2,"Importação da classe "_classe,msgsc)
	    continue
	  }
	  if ($data(tabErros(1))) {
	     kill tabTemp
	    merge tabTemp=tabErros(1)
	    if ('$data(tabTemp(2))),($get(tabTemp(1))["Unknown tag found during import of class, ignoring item: <Inheritance>") {
	      continue
	    }
	    set sc=$$GerarLogErro(codAtualizacao,2,"Importação da classe "_classe,.tabTemp)
	    continue
	  }
	  ;	
	  set sc=$$GerarLogOK(codAtualizacao,2,"Importação da classe "_classe)
	  set tabClasses(classe_".cls")=""
	  if ($extract(classe,1,7) = "Est.Esn") set flgEstEsn=1
	}
	;
	if ('$data(tabClasses)) quit 1
	;
	set flagCompClasses="cor1-dlf"
	;
	do $system.OBJ.CompileList(.tabClasses,flagCompClasses,.errorLog)
	;
	if ($order(errorLog(""))'="") {
	  set lin=""
	  for {
	    set lin=$order(errorLog(lin))
	    if (lin="") quit
	   set tabTemp(lin)=$piece($get(errorLog(lin)),$char(13)_$char(10)_$char(32),1)
	  }
	  set sc=$$GerarLogErro(codAtualizacao,2,"Compilação de classes",.tabTemp)
	} else {
	  set sc=$$GerarLogOK(codAtualizacao,2,"Compilação de classes")
	}
	;
	; Implementação para tratar bug de compilação no caché 5
	if (flgEstEsn) {
	  do $SYSTEM.OBJ.CompilePackage("Est.Esn","bkf1")
	  set sc=$$GerarLogOK(codAtualizacao,2,"Compilação de classes por package (Est.Esn)")
	}
	;
	quit 1
	;
	; Backup das Rotinas e Classes
	;
BackupRotinasClasses(codTerm,caminhoBackup,namespace)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,horolog,tabItens
	;
	set sc=##class(%Library.File).CreateDirectoryChain(caminhoBackup)
	;
	set horolog=$horolog
	;
	merge tabItens=^mtempSrc2PatchImport(codTerm,"classes",namespace,3)
	;
	set sc=$system.OBJ.Export(.tabItens,caminhoBackup_$translate($zdatetime(horolog,3),": ","--")_"-"_namespace_"-CLASSES.xml","-d")
	;
	kill tabItens
	merge tabItens=^mtempSrc2PatchImport(codTerm,"rotinas",namespace,3)
	;
	set sc=$system.OBJ.Export(.tabItens,caminhoBackup_$translate($zdatetime(horolog,3),": ","--")_"-"_namespace_"-ROTINAS.xml","-d")
	;
	quit 1
	;
	; Exclui Rotinas e Classes
	;
ExcluirRotinasClasses(codTerm,codAtualizacao,sistema,tipo,versaoLog,revisao,namespace)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,classe,msgsc,rotina
	;
	set classe=""
	for {
	  set classe=$order(^mtempSrc2PatchImport(codTerm,"classes",namespace,2,classe))
	  if (classe="") quit
	  ;
	  set msgsc=$$GerarLogAtualizacaoItem(codAtualizacao,tipo,sistema,2,classe,versaoLog,revisao)
	  if (msgsc'=1) {
	  set msgsc=$$GerarLogAviso(codAtualizacao,2,msgsc)
	  continue
	  }
	  ;
	  set msgsc=$$ExcluirClasse(classe)
	  if (msgsc'=1) {
	    set sc=$$GerarLogErro(codAtualizacao,2,"Exclusão da classe "_classe)
	  }
	  ;
	  set sc=$$GerarLogOK(codAtualizacao,2,"Exclusão da classe "_classe)
	}
	;
	set rotina=""
	for {
	  set rotina=$order(^mtempSrc2PatchImport(codTerm,"rotinas",namespace,2,rotina))
	  if (rotina="") quit
	  ;
	  set msgsc=$$GerarLogAtualizacaoItem(codAtualizacao,tipo,sistema,1,rotina,versaoLog,revisao)
	  if (msgsc'=1) {
	    set msgsc=$$GerarLogAviso(codAtualizacao,2,msgsc)
	    continue
	  }
	  ;
	  set msgsc=$$ExcluirRotina(rotina)
	  if (msgsc'=1) {
	    set sc=$$GerarLogErro(codAtualizacao,1,"Exclusão da rotina "_rotina)
	  }
	  ;
	  set sc=$$GerarLogOK(codAtualizacao,1,"Exclusão da rotina "_rotina)
	}
	;
	quit 1
	;
	; Exclui uma Classe
	;
ExcluirClasse(classe)	;
	;
	do $SYSTEM.OBJ.Delete(classe,"-d")
	;
	quit 1
	;
	; Cria uma Classe a Partir de um Arquivo
	; 
	;   tabErros = Em fixas conforme lista abaixo
	;              1 - Outros erros
	;              2 - Erro de compilação da classe
	;   
	;   tabOK = 1 - Importou
	;           2 - Compilou
GerarClasseArquivo(arquivoClasse,classe,flagComp,tabErros,tabOK,flgLog)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,errorlog,lin
	;
	set flagComp=$get(flagComp)
	;
	if $get(flgLog)="" set flgLog=0
	;
	kill tabErros,tabOK
	;
	if ('##class(%Library.File).Exists(arquivoClasse)) {
	  quit "Arquivo '"_arquivoClasse_"' para importação da classe "_classe_" não encontrado"
	}
	;
	if (flagComp="") {
	  set flagComp="-d"
	}
	;
	set tabOK(1)=""
	;
	set sc=$System.OBJ.Load(arquivoClasse,flagComp,.errorlog)
	if (sc=1) {
	  set tabOK(2)=""
	  quit 1
	}
	;
	set lin=""
	for {
	  set lin=$order(errorlog(lin))
	  if (lin="") quit
	  set tabErros(1,lin)=$piece($get(errorlog(lin)),$char(13)_$char(10)_$char(32),1)
	}
	;
	quit "Erro ao compilar a classe "_classe
	;
	; Gerar Rotina de Versao
	;
GerarRotinaVersao(sistema,rotina,versao,revisao,autor,data,urlRepositorio)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,namespace,namespaceOrigem
	;
	set namespaceOrigem=$znspace
	;
	if (rotina="") quit 1
	;
	set namespace=""
	for {
	  set namespace=$order(^%CSW1ATUCONF(3,sistema,1,namespace))
	  if (namespace="") quit
	  ;
	  set sc=##class(Src2.PatchUtils).ValidarSelecaoNamespace(sistema,namespace,1,rotina)
	  if (sc'=1) continue
	  ;
	  znspace namespace
	  ;
	  set sc=##class(Src2.Utilitarios).GerarRotinaZZZ(rotina,versao,revisao,autor,data,urlRepositorio)
	}
	;
	znspace namespaceOrigem
	;
	quit 1
	;
	; csw:csp:naogerar
]]></Routine>


<Routine name="PCATUARG002" type="MAC" languagemode="0"><![CDATA[
PCATUARG002	; 14/2014 - REGRAS DO CONTROLE DE FONTES - FONTES QUE NÃO FUNCIONAM EM CLASSE
	;
	; Obter Tabela da Chave
	; 
	; OBS: Não trata chaves de string com aspas dentro, somente com virgulas
	;
	; set sc=$$ObterTabChave^PCATUARG002("^TESTEIMP",.tabChave,.nrNiveis)
	; set sc=$$ObterTabChave^PCATUARG002("^TESTEIMP(1)",.tabChave,.nrNiveis)
	; set sc=$$ObterTabChave^PCATUARG002("^TESTEIMP(1,""CO"",23,""TESTE,TESTE"")",.tabChave,.nrNiveis)
ObterTabChave(chave,tabChave,nrNiveis)	;
	new var,nivel,tab
	;
	kill tabChave
	set nrNiveis=0
	;
	set chave=$piece(chave,"(",2,$length(chave,"("))
	;
	set chave=$piece(chave,")",1,$length(chave,")")-1)
	;
	if chave="" quit 1
	;
	set @("tab("_chave_")=""""")
	;
	set var=$query(tab(""))
	;
	set nrNiveis=$qlength(var)
	;
	for nivel=1:1:$qlength(var) do
	. set tabChave(nivel)=$qsubscript(var,nivel)
	;
	quit 1
	;
	; Obter Dados
	;
	; set sc=$$ObterDados^PCATUARG002(1,"60001^70000^0^60022^79",.tabXecuteDados,"WI",80,.dados)
ObterDados(nivel,string,tabXecuteDados,codConta,codEmpresa,dados)	;
	new Z,z,Y,y,V,v set Z="^",z="^",Y=";",y=";",V=",",v=","
	new sc,codSeq,var
	;
	;set tabXecuteDados(1,1)=1
	;set tabXecuteDados(1,2)="set $piece(dados,"^",15)=codConta,$piece(dados,"^",40)=codEmpresa"
	;
	set dados=string
	;
	set codSeq=""
	for  set codSeq=$order(tabXecuteDados(codSeq)) quit:codSeq=""  do
	. set var=$get(tabXecuteDados(codSeq,1))
	. ;
	. if nivel'=$piece(var,"^",1) quit
	. ;
	. xecute $get(tabXecuteDados(codSeq,2))
	;
	set dados=""""_dados_""""
	;
	quit 1
	;
	; Validar Chave
	;
ValidarChave(chave)	;
	new codAtualizacao,chaveAtu
	;
	if $get(chave)="" quit $$Error^%CSUTICSP(10000,"Chave inválida!")
	;
	set codAtualizacao=$order(^%CSW1ATULOG(1,""),-1)
	;
	if codAtualizacao="" quit $$Error^%CSUTICSP(10000,"Chave inválida!")
	;
	if $piece($get(^%CSW1ATULOG(1,codAtualizacao)),"^",2)'="" quit $$Error^%CSUTICSP(10000,"Chave inválida!")
	;
	set chaveAtu=$extract($system.Encryption.AESBase64Encode($translate($piece($get(^%CSW1ATULOG(1,codAtualizacao)),"^",1),",.",""),"CHAVE"),1,20)
	;
	if chave'=chaveAtu quit $$Error^%CSUTICSP(10000,"Chave inválida!")
	;
	quit 1
	;
	;
	; Gera a Chave de Acesso do Menu
	;
ObterNovaChave()	;
	new codAtualizacao
	;
	set codAtualizacao=$order(^%CSW1ATULOG(1,""),-1)
	;
	if codAtualizacao="" quit ""
	;
	if $piece($get(^%CSW1ATULOG(1,codAtualizacao)),"^",2)'="" quit ""
	;
	quit $extract($system.Encryption.AESBase64Encode($translate($piece($get(^%CSW1ATULOG(1,codAtualizacao)),"^",1),",.",""),"CHAVE"),1,20)
	;
	; Grava a Chave de Acesso ao Menu
	;
GravarChave(produto,chave)	;
	new produtoCrypt
	;
	if $get(chave)="" quit 0
	;
	; ATENÇÃO: NUNCA DOCUMENTAR A GLOBAL ^%CSWCAPM - SECRETA
	;          CONTROLE DE AUTENTICAÇÃO DOS PROGRAMAS DO MENU
	;
	set produtoCrypt=$system.Encryption.AESCBCEncrypt(produto,"PRODUTO")
	;
	; Backup da Chave Atual (para validação durante a atualização)
	if $data(^%CSWCAPM(1,produtoCrypt,1)) set ^%CSWCAPM(1,produtoCrypt,2)=$get(^%CSWCAPM(1,produtoCrypt,1))
	;
	; Nova Chave
	set ^%CSWCAPM(1,produtoCrypt,1)=$system.Encryption.AESCBCEncrypt(chave,"CHAVE")
	;
	quit 1
	;
	; Exclui a Chave 2 de Acesso do Menu
	;
ExcluirChave(produto)	;
	new produtoCrypt
	;
	set produtoCrypt=$system.Encryption.AESCBCEncrypt(produto,"PRODUTO")
	;
	; Exclui a Chave Antiga
	set ^%CSWCAPM(1,produtoCrypt,2)=""
	;
	quit 1
	;
	; Obter Nome do Programa Criptografado
	;
ObterProgramaEncrypt(programa,chave)	;
	quit $system.Encryption.AESCBCEncrypt(programa,"PROGRAMA")
	;
	; Obter Senha de Atenticação do Programa
	;
ObterAutenticacaoPrograma(programa,chave)	;
	if $get(chave)="" quit ""
	quit $system.Encryption.AESCBCEncrypt(programa,$translate(chave,"0192837465","6574839201"))
	;
	; Gravar Atencicacao do Programa
	;
GravarAtenticacaoPrograma(programa,chave)	;
	new sc,programaEcrypt
	;
	set programaEcrypt=$$ObterProgramaEncrypt^PCATUARG002(programa)
	;
	set sc=$$ValidarChave(chave)
	if sc'=1 do  quit sc
	. kill ^%CSWCAPM(2,programaEcrypt)
	;
	; ATENÇÃO: NUNCA DOCUMENTAR A GLOBAL ^%CSWCAPM - SECRETA
	;          CONTROLE DE AUTENTICAÇÃO DOS PROGRAMAS DO MENU
	set ^%CSWCAPM(2,programaEcrypt)=$$ObterAutenticacaoPrograma^PCATUARG002(programa,chave)
	;
	quit 1
	;
	; Autenticar Programa
	;
	; set sc=$$AutenticarPrograma^PCATUARG002("CCCC130")
AutenticarPrograma(programa)	;
	new chave,codSeq,flgAutenticado,programaEcrypt,senha
	;
	if '$data(^%CSWCAPM)!($extract($znspace,1,6)="DESENV") quit 1
	;
	set programaEcrypt=$$ObterProgramaEncrypt^PCATUARG002(programa)
	;
	set flgAutenticado=0
	;
	set senha=$get(^%CSWCAPM(2,programaEcrypt))
	;
	if senha="" quit $$Error^%CSUTICSP(10000,"Programa inválido no menu!")
	;
	set codSeq=""
	for  {
	  set codSeq=$order(^%CSWCAPM(1,codSeq))
	  if codSeq="" quit
	  ;
	  if ($get(^%CSWCAPM(1,codSeq,1))'="") {
	    try {
	      set chave=$system.Encryption.AESCBCDecrypt($get(^%CSWCAPM(1,codSeq,1)),"CHAVE")
	      if $$ObterAutenticacaoPrograma^PCATUARG002(programa,chave)=senha set flgAutenticado=1
	    } catch { }
	  }
	  ;
	  if flgAutenticado quit
	  ;
	  if ($get(^%CSWCAPM(1,codSeq,2))'="") {
	    try {
	      set chave=$system.Encryption.AESCBCDecrypt($get(^%CSWCAPM(1,codSeq,2)),"CHAVE")
	      if $$ObterAutenticacaoPrograma^PCATUARG002(programa,chave)=senha set flgAutenticado=1
	    } catch { }
	  }
	  ;
	  if flgAutenticado quit
	}
	;
	if flgAutenticado quit 1
	;
	quit $$Error^%CSUTICSP(10000,"Programa inválido no menu!")
	;
	; Finaliza a Atualizacao
	;
FinalizarAtualizacao(codAtualizacao)	;
	;
	; Exclui Global de Menu de Piratas
	kill ^EgdUTI
	;
	quit 1
	;
	; csw:csp:naogerar
]]></Routine>


<Class name="Src2.Classe">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>62402,71835.577655</TimeCreated>

<Method name="ObterClassesSistema">
<Description>

Obter Classes do Sistema

set sc = ##class(Src2.Classe).ObterClassesSistema("csw", .tabItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,&tabItens:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.UtilsXml).ObterSistemasXML(.tabSistemas)
 
 set expressao = ""
 for {
   set expressao = $order(tabSistemas(sistema,2,expressao))
   if (expressao = "") quit
   
   set sc = ##class(Src2.Classe).ValidarClasse(expressao_"*.cls", .expressaoEdt, .qtdItens, .tabItens2)
   
   merge tabItens = tabItens2
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarClasse">
<Description>

Validar Classe

set sc = ##class(Src2.Classe).ValidarClasse("nfe.v110.COF*.cls", .expressaoEdt, .qtdItens, .tabItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[expressao:%String,&expressaoEdt:%String,&qtdItens:%Integer,&tabItens:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set expressaoEdt = expressao
 set qtdItens = 0
 kill tabItens
 
 if (expressao [ "*") set tipo = 2
 else  set tipo = 1
 
 set expressao = $zconvert($translate(expressao,"*",""),"U")
 
 if $piece(expressao,".",$length(expressao,".")) = "CLS" {
   set expressao = $piece(expressao,".",1,$length(expressao,".")-1)
 }
 
 set expressao2 = $extract(expressao,1,$length(expressao)-1)
 
 set expressao3 = expressao2
 for {
   set expressao3 = $order(^rINDEXCLASS(expressao3))
   
   if (expressao3 = "") ! ($extract(expressao2,1,$length(expressao2)) '= $extract(expressao3,1,$length(expressao2))) quit
   
   if ($list(^rINDEXCLASS(expressao3),1) = "") continue
   
   set classe = $list(^rINDEXCLASS(expressao3),2)
   
   if (tipo = 1) & (expressao = expressao3) {
     set tabItens(classe_".cls") = ""
     set expressaoEdt = $extract(classe,1,$length(expressao))
     set qtdItens = qtdItens + 1
   } 
   if (tipo = 2) & (expressao = $extract(expressao3,1,$length(expressao))) {
     set tabItens(classe_".cls") = ""
     set expressaoEdt = $extract(classe,1,$length(expressao))
     set qtdItens = qtdItens + 1
   }
 }
 
 if (qtdItens = 0) quit "Nenhuma classe encontrada para a expressão '"_expressaoEdt_"'!"
 
 if (tipo = 1) set expressaoEdt = expressaoEdt_".cls"
 else  set expressaoEdt = expressaoEdt_"*.cls"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterClassesProjeto">
<Description>

Obter Classes do Projeto

set sc = ##class(Src2.Classe).ObterClassesProjeto("csw.classes", .expressaoEdt, .qtdItens, .tabItens)
set sc = ##class(Src2.Classe).ObterClassesProjeto("cswutil.classes", .expressaoEdt, .qtdItens, .tabItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[expressao:%String,&expressaoEdt:%String,&qtdItens:%Integer,&tabItens:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set expressaoEdt = expressao
 set qtdItens = 0
 kill tabItens
 
 set sc = ##class(Src2.UtilsXml).ObterSistemasXML(.tabSistemas)
 quit:sc'=1 sc
 
 set projeto = $piece(expressao,".",1)
 
 set grupoClasses = ""
 for {
   set grupoClasses = $order(tabSistemas(projeto,2,grupoClasses))
   if (grupoClasses = "") quit
   for cont = ($length(grupoClasses)-1) : -1 : 2 {
     if $data(tabSistemas(projeto,2,$extract(grupoClasses,1,cont))) {
       kill tabSistemas(projeto,2,grupoClasses)
       quit
     }
   }
 }
 
 set grupoClasses = ""
 for {
   set grupoClasses = $order(tabSistemas(projeto,2,grupoClasses))
   if (grupoClasses = "") quit
   
   set sc = ##class(Src2.Classe).ValidarClasse(grupoClasses_"*.cls", .grupoClassesEdt, .qtdItens, .tabItens2)
   
   set tabItensSel(grupoClassesEdt) = qtdItens
   
   merge tabItens = tabItens2
 }
 
 set sc = ##class(Src2.Item).AgruparItens(.tabItensSel,.qtdItens)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarClasseArquivo">
<Description>

Exporta uma classe para um arquivo texto com a extensão .cls
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>classe:%String,arquivoClasse:%String,flgSubversion:%Boolean=1,username:%String="",password:%String="",flgLog:%Boolean=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig( , , .caminhoSvn, .arquivoTemp)
 quit:msgsc'=1 msgsc
 
 set (permissao, adicionar) = 0
 
 if (flgSubversion) {
   if (##class(Src2.Utils).ObterSistOper() = "linux") { set permissao = 1 }
   if ('##class(%File).Exists(arquivoClasse)) set adicionar = 1
 }
 
 set pastaArquivo = ##class(Src2.Utils).ObterCaminhoArquivo(arquivoClasse)
 
 set sc=$system.OBJ.Export(classe_".cls",arquivoTemp,"f-l-d")
 
 set sc = ##class(Src2.Classe).ObterTabClasseArquivo(classe, arquivoTemp, .tabClasse)
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 if ('##class(%File).DirectoryExists(pastaArquivo)) {
   do ##class(%File).CreateDirectory(pastaArquivo)
   if (flgSubversion) {
     set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "add "_pastaArquivo, username, password)
     if (permissao) { do $zf(-1,"chmod -R 777 "_pastaArquivo) }
   }
 }
 
 if ('##class(%File).DirectoryExists(pastaArquivo)) quit "Não foi possível criar o diretório "_pastaArquivo_"!"
 
 set objFile = ##class(%File).%New(arquivoClasse)
 
 do objFile.Open("WN:/IOTABLE=""UTF8""")
 if ('objFile.IsOpen) {
   set objFile = ""
   if (flgLog) { set sc = ##class(Src2.Utils).GeraLog(2, "Exportação de Classe | "_classe_" => "_arquivoClasse_" | Não foi possível abrir o arquivo") }
   quit "Não foi possível abrir o arquivo "_arquivoClasse_" para exportar a classe "_classe_"!"
 }
 
 set sc = $$$OK
 set lin = ""
 for {
   set lin = $order(tabClasse(lin))
   if (lin = "") quit
   set sc = objFile.Write($get(tabClasse(lin))_$char(10))
   if (sc '= 1) quit
 }
 
 do objFile.Close()
 set objFile = ""
 
 if (flgSubversion) {
   if (adicionar) {
     set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "add "_arquivoClasse, username, password)
     if (permissao) { do $zf(-1,"chmod -R 777 "_pastaArquivo) }
   }
   if (permissao) { do $zf(-1,"chmod 777 "_arquivoClasse) }
 }
 
 if (sc '= $$$OK) {
   if (flgLog) { set sc = ##class(Src2.Utils).GeraLog(2, "Exportação de Classe | "_classe_" => "_arquivoClasse_" | Erro ao gravar o arquivo") }
   quit "Erro ao exportar a classe "_classe_" para o arquivo "_arquivoClasse_"!"
 }
 
 if (flgLog) {
   set sc = ##class(Src2.Utils).GeraLog(1, "Exportação de Classe | "_classe_" => "_arquivoClasse)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabClasseArquivo">
<Description>

Obtem uma Tabela com o Fonte de uma Classe a Partir de um Arquivo
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[classe:%String,arquivoClasse:%String,&tabClasse:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabClasse
 
 if ('##class(%File).Exists(arquivoClasse)) {
   quit "Arquivo '"_arquivoClasse_"' para importação da classe "_classe_" não encontrado"
 }
 
 set lin = ""
 
 set file = ##class(%File).%New(arquivoClasse)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   
   if (linhaFile [ "<Export generator=""Cache""") {
     set linhaFile = "<Export generator=""Cache"" version=""9"" zv=""Cache for UNIX (Linux AMD64/64-bit) 5.0.21 (Build 6408)"" ts=""2010-01-01 12:00:00"">"
   }
   if (linhaFile [ "<TimeChanged>") {
     set linhaFile = "<TimeChanged>61727,0.0</TimeChanged>"
   }
   if (linhaFile [ "<TimeCreated>") {
     set linhaFile = "<TimeCreated>61727,0</TimeCreated>"
   }
   if (linhaFile [ "<ConditionalWithHostVars/>") {
     set linhaFile = "<ConditionalWithHostVars>0</ConditionalWithHostVars>"
   }
   if (linhaFile [ "</ExtentSize>") ! (linhaFile [ "</LegacyInstanceContext>") {
     continue
   }
   
   set lin = lin + 1
   set tabClasse(lin) = ##class(Src2.Utils).ConverterStringUTF8(linhaFile)
 }
 
 do file.Close()
 set file=""
 
 if ('$data(tabClasse)) quit "Arquivo '"_arquivoClasse_"' para importação da classe "_classe_" sem dados"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarClasseArquivo">
<Description>

Cria uma Classe a Partir de um Arquivo

  tabErros = Em fixas conforme lista abaixo
             1 - Outros erros
             2 - Erro de compilação da classe
  
  tabOK = 1 - Importou
          2 - Compilou

set sc = ##class(Src2.Classe).GerarClasseArquivo("C:\workspacecsw\csw63\classes\Tcp\Engenharia.xml", "Tcp.Engenharia", , .tabErros, .tabOK)
set sc = ##class(Src2.Classe).GerarClasseArquivo("C:\workspacecsw\csw63\classes\Tcp\Engenharia2.xml", "Tcp.Engenharia", , .tabErros, .tabOK)
set sc = ##class(Src2.Classe).GerarClasseArquivo("C:\workspacecsw\csw63\classes\Tcp\Estampas.xml", "Tcp.Estampas", , .tabErros, .tabOK)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[arquivoClasse:%String,classe:%String,flagComp:%String="",&tabErros:%String,&tabOK:%String,flgLog:%Boolean=0]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabErros, tabOK
 
 if ('##class(%File).Exists(arquivoClasse)) {
   if (flgLog) { set sc = ##class(Src2.Utils).GeraLog(2, "Importação de Classe | "_arquivoClasse_" => "_classe_" | Flags: "_flagComp_" | Arquivo '"_arquivoClasse_"' para importação da classe "_classe_" não encontrado") }
   quit "Arquivo '"_arquivoClasse_"' para importação da classe "_classe_" não encontrado"
 }
 
 if (flagComp = "") {
   set flagComp = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao()
 }
 
 set tabOK(1) = ""
 
 set sc = $System.OBJ.Load(arquivoClasse, flagComp, .errorlog)
 if (sc = $$$OK) {
   if (flgLog) { set sc = ##class(Src2.Utils).GeraLog(1, "Importação de Classe | "_arquivoClasse_" => "_classe_" | Flags: "_flagComp) }
   set tabOK(2) = ""
   quit $$$OK
 }
 
 set lin = ""
 for {
   set lin = $order(errorlog(lin))
   if (lin = "") quit
   set tabErros(1,lin) = $piece($get(errorlog(lin)),$char(13)_$char(10)_$char(32),1)
 }
 
 if (flgLog) {
   set sc = ##class(Src2.Utils).GeraLog(2, "Importação de Classe | "_arquivoClasse_" => "_classe_" | Flags: "_flagComp_" | "_$get(tabErros(1,1)))
 }
 
 // TODO - Implementar recurso de atualizar workspace - ver rotina
 
 quit "Erro ao compilar a classe "_classe
]]></Implementation>
</Method>

<Method name="ExcluirClasse">
<Description>

Exclui uma Classe
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[classe:%String,&tabErros:%String,flgLog:%Boolean=0]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabErros
 
 do $SYSTEM.OBJ.Delete(classe,"-d")
 
 if (flgLog) {
   set sc = ##class(Src2.Utils).GeraLog(1, "Exclusão de Classe | "_classe)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CompararClasseArquivo">
<Description>

Compara uma Classe com um Arquivo
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[classe:%String,arquivoClasse:%String,&linDifNr:%String="",&linDifItem:%String="",&linDifArq:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConfig(, , , .arquivoTemp)
 quit:sc'=1 sc
 
 set flgErro=0
 
 set file = ##class(%File).%New(arquivoClasse)
 
 do file.Open("R")
 
 set sc=$system.OBJ.Export(classe_".cls",arquivoTemp,"f-l-d")
 
 set sc = ##class(Src2.Classe).ObterTabClasseArquivo(classe, arquivoTemp, .tabClasse)
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 set lin = ""
 for {
   set lin = $order(tabClasse(lin))
   if (lin = "") quit
   set linhaFile = file.Read(32000)
   
   if ($get(tabClasse(lin)) '= ##class(Src2.Utils).ConverterStringUTF8(linhaFile)) {
     set linDifNr = lin
     set linDifItem = $get(tabClasse(lin))
     set linDifArq = ##class(Src2.Utils).ConverterStringUTF8(linhaFile)
     set flgErro=1
     quit
   }
 }
 
 if ('flgErro) {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam '= -1) {
     set linDifNr = lin
     set linDifArq = ##class(Src2.Utils).ConverterStringUTF8(linhaFile)
     set flgErro=1
   }
 }
 
 do file.Close()
 
 set file=""
 
 if (flgErro) quit "Classe "_classe_" desatualizada no controle de versão!"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosClasse">
<Description>

Obter Dados Classe

set sc = ##class(Src2.Classe).ObterDadosClasse("Tcp.Engenharia", .classePastaCopiaTrabalho, .classeCopiaTrabalho, .classePastaRepositorio, .classeRepositorio, .descricao, .extensao, .InternalName, .pasta, .projeto, .versaoRelacionada)
set sc = ##class(Src2.Classe).ObterDadosClasse("nfe.v200.transporta", .classePastaCopiaTrabalho, .classeCopiaTrabalho, .classePastaRepositorio, .classeRepositorio, .descricao, .extensao, .InternalName, .pasta, .projeto, .versaoRelacionada)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[classe:%String,&classePastaCopiaTrabalho:%String,&classeCopiaTrabalho:%String,&classePastaRepositorio:%String,&classeRepositorio:%String,&descricao:%String,&extensao:%String,&InternalName:%String,&pasta:%String,&projeto:%String,&versaoRelacionada:%String,&sistema:%String,&arquivo:%String,&classeId:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (classePastaCopiaTrabalho, classeCopiaTrabalho, classePastaRepositorio, classeRepositorio, descricao, extensao, InternalName, pasta, projeto, versaoRelacionada, sistema, arquivo, classeId) = ""
 
 set sc = ##class(Src2.Classe).ObterInfoClasse(classe, .classeId, .pasta, .InternalName, .descricao, .sigla, .situacao, .projeto, .extensao, .versaoRelacionada, .arquivo)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Classe).ObterInfoClasseId2(classeId, urlRepositorio, caminhoCopiaTrabalho, .classePastaCopiaTrabalho, .classeCopiaTrabalho, .classePastaRepositorio, .classeRepositorio)
 quit:sc'=1 sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfoClasse">
<Description>

Obtem Informações de uma Classe

Entrada
  classe       = "nfe.v200.transporta"
Saidas
  classeId     = "nfe_v200\transporta.xml" ou "nfe_v200/transporta.xml"
  pasta        = "nfe_v200"
  InternalName = "nfe.v200.transporta.cls"

set sc = ##class(Src2.Classe).ObterInfoClasse("nfe.v200.transporta", .classeId, .pasta, .InternalName, .descricao, .sigla, .situacao, .projeto, .extensao, .versaoRelacionada)
set sc = ##class(Src2.Classe).ObterInfoClasse("Tcp.Engenharia", .classeId, .pasta, .InternalName, .descricao, .sigla, .situacao, .projeto, .extensao, .versaoRelacionada)
set sc = ##class(Src2.Classe).ObterInfoClasse("Gcco.Tct.Forn.nfe.v200.Teste", .classeId, .pasta, .InternalName, .descricao, .sigla, .situacao, .projeto, .extensao, .versaoRelacionada)
set sc = ##class(Src2.Classe).ObterInfoClasse("Reqe.Tct.Forn.nfe.v200.Teste", .classeId, .pasta, .InternalName, .descricao, .sigla, .situacao, .projeto, .extensao, .versaoRelacionada)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[classe:%String,&classeId:%String,&pasta:%String,&InternalName:%String,&descricao:%String,&sigla:%String,&situacao:%String,&projeto:%String,&extensao:%String="cls",&versaoRelacionada:%String,&arquivo:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (classeId, pasta, InternalName, descricao, sigla, situacao, projeto, versaoRelacionada, arquivo) = ""
 
 set extensao = "cls"
 
 set pasta = $piece(classe,".",1,$length(classe,".")-1)
 
 if (pasta = "") quit "Classe "_classe_" sem pasta definida!"
 
 set sc = ##class(Src2.Classe).ObterPastaRefClasse(pasta, .pastaRef)
 if (sc'=1) quit "Classe "_classe_" sem pasta definida!"
 
 set var = $get(^Src2Config("classe",pastaRef))
 
 set projeto = $piece(var,"^",1)
 set situacao = $piece(var,"^",2)
 set sigla = $piece(var,"^",3)
 set descricao = $piece(var,"^",4)
 set versaoRelacionada = $piece(var,"^",5)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set pasta = $translate(pasta,".","_")
 set arquivo = $piece(classe,".",$length(classe,"."))_".xml"
 set classeId = pasta_barra_arquivo
 set InternalName = classe_".cls"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterPastaRefClasse">
<Description>
set sc = ##class(Src2.Classe).ObterPastaRefClasse("nfe.v200", .pastaRef)
set sc = ##class(Src2.Classe).ObterPastaRefClasse("Gcco.Tct.Forn.nfe.v200", .pastaRef)
set sc = ##class(Src2.Classe).ObterPastaRefClasse("Rqco.Tct.Forn.nfe.v200", .pastaRef)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[pasta:%String,&pastaRef:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set pastaRef = ""
 
 if ($data(^Src2Config("classe",pasta))) {
   set pastaRef = pasta
   quit $$$OK
 }
 
 for cont = ($length(pasta,".")-1):-1:1 {
   if ($data(^Src2Config("classe",$piece(pasta,".",1,cont)))) {
     set pastaRef = $piece(pasta,".",1,cont)
     quit
   }
 }
 
 if (pastaRef '= "") quit $$$OK
 
 quit "Pasta não encontrada!"
]]></Implementation>
</Method>

<Method name="ObterInfoClasseId">
<Description>

Obtem Informações de um classeId

Entrada
  classeId     = "nfe_v200\transporta.xml" ou "nfe_v200/transporta.xml"
Saidas
  classe       = "nfe.v200.transporta"
  pasta        = "nfe_v200"
  InternalName = "nfe.v200.transporta.cls"

set sc = ##class(Src2.Classe).ObterInfoClasseId("nfe_v200\transporta.xml", .classe, .pasta, .InternalName, .package)
set sc = ##class(Src2.Classe).ObterInfoClasseId("nfe_v200/transporta.xml", .classe, .pasta, .InternalName, .package)
set sc = ##class(Src2.Classe).ObterInfoClasseId("transporta.xml", .classe, .pasta, .InternalName, .package)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[classeId:%String,&classe:%String,&pasta:%String,&InternalName:%String,&package:%String,&packageRed:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (pasta, classe, InternalName, package, packageRed) = ""
 
 set classeId = $translate(classeId,"/","\")
 
 if ($piece(classeId,"\",2) = "") {
   quit "Classe "_classeId_" sem pasta definida!"
 }
 
 set pasta = $piece(classeId,"\",1)
 set package = $translate(pasta,"_",".")
 set packageRed = $piece(package,".",1)
 set classe = $translate($piece(classeId,".xml",1),"_\","..")
 set InternalName = classe_".cls"
 
 if (pasta = "") quit "Classe "_classeId_" sem pasta definida!"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfoClasseId2">
<Description>

Obtem Informações de um classeId 2

set sc = ##class(Src2.Classe).ObterInfoClasseId2("nfe_v200\transporta.xml", "http://192.168.15.10:18080/svn/cswutil/branches/6.2", "C:\workspacecsw\projetos\6.2\csw62", .classePastaCopiaTrabalho, .classeCopiaTrabalho, .classePastaRepositorio, .classeRepositorio)
set sc = ##class(Src2.Classe).ObterInfoClasseId2("nfe_v200/transporta.xml", "http://192.168.15.10:18080/svn/cswutil/branches/6.2", "C:\workspacecsw\projetos\6.2\csw62", .classePastaCopiaTrabalho, .classeCopiaTrabalho, .classePastaRepositorio, .classeRepositorio)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[classeId:%String,urlRepositorio:%String,caminhoCopiaTrabalho:%String,&classePastaCopiaTrabalho:%String,&classeCopiaTrabalho:%String,&classePastaRepositorio:%String,&classeRepositorio:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (classePastaCopiaTrabalho, classeCopiaTrabalho, classePastaRepositorio, classeRepositorio) = ""
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sc = ##class(Src2.Classe).ObterInfoClasseId(classeId, , .pasta)
 quit:sc'=1 sc
 
 if (caminhoCopiaTrabalho '= "") {
   set classePastaCopiaTrabalho = caminhoCopiaTrabalho_barra_"classes"_barra_pasta
   set classeCopiaTrabalho = caminhoCopiaTrabalho_barra_"classes"_barra_$translate(classeId,"\/",barra_barra)
 }
 
 if (urlRepositorio '= "") {
   set classePastaRepositorio = urlRepositorio_"/classes/"_pasta
   set classeRepositorio = urlRepositorio_"/classes/"_$translate(classeId,"\","/")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarClasses">
<Description>

Importa Classes a Partir de Arquivos
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,flagComp:%String="",flgLog:%Boolean=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set classeId = ""
 for {
   set classeId = $order(^mtempInfoArquivo(codTerm,"classes",classeId))
   if (classeId = "") quit
   set var = $get(^mtempInfoArquivo(codTerm,"classes",classeId))
   
   set operacao = $piece(var,"^",1)
   set pathClasse = $piece(var,"^",2)
   set status = $piece(var,"^",3)
   
   if (status '= "") { set status = "["_status_"] " }
   
   set msgsc = ##class(Src2.Classe).ObterInfoClasseId(classeId, .classe)
   if (msgsc '= $$$OK) continue
   
   if (operacao = 1) {
     set msgsc = ##class(Src2.Classe).GerarClasseArquivo(pathClasse, classe, flagComp, , , flgLog)
     write !,"Classe Importada: "_status_classe_" "_$select(msgsc=$$$OK:"[OK]",1:"[ERRO]")
   }
   
   if (operacao = 2) {
     set msgsc = ##class(Src2.Classe).ExcluirClasse(classe, , flgLog)
     write !,"Classe Excluida: "_status_classe_" "_$select(msgsc=$$$OK:"[OK]",1:"[ERRO]")
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CompararClassesWorkspaceCache">
<Description>

Compara/Acerta as Classes do Workspace para o Cache
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,flgAcertar:%Boolean=0,flagComp:%String="",flgLog:%Boolean=0,grupoItensSel:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set classeId = ""
 for {
   set classeId = $order(^mtempInfoArquivo(codTerm,"classes",classeId))
   if (classeId = "") quit
   set var = $get(^mtempInfoArquivo(codTerm,"classes",classeId))
   
   set operacao = $piece(var,"^",1)
   set pathClasse = $piece(var,"^",2)
   
   set msgsc = ##class(Src2.Classe).ObterInfoClasseId(classeId, .classe, , .InternalName)
   if (msgsc '= $$$OK) continue
   
   if (grupoItensSel '= "") , ('##class(Src2.Item).ValidarSelecaoItem(grupoItensSel, InternalName)) continue
   
   set msgsc = ##class(Src2.Item).CompararItemArquivo(InternalName, .linDifNr, .linDifItem, .linDifArq)
   if (msgsc = $$$OK) continue
   
   write !,InternalName_" (Linha: "_$get(linDifNr)_")"
   
   if (flgAcertar) {
     if (operacao = 1) {
       set msgsc = ##class(Src2.Classe).GerarClasseArquivo(pathClasse, classe, flagComp, , , flgLog)
       write !,"  Importada: "_classe_" "_$select(msgsc=$$$OK:"[OK]",1:"[ERRO]")
     }
     
     if (operacao = 2) {
       set msgsc = ##class(Src2.Classe).ExcluirClasse(classe, , flgLog)
       write !,"  Excluida: "_classe_" "_$select(msgsc=$$$OK:"[OK]",1:"[ERRO]")
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarClasseControleFonte">
<Description>

Verifica se Uma Classe Tem Controle de Fonte

write ##class(Src2.Classe).ValidarClasseControleFonte2("nfe.v200.avulsa")
write ##class(Src2.Classe).ValidarClasseControleFonte2("Tcp.Engenharia")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>classe:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
 if (classe = "") quit 0
 
 set pasta1 = $zconvert($piece(classe,".",1),"u")
 
 if (pasta1 = "") quit 0
 
 if ('$data(^Src2Config("classe2",pasta1))) quit 0
 
 set flgSourceControl = 1
 
 set tam = $length(classe,".")
 
 for cont = tam:-1:1 {
   set classe2 = $piece(classe,".",1,cont)
   if $data(^Src2Config("classesemctr",classe2)) {
     set var = $get(^Src2Config("classesemctr",classe2))
     set tamItem = $length(classe2,".") + 1
     if (($piece(var,"^",1) = 1) & (classe = classe2)) {
       set flgSourceControl = 0
       quit
     }
     if (classe '= classe2) {
       if (($piece(var,"^",2) = 1) & (tam = tamItem)) {
         set flgSourceControl = 0
         quit
       }
       if (($piece(var,"^",3) = 1) & (tam '= tamItem)) {
         set flgSourceControl = 0
         quit
       }
     }
   }
 }
 
 quit flgSourceControl
]]></Implementation>
</Method>

<Method name="ObterFlagsCompilacaoPadrao">
<Description>

Obter Flags de Compilacao Padrao

Do $system.OBJ.ShowFlags()

tipo = 1 - Para Load (Sem compilação / Sem display)
       2 - Para Load (Com compilação / Sem display)
       3 - Para CompileAll/CompilePackage (Com compilação / Com Display)
       4 - Para CompileAll/CompilePackage (Com compilação / Com Display / Sem Dependencias)

write ##class(Src2.Classe).ObterFlagsCompilacaoPadrao()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>tipo:%String=1</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (tipo = 1) quit "-dia"
 if (tipo = 2) quit "cbkf1-dia"
 if (tipo = 3) quit "bkf1"
 if (tipo = 4) quit "k-l"
 quit ""
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Config">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="ObterVersaoSrc">
<Description>

Obtem a Versao do Controle de Fonte

write ##class(Src2.Config).ObterVersaoSrc()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Integer</ReturnType>
<Implementation><![CDATA[ quit 78
]]></Implementation>
</Method>

<Method name="AtualizarConfiguracoes">
<Description>

Obtem as Configurações de um Arquivo XML

set sc=##class(Src2.Config).AtualizarConfiguracoes()
set sc=##class(Src2.Config).AtualizarConfiguracoes(1,1)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>force:%Boolean=0,flgUpdate:%Boolean=0,forceDicionario:%Boolean=0,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 if ($data(^Src2Config("projetorev"))) {
   kill ^%CSW1ATULOG
   kill ^%CSW1ATUCONF
 }
 
 set (flgConfiguracao, flgSourceCheck, flgDicionario) = 0
 
 if ('flgUpdate) {
   set flgUpdate = ##class(Src2.Config).ValidarUpdateConfigWorkspace()
 }
 
 if (flgUpdate) {
   set msgsc = ##class(Src2.Config).ValidarConexaoSubversion()
   if (msgsc = 1) {
     set nrRevisao = ""
     set msgsc = ##class(Src2.Utils).UpdateConfigGeralWorkspace(.nrRevisao)
     if (msgsc '= 1) {
       write !,"Source Control: ",msgsc
       quit msgsc
     }
     
     write !!,##class(Src2.Utils).ObterBarra("Update das Configurações do Workspace")
     write !,"Source Control: Update das configurações do workspace para revisão: "_nrRevisao
     set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
     set sc = ##class(Src2.Utils).GeraLog(0, "Update das Configurações do Workspace | Revisão: "_nrRevisao_" | Tempo: "_tempoTotalEdt)
     
     set sc = ##class(Src2.Utils2).GerarBackupJob(username)
     
     write !,##class(Src2.Utils).ObterBarra(tempoTotalEdt)
     
     set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
   } else {
     write !,"Source Control: ",msgsc
   }
 }
 
 set sc = ##class(Src2.Config).ObterIdArquivos(.idConfiguracao, .idSourceCheck, .idDicionario)
 if (sc '= 1) {
   write !,"Source Control: ",sc
   quit sc
 }
 
 if (force) ! ($get(^Src2Config("config","idConfiguracao")) '= idConfiguracao) {
   set flgConfiguracao = 1
 }
 
 if (force) ! ($get(^Src2Config("config","idSourceCheck")) '= idSourceCheck) {
   set flgSourceCheck = 1
 }
 
 if (forceDicionario) ! ($get(^Src2Config("config","idDicionario")) '= idDicionario) {
   set flgDicionario = 1
 }
 
 if '(flgConfiguracao + flgSourceCheck + flgDicionario) quit $$$OK
 
 write !!,##class(Src2.Utils).ObterBarra("Atualizar Configurações")
 
 if (flgConfiguracao) {
   set sc=##class(Src2.Config).GerarConfiguracao()
   write !,"Source Control: Configurações atualizadas"
   set sc = ##class(Src2.Utils).GeraLog(0, "Atualizar Configurações | Configurações atualizadas")
 }
 
 if (flgSourceCheck) {
   set sc=##class(Src2.Config).GerarSourceCheck()
   write !,"Source Control: Source Check atualizado"
   set sc = ##class(Src2.Utils).GeraLog(0, "Atualizar Configurações | Source Check atualizado")
 }
 
 if (flgDicionario) {
   set sc=##class(Src2.Config).GerarDicionario()
   write !,"Source Control: Dicionário atualizado"
   set sc = ##class(Src2.Utils).GeraLog(0, "Atualizar Configurações | Dicionário atualizado")
 }
 
 if (flgConfiguracao) {
   set sc = ##class(Src2.Utils).GerarCSMENCF()
   write !,"Source Control: Gerada da global ^%CSMENCF"
   set sc = ##class(Src2.Utils).GeraLog(0, "Atualizar Configurações | Gerada da global ^%CSMENCF")
 }
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra(tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Atualizar Configurações | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarConexaoSubversion">
<Description>

Validar Conexao com o Subversion

set sc=##class(Src2.Config).ValidarConexaoSubversion()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set httprequest = ##Class(%Net.HttpRequest).%New()
 
 set httprequest.Timeout = 0.5
 set httprequest.Server = "192.168.15.10"
 set httprequest.Port = 18080
 
 if (httprequest.Get() '= 1) quit "Não foi possível se conectar ao subversion!"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarConfiguracao">
<Description>

Obtem as Configurações de um Arquivo XML

set sc=##class(Src2.Config).GerarConfiguracao()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 lock +^Src2Config
 
 set sc = ##class(Src2.UtilsXml).ObterConfigXML($znspace, .tabProjLocais)
 if (sc '= 1) {
   lock -^Src2Config
   quit sc
 }
 
 set sc = ##class(Src2.UtilsXml).ObterProjetosXML(.tabProjetos)
 if (sc '= 1) {
   lock -^Src2Config
   quit sc
 }
 
 set sc = ##class(Src2.UtilsXml).ObterSistemasXML(.tabSistemas)
 if (sc '= 1) {
   lock -^Src2Config
   quit sc
 }
 
 set sc = ##class(Src2.UtilsXml).ObterContas(.tabContas)
 if (sc '= 1) {
   lock -^Src2Config
   quit sc
 }
 
 set sc = ##class(Src2.UtilsXml).ObterParametrosXML(.tabParametros, .tabUsuarios)
 if (sc '= 1) {
   lock -^Src2Config
   quit sc
 }
 
 set sc = ##class(Src2.Config).ObterIdArquivos(.idConfiguracao)
 if (sc '= 1) quit sc
 
 set ^Src2Config("config","idConfiguracao") = idConfiguracao
 
 kill ^mtempSrc2Config
 
 merge ^mtempSrc2Config("conta") = tabContas
 
 merge ^mtempSrc2Config("parametros") = tabParametros
 
 merge ^mtempSrc2Config("usuarios") = tabUsuarios
 
 set (idProjeto, grupoRotina, grupoClasse, grupoClasse2, conta) = ""
 for {
   set idProjeto = $order(tabProjLocais(idProjeto))
   if (idProjeto = "") quit
   set varProjLocais = $get(tabProjLocais(idProjeto))
   
   set pasta = $piece(varProjLocais,"^",2)
   
   set varProjeto = $get(tabProjetos(idProjeto))
   
   set idSistema = $piece(varProjeto,"^",1)
   set urlRepositorio = $piece(varProjeto,"^",2)
   set porContaProjeto = $piece(varProjeto,"^",3)
   
   if ($data(^Src2Config("projeto2",idProjeto))) {
     set idProjetoSwitch = $piece($get(^Src2Config("projeto2",idProjeto)),"^",1)
     if (idProjetoSwitch '= "") {
       set varProjetoSwitch = $get(tabProjetos(idProjetoSwitch))
       set urlRepositorio = $piece(varProjetoSwitch,"^",2)
     }
   }
   
   set sc = ##class(Src2.Config).GravarProjeto(idProjeto, idSistema, urlRepositorio, porContaProjeto, $piece(varProjeto,"^",4), $piece(varProjeto,"^",5), $piece(varProjeto,"^",6), pasta, $piece(varProjeto,"^",7), $piece(varProjeto,"^",8))
   
   // Projetos por Conta (Rotinas especificas)
   if (porContaProjeto) {
     for {
       set conta = $order(tabContas(conta))
       if (conta = "") quit
       set varContas = $get(tabContas(conta))
       if ($piece(varContas,"^",2) = 1) {
         set sc = ##class(Src2.Config).GravarGrupoRotina(conta, idProjeto, 1, , $piece(varContas,"^",1), $piece(varContas,"^",3))
         set sc = ##class(Src2.Config).GravarGrupoRotinaControlada(conta)
       }
     }
   }
   
   if (idSistema = "") continue
   
   // Um sistema configurado por namespace
   if $data(tabSistema(idSistema)) continue
   set tabSistema(idSistema) = ""
   
   set varSistema = $get(tabSistemas(idSistema))
   
   set porContaSistema = $piece(varSistema,"^",1)
   
   // Sistemas padrões
   if ('porContaSistema) {
     for {
       set grupoRotina = $order(tabSistemas(idSistema,1,grupoRotina))
       if (grupoRotina = "") quit
       set varGrupoRotina = $get(tabSistemas(idSistema,1,grupoRotina))
       set sc = ##class(Src2.Config).GravarGrupoRotina(grupoRotina, idProjeto, $piece(varGrupoRotina,"^",1), $piece(varGrupoRotina,"^",2), $piece(varGrupoRotina,"^",3))
     }
     for {
       set grupoClasse = $order(tabSistemas(idSistema,2,grupoClasse))
       if (grupoClasse = "") quit
       set varGrupoClasse = $get(tabSistemas(idSistema,2,grupoClasse))
       set sc = ##class(Src2.Config).GravarGrupoClasse(grupoClasse, idProjeto, $piece(varGrupoClasse,"^",1), $piece(varGrupoClasse,"^",2), $piece(varGrupoClasse,"^",3))
     }
   }
   
   // Sistemas por Conta (Gatilhos / Customax / Adapcon)
   if (porContaSistema) {
     for {
       set conta = $order(tabContas(conta))
       if (conta = "") quit
       set varContas = $get(tabContas(conta))
       if ($piece(varContas,"^",4) '= 1) {
         for {
           set grupoRotina = $order(tabSistemas(idSistema,1,grupoRotina))
           if (grupoRotina = "") quit
           set varGrupoRotina = $get(tabSistemas(idSistema,1,grupoRotina))
           set sc = ##class(Src2.Config).GravarGrupoRotina(grupoRotina_conta, idProjeto, $piece(varGrupoRotina,"^",1), $piece(varGrupoRotina,"^",2), $piece(varGrupoRotina,"^",3)_" - "_$piece(varContas,"^",1), $piece(varContas,"^",3))
         }
         for {
           set grupoClasse = $order(tabSistemas(idSistema,2,grupoClasse))
           if (grupoClasse = "") quit
           set varGrupoClasse = $get(tabSistemas(idSistema,2,grupoClasse))
           set sc = ##class(Src2.Config).GravarGrupoClasse(grupoClasse_$zconvert(conta,"l"), idProjeto, $piece(varGrupoClasse,"^",1), $piece(varGrupoClasse,"^",2), $piece(varGrupoClasse,"^",3)_" - "_$piece(varContas,"^",1), $piece(varContas,"^",3))
         }
       }
     }
   }
   
   // Rotinas Controladas
   for {
     set grupoRotina = $order(tabSistemas(idSistema,3,grupoRotina))
     if (grupoRotina = "") quit
     set sc = ##class(Src2.Config).GravarGrupoRotinaControlada(grupoRotina)
   }
   
   for {
     set grupoClasse = $order(tabSistemas(idSistema,4,grupoClasse))
     if (grupoClasse = "") quit
     set varGrupoClasse = $get(tabSistemas(idSistema,4,grupoClasse))
     set sc = ##class(Src2.Config).GravarGrupoClasseSemControle(grupoClasse, $piece(varGrupoClasse,"^",1), $piece(varGrupoClasse,"^",2), $piece(varGrupoClasse,"^",3))
   }
 }
 
 set sc=##class(Src2.Config).GravarConfiguracao("projeto")
 
 set sc=##class(Src2.Config).GravarConfiguracao("rotina")
 
 set sc=##class(Src2.Config).GravarConfiguracao("rotina2")
 
 set sc=##class(Src2.Config).GravarConfiguracao("classe")
 
 set sc=##class(Src2.Config).GravarConfiguracao("classe2")
 
 set sc=##class(Src2.Config).GravarConfiguracao("classesemctr")
 
 set sc=##class(Src2.Config).GravarConfiguracao("conta")
 
 set sc=##class(Src2.Config).GravarConfiguracao("parametros")
 
 set sc=##class(Src2.Config).GravarConfiguracao("usuarios")
 
 kill ^mtempSrc2Config
 
 lock -^Src2Config
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarSourceCheck">
<Description>

Obtem as Configurações de um Arquivo XML

set sc=##class(Src2.Config).GerarSourceCheck()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 lock +^Src2Config
 
 set sc = ##class(Src2.UtilsXml).ObterSourceCheck(.tabPalavras, .tabPalavrasInv, .tabUtilitarios)
 if (sc '= 1) {
   lock -^Src2Config
   quit sc
 }
 
 set sc = ##class(Src2.Config).ObterIdArquivos(, .idSourceCheck)
 if (sc '= 1) quit sc
 
 set ^Src2Config("config","idSourceCheck") = idSourceCheck
 
 kill ^mtempSrc2Config
 
 merge ^mtempSrc2Config("palavras") = tabPalavras
 set sc=##class(Src2.Config).GravarConfiguracao("palavras")
 
 merge ^mtempSrc2Config("palavrasinv") = tabPalavrasInv
 set sc=##class(Src2.Config).GravarConfiguracao("palavrasinv")
 
 merge ^mtempSrc2Config("utilitarios") = tabUtilitarios
 set sc=##class(Src2.Config).GravarConfiguracao("utilitarios")
 
 kill ^mtempSrc2Config
 
 lock -^Src2Config
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarDicionario">
<Description>

Obtem as Configurações de um Arquivo XML

set sc=##class(Src2.Config).GerarDicionario()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 lock +^Src2Config
 
 set sc = ##class(Src2.Config).ObterIdArquivos(, , .idDicionario)
 if (sc '= 1) quit sc
 
 set ^Src2Config("config","idDicionario") = idDicionario
 
 kill ^mtempSrc2Config
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(, , , , .arquivoDicionario)
 if (sc '= 1) quit sc
 
 if ('##class(%File).Exists(arquivoDicionario)) quit "Arquivo 'dicionariopt.txt' não encontrado!"
 
 set file = ##class(%File).%New(arquivoDicionario)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   if (linhaFile '= "") {
     set ^mtempSrc2Config("dicionario",$zconvert(linhaFile,"U")) = ""
   }
 }
 
 do file.Close()
 do file.%Close()
 set file = ""
 
 merge ^mtempSrc2Config("dicionario") = tabPalavras
 set sc=##class(Src2.Config).GravarConfiguracao("dicionario")
 
 kill ^mtempSrc2Config
 
 lock -^Src2Config
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarConfiguracao">
<Description>

Obtem as Configurações de um Arquivo XML

set sc=##class(Src2.Config).GravarConfiguracao(dados)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>dados:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 merge ^Src2Config(dados) = ^mtempSrc2Config(dados)
 
 set var = "^Src2Config("""_dados_""")"
 
 for {
   set var = $query(@var)
   if (var = "") quit
   
   if ($qsubscript(var,1) '= dados) quit
      
   set var2 = ""
   for cont = 1:1:$qlength(var) {
     set var2 = var2_$select(var2="":"",1:",")_""""_$qsubscript(var,cont)_""""
   }
   
   set var2 = "^mtempSrc2Config("_var2_")"
   
   if '$data(@var2) {
     kill @var
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterIdArquivos">
<Description>

Obtem os Identificadores dos Arquivos

set sc = ##class(Src2.Config).ObterIdArquivos(.idConfiguracao, .idSourceCheck, .idDicionario)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&idConfiguracao:%String,&idSourceCheck:%String,&idDicionario:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (idConfiguracao, idSourceCheck, idDicionario) = ""
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(.arquivoProjetos, .arquivoSistemas, .arquivoSourcecheck, .arquivoContas, .arquivoDicionario, .arquivoConfig, .arquivoParametros)
 if (sc '= 1) quit sc
 
 if ('##class(%File).Exists(arquivoProjetos)) quit "Arquivo 'projetos.xml' não encontrado!"
 
 if ('##class(%File).Exists(arquivoSistemas)) quit "Arquivo 'sistemas.xml' não encontrado!"
 
 if ('##class(%File).Exists(arquivoSourcecheck)) quit "Arquivo 'sourcecheck.xml' não encontrado!"
 
 if ('##class(%File).Exists(arquivoContas)) quit "Arquivo 'contas.xml' não encontrado!"
 
 if ('##class(%File).Exists(arquivoDicionario)) quit "Arquivo 'dicionariopt.txt' não encontrado!"
 
 if ('##class(%File).Exists(arquivoConfig)) quit "Arquivo 'config.xml' não encontrado!"
 
 if ('##class(%File).Exists(arquivoParametros)) quit "Arquivo 'parametros.xml' não encontrado!"
 
 set idConfiguracao = ##class(%File).GetFileDateModified(arquivoConfig)
 set idConfiguracao = idConfiguracao_";"_##class(%File).GetFileDateModified(arquivoProjetos)
 set idConfiguracao = idConfiguracao_";"_##class(%File).GetFileDateModified(arquivoSistemas)
 set idConfiguracao = idConfiguracao_";"_##class(%File).GetFileDateModified(arquivoContas)
 set idConfiguracao = idConfiguracao_";"_##class(%File).GetFileDateModified(arquivoParametros)
 
 set idSourceCheck = ##class(%File).GetFileDateModified(arquivoSourcecheck)
 
 set idDicionario = ##class(%File).GetFileDateModified(arquivoDicionario)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterArquivosConfig">
<Description>

Obtem os Arquivos de Configuração

set sc = ##class(Src2.Config).ObterArquivosConfig(.arquivoProjetos, .arquivoSistemas, .arquivoSourcecheck, .arquivoContas, .arquivoDicionario, .arquivoConfig, .arquivoParametros, .arquivoAtualizacao, .arquivoIntAux, .arquivoBases)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&arquivoProjetos:%String,&arquivoSistemas:%String,&arquivoSourcecheck:%String,&arquivoContas:%String,&arquivoDicionario:%String,&arquivoConfig:%String,&arquivoParametros:%String,&arquivoAtualizacao:%String,&arquivoIntAux:%String,&arquivoBases:%String,&arquivoVersionado:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (arquivoProjetos, arquivoSistemas, arquivoSourcecheck, arquivoContas, arquivoDicionario) = ""
 set (arquivoConfig, arquivoParametros, arquivoAtualizacao, arquivoIntAux, arquivoBases) = ""
 set (arquivoVersionado) = ""
 
 set sc = ##class(Src2.Utils).ObterConfig(, .caminhoWorkspace)
 if (sc '= 1) quit sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set arquivoProjetos = caminhoWorkspace_barra_"configgeral"_barra_"projetos.xml"
 
 set arquivoSistemas = caminhoWorkspace_barra_"configgeral"_barra_"sistemas.xml"
 
 set arquivoSourcecheck = caminhoWorkspace_barra_"configgeral"_barra_"sourcecheck.xml"
 
 set arquivoContas = caminhoWorkspace_barra_"configgeral"_barra_"contas.xml"
 
 set arquivoDicionario = caminhoWorkspace_barra_"configgeral"_barra_"dicionariopt.txt"
 
 set arquivoParametros = caminhoWorkspace_barra_"configgeral"_barra_"parametros.xml"
 
 set arquivoAtualizacao = caminhoWorkspace_barra_"configgeral"_barra_"atualizacao.xml"
 
 set arquivoIntAux = caminhoWorkspace_barra_"configgeral"_barra_"interfaceAuxiliar.xml"
 
 set arquivoBases = caminhoWorkspace_barra_"configgeral"_barra_"bases.xml"
 
 set arquivoVersionado = caminhoWorkspace_barra_"configgeral"_barra_"arquivos_versionados.xml"
 
 set arquivoConfig = caminhoWorkspace_barra_"configgeral"_barra_"config.xml"
 if (##class(%File).Exists(caminhoWorkspace_barra_"configlocal"_barra_"config.xml")) {
   set arquivoConfig = caminhoWorkspace_barra_"configlocal"_barra_"config.xml"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterOutrosArquivosConfig">
<Description>

Obtem Outros os Arquivos de Configuração

set sc = ##class(Src2.Config).ObterOutrosArquivosConfig(.arquivoConfigCert)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&arquivoConfigCert:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (arquivoConfigCert) = ""
 
 set sc = ##class(Src2.Utils).ObterConfig(, .caminhoWorkspace)
 if (sc '= 1) quit sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set arquivoConfigCert = caminhoWorkspace_barra_"configgeral"_barra_"certificados"_barra_"configcert.xml"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarProjeto">
<Description>

Grava um Projeto
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>idProjeto:%String,idSistema:%String,urlRepositorio:%String,porConta:%String,geraLog:%String,idVersaoGercon:%String,origem:%String,pasta:%String,menu:%String,versao:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set ^mtempSrc2Config("projeto",idProjeto) = idSistema_"^"_urlRepositorio_"^"_porConta_"^"_geraLog_"^"_idVersaoGercon_"^"_origem_"^"_pasta_"^"_menu_"^"_versao
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarGrupoRotina">
<Description>

Grava um Grupo Rotina
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>grupoRotina:%String,idProjeto:%String,situacao:%String,sigla:%String="",descricao:%String,versaoRelacionada:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set ^mtempSrc2Config("rotina",grupoRotina) = idProjeto_"^"_situacao_"^"_sigla_"^"_descricao_"^"_versaoRelacionada
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarGrupoRotinaControlada">
<Description>

Grava um Grupo Rotina Controlada
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>grupoRotina:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set ^mtempSrc2Config("rotina2",grupoRotina) = ""
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarGrupoClasse">
<Description>

Grava um Grupo Classe
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>grupoClasse:%String,idProjeto:%String,situacao:%String,sigla:%String="",descricao:%String,versaoRelacionada:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set ^mtempSrc2Config("classe",grupoClasse) = idProjeto_"^"_situacao_"^"_sigla_"^"_descricao_"^"_versaoRelacionada
 set ^mtempSrc2Config("classe2",$zconvert($piece(grupoClasse,".",1),"u")) = ""
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarGrupoClasseSemControle">
<Description>

Grava um Grupo Classe Sem Controle
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>grupoClasse:%String,flgItem:%String,flgSubItens:%String,flgSubPastas:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set ^mtempSrc2Config("classesemctr",grupoClasse) = flgItem_"^"_flgSubItens_"^"_flgSubPastas
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarVersaoSrc">
<Description>

Grava um Grupo Classe Controlada

write ##class(Src2.Config).ValidarVersaoSrc()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ('$data(^Src2Config("parametros","SourceControlVersion"))) quit $$$OK
 
 if (##class(Src2.Config).ObterVersaoSrc() < $get(^Src2Config("parametros","SourceControlVersion"))) {
   quit "Favor atualizar o controle de fonte!"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarUpdateConfigWorkspace">
<Description>

Grava um Grupo Classe Controlada

write ##class(Src2.Config).ValidarUpdateConfigWorkspace()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>flgUpdate:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
 set horolog = $get(^Src2Config("config","updateconfig"))
 
 if ((+$horolog) '= (+horolog)) {
   set ^Src2Config("config","updateconfig") = $horolog
   quit 1
 }
 
 // 1 hora
 set tempo = $piece($horolog,",",2) - $piece(horolog,",",2)
 if (tempo > 3600) {
   set ^Src2Config("config","updateconfig") = $horolog
   quit 1
 }
 
 quit 0
]]></Implementation>
</Method>
</Class>


<Class name="Src2.ConsistemLog">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>63432,61679.583765</TimeCreated>

<Method name="ObterInfo">
<Description>

==============================================
TODO - IMPLEMENTAR UM CADASTRO PARA REENVIO DE LOG
TODO - IMPLEMENTAR UM CADASTRO DE PESQUISA
TODO - IMPLEMENTAR CONSULTA PARA CONSULTAR OS RESULTADOS DA PESQUISA
TODO - IMPLEMENTAR CONSULTAS PARA ANALISAR OS LOGS DE USO
TODO - QUANDO DER ERRO AO PEGAR LICENCA ENVIAR EMAIL CONSISTEM
TODO - NO TRATAMENTO DE ERRO DO SISTEMA GERAR LOG E TRATAR PARA ENVIO
==============================================


Obter Informações do Consistem Log

set sc = ##class(Src2.ConsistemLog).ObterInfo()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>flgAtuAgend:%Boolean=1</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterVersaoCache(, .versaoCache)
 if (versaoCache = 5) quit $$$OK
 
 set sc = ##class(Src2.ConsistemLog).ObterContaCliente(.codConta)
 if $$$ISERR(sc) quit sc
 
 if (codConta = "CC") quit $$$ERROR(10000,"Conta inválida!")
 
 set sc = ##class(Src2.ConsistemLog).ObterNamespaceAgendamentoLog(.namespace)
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.Utils2).ValidarServidorOficial(namespace)
 if $$$ISERR(sc) {
   set $piece(^%CSW1LOGCFG(1),"^",1) = 0
   set $piece(^%CSW1LOGCFG(1),"^",2) = $horolog
   if (flgAtuAgend) {
     set sc = ##class(Src2.ConsistemLog).AtualizarAgendamento()
   }
   quit $$$OK
 }
 
 set objService = ##class(Src2.Web.Cliente.ConsistemLogSoap).%New()
 
 set sc = $$$OK
 
 try {
   set $piece(^%CSW1LOGCFG(1),"^",2) = $horolog
   
   set objInfo = objService.ObterInfo(codConta)
   
   set $piece(^%CSW1LOGCFG(1),"^",1) = objInfo.situacao
   set $piece(^%CSW1LOGCFG(1),"^",3) = objInfo.horaEnvio
   set $piece(^%CSW1LOGCFG(1),"^",4) = objInfo.dataInicio
   set $piece(^%CSW1LOGCFG(1),"^",5) = objInfo.dataFim
   set $piece(^%CSW1LOGCFG(1),"^",6) = objInfo.dataInicioReenvio
   set $piece(^%CSW1LOGCFG(1),"^",7) = objInfo.dataFimReenvio
   
   set codSeq = ""
   for {
     set objPesquisa = objInfo.pesquisas.GetNext(.codSeq)
     if objPesquisa = "" quit
     if '$data(^%CSW1LOGCFG(4,objPesquisa.codPesquisa)) {
       set ^%CSW1LOGCFG(2,objPesquisa.codPesquisa) = objPesquisa.regra
     }
   }
 } catch {
   if $zerror["<ZSOAP>" { set sc = $get(%objlasterror) }
   else { set sc = $$$ERROR($$$CacheError,$zerror) }
   set sc2 = ##class(Src2.ConsistemLog).GerarLogErro(1, sc)
 }
 
 if (flgAtuAgend) {
   set sc2 = ##class(Src2.ConsistemLog).AtualizarAgendamento()
 }
 
 quit sc
]]></Implementation>
</Method>

<Method name="TransferirLog">
<Description>

Transferir Log Consistem

set sc = ##class(Src2.ConsistemLog).TransferirLog()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.ConsistemLog).ObterInfo(0)
 
 if ($piece($get(^%CSW1LOGCFG(1)),"^",9) '= "") & ($piece($get(^%CSW1LOGCFG(1)),"^",9) '= $znspace) quit $$$OK
 
 set csw1logcfg1 = $get(^%CSW1LOGCFG(1))
 
 // Log Inativo
 if ($piece(csw1logcfg1,"^",1) '= 1) quit $$$OK
 
 set sc = ##class(Src2.ConsistemLog).ObterContaCliente(.codConta)
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.ConsistemLog).ObterNamespaceAgendamentoLog(.namespace)
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.Utils2).ValidarServidorOficial(namespace)
 if $$$ISERR(sc) quit $$$OK
 
 lock +Src2ConsistemLog:0
 else  quit $$$OK
 
 set sc = ##class(Src2.ConsistemLog).TransferirLogReenvio()
 
 set sc = ##class(Src2.ConsistemLog).TransferirLogEnvio()
 
 set sc = ##class(Src2.ConsistemLog).TransferirPesquisas()
 
 set sc = ##class(Src2.PatchUtils).AtualizarVersoesConsistem(codConta)
 
 lock -Src2ConsistemLog
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TransferirLogEnvio">
<Description>

Transferir Log Consistem - Envio Padrão
</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set csw1logcfg1 = $get(^%CSW1LOGCFG(1))
 
 set dataInicio = $piece(csw1logcfg1,"^",4)
 set dataFim = $piece(csw1logcfg1,"^",5)
 if (dataFim = "") set dataFim = $horolog - 1
 if (dataFim > ($horolog - 1)) set dataFim = $horolog - 1
 
 set data = dataInicio - 1
 for  {
   set data = $order(^%CSWLOGUDT(data))
   if (data = "") ! (data > dataFim) quit
   
   if ($data(^%CSW1LOGCFG(3,data))) continue
   
   set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
   
   set sc = ##class(Src2.ConsistemLog).TransfLogWebService(data)
   if $$$ISERR(sc) quit
   
   set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, , .tempoTotal)
   
   set ^%CSW1LOGCFG(3,data) = 1_"^"_tempoTotal_"^"_$horolog
   
   write !,"Log Envio: ",$zdate(data,4)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TransferirLogReenvio">
<Description>

Transferir Log Consistem - Reenvio
</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set csw1logcfg1 = $get(^%CSW1LOGCFG(1))
 
 set dataInicio = $piece(csw1logcfg1,"^",6)
 set dataFim = $piece(csw1logcfg1,"^",7)
 
 if (dataInicio = "") ! (dataFim = "") quit $$$OK
 
 if (dataFim > ($horolog - 1)) set dataFim = $horolog - 1
 
 set flgErro = 0
 
 set data = dataInicio - 1
 for  {
   set data = $order(^%CSWLOGUDT(data))
   if (data = "") ! (data > dataFim) quit
   
   set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
   
   set sc = ##class(Src2.ConsistemLog).TransfLogWebService(data)
   if $$$ISERR(sc) set flgErro = 1 quit
   
   set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, , .tempoTotal)
   
   set ^%CSW1LOGCFG(3,data) = 2_"^"_tempoTotal_"^"_$horolog
   
   write !,"Log Reenvio: ",$zdate(data,4)
 }
 
 if ('flgErro) {
   set $piece(^%CSW1LOGCFG(1),"^",6) = ""
   set $piece(^%CSW1LOGCFG(1),"^",7) = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TransfLogWebService">
<Description>

Transferir Log - WebService

set sc = ##class(Src2.ConsistemLog).TransfLogWebService()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>data:%Date</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set objService = ##class(Src2.Web.Cliente.ConsistemLogSoap).%New()
 
 set sc = $$$OK
 
 try {
   set sc = objService.TransferirLog(##class(Src2.ConsistemLog).ObterLogConsistem(data))
 } catch {
   if $zerror["<ZSOAP>" { set sc = $get(%objlasterror) }
   else { set sc = $$$ERROR($$$CacheError,$zerror) }
   set sc2 = ##class(Src2.ConsistemLog).GerarLogErro(2, sc, data)
 }
 
 quit sc
]]></Implementation>
</Method>

<Method name="ObterLogConsistem">
<Description>

Obter Log Consistem
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>data:%Date</FormalSpec>
<ReturnType>Src2.Log.Dados</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.ConsistemLog).ObterContaCliente(.codConta)
 
 set sc = ##class(Src2.Utils2).ObterDadosServidor(.macAddress)
 
 set sc = ##class(Src2.PatchUtils).ObterVersaoProdutoCliente("cswutil", .versao)
 set sc = ##class(Src2.Utils2).ObterVersao(versao, .versao)
 
 set objLogDados = ##Class(Src2.Log.Dados).%New()
 
 set objLogDados.codConta = codConta
 set objLogDados.data = data
 set objLogDados.tipo = 1
 set objLogDados.macAddress = macAddress
 set objLogDados.versao = versao
 set objLogDados.logsUso = ##class(Src2.ConsistemLog).ObterLogUso(data)
 
 quit objLogDados
]]></Implementation>
</Method>

<Method name="ObterLogUso">
<Description>

Obter Log de Uso

set sc = ##class(Src2.ConsistemLog).ObterLogUso($zdateh("06/05/2014",4))</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>data:%Date</FormalSpec>
<ReturnType>%ListOfObjects</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.ConsistemLog).PrepararLog(data)
 
 set list = ##class(%ListOfObjects).%New()
 
 set (proprama, tipoInterface, tipoMenu) = ""
 for  {
   set proprama = $order(^mtempSrc2ConsistemLog(proprama))
   if (proprama = "") quit
   for  {
     set tipoInterface = $order(^mtempSrc2ConsistemLog(proprama,tipoInterface))
     if (tipoInterface = "") quit
     for  {
       set tipoMenu = $order(^mtempSrc2ConsistemLog(proprama,tipoInterface,tipoMenu))
       if (tipoMenu = "") quit
       set var = $get(^mtempSrc2ConsistemLog(proprama,tipoInterface,tipoMenu))
       
       set objLogUso = ##Class(Src2.Log.LogUso).%New()
       set objLogUso.programa = proprama
       set objLogUso.tipoInterface = tipoInterface
       set objLogUso.tipoMenu = tipoMenu
       set objLogUso.tempo = $piece(var,"^",1)
       set objLogUso.qtdAcessos = $piece(var,"^",2)
       set objLogUso.qtdQuebras = $piece(var,"^",3)
       set objLogUso.nrChamadaGatInter = $piece(var,"^",4)
       set objLogUso.nrChamadaGatRegra = $piece(var,"^",5)
       
       set sc = list.Insert(objLogUso)
     }
   }
 }
 
 kill ^mtempSrc2ConsistemLog
 
 quit list
]]></Implementation>
</Method>

<Method name="PrepararLog">
<Description>

Preparar Log para Envio

set sc = ##class(Src2.ConsistemLog).PrepararLog($zdateh("06/05/2014",4))</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>data:%Date</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill ^mtempSrc2ConsistemLog
 
 set idLogUso = ""
 for  {
   set idLogUso = $order(^%CSWLOGUDT(data,idLogUso))
   if (idLogUso = "") quit
   set cswloguso = $get(^%CSWLOGUSO(1,idLogUso))
   
   set proprama = $piece(cswloguso,"^",1)
   set tipoInterface = +$piece(cswloguso,"^",11)
   set tipoMenu = +$piece(cswloguso,"^",13)
   set tipoAcesso = +$piece(cswloguso,"^",12)
   set sessao = $piece(cswloguso,"^",14)
   set nrChamadaGatInter = $piece(cswloguso,"^",15)
   set nrChamadaGatRegra = $piece(cswloguso,"^",16)
   
   set acesso = 0
   if (tipoAcesso = 0) ! (tipoAcesso = 1) set acesso = 1
   
   if ($piece(cswloguso,"^",10) = "") {
     set quebra = 0
     if (sessao = "") ! ((sessao '= "") && ('$data(^mtempCSWLOGUSOROT(proprama,1,sessao)))) set quebra = 1
     
     set var = $get(^mtempSrc2ConsistemLog(proprama,tipoInterface,tipoMenu))
     set $piece(var,"^",2) = $piece(var,"^",2) + acesso
     set $piece(var,"^",3) = $piece(var,"^",3) + quebra
     set $piece(var,"^",4) = $piece(var,"^",4) + nrChamadaGatInter
     set $piece(var,"^",5) = $piece(var,"^",5) + nrChamadaGatRegra
     set ^mtempSrc2ConsistemLog(proprama,tipoInterface,tipoMenu) = var
     continue
   }
   
   set dataHoraInicio = $piece(cswloguso,"^",7)_","_$piece(cswloguso,"^",8)
   set dataHoraFim = $piece(cswloguso,"^",9)_","_$piece(cswloguso,"^",10)
   
   set sc = ##class(Src2.Utils).CalcularPeriodo(dataHoraInicio, dataHoraFim, , .segundos)
   
   if (segundos '> 0) continue
   
   // Tempo de Uso - Segundos
   set var = $get(^mtempSrc2ConsistemLog(proprama,tipoInterface,tipoMenu))
   set $piece(var,"^",1) = $piece(var,"^",1) + segundos
   set $piece(var,"^",2) = $piece(var,"^",2) + acesso
   set $piece(var,"^",4) = $piece(var,"^",4) + nrChamadaGatInter
   set $piece(var,"^",5) = $piece(var,"^",5) + nrChamadaGatRegra
   set ^mtempSrc2ConsistemLog(proprama,tipoInterface,tipoMenu) = var
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarAgendamento">
<Description>

Atualizar Agendamento

set sc = ##class(Src2.ConsistemLog).AtualizarAgendamento()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set csw1logcfg1 = $get(^%CSW1LOGCFG(1))
 
 set hora = $piece(csw1logcfg1,"^",3)
 set idTarefa = $piece(csw1logcfg1,"^",8)
 
 if ($piece(csw1logcfg1,"^",1) '= 1) {
   if (idTarefa '= "") {
     set sc = ##Class(%SYSTEM.Task).%DeleteId(idTarefa)
   }
   set $piece(^%CSW1LOGCFG(1),"^",8) = ""
   quit $$$OK
 }
 
 if (hora = "") quit $$$OK
 
 set sc = ##class(Src2.ConsistemLog).AgendarLogConsistem(.idTarefa, hora, .namespace)
 if $$$ISERR(sc) {
   set sc = ##class(Src2.ConsistemLog).GerarLogErro(4, sc)
 }
 
 set $piece(^%CSW1LOGCFG(1),"^",8) = idTarefa
 set $piece(^%CSW1LOGCFG(1),"^",9) = namespace
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AgendarLogConsistem">
<Description>

Agendar Log Consistem

set sc = ##class(Src2.ConsistemLog).AgendarLogConsistem(.idTarefa)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&idTarefa:%String,hora:%Time,&namespace:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set task = ""
 
 set sc = ##class(Src2.ConsistemLog).ObterNamespaceAgendamentoLog(.namespace)
 if $$$ISERR(sc) quit sc
 
 set idTarefa = $get(idTarefa)
 
 if (idTarefa '= "") {
   set task = ##Class(%SYSTEM.Task).%OpenId(idTarefa)
 }
 
 if (task = "") set task = ##Class(%SYSTEM.Task).%New()
 
 set task.Name = "Log Consistem"
 set task.NameSpace = namespace
 set task.TaskClass = "%SYS.Task.RunLegacyTask"
 set task.Settings = $listbuild("ExecuteCode","do ##class(Src2.ConsistemLog).TransferirLog()")
 set task.RunAsUser = "_SYSTEM"
 set task.Description = "Log Consistem"
 set task.DailyFrequency = 0
 set task.DailyFrequencyTime = 0
 set task.DailyIncrement = ""
 set task.StartDate = +$horolog
 set task.EndDate = ""
 set task.DailyStartTime = hora
 set task.DailyEndTime = hora
 set task.Expires = 1
 set task.IsBatch = 1
 set task.RescheduleOnStart = 1
 set task.EmailOnError = "gestor.desenvolvimento@consistem.com.br"
 
 set sc = task.%Save()
 if $$$ISERR(sc) quit sc
 
 set idTarefa = task.%Id()
 
 set task=""
 
 set sc = ##Class(%SYSTEM.Task).Resume(idTarefa)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TransferirPesquisas">
<Description>

Transferir Pesquisas

set sc = ##class(Src2.ConsistemLog).TransferirPesquisas()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.ConsistemLog).ExecutarPesquisas(.tabPesquisas, .variaveis)
 if $$$ISERR(sc) quit $$$OK
 
 set sc = ##class(Src2.ConsistemLog).ObterContaCliente(.codConta)
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.Utils2).ObterDadosServidor(.macAddress)
 
 set sc = ##class(Src2.PatchUtils).ObterVersaoProdutoCliente("cswutil", .versao)
 set sc = ##class(Src2.Utils2).ObterVersao(versao, .versao)
 
 set objLogDados = ##Class(Src2.Log.Dados).%New()
 
 set objLogDados.codConta = codConta
 set objLogDados.data = +$horolog
 set objLogDados.tipo = 2
 set objLogDados.macAddress = macAddress
 set objLogDados.versao = versao
 set objLogDados.variaveis = variaveis
 
 set objService = ##class(Src2.Web.Cliente.ConsistemLogSoap).%New()
 
 set sc = $$$OK
 
 try {
   set sc = objService.TransferirLog(objLogDados)
   
   set codPesquisa = ""
   for  {
     set codPesquisa = $order(tabPesquisas(codPesquisa))
     if (codPesquisa = "") quit
     kill ^%CSW1LOGCFG(2,codPesquisa)
     set ^%CSW1LOGCFG(4,codPesquisa) = ""
   }
   
   write !,"Pesquisa Envio: ",$zdate(+$horolog,4)
 } catch {
   if $zerror["<ZSOAP>" { set sc = $get(%objlasterror) }
   else { set sc = $$$ERROR($$$CacheError,$zerror) }
   set sc2 = ##class(Src2.ConsistemLog).GerarLogErro(3, sc, +$horolog)
 }
 
 quit sc
]]></Implementation>
</Method>

<Method name="ExecutarPesquisas">
<Description>

Executar Pesquisas
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabPesquisas:%String,&variaveis:%ListOfObjects]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabPesquisas
 
 set variaveis = ##class(%ListOfObjects).%New()
 
 set (codPesquisa, flag) = ""
 for  {
   set codPesquisa = $order(^%CSW1LOGCFG(2,codPesquisa))
   if (codPesquisa = "") quit
   
   set sc = ##class(Src2.ConsistemLog).ExecutarPesquisa(codPesquisa, .tabDados)
   if $$$ISERR(sc) continue
   
   set tabPesquisas(codPesquisa) = ""
   
   set variavel = ""
   for  {
     set variavel = $order(tabDados(variavel))
     if (variavel = "") quit
     set objLogVariavel = ##Class(Src2.Log.Variavel).%New()
     set objLogVariavel.codPesquisa = codPesquisa
     set objLogVariavel.nome = variavel
     set objLogVariavel.valor = $get(tabDados(variavel))
     
     set sc = variaveis.Insert(objLogVariavel)
     
     set flag = 1
   }
 }
 
 if ('flag) quit $$$ERROR(10000,"Não existem dados para retorno!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExecutarPesquisa">
<Description>

Executar Pesquisa
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codPesquisa:%Integer,&tabDados:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set cswloguso2 = $get(^%CSW1LOGCFG(2,codPesquisa))
 
 kill tabDados
 
 set sc = $$$OK
 
 try {
   kill ^mtempSrc2ConsistemLog
   xecute "do "_cswloguso2_"(.tabDados)"
   xecute "merge ^mtempSrc2ConsistemLog=tabDados kill tabDados"
   merge tabDados = ^mtempSrc2ConsistemLog
   kill ^mtempSrc2ConsistemLog
 } catch {
   set sc = $$$ERROR($$$CacheError,$zerror)
   set ^%CSW1LOGCFG(2,codPesquisa,1) = $zerror
 }
 
 quit sc
]]></Implementation>
</Method>

<Method name="GerarLogErro">
<Description>

Gerar Log de Erro
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>origem:%Integer,sc:%Status,dataRef:%Date</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codSeqErro = $order(^%CSW1LOGCFG(5,""),-1) + 1
 set ^%CSW1LOGCFG(5,codSeqErro) = $get(origem)_"^"_$get(dataRef)_"^"_$horolog_"^"_$znspace
 set ^%CSW1LOGCFG(5,codSeqErro,1) = ##class(Src2.Utils).ObterMensagemStatusCode(sc)
 set ^%CSW1LOGCFG(5,codSeqErro,2) = sc
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterNamespaceAgendamentoLog">
<Description>

Obter Namespace para Agendamento do Log

set sc = ##class(Src2.ConsistemLog).ObterNamespaceAgendamentoLog(.namespace)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&namespace:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set namespace = ""
 
 if ($piece($get(^%CSW1ATUCONF(4,"SISTEMAS")),"^",1) = "sistemas") {
   set namespace = "SISTEMAS"
   quit $$$OK
 }
 
 if ($piece($get(^%CSW1ATUCONF(4,"CONSISTEM")),"^",1) = "sistemas") {
   set namespace = "CONSISTEM"
   quit $$$OK
 }
 
 set namespace2 = ""
 for  {
   set namespace2 = $order(^%CSW1ATUCONF(4,namespace2))
   if (namespace2 = "") quit
   if ($piece($get(^%CSW1ATUCONF(4,namespace2)),"^",1) '= "sistemas") continue
   set namespace = namespace2
   quit
 }
 
 if (namespace = "") quit $$$ERROR(10000,"Namespace para agendamento não encontrado!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterContaCliente">
<Description>

Obter Conta Cliente

set sc = ##class(Src2.ConsistemLog).ObterContaCliente(.codConta)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&codConta:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.ConsistemLog).ObterNamespaceAgendamentoLog(.namespace)
 if $$$ISERR(sc) quit sc
 
 set nspOrigem = $znspace
 
 try {
   if (namespace '= "") & (nspOrigem '= namespace) znspace namespace
 } catch {
   set namespace = nspOrigem
 }
 
 set codConta = $piece($get(^%CSMENCF),"^",10)
 
 if (codConta '= "") && ($piece($get(^%CSW1CONTAAGRUP(codConta)),"^",1) '= "") {
   set codConta = $piece($get(^%CSW1CONTAAGRUP(codConta)),"^",1)
 }
 
 if (codConta = "") {
   if (namespace '= "") & (nspOrigem '= namespace) znspace nspOrigem
   quit $$$ERROR(10000,"Conta do cliente não encontrada!")
 }
 
 if (namespace '= "") & (nspOrigem '= namespace) znspace nspOrigem
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Dados.ChAdapcon">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>0</SqlRowIdPrivate>
<StorageStrategy>Src2DadosChAdapconStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62948,53722.654435</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Linhas alteradas por chamado da Adapcon</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="chamado">
<Description>
Chamado Adapcon</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="nrLinhasAlter">
<Description>
Número de linhas alteradas</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>chamado</Properties>
</Index>

<Storage name="Src2DadosChAdapconStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosChAdapconS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2DadosChAdapconMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosChAdapcon</Global>
<Subscript name="1">
<Expression>{chamado}</Expression>
</Subscript>
<Data name="nrLinhasAlter">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.ChAdapconRevisao">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>0</SqlRowIdPrivate>
<StorageStrategy>Src2DadosChAdapconStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62948,53698.804801</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Revisão por chamado da Adapcon</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="chamado">
<Description>
Chamado da Adapcon</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>chamado,urlRepositorio,nrRevisao</Properties>
</Index>

<Storage name="Src2DadosChAdapconStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosChAdapconRevisaoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2DadosChAdapconMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosChAdapcon</Global>
<Subscript name="1">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{nrRevisao}</Expression>
</Subscript>
<Subscript name="3">
<Expression>{chamado}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.Chamado">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>0</SqlRowIdPrivate>
<StorageStrategy>SvnStatChamadoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62145,39299.652469</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Linhas alteradas por chamado Gercon</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="chamado">
<Description>
Chamado Gercon</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="nrLinhasAlter">
<Description>
Número de linhas alteradas</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>chamado</Properties>
</Index>

<Storage name="SvnStatChamadoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosChamadoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="SvnStatChamadoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosChamado</Global>
<Subscript name="1">
<Expression>{chamado}</Expression>
</Subscript>
<Data name="nrLinhasAlter">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.ChamadoRevisao">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>0</SqlRowIdPrivate>
<StorageStrategy>SvnStatChamadoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62145,39299.654854</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Revisão por chamado</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="chamado">
<Description>
Chamado</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>chamado,urlRepositorio,nrRevisao</Properties>
</Index>

<Storage name="SvnStatChamadoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosChamadoRevisaoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="SvnStatChamadoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosChamado</Global>
<Subscript name="1">
<Expression>{chamado}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="3">
<Expression>{nrRevisao}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.Data">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>SvnStatDataStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62145,39299.657081</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Linhas alteradas por data</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="data">
<Description>
Data</Description>
<Type>%Date</Type>
<Required>1</Required>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="nrLinhasAlter">
<Description>
Número de linhas alteradas</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>data</Properties>
</Index>

<Storage name="SvnStatDataStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosDataS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="SvnStatDataMap">
<Type>data</Type>
<Global>^Src2DadosData</Global>
<Subscript name="1">
<Expression>{data}</Expression>
</Subscript>
<Data name="nrLinhasAlter">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.DataRevisao">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>SvnStatDataStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62145,39299.659118</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Revisão por data</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="data">
<Description>
Data</Description>
<Type>%Date</Type>
<Required>1</Required>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>data,urlRepositorio,nrRevisao</Properties>
</Index>

<Storage name="SvnStatDataStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosDataRevisaoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="SvnStatDataMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosData</Global>
<Subscript name="1">
<Expression>{data}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="3">
<Expression>{nrRevisao}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.Projeto">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>SvnStatProjetoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62145,39299.661356</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Linhas alteradas do projeto</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="projeto">
<Description>
Projeto</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="nrLinhasAlter">
<Description>
Número de linhas alteradas</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>projeto</Properties>
</Index>

<Storage name="SvnStatProjetoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosProjetoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="SvnStatProjetoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosProjeto</Global>
<Subscript name="1">
<Expression>{projeto}</Expression>
</Subscript>
<Data name="nrLinhasAlter">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.ProjetoRevisao">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>SvnStatProjetoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62145,39299.664015</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Revisão por projeto</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="projeto">
<Description>
Projeto</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>projeto,urlRepositorio,nrRevisao</Properties>
</Index>

<Storage name="SvnStatProjetoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosProjetoRevisaoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="SvnStatProjetoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosProjeto</Global>
<Subscript name="1">
<Expression>{projeto}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="3">
<Expression>{nrRevisao}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.Revisao">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>SvnStatRevisaoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62145,39299.667884</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Revisão</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="autor">
<Description>
Autor</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="dataCalculo">
<Description>
Data do cálculo - Sistema</Description>
<Type>%Date</Type>
<Required>1</Required>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="horaCalculo">
<Description>
Hora do cálculo - Sistema</Description>
<Type>%Time</Type>
<Required>1</Required>
</Property>

<Property name="nrLinhasAlter">
<Description>
Número de linhas alteradas</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>urlRepositorio,nrRevisao</Properties>
</Index>

<Storage name="SvnStatRevisaoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosRevisaoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="SvnStatRevisaoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosRevisao</Global>
<Subscript name="1">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{nrRevisao}</Expression>
</Subscript>
<Subscript name="3">
<Expression>1</Expression>
</Subscript>
<Data name="autor">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
<Data name="dataCalculo">
<Delimiter>"^"</Delimiter>
<Piece>2</Piece>
</Data>
<Data name="horaCalculo">
<Delimiter>"^"</Delimiter>
<Piece>3</Piece>
</Data>
<Data name="nrLinhasAlter">
<Delimiter>"^"</Delimiter>
<Piece>4</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.RevisaoChamAdap">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>0</SqlRowIdPrivate>
<StorageStrategy>Src2DadosRevisaoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62948,52852.970912</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Chamado Adapcon da revisão</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="chamado">
<Description>
Chamado Adapcon</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>urlRepositorio,nrRevisao,chamado</Properties>
</Index>

<Storage name="Src2DadosRevisaoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosRevisaoChamAdapS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2DadosRevisaoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosRevisao</Global>
<Subscript name="1">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{nrRevisao}</Expression>
</Subscript>
<Subscript name="3">
<Expression>9</Expression>
</Subscript>
<Subscript name="4">
<Expression>{chamado}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.RevisaoChamado">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>SvnStatRevisaoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62145,39299.670815</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Chamado da revisão</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="chamado">
<Description>
Chamado</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>urlRepositorio,nrRevisao,chamado</Properties>
</Index>

<Storage name="SvnStatRevisaoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosRevisaoChamadoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="SvnStatRevisaoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosRevisao</Global>
<Subscript name="1">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{nrRevisao}</Expression>
</Subscript>
<Subscript name="3">
<Expression>3</Expression>
</Subscript>
<Subscript name="4">
<Expression>{chamado}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.RevisaoClasse">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>0</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>Src2DadosRevisaoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62948,51830.895602</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Linhas alteradas na revisão por classe</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="classe">
<Description>
Classe</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrLinhasAlter">
<Description>
Número de linhas alteradas</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>urlRepositorio,nrRevisao,classe</Properties>
</Index>

<Storage name="Src2DadosRevisaoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosRevisaoClasseS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2DadosRevisaoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosRevisao</Global>
<Subscript name="1">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{nrRevisao}</Expression>
</Subscript>
<Subscript name="3">
<Expression>6</Expression>
</Subscript>
<Subscript name="4">
<Expression>{classe}</Expression>
</Subscript>
<Data name="nrLinhasAlter">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.RevisaoMensagem">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>SvnStatRevisaoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62145,39299.673603</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Mensagem da revisão</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="mensagem">
<Description>
Mensagem</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="300"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>urlRepositorio,nrRevisao</Properties>
</Index>

<Storage name="SvnStatRevisaoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosRevisaoMensagemS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="SvnStatRevisaoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosRevisao</Global>
<Subscript name="1">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{nrRevisao}</Expression>
</Subscript>
<Subscript name="3">
<Expression>2</Expression>
</Subscript>
<Data name="mensagem">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.RevisaoProjeto">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>SvnStatRevisaoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62145,39299.676248</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Projeto da revisão</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="projeto">
<Description>
Projeto</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>urlRepositorio,nrRevisao,projeto</Properties>
</Index>

<Storage name="SvnStatRevisaoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosRevisaoProjetoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="SvnStatRevisaoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosRevisao</Global>
<Subscript name="1">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{nrRevisao}</Expression>
</Subscript>
<Subscript name="3">
<Expression>4</Expression>
</Subscript>
<Subscript name="4">
<Expression>{projeto}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.RevisaoRotina">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>0</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>SvnStatRevisaoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62145,39299.679267</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Linhas alteradas na revisão por rotina</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="rotina">
<Description>
Rotina</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrLinhasAlter">
<Description>
Número de linhas alteradas</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>urlRepositorio,nrRevisao,rotina</Properties>
</Index>

<Storage name="SvnStatRevisaoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosRevisaoRotinaS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="SvnStatRevisaoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosRevisao</Global>
<Subscript name="1">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{nrRevisao}</Expression>
</Subscript>
<Subscript name="3">
<Expression>5</Expression>
</Subscript>
<Subscript name="4">
<Expression>{rotina}</Expression>
</Subscript>
<Data name="nrLinhasAlter">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.RevisaoTicketKayako">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>0</SqlRowIdPrivate>
<StorageStrategy>Src2DadosRevisaoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62948,52937.267677</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Ticket Kayako</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="nrTicket">
<Description>
Ticket Kayako da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>urlRepositorio,nrRevisao,nrTicket</Properties>
</Index>

<Storage name="Src2DadosRevisaoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosRevisaoTicketKayakoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2DadosRevisaoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosRevisao</Global>
<Subscript name="1">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{nrRevisao}</Expression>
</Subscript>
<Subscript name="3">
<Expression>7</Expression>
</Subscript>
<Subscript name="4">
<Expression>{nrTicket}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.RevisaoTicketRedmine">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>0</SqlRowIdPrivate>
<StorageStrategy>Src2DadosRevisaoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62948,52939.85288</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Ticket Redmine</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="nrTicket">
<Description>
Ticket Redmine da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>urlRepositorio,nrRevisao,nrTicket</Properties>
</Index>

<Storage name="Src2DadosRevisaoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosRevisa8CDBS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2DadosRevisaoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosRevisao</Global>
<Subscript name="1">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{nrRevisao}</Expression>
</Subscript>
<Subscript name="3">
<Expression>8</Expression>
</Subscript>
<Subscript name="4">
<Expression>{nrTicket}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.TkKayako">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>0</SqlRowIdPrivate>
<StorageStrategy>Src2DadosTkKayakoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62948,53613.491696</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Linhas alteradas por ticket do Kayako</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="ticket">
<Description>
Ticket Kayako</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="nrLinhasAlter">
<Description>
Número de linhas alteradas</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>ticket</Properties>
</Index>

<Storage name="Src2DadosTkKayakoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosTkKayakoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2DadosTkKayakoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosTkKayako</Global>
<Subscript name="1">
<Expression>{ticket}</Expression>
</Subscript>
<Data name="nrLinhasAlter">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.TkKayakoRevisao">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>0</SqlRowIdPrivate>
<StorageStrategy>Src2DadosTkKayakoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62948,53610.890305</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Revisão por ticket do Kayako</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="ticket">
<Description>
Ticket do Kayako</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>ticket,urlRepositorio,nrRevisao</Properties>
</Index>

<Storage name="Src2DadosTkKayakoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosTkKayakoRevisaoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2DadosTkKayakoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosTkKayako</Global>
<Subscript name="1">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{nrRevisao}</Expression>
</Subscript>
<Subscript name="3">
<Expression>{ticket}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.TkRedmine">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>0</SqlRowIdPrivate>
<StorageStrategy>Src2DadosTkRedmineStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>61727,0</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Linhas alteradas por ticket do Redmine</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="ticket">
<Description>
Ticket Redmine</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="nrLinhasAlter">
<Description>
Número de linhas alteradas</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>ticket</Properties>
</Index>

<Storage name="Src2DadosTkRedmineStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosTkRedmineS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2DadosTkRedmineMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosTkRedmine</Global>
<Subscript name="1">
<Expression>{ticket}</Expression>
</Subscript>
<Data name="nrLinhasAlter">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados.TkRedmineRevisao">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>0</SqlRowIdPrivate>
<StorageStrategy>Src2DadosTkRedmineStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62948,53644.540638</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn estatística</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Revisão por ticket do Redmine</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="ticket">
<Description>
Ticket do Redmine</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="urlRepositorio">
<Description>
URL do repositório</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nrRevisao">
<Description>
Número da revisão</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>ticket,urlRepositorio,nrRevisao</Properties>
</Index>

<Storage name="Src2DadosTkRedmineStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosTkRedmineRevisaoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2DadosTkRedmineMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2DadosTkRedmine</Global>
<Subscript name="1">
<Expression>{urlRepositorio}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{nrRevisao}</Expression>
</Subscript>
<Subscript name="3">
<Expression>{ticket}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Dados">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>62145,39299.649005</TimeCreated>

<Method name="AtualizarLog">
<Description>

Atualizar Log de Dados do SVN no Gercon

regerar = 0 - Importa as revisões não importadas de todos os repositórios
          1 - Mata e gera a base de todos os repositórios
          2 - Regera a base de todos os repositórios

projetoInf = URL do repositório (regerar = 0)

intervRev = Intervalo de revisão ou revisão (regerar = 0)
            "3720" ou "3720:3760" ou "3720:" ou ":3720"

set sc = ##class(Src2.Dados).AtualizarLog(,,,,"admin","*****")
set sc = ##class(Src2.Dados).AtualizarLog(1,,,,"admin","*****")
set sc = ##class(Src2.Dados).AtualizarLog(2,,,,"admin","*****")
set sc = ##class(Src2.Dados).AtualizarLog(,"csw63", ,"37:","admin","*****")
set sc = ##class(Src2.Dados).AtualizarLog(,"csw63", ,"3720:3760","admin","*****")
set sc = ##class(Src2.Dados).AtualizarLog(,"csw63", ,"4:6","admin","*****")
set sc = ##class(Src2.Dados).AtualizarLog(,, "http://192.168.15.10:18080/svn/csw","11","admin","*****")

OBS: Método utilizado pelo Gercon</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>regerar:%Status=0,projetoInf:%Status="",urlRepositorioInf:%Status="",intervRev:%Status="",username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoDiff)
 if (sc '= 1) quit $$$ERROR(10000,sc)
 
 set sc = ##class(Src2.Utils).UpdateConfigGeralWorkspace(.nrRevisao)
 if (sc '= 1) quit $$$ERROR(10000,sc)
 
 set sc = ##class(Src2.UtilsXml).ObterProjetosXML(.tabProjetos)
 if (sc '= 1) quit $$$ERROR(10000,sc)
 
 set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 lock +Src2Dados:0
 else  quit $$$ERROR(10000,"Importação dos commits do Subversion sendo realizada por outro usuário!")
 
 if (regerar = 1) {
   kill ^Src2DadosRevisao
   kill ^Src2DadosData
   kill ^Src2DadosChamado
   kill ^Src2DadosChAdapcon
   kill ^Src2DadosProjeto
   kill ^Src2DadosTkKayako
   kill ^Src2DadosTkRedmine
   set (projetoInf, urlRepositorioInf, intervRev) = ""
 }
 
 set projeto = ""
 for {
   set projeto = $order(tabProjetos(projeto))
   if (projeto = "") quit
   
   if ('$data(tabProjetos(projeto))) continue
   
   set varProjetos = $get(tabProjetos(projeto))
   
   if ($piece(varProjetos,"^",4) '= 1) continue
   
   set urlRepositorio = $piece(varProjetos,"^",2)
   
   if (projetoInf '= "") & (projeto '= projetoInf) continue
   
   if (urlRepositorioInf '= "") & (urlRepositorio '[ (urlRepositorioInf_"/")) continue
   
   set revInicioLog = $piece(varProjetos,"^",11)
   
   set revInicio = +$order(^Src2DadosRevisao(projeto,""),-1)
   set revFim = "head"
   
   if (projetoInf '= "") ! (urlRepositorioInf '= "") {
     if (intervRev [ ":") {
       set revInicio = $piece(intervRev,":",1)
       set revFim = $piece(intervRev,":",2)
     } else {
       set (revInicio,revFim) = intervRev
     }
   }
   
   if (regerar = 2) {
     set revInicio = 0
     set revFim = "head"
   }
   
   if (revInicio = "") set revInicio = "0"
   if (revFim = "") set revFim = "head"
   
   if (revInicio = "0") & (revInicioLog '= "") {
     set revInicio = revInicioLog
   }
   
   set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "log --xml -r "_revInicio_":"_revFim_" "_urlRepositorio, , , autenticacao, arquivoTemp)
   if (sc '= $$$OK) continue
   
   if ('##class(%File).Exists(arquivoTemp)) continue
   
   set sc = ##class(%XML.TextReader).ParseFile(arquivoTemp,.reader)
   if $$$ISERR(sc) continue
   
   set (path, revisao, author, date) = ""
   
   while (reader.Read()) {
     if (reader.Path '= "") { set path = reader.Path }
     
     if (reader.NodeType = "element") , (reader.Path = "/log/logentry") {
       if reader.MoveToAttributeName("revision") set revisao = reader.Value
       set (author, date, message) = ""
     }
     
     if (reader.NodeType = "chars") , (path = "/log/logentry/msg") {
       set message = reader.Value
     }
     
     if (reader.NodeType = "chars") , (path = "/log/logentry/author") {
       set author = reader.Value
     }
     
     if (reader.NodeType = "chars") , (path = "/log/logentry/date") {
       set date = reader.Value
     }
     
     if (reader.NodeType = "endelement") , (reader.Depth = "1") {
       if (revisao '= "") {
         set sc = ##class(Src2.Dados).GravarRevisao(caminhoSvn, urlRepositorio, projeto, revisao, author, date, message, arquivoDiff, autenticacao)
       }
     }
   }
 }
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 lock -Src2Dados
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarRevisao">
<ClassMethod>1</ClassMethod>
<FormalSpec>caminhoSvn:%String,urlRepositorio:%String,projeto:%String,revisao:%String,author:%String,date:%String,message:%String,arquivoDiff:%String,autenticacao:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Dados).ExcluirRevisao(projeto, revisao)
 
 set sc = ##class(Src2.Dados).ObterInfMessage(message, .tabChamados, .tabProjetosDes, .tabTicketKayako, .tabTicketRedmine, .tabChamadosAdapcon)
 
 if ('$data(tabChamados)) & ('$data(tabProjetosDes)) & ('$data(tabTicketKayako)) & ('$data(tabTicketRedmine)) & ('$data(tabChamadosAdapcon)) quit $$$OK
 
 set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "diff --old="_urlRepositorio_"@"_(revisao-1)_" --new="_urlRepositorio_"@"_revisao, , , autenticacao, arquivoDiff)
 if (sc '= $$$OK) quit $$$ERROR(10000,sc)
 
 set sc = ##class(Src2.Dados).ObterDataHora(date, .data, .hora)
 
 set sc = ##class(Src2.Dados).LerDiff(arquivoDiff, .tabItens)
 
 set nrLinhas = +$piece($get(tabItens),"^",1)
 
 zkill tabItens
 
 set ^Src2DadosRevisao(projeto,revisao,1) = author_"^"_data_"^"_hora_"^"_nrLinhas
 set ^Src2DadosRevisao(projeto,revisao,2) = message
 merge ^Src2DadosRevisao(projeto,revisao,3) = tabChamados
 merge ^Src2DadosRevisao(projeto,revisao,4) = tabProjetosDes
 merge ^Src2DadosRevisao(projeto,revisao,5) = tabItens(1)
 merge ^Src2DadosRevisao(projeto,revisao,6) = tabItens(2)
 merge ^Src2DadosRevisao(projeto,revisao,7) = tabTicketKayako
 merge ^Src2DadosRevisao(projeto,revisao,8) = tabTicketRedmine
 merge ^Src2DadosRevisao(projeto,revisao,9) = tabChamadosAdapcon
 
 set ^Src2DadosData(data) = $get(^Src2DadosData(data)) + nrLinhas
 set ^Src2DadosData(data,projeto,revisao) = ""
 
 set chamado = ""
 for {
   set chamado = $order(tabChamados(chamado))
   if (chamado = "") quit
   set ^Src2DadosChamado(chamado) = $get(^Src2DadosChamado(chamado)) + nrLinhas
   set ^Src2DadosChamado(chamado,projeto,revisao) = ""
 }
 
 set chamado = ""
 for {
   set chamado = $order(tabChamadosAdapcon(chamado))
   if (chamado = "") quit
   set ^Src2DadosChAdapcon(chamado) = $get(^Src2DadosChAdapcon(chamado)) + nrLinhas
   set ^Src2DadosChAdapcon(chamado,projeto,revisao) = ""
 }
 
 set projetoDes = ""
 for {
   set projetoDes = $order(tabProjetosDes(projetoDes))
   if (projetoDes = "") quit
   set ^Src2DadosProjeto(projetoDes) = $get(^Src2DadosProjeto(projetoDes)) + nrLinhas
   set ^Src2DadosProjeto(projetoDes,projeto,revisao) = ""
 }
 
 set ticketKayako = ""
 for {
   set ticketKayako = $order(tabTicketKayako(ticketKayako))
   if (ticketKayako = "") quit
   set ^Src2DadosTkKayako(ticketKayako) = $get(^Src2DadosTkKayako(ticketKayako)) + nrLinhas
   set ^Src2DadosTkKayako(ticketKayako,projeto,revisao) = ""
 }
 
 set ticketRedmine = ""
 for {
   set ticketRedmine = $order(tabTicketRedmine(ticketRedmine))
   if (ticketRedmine = "") quit
   set ^Src2DadosTkRedmine(ticketRedmine) = $get(^Src2DadosTkRedmine(ticketRedmine)) + nrLinhas
   set ^Src2DadosTkRedmine(ticketRedmine,projeto,revisao) = ""
 }
 
 set sc = ##class(%File).Delete(arquivoDiff)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirRevisao">
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,revisao:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ('$data(^Src2DadosRevisao(projeto,revisao,1))) quit $$$OK
 
 set SvnStatRevisao = $get(^Src2DadosRevisao(projeto,revisao,1))
 
 set data = $piece(SvnStatRevisao,"^",2)
 
 set nrLinhas = $piece(SvnStatRevisao,"^",4)
 
 merge tabChamados = ^Src2DadosRevisao(projeto,revisao,3)
 merge tabProjetosDes = ^Src2DadosRevisao(projeto,revisao,4)
 merge tabTicketKayako = ^Src2DadosRevisao(projeto,revisao,7)
 merge tabTicketRedmine = ^Src2DadosRevisao(projeto,revisao,8)
 merge tabChamadosAdapcon = ^Src2DadosRevisao(projeto,revisao,9)
 
 kill ^Src2DadosRevisao(projeto,revisao)
 
 set ^Src2DadosData(data) = $get(^Src2DadosData(data)) - nrLinhas
 kill ^Src2DadosData(data, projeto, revisao)
 if ($order(^Src2DadosData(data,"")) = "") {
   kill ^Src2DadosData(data)
 }
 
 set chamado = ""
 for {
   set chamado = $order(tabChamados(chamado))
   if (chamado = "") quit
   set ^Src2DadosChamado(chamado) = $get(^Src2DadosChamado(chamado)) - nrLinhas
   kill ^Src2DadosChamado(chamado, projeto, revisao)
   if ($order(^Src2DadosChamado(chamado,"")) = "") {
     kill ^Src2DadosChamado(chamado)
   }
 }
 
 set chamado = ""
 for {
   set chamado = $order(tabChamadosAdapcon(chamado))
   if (chamado = "") quit
   set ^Src2DadosChAdapcon(chamado) = $get(^Src2DadosChAdapcon(chamado)) - nrLinhas
   kill ^Src2DadosChAdapcon(chamado, projeto, revisao)
   if ($order(^Src2DadosChAdapcon(chamado,"")) = "") {
     kill ^Src2DadosChAdapcon(chamado)
   }
 }
 
 set projetoDes = ""
 for {
   set projetoDes = $order(tabProjetosDes(projetoDes))
   if (projetoDes = "") quit
   set ^Src2DadosProjeto(projetoDes) = $get(^Src2DadosProjeto(projetoDes)) - nrLinhas
   kill ^Src2DadosProjeto(projetoDes, projeto, revisao)
   if ($order(^Src2DadosProjeto(projetoDes,"")) = "") {
     kill ^Src2DadosProjeto(projetoDes)
   }
 }
 
 set ticketKayako = ""
 for {
   set ticketKayako = $order(tabTicketKayako(ticketKayako))
   if (ticketKayako = "") quit
   set ^Src2DadosTkKayako(ticketKayako) = $get(^Src2DadosTkKayako(ticketKayako)) - nrLinhas
   kill ^Src2DadosTkKayako(ticketKayako, projeto, revisao)
   if ($order(^Src2DadosTkKayako(ticketKayako,"")) = "") {
     kill ^Src2DadosTkKayako(ticketKayako)
   }
 }
 
 set ticketRedmine = ""
 for {
   set ticketRedmine = $order(tabTicketRedmine(ticketRedmine))
   if (ticketRedmine = "") quit
   set ^Src2DadosTkRedmine(ticketRedmine) = $get(^Src2DadosTkRedmine(ticketRedmine)) - nrLinhas
   kill ^Src2DadosTkRedmine(ticketRedmine, projeto, revisao)
   if ($order(^Src2DadosTkRedmine(ticketRedmine,"")) = "") {
     kill ^Src2DadosTkRedmine(ticketRedmine)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDataHora">
<Description>
set sc = ##class(Src2.Dados).ObterDataHora("2009-09-15T10:50:50.770115Z", .data, .hora)
set sc = ##class(Src2.Dados).ObterDataHora("2009-10-02T00:38:56.729879Z", .data, .hora)
set sc = ##class(Src2.Dados).ObterDataHora("2009-10-02T00:00:00.729879Z", .data, .hora)
set sc = ##class(Src2.Dados).ObterDataHora("2009-10-02T23:59:59.729879Z", .data, .hora)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>date:%String,data:%String,hora:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set data = $zdateh($piece(date,"T",1),3)
 
 set hora = $ztimeh($piece($piece(date,"T",2),".",1))
 
 if ((hora - 10800) < 0) {
   set data = data - 1
   set hora = 86400 + hora
 }
 
 set hora = hora - 10800
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfMessage">
<Description>
set sc = ##class(Src2.Dados).ObterInfMessage("[ CH167964] - Pro[TK33333]bl[#34]ema [CH - 123123]do #999999 para [ch45446] [ch = 987654] não [PJ23] teste.", .tabChamados, .tabProjetosDes, .tabTicketKayako, .tabTicketRedmine, .tabChamadosAdapcon, .flgMerge)
set sc = ##class(Src2.Dados).ObterInfMessage("Teste #343 casa #fixes  [MERGE]   teste", .tabChamados, .tabProjetosDes, .tabTicketKayako, .tabTicketRedmine, .tabChamadosAdapcon, .flgMerge)
set sc = ##class(Src2.Dados).ObterInfMessage("[ AS167964] - Pro[TK33333]bl[#34]ema [Merge] [AS - 123123]do #999999 para [as45446] [as = 987654] não [PJ23] teste.", .tabChamados, .tabProjetosDes, .tabTicketKayako, .tabTicketRedmine, .tabChamadosAdapcon, .flgMerge)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[mensagem:%String="",&tabChamados:%String,&tabProjetosDes:%String,&tabTicketKayako:%String,&tabTicketRedmine:%String,&tabChamadosAdapcon:%String,&flgMerge:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set flgMerge = 0
 
 kill tabChamados, tabProjetosDes, tabTicketKayako, tabTicketRedmine, tabChamadosAdapcon
 
 if (mensagem = "") quit $$$OK
 
 set mensagem = $zconvert(mensagem,"U")
 
 if (mensagem [ "[MERGE]") set flgMerge = 1
 
 for cont = 2:1:$length(mensagem,"[") {
   set var = $translate($piece($piece(mensagem,"[",cont),"]",1),"=- ","")
   
   set chamado = $piece(var,"CH",2)
   if (chamado '= "") & (chamado ?.N) { set tabChamados(chamado) = "" }
   
   set projetoDes = $piece(var,"PJ",2)
   if (projetoDes '= "") & (projetoDes ?.N) { set tabProjetosDes(projetoDes) = "" }
   
   set ticketKayako = $piece(var,"TK",2)
   if (ticketKayako '= "") & (ticketKayako ?.N) { set tabTicketKayako(ticketKayako) = "" }
   
   set ticketRedmine = $piece(var,"#",2)
   if (ticketRedmine '= "") & (ticketRedmine ?.N) { set tabTicketRedmine(ticketRedmine) = "" }
   
   set chamadoAdapcon = $piece(var,"AS",2)
   if (chamadoAdapcon '= "") & (chamadoAdapcon ?.N) { set tabChamadosAdapcon(chamadoAdapcon) = "" }
 }
 
 for cont=1:1:$length(mensagem," ") {
   set var = $piece(mensagem," ",cont)
   if ($extract(var,1) '= "#") continue
   if ($piece(var,"#",2) = "") ! ($piece(var,"#",2) '?.N) continue
   set tabTicketRedmine($piece(var,"#",2)) = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="LerDiff">
<Description>
set sc = ##class(Src2.Dados).LerDiff("C:\workspacecsw\temp\diff.txt", .tabItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[arquivoTemp:%String,&tabItens:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabItens
 
 if ('##class(%File).Exists(arquivoTemp)) quit $$$ERROR(10000,"Diff do Subversion não encontrado!")
 
 set (tipo, item) = ""
 
 set ler = 0
 
 set file = ##class(%File).%New(arquivoTemp)
 
 do file.Open("R")
 
 set tam = 32000
 set linha = file.Read(.tam)
 
 for {
   set tam = 32000
   set linha = file.Read(.tam)
   
   if (tam = -1) {
     set sc = ##class(Src2.Dados).GerarLinhas(tipo, item, .tabItens, .tabLinhas)
     quit
   }
   
   if ($extract(linha,1,4) = "+++ ") {
     kill tabLinhas
     set sc = ##class(Src2.Item).ObterItem($piece(linha,"+++ ",2), .tipo, .item)
     if (sc '= 1) continue
     set tabItens(tipo,item) = +$get(tabItens(tipo,item))
   }
   
   // Realiza a contagem das linhas somente para rotinas
   if (tipo '= 1) continue
   
   if ($extract(linha,1,3) = "@@ ") {
     set ler = 1
     continue
   }
   
   if $extract(linha,1,7) = "Index: " {
     set ler = 0
     set sc = ##class(Src2.Dados).GerarLinhas(tipo, item, .tabItens, .tabLinhas)
     continue
   }
   
   if ('ler) ! (item = "") continue
   
   set sinal = $extract(linha,1)
   if (sinal = " ") {
     set sc = ##class(Src2.Dados).GerarLinhas(tipo, item, .tabItens, .tabLinhas)
   } else {
     set $extract(linha,1) = ""
     if ('##class(Src2.Dados).LinhaComentada(linha)) {
       set tabLinhas(sinal) = $get(tabLinhas(sinal)) + 1
     }
   }
 }
 
 do file.Close()
 do file.%Close()
 set file=""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarLinhas">
<Description>
write ##class(Src2.Dados).GerarLinhas(item, .tabItens, .tabLinhas)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>tipo:%String,item:%String,tabItens:%String,tabLinhas:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (tipo = "") ! (item = "") quit $$$OK
 
 if ($get(tabLinhas("+")) > $get(tabLinhas("-"))) {
   set linhas = $get(tabLinhas("+"))
 } else {
   set linhas = $get(tabLinhas("-"))
 }
 
 set tabItens = $get(tabItens) + linhas
 set tabItens(tipo) = $get(tabItens(tipo)) + linhas
 set tabItens(tipo,item) = $get(tabItens(tipo,item)) + linhas
 
 kill tabLinhas
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="LinhaComentada">
<Description>
write ##class(Src2.Dados).LinhaComentada($get(^rMAC("CCTCP020",0,66)))
write ##class(Src2.Dados).LinhaComentada($get(^rMAC("CCTCP020",0,66)))</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>linha:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (linha [ "csw:") quit 0
 if ($translate($piece(linha,";",1),$char(9)_" .","") = "") quit $$$OK
 if ($translate($piece(linha,"//",1),$char(9)_" .","") = "") quit $$$OK
 quit 0
]]></Implementation>
</Method>
</Class>


<Class name="Src2.DadosLog.Config">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>CSW1LOGCFGStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>63440,56728.644044</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Controle de Fontes</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Log Consistem - Client</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Configuração do Log Consistem</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="situacao">
<Description>
Situação</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="DISPLAYLIST" value=",Inativo,Ativo"/>
<Parameter name="VALUELIST" value=",0,1"/>
</Property>

<Property name="dataConfig">
<Description>
Data da última atualização da configuração - Sistema</Description>
<Type>%Date</Type>
<Required>1</Required>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="horaConfig">
<Description>
Hora da última atualização da configuração - Sistema</Description>
<Type>%Time</Type>
<Required>1</Required>
</Property>

<Property name="horaAgendada">
<Description>
Hora do agendada para envio dos dados</Description>
<Type>%Time</Type>
<Required>1</Required>
</Property>

<Property name="dataInicioEnvio">
<Description>
Data início para envio dos dados</Description>
<Type>%Date</Type>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="dataFimEnvio">
<Description>
Data fim para envio dos dados</Description>
<Type>%Date</Type>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="dataInicioReenvio">
<Description>
Data início para reenvio dos dados</Description>
<Type>%Date</Type>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="dataFimReenvio">
<Description>
Data fim para reenvio dos dados</Description>
<Type>%Date</Type>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="codTask">
<Description>
Código da Task do Agendamento</Description>
<Type>%Integer</Type>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="1"/>
</Property>

<Property name="namespace">
<Description>
Namespace Configurado</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="30"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>

<Property name="fixa1">
<Description>
Fixa 1</Description>
<Type>%String</Type>
<Private>1</Private>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Index name="RowID">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>fixa1</Properties>
</Index>

<Storage name="CSW1LOGCFGStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosLog.ConfigS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="CSW1LOGCFGMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^%CSW1LOGCFG</Global>
<Subscript name="1">
<Expression>{fixa1}</Expression>
</Subscript>
<Data name="codTask">
<Delimiter>"^"</Delimiter>
<Piece>8</Piece>
</Data>
<Data name="dataConfig">
<Delimiter>"^",","</Delimiter>
<Piece>2,1</Piece>
</Data>
<Data name="dataFimEnvio">
<Delimiter>"^"</Delimiter>
<Piece>5</Piece>
</Data>
<Data name="dataFimReenvio">
<Delimiter>"^"</Delimiter>
<Piece>7</Piece>
</Data>
<Data name="dataInicioEnvio">
<Delimiter>"^"</Delimiter>
<Piece>4</Piece>
</Data>
<Data name="dataInicioReenvio">
<Delimiter>"^"</Delimiter>
<Piece>6</Piece>
</Data>
<Data name="horaAgendada">
<Delimiter>"^"</Delimiter>
<Piece>3</Piece>
</Data>
<Data name="horaConfig">
<Delimiter>"^",","</Delimiter>
<Piece>2,2</Piece>
</Data>
<Data name="namespace">
<Delimiter>"^"</Delimiter>
<Piece>9</Piece>
</Data>
<Data name="situacao">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.DadosLog.LogErro">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>CSW1LOGCFGStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>63440,59789.60612</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Controle de Fontes</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Log Consistem - Client</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Logs de Erros</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="codSeq">
<Description>
Código da sequencia do erro</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999"/>
<Parameter name="MINVAL" value="1"/>
</Property>

<Property name="origem">
<Description>
Origem do Erro</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="DISPLAYLIST" value=",Atualização da Configuração,Envio de Log,Envio de Pesquisa,Agendamento da Tarefa"/>
<Parameter name="VALUELIST" value=",1,2,3,4"/>
</Property>

<Property name="dataReferencia">
<Description>
Data de Referência</Description>
<Type>%Date</Type>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="dataErro">
<Description>
Data do erro - Sistema</Description>
<Type>%Date</Type>
<Required>1</Required>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="horaErro">
<Description>
Hora do erro - Sistema</Description>
<Type>%Time</Type>
<Required>1</Required>
</Property>

<Index name="RowID">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>codSeq</Properties>
</Index>

<Storage name="CSW1LOGCFGStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosLog.LogErroS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="CSW1LOGCFGMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^%CSW1LOGCFG</Global>
<Subscript name="1">
<Expression>5</Expression>
</Subscript>
<Subscript name="2">
<Expression>{codSeq}</Expression>
</Subscript>
<Data name="dataErro">
<Delimiter>"^",","</Delimiter>
<Piece>3,1</Piece>
</Data>
<Data name="dataReferencia">
<Delimiter>"^"</Delimiter>
<Piece>2</Piece>
</Data>
<Data name="horaErro">
<Delimiter>"^",","</Delimiter>
<Piece>3,2</Piece>
</Data>
<Data name="origem">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.DadosLog.LogErroMsg">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>CSW1LOGCFGStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>63440,59786.017885</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Controle de Fontes</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Log Consistem - Client</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Logs de Erros - Mensagem</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="codSeq">
<Description>
Código da sequencia do erro</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999"/>
<Parameter name="MINVAL" value="1"/>
</Property>

<Property name="msgErro">
<Description>
Mensagem de erro</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="200"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>

<Index name="RowID">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>codSeq</Properties>
</Index>

<Storage name="CSW1LOGCFGStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosLog.LogErroMsgS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="CSW1LOGCFGMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^%CSW1LOGCFG</Global>
<Subscript name="1">
<Expression>5</Expression>
</Subscript>
<Subscript name="2">
<Expression>{codSeq}</Expression>
</Subscript>
<Subscript name="3">
<Expression>1</Expression>
</Subscript>
<Data name="msgErro">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.DadosLog.LogErroMsg2">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>CSW1LOGCFGStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>63460,46941.364342</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Controle de Fontes</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Log Consistem - Client</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Logs de Erros - Mensagem - Sem DecomposeStatus</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="codSeq">
<Description>
Código da sequencia do erro</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999"/>
<Parameter name="MINVAL" value="1"/>
</Property>

<Property name="msgErro">
<Description>
Mensagem de erro</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="200"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>

<Index name="RowID">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>codSeq</Properties>
</Index>

<Storage name="CSW1LOGCFGStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosLog.LogErroMsg2S</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="CSW1LOGCFGMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^%CSW1LOGCFG</Global>
<Subscript name="1">
<Expression>5</Expression>
</Subscript>
<Subscript name="2">
<Expression>{codSeq}</Expression>
</Subscript>
<Subscript name="3">
<Expression>2</Expression>
</Subscript>
<Data name="msgErro">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.DadosLog.LogsEnviados">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>CSW1LOGCFGStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>63440,57031.827213</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Controle de Fontes</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Log Consistem - Client</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Logs Enviados por Data</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="dataLog">
<Description>
Data do log enviado</Description>
<Type>%Date</Type>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="tipo">
<Description>
Tipo do log</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="DISPLAYLIST" value=",Envio,Reenvio"/>
<Parameter name="VALUELIST" value=",1,2"/>
</Property>

<Property name="tempo">
<Description>
Tempo para envio do log</Description>
<Type>%Float</Type>
<Required>1</Required>
<Parameter name="SCALE" value="6"/>
</Property>

<Property name="dataEnvio">
<Description>
Data do envio do log - Sistema</Description>
<Type>%Date</Type>
<Required>1</Required>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="horaEnvio">
<Description>
Hora do envio do log - Sistema</Description>
<Type>%Time</Type>
<Required>1</Required>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>dataLog</Properties>
</Index>

<Storage name="CSW1LOGCFGStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosLog.LogsEnviadosS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="CSW1LOGCFGMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^%CSW1LOGCFG</Global>
<Subscript name="1">
<Expression>3</Expression>
</Subscript>
<Subscript name="2">
<Expression>{dataLog}</Expression>
</Subscript>
<Data name="dataEnvio">
<Delimiter>"^",","</Delimiter>
<Piece>3,1</Piece>
</Data>
<Data name="horaEnvio">
<Delimiter>"^",","</Delimiter>
<Piece>3,2</Piece>
</Data>
<Data name="tempo">
<Delimiter>"^"</Delimiter>
<Piece>2</Piece>
</Data>
<Data name="tipo">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.DadosLog.PesquisaEnviada">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>CSW1LOGCFGStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>63440,57034.747045</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Controle de Fontes</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Log Consistem - Client</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Pesquisas Enviadas</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="codPesquisa">
<Description>
Código da pesquisa</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="1"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>codPesquisa</Properties>
</Index>

<Storage name="CSW1LOGCFGStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosLog.PesquisaEnviadaS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="CSW1LOGCFGMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^%CSW1LOGCFG</Global>
<Subscript name="1">
<Expression>4</Expression>
</Subscript>
<Subscript name="2">
<Expression>{codPesquisa}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.DadosLog.PesquisaErro">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>CSW1LOGCFGStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>63440,57029.001183</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Controle de Fontes</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Log Consistem - Client</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Erro na Execução da Pesquisa</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="codPesquisa">
<Description>
Código da pesquisa</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="1"/>
</Property>

<Property name="msgErro">
<Description>
Mensagem de erro na execução da regra</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="200"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>codPesquisa</Properties>
</Index>

<Storage name="CSW1LOGCFGStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosLog.PesquisaErroS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="CSW1LOGCFGMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^%CSW1LOGCFG</Global>
<Subscript name="1">
<Expression>2</Expression>
</Subscript>
<Subscript name="2">
<Expression>{codPesquisa}</Expression>
</Subscript>
<Subscript name="3">
<Expression>1</Expression>
</Subscript>
<Data name="msgErro">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.DadosLog.PesquisaPendente">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>CSW1LOGCFGStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>63440,56864.365674</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Controle de Fontes</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Log Consistem - Client</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Pesquisa Pendente</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="codPesquisa">
<Description>
Código da pesquisa</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="1"/>
</Property>

<Property name="regra">
<Description>
Regra a ser chamada</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>codPesquisa</Properties>
</Index>

<Storage name="CSW1LOGCFGStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.DadosLog.PesquisaPendB4DS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="CSW1LOGCFGMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^%CSW1LOGCFG</Global>
<Subscript name="1">
<Expression>2</Expression>
</Subscript>
<Subscript name="2">
<Expression>{codPesquisa}</Expression>
</Subscript>
<Data name="regra">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.ImportExport">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="ExportarArquivoXml">
<Description>

Exporta Rotinas e Classes para um Arquivo xml
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>itens:%String="",arquivo:%String,flgCong:%Boolean</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set flgCong = $get(flgCong)
 
 set sc = ##class(Src2.Utils).ConvertStrTab(itens, .tabGrupoItens)
 
 merge tabGrupoItens = itens
 
 set item = ""
 for {
   set item = $order(tabGrupoItens(item))
   if (item = "") quit
   
   set sc = ##class(Src2.Item).ValidarItem(item, , , .tabItens2)
   
   merge tabItens = tabItens2
 }
 
 if ('$data(tabItens)) quit $$$ERROR(10000,"Não foi encontrado nenhum item para exportar!")
 
 set sc = $system.OBJ.Export(.tabItens,arquivo,"-l-d")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarArquivo">
<Description>

Importa Rotinas e Classes de um Arquivo xml ou rsa

set sc = ##class(Src2.ImportExport).ImportarArquivo("aa", "C:\workspacecsw\temp\testeexport.xml", "admin", "admin")
set sc = ##class(Src2.ImportExport).ImportarArquivo("aa", "C:\workspacecsw\temp\rotinasteste.rsa", "admin", "admin")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,arquivo:%String,username:%String="",password:%String="",flgAtuWorkspace:%Boolean=1</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set extensao = $zconvert($piece(arquivo,".",$length(arquivo,".")),"l")
 
 if (extensao = "xml") {
   set sc = ##class(Src2.ImportExport).ImportarArquivoXml(codTerm, arquivo, username, password, flgAtuWorkspace)
   quit sc
 }
 
 if (extensao = "rsa") {
   set sc = ##class(Src2.ImportExport).ImportarArquivoRsa(codTerm, arquivo, username, password, flgAtuWorkspace)
   quit sc
 }
 
 quit $$$ERROR(10000,"Extensão ."_extensao_" inválida!")
]]></Implementation>
</Method>

<Method name="ImportarArquivoXml">
<Description>

Importa Rotinas e Classes de um Arquivo xml
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,arquivo:%String,username:%String="",password:%String="",flgAtuWorkspace:%Boolean=1</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.ImportExport).ValidarImportarArquivoXmlRsa(codTerm, arquivo)
 if $$$ISERR(sc) quit sc
 
 set sc = $system.OBJ.Load(arquivo, ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(2))
 
 set sc2 = ##class(Src2.ImportExport).ImportarArquivoXml2(codTerm, arquivo, username, password, flgAtuWorkspace)
 if $$$ISERR(sc) quit sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarArquivoXml2">
<Description>

Atualizar o Workspace e Gera as Páginas CSP das Rotinas
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,arquivo:%String,username:%String="",password:%String="",flgAtuWorkspace:%Boolean=1</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set rotina = ""
 for {
   set rotina = $order(^mtempImportExport(codTerm,1,rotina))
   if (rotina = "") quit
   set var = $get(^mtempImportExport(codTerm,1,rotina))
   
   set InternalName = $piece(var,"^",1)
   
   if (flgAtuWorkspace) {
     set msgsc = ##class(Src2.Item).ExportarItemArquivo(InternalName, 1, username, password)
   }
   
   set msgsc = ##class(Src2.Rotina).GerarPaginaCSP(rotina)
 }
 
 if (flgAtuWorkspace) {
   set classe = ""
   for {
     set classe = $order(^mtempImportExport(codTerm,2,classe))
     if (classe = "") quit
     set var = $get(^mtempImportExport(codTerm,2,classe))
     
     set InternalName = $piece(var,"^",1)
     
     set msgsc = ##class(Src2.Item).ExportarItemArquivo(InternalName, 1, username, password)
   }
 }
  
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarArquivoRsa">
<Description>

Importa Rotinas de um Arquivo rsa
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,arquivo:%String,username:%String="",password:%String="",flgAtuWorkspace:%Boolean=1</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.ImportExport).ValidarImportarArquivoXmlRsa(codTerm, arquivo)
 if $$$ISERR(sc) quit sc
 
 set strOpcoes = "csp"
 if (flgAtuWorkspace) { set strOpcoes = "csp;workspace" }
 
 kill ^mtempImportarRsa(codTerm)
 
 set rotina = ""
 
 set file = ##class(%File).%New(arquivo)
 
 do file.Open("R")
 
 set tam=32000
 set linhaFile=file.Read(.tam)
 
 for {
   set tam=32000
   set linhaFile=file.Read(.tam)
   if (tam = -1) quit
   
   if ($zconvert($piece(linhaFile,"^",2),"U") = "MAC") {
     set rotina = $piece(linhaFile,"^",1)
     set tam=32000
     set linhaFile=file.Read(.tam)
     if (tam = -1) quit
   }
   if (rotina '= "") & (linhaFile '= "") {
     set ^mtempImportarRsa(codTerm,rotina,1,$order(^mtempImportarRsa(codTerm,rotina,1,""),-1)+1) = linhaFile
   }
 }
 
 do file.Close()
 set file=""
 
 set rotina = ""
 for {
   set rotina = $order(^mtempImportarRsa(codTerm,rotina))
   if (rotina = "") quit
   kill tabRotina
   merge tabRotina = ^mtempImportarRsa(codTerm,rotina,1)
   set sc = ##class(Src2.Rotina).GerarRotinaArquivo(, rotina, strOpcoes, .tabErros, .tabOK, .tabRotina, 1, username, password)
 }
 
 kill ^mtempImportarRsa(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarImportarArquivoXmlRsa">
<Description>

Valida a Importação de Rotinas e Classes de um Arquivo xml

set sc = ##class(Src2.ImportExport).ValidarImportarArquivoXmlRsa("C:\workspacecsw\temp\testeexport.xml")
set sc = ##class(Src2.ImportExport).ValidarImportarArquivoXmlRsa("C:\workspacecsw\temp\rotinasteste.rsa")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,arquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConfig(, , .caminhoSvn, .arquivoTemp)
 if (sc '= 1) quit $$$ERROR(10000,sc)
 
 kill ^mtempImportExportErro(codTerm)
 
 kill ^mtempImportExport(codTerm)
 
 if ('##class(%File).Exists(arquivo)) quit $$$ERROR(10000,"Arquivo não encontrado!")
 
 kill tabProjetos
 
 set file = ##class(%File).%New(arquivo)
 
 do file.Open("R")
 
 set tam=32000
 set linhaFile=file.Read(.tam)
 
 for {
   set tam=32000
   set linhaFile=file.Read(.tam)
   
   if (tam = -1) quit
   
   // Arquivo XML - Rotina
   if (linhaFile [ "<Routine name") & (linhaFile [ "type=""MAC""") {
     set rotina = $piece($piece(linhaFile,"Routine name=""",2),"""",1)
     
     set ^mtempImportExport(codTerm,1,rotina) = ""
     
     if ##class(Src2.Rotina).ValidarRotinaControleFonte(rotina) {
       set msgsc = ##class(Src2.Rotina).ObterDadosRotina(rotina, .rotPastaCopiaTrabalho, .rotinaCopiaTrabalho, .rotPastaRepositorio, .rotinaRepositorio, .descricao, .extensao, .InternalName, .pasta, .projeto, .projetoRelacionado)
       if (msgsc = 1) {
         if ($data(^Src2Config("projetorev",projeto))) {
           set ^mtempImportExport(codTerm,1,rotina) = InternalName_"^"_projeto
           set tabProjetos(projeto) = ""
         }
       } else {
         set ^mtempImportExportErro(codTerm,$order(^mtempImportExportErro(codTerm,""),-1)+1) = "Rotina: "_rotina_" - "_msgsc
       }
     }
     
   }
   
   // Arquivo RSA - Rotina
   if ($zconvert($piece(linhaFile,"^",2),"U") = "MAC") {
     set rotina = $piece(linhaFile,"^",1)
     
     set ^mtempImportExport(codTerm,1,rotina) = ""
     
     if ##class(Src2.Rotina).ValidarRotinaControleFonte(rotina) {
       set msgsc = ##class(Src2.Rotina).ObterDadosRotina(rotina, .rotPastaCopiaTrabalho, .rotinaCopiaTrabalho, .rotPastaRepositorio, .rotinaRepositorio, .descricao, .extensao, .InternalName, .pasta, .projeto, .projetoRelacionado)
       if (msgsc = 1) {
         if ($data(^Src2Config("projetorev",projeto))) {
           set ^mtempImportExport(codTerm,1,rotina) = InternalName_"^"_projeto
           set tabProjetos(projeto) = ""
         }
       } else {
         set ^mtempImportExportErro(codTerm,$order(^mtempImportExportErro(codTerm,""),-1)+1) = "Rotina: "_rotina_" - "_msgsc
       }
     }
   }
   
   // Arquivo XML - Classe
   if (linhaFile [ "<Class name") {
     set classe = $piece($piece(linhaFile,"Class name=""",2),"""",1)
     
     set ^mtempImportExport(codTerm,2,classe) = ""
     
     if ##class(Src2.Classe).ValidarClasseControleFonte(classe) {
       set msgsc = ##class(Src2.Classe).ObterDadosClasse(classe, .classePastaCopiaTrabalho, .classeCopiaTrabalho, .classePastaRepositorio, .classeRepositorio, .descricao, .extensao, .InternalName, .pasta, .projeto, .projetoRelacionado)
       if (msgsc = 1) {
         if ($data(^Src2Config("projetorev",projeto))) {
           set ^mtempImportExport(codTerm,2,classe) = InternalName_"^"_projeto
           set tabProjetos(projeto) = ""
         }
       } else {
         set ^mtempImportExportErro(codTerm,$order(^mtempImportExportErro(codTerm,""),-1)+1) = "Classe: "_classe_" - "_msgsc
       }
     }
   }
 }
 
 do file.Close()
 set file=""
 
 set projeto = ""
 for {
   set projeto = $order(tabProjetos(projeto))
   if (projeto = "") quit
   set msgsc = ##class(Src2.Utils).ValidarWorkspaceProjeto(projeto)
   if ('msgsc) {
     set ^mtempImportExportErro(codTerm,$order(^mtempImportExportErro(codTerm,""),-1)+1) = msgsc
   }
 }
 
 if $data(^mtempImportExportErro(codTerm)) quit $$$ERROR(10000,"Erros ao importar o arquivo "_arquivo_"!")
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Inf.DadosCliente">
<ClassType>persistent</ClassType>
<ProcedureBlock>1</ProcedureBlock>
<Super>%Persistent,%XML.Adaptor</Super>
<TimeCreated>61727,0</TimeCreated>
<Inheritance>right</Inheritance>

<Parameter name="ELEMENTQUALIFIED">
<Default>1</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Default>http://consistem.com.br</Default>
</Parameter>

<Parameter name="XMLNAME">
<Default>DadosCliente</Default>
</Parameter>

<Parameter name="XMLSEQUENCE">
<Default>1</Default>
</Parameter>

<Property name="conta">
<Description>
Conta do Cliente</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="5"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="macAddress">
<Description>
Mac Address do Servidor que está enviando as informações</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="20"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="flagAtualizadoGercon">
<Description>
Flag para dizer se o gercon já foi atualizado</Description>
<Type>%Boolean</Type>
</Property>

<Property name="dataHoraAtualizaoCliente">
<Description>
Data e Hora do fim da atualização no cliente</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="dataHoraWebService">
<Description>
Data e Hora que o WebService recebeu os dados</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="dadosServidor">
<Description>
Dados do Servidor do Cliente</Description>
<Type>Src2.Inf.DadosServidor</Type>
</Property>

<Property name="dadosLicencaCache">
<Description>
Dados da Licenca Caché no Cliente</Description>
<Type>Src2.Inf.DadosLicencaCache</Type>
</Property>

<Property name="dadosLicencaConsistem">
<Description>
Dados da Licenca Consistem no Cliente</Description>
<Type>Src2.Inf.DadosLicencaConsistem</Type>
</Property>

<Property name="dadosUsoLicencaConsistem">
<Description>
Dados de Uso da Licenca Consistem</Description>
<Type>Src2.Inf.DadosUsoLicencaConsistem</Type>
<Collection>list</Collection>
</Property>

<Property name="dadosVersaoAtual">
<Description>
Lista com os dados da versão atual do cliente</Description>
<Type>Src2.Inf.DadosVersaoAtual</Type>
<Collection>list</Collection>
</Property>

<Method name="%OnDelete">
<Description>
 
Method para excluir todas as outras propriedades da classe
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>oid:%ObjectIdentity</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set objDadosCliente=##Class(Src2.Inf.DadosCliente).%Open(oid)
 if objDadosCliente="" quit $$$ERROR(10000,"Não foi possível abrir o objeto para deletar as propriedades filhas!")
 
 if (objDadosCliente.dadosServidor '= "") {
   set sc=##Class(Src2.Inf.DadosServidor).%DeleteId(objDadosCliente.dadosServidor.%Id())
   if sc'=1 quit sc
 }
 
 if (objDadosCliente.dadosLicencaCache '= "") {
  set sc=##Class(Src2.Inf.DadosLicencaCache).%DeleteId(objDadosCliente.dadosLicencaCache.%Id())
  if sc'=1 quit sc
 }
 
 if (objDadosCliente.dadosLicencaConsistem '= "") {
  set sc=##Class(Src2.Inf.DadosLicencaConsistem).%DeleteId(objDadosCliente.dadosLicencaConsistem.%Id())
  if sc'=1 quit sc
 }
 
 set seq = ""
 for {
   set obj=objDadosCliente.dadosUsoLicencaConsistem.GetNext(.seq)
   if (obj = "") quit
   set sc = ##Class(Src2.Inf.DadosUsoLicencaConsistem).%DeleteId(obj.%Id())
 }
 
 set seq = ""
 for {
   set obj = objDadosCliente.dadosVersaoAtual.GetNext(.seq)
   if (obj = "") quit
   set sc = ##Class(Src2.Inf.DadosVersaoAtual).%DeleteId(obj.%Id())
 }
 
 set (obj, objDadosCliente)=""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarAtualizarInfGercon">
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[id:%Integer,&codConta:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (codConta, versao) = ""
 
 set objDadosCliente = ##Class(Src2.Inf.DadosCliente).%OpenId(id)
 if (objDadosCliente = "") quit $$$ERROR(10000,"Id "_id_" inválido para atualizar o gercon!")
 
 set codConta = objDadosCliente.conta
 
 set seq = ""
 for {
   set obj = objDadosCliente.dadosVersaoAtual.GetNext(.seq)
   if (obj = "") quit
   if (obj.produto = "csw") set versao = obj.versao
 }
 
 set objDadosCliente = ""
 
 // Tratamento para contas que tem servidor antigo enviando informações erradas
 set tabContas("SI") = ""
 set tabContas("SE") = ""
 if ($data(tabContas(codConta))) & (##class(Src2.Utils2).CompararVersao(versao, "<", "6.4")) {
   quit $$$ERROR(10000,"Servidor inválido!")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarInfGerconJob">
<ClassMethod>1</ClassMethod>
<FormalSpec>id:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##Class(Src2.Inf.DadosCliente).ValidarAtualizarInfGercon(id, .codConta)
 if $$$ISERR(sc) quit sc
 
 set tituloDefault = "Erro ao Atualizar Dados Cliente (GERCON) - Novo Atualizador Consistem"
 set emailRemetente = "gercon@consistem.com.br"
 set emailsErro = "gestor.desenvolvimento@consistem.com.br"
 
 set sc=""
 while (sc '= 1) { set sc=$$LockCliente^CCGERRG000(codConta) }
 
 set sc = ##Class(Src2.Inf.DadosCliente).AtualizarInfGercon(id)
 
 set sc2 = $$UnLockCliente^CCGERRG000(codConta)
 
 if (sc '= 1) {
   set sc = ##class(Src2.Utils2).EnviarEmail(tituloDefault, emailRemetente, emailsErro, "Erro no method ##Class(Src2.Inf.DadosCliente).AtualizarInfGercon: "_$$MEW^%CSUTICSP(sc), 1)
   quit sc
 }
 
 // 
 // Por enquanto não vai ser deletado os Logs, para podermos acompanhar as atualizações
 // 
 //set sc=##Class(Src2.Inf.DadosCliente).%DeleteId(id)
 //if sc'=1 {
 //  set sc = ##class(Src2.Utils2).EnviarEmail(tituloDefault, emailRemetente, emailsErro, "Erro no method ##Class(Src2.Inf.DadosCliente).%DeleteId: "_$$MEW^%CSUTICSP(sc), 1)
 //  quit sc
 //}
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarInfGercon">
<Description>

Method para atualizar o gercon conforme informações recebidas
Esse method somente atualiza sem efetuar lock e sem excluir os dados no final
Utilizar o AtualizarInfGerconJob
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>id:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set objDadosCliente = ##Class(Src2.Inf.DadosCliente).%OpenId(id)
 if (objDadosCliente = "") quit $$$ERROR(10000,"Id "_id_" inválido para atualizar o gercon!")
 
 set sql = "select ID FROM CCliente where conta="""_objDadosCliente.conta_""""
 
 set rs = ##class(%ResultSet).%New("%DynamicQuery:SQL")
 
 set sc = rs.Prepare(sql)
 if $$$ISERR(sc) quit sc
 
 set sc=rs.Execute()
 if $$$ISERR(sc) quit sc
 
 do rs.Next()
 set objCliente = ##class(User.CCliente).%OpenId(rs.GetData(1))
 if (objCliente = "") quit $$$ERROR(10000,"Cliente não encontrado para a conta "_objDadosCliente.conta_"!")
 
 set objCliente.ultAtulWebService = objDadosCliente.dataHoraWebService
 
 if (objDadosCliente.dadosServidor '= "") {
   // Por enquanto o sistema operacional não vai ser atualizado
   // set objCliente.sistemaOperacional=objDadosCliente.dadosServidor.sistemaOperacional
   set objCliente.versaoCache = objDadosCliente.dadosServidor.versaoCache
   set objCliente.plataforma = objDadosCliente.dadosServidor.plataforma
   set objCliente.velocidadeProcessador = objDadosCliente.dadosServidor.velocidadeProcessador
   set objCliente.modeloProcessador = objDadosCliente.dadosServidor.modeloProcessador
   set objCliente.fabricanteProcessador = objDadosCliente.dadosServidor.fabricanteProcessador
   set objCliente.numeroChips = objDadosCliente.dadosServidor.numeroChips
   set objCliente.numeroCores = objDadosCliente.dadosServidor.numeroCores
   set objCliente.numeroCoresPorChip = objDadosCliente.dadosServidor.numeroCoresPorChip
   set objCliente.numeroThreads = objDadosCliente.dadosServidor.numeroThreads
   set objCliente.numeroThreadsPorCore = objDadosCliente.dadosServidor.numeroThreadsPorCore
   
   if (objDadosCliente.macAddress '= "") {
     set objServidor = ##Class(User.CClienteServidor).GetObjCClienteServidorPorClienteMacAddress(objCliente.%Id(), objDadosCliente.macAddress)
     
     if (objServidor '= "") {
       set objServidor.versaoCache = objDadosCliente.dadosServidor.versaoCache
       set objServidor.plataforma = objDadosCliente.dadosServidor.plataforma
       set objServidor.velocidadeProcessador = objDadosCliente.dadosServidor.velocidadeProcessador
       set objServidor.modeloProcessador = objDadosCliente.dadosServidor.modeloProcessador
       set objServidor.fabricanteProcessador = objDadosCliente.dadosServidor.fabricanteProcessador
       set objServidor.numeroChips = objDadosCliente.dadosServidor.numeroChips
       set objServidor.numeroCores = objDadosCliente.dadosServidor.numeroCores
       set objServidor.numeroCoresPorChip = objDadosCliente.dadosServidor.numeroCoresPorChip
       set objServidor.numeroThreads = objDadosCliente.dadosServidor.numeroThreads
       set objServidor.numeroThreadsPorCore = objDadosCliente.dadosServidor.numeroThreadsPorCore
       
       set sc=objServidor.%Save()
       if $$$ISERR(sc) quit sc
     }
   }
 }
 
 if (objDadosCliente.dadosLicencaCache '= "") {
   set objCliente.numeroLicencasCache = objDadosCliente.dadosLicencaCache.numeroLicencasCache
   set objCliente.dataLicencasCache = objDadosCliente.dadosLicencaCache.dataLicencasCache
   set objCliente.nomeClienteLicencaCache = objDadosCliente.dadosLicencaCache.nomeClienteLicenca
 }
 
 if (objDadosCliente.dadosLicencaConsistem '= "") {
   set objLicNoCliente = ##Class(User.CClienteLicencaNoCliente).%New()
   
   set objLicNoCliente.codCliente = objCliente
   set objLicNoCliente.licenca = objDadosCliente.dadosLicencaConsistem.licenca
   set objLicNoCliente.chaveLicenca = objDadosCliente.dadosLicencaConsistem.chaveLicenca
   set objLicNoCliente.tipoLicenca = objDadosCliente.dadosLicencaConsistem.tipoLicenca
   set objLicNoCliente.dataHoraGeracao = $zdatetime($horolog,3)
   
   set sc = objLicNoCliente.%Save()
 }
 
 set seq = ""
 for {
   set obj = objDadosCliente.dadosVersaoAtual.GetNext(.seq)
   if (obj = "") quit
   
   set novaVersao = obj.versao
   if (obj.flgVersaoAlter) set novaVersao = obj.versao_".+"
   if (obj.revisao '= "") set novaVersao = obj.versao_"."_obj.revisao
   
   if (obj.produto = "csw") set objCliente.versaoCSW2 = novaVersao
   if (obj.produto = "cswutil") set objCliente.versaoUtilitarios = novaVersao
 }
 
 // Salva o objeto cliente
 set sc = objCliente.%Save()
 if (sc'=1) quit sc
 
 set seq = ""
 for {
   set obj = objDadosCliente.dadosUsoLicencaConsistem.GetNext(.seq)
   if (obj = "") quit
   set sc = ##Class(User.CClienteLogUsoLicencaConsistem).GravarLogUso(objCliente,obj.data,obj.hora,obj.totUsuarios,obj.usuariosLogadosCRM,obj.usuariosLogadosCSW,obj.usuariosLogadosCaracter,obj.usuariosLogadosGrafico,obj.usuariosTmpConsistem)
 }
 
 set objDadosCliente.flagAtualizadoGercon = 1
 
 set sc = objDadosCliente.%Save()
 if $$$ISERR(sc) quit sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="LimparDadosClienteImportados">
<Description>

Method para limpar os dados do cliente
Se passar a dataRef, limpa até a data já importados. Senão, todos os importados

do ##Class(Src2.Inf.DadosCliente).LimparDadosClienteImportados()
do ##Class(Src2.Inf.DadosCliente).LimparDadosClienteImportados((+$h-10))</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>dataRef:%Date=""</FormalSpec>
<Implementation><![CDATA[
 set sql = "select ID FROM Src2_Inf.DadosCliente where flagAtualizadoGercon=1"
 
 set rs = ##class(%ResultSet).%New("%DynamicQuery:SQL")
 
 set sc = rs.Prepare(sql)
 if $$$ISERR(sc) quit sc
 
 set sc = rs.Execute()
 if $$$ISERR(sc) quit sc
 
 while (rs.Next()) {
   set objDadosCliente = ##Class(Src2.Inf.DadosCliente).%OpenId(rs.GetData(1))
   if (objDadosCliente = "") continue
   
   set data = $piece(objDadosCliente.dataHoraWebService,",",1)
   if (data > dataRef) , (dataRef '= "") continue
   
   set sc = ##Class(Src2.Inf.DadosCliente).%DeleteId(rs.GetData(1))
 }
]]></Implementation>
</Method>

<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DataLocation>^Src2.Inf.DadosClienteD</DataLocation>
<DefaultData>DadosClienteDefaultData</DefaultData>
<IdLocation>^Src2.Inf.DadosClienteD</IdLocation>
<IndexLocation>^Src2.Inf.DadosClienteI</IndexLocation>
<StreamLocation>^Src2.Inf.DadosClienteS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<Data name="DadosClienteDefaultData">
<Structure>listnode</Structure>
<Subscript/>
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>conta</Value>
</Value>
<Value name="3">
<Value>dadosServidor</Value>
</Value>
<Value name="4">
<Value>dadosLicencaCache</Value>
</Value>
<Value name="5">
<Value>DadosUsoLicencaConsistem</Value>
</Value>
<Value name="6">
<Value>dadosVersaoAtual</Value>
</Value>
<Value name="7">
<Value>dadosUsoLicencaConsistem</Value>
</Value>
<Value name="8">
<Value>flagAtualizadoGercon</Value>
</Value>
<Value name="9">
<Value>dataHoraAtualizaoCliente</Value>
</Value>
<Value name="10">
<Value>dataHoraWebService</Value>
</Value>
<Value name="11">
<Value>dadosLicencaConsistem</Value>
</Value>
<Value name="12">
<Value>macAddress</Value>
</Value>
</Data>
</Storage>
</Class>


<Class name="Src2.Inf.DadosLicencaCache">
<ClassType>persistent</ClassType>
<ProcedureBlock>1</ProcedureBlock>
<Super>%Persistent,%XML.Adaptor</Super>
<TimeCreated>62809,48159.816725</TimeCreated>

<Parameter name="ELEMENTQUALIFIED">
<Default>1</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Default>http://consistem.com.br</Default>
</Parameter>

<Parameter name="XMLNAME">
<Default>DadosLicencaCache</Default>
</Parameter>

<Parameter name="XMLSEQUENCE">
<Default>1</Default>
</Parameter>

<Property name="numeroLicencasCache">
<Description>
Número de Licenças do Caché</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="10"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="dataLicencasCache">
<Description>
Data da Licenças do Caché</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="30"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="nomeClienteLicenca">
<Description>
Nome Cliente Licenciada Caché</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DataLocation>^Src2.Inf.DadosLicencaCacheD</DataLocation>
<DefaultData>DadosLicencaCacheDefaultData</DefaultData>
<IdLocation>^Src2.Inf.DadosLicencaCacheD</IdLocation>
<IndexLocation>^Src2.Inf.DadosLicencaCacheI</IndexLocation>
<StreamLocation>^Src2.Inf.DadosLicencaCacheS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<Data name="DadosLicencaCacheDefaultData">
<Structure>listnode</Structure>
<Subscript/>
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>numeroLicencasCache</Value>
</Value>
<Value name="3">
<Value>dataLicencasCache</Value>
</Value>
<Value name="4">
<Value>nomeClienteLicenca</Value>
</Value>
</Data>
</Storage>
</Class>


<Class name="Src2.Inf.DadosLicencaConsistem">
<ClassType>persistent</ClassType>
<ProcedureBlock>1</ProcedureBlock>
<Super>%Persistent,%XML.Adaptor</Super>
<TimeCreated>61727,0</TimeCreated>

<Parameter name="ELEMENTQUALIFIED">
<Default>1</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Default>http://consistem.com.br</Default>
</Parameter>

<Parameter name="XMLNAME">
<Default>DadosLicencaConsistem</Default>
</Parameter>

<Parameter name="XMLSEQUENCE">
<Default>1</Default>
</Parameter>

<Property name="licenca">
<Description>
Licença</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="9999"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>

<Property name="chaveLicenca">
<Description>
Chave da Licença</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="9999"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>

<Property name="tipoLicenca">
<Description>
Tipo da Licença: Arquivo ou Banco</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="DISPLAYLIST" value=",Antiga (Arquivo),Nova(Banco)"/>
<Parameter name="VALUELIST" value=",0,1"/>
</Property>

<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DataLocation>^Src2.Inf.DadosLicencE39AD</DataLocation>
<DefaultData>DadosLicencaConsistemDefaultData</DefaultData>
<IdLocation>^Src2.Inf.DadosLicencE39AD</IdLocation>
<IndexLocation>^Src2.Inf.DadosLicencE39AI</IndexLocation>
<StreamLocation>^Src2.Inf.DadosLicencE39AS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<Data name="DadosLicencaConsistemDefaultData">
<Structure>listnode</Structure>
<Subscript/>
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>licenca</Value>
</Value>
<Value name="3">
<Value>chaveLicenca</Value>
</Value>
<Value name="4">
<Value>tipoLicenca</Value>
</Value>
</Data>
</Storage>
</Class>


<Class name="Src2.Inf.DadosServidor">
<ClassType>persistent</ClassType>
<ProcedureBlock>1</ProcedureBlock>
<Super>%Persistent,%XML.Adaptor</Super>
<TimeCreated>62809,50730.246939</TimeCreated>

<Parameter name="ELEMENTQUALIFIED">
<Default>1</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Default>http://consistem.com.br</Default>
</Parameter>

<Parameter name="XMLNAME">
<Default>DadosServidor</Default>
</Parameter>

<Parameter name="XMLSEQUENCE">
<Default>1</Default>
</Parameter>

<Property name="sistemaOperacional">
<Description>
Sistema Operacional aonde está instalado o Caché</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="versaoCache">
<Description>
Versão do Caché no Cliente</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="plataforma">
<Description>
Plataforma do Servidor</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="velocidadeProcessador">
<Description>
Velocidade do Processador</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="modeloProcessador">
<Description>
Modelo do Processador</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="fabricanteProcessador">
<Description>
Fabricante do Processador</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="numeroChips">
<Description>
Número de Chips do Processador</Description>
<Type>%Integer</Type>
</Property>

<Property name="numeroCores">
<Description>
Número de Cores do Processador</Description>
<Type>%Integer</Type>
</Property>

<Property name="numeroCoresPorChip">
<Description>
Números de Cores por Chip do Processador</Description>
<Type>%Integer</Type>
</Property>

<Property name="numeroThreads">
<Description>
Número de Threads do Processador</Description>
<Type>%Integer</Type>
</Property>

<Property name="numeroThreadsPorCore">
<Description>
Número de Threads Por Cores do Processador</Description>
<Type>%Integer</Type>
</Property>

<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DataLocation>^Src2.Inf.DadosServidorD</DataLocation>
<DefaultData>DadosServidorDefaultData</DefaultData>
<IdLocation>^Src2.Inf.DadosServidorD</IdLocation>
<IndexLocation>^Src2.Inf.DadosServidorI</IndexLocation>
<StreamLocation>^Src2.Inf.DadosServidorS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<Data name="DadosServidorDefaultData">
<Structure>listnode</Structure>
<Subscript/>
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>sistemaOperacional</Value>
</Value>
<Value name="3">
<Value>versaoCache</Value>
</Value>
<Value name="4">
<Value>plataforma</Value>
</Value>
<Value name="5">
<Value>velocidadeProcessador</Value>
</Value>
<Value name="6">
<Value>modeloProcessador</Value>
</Value>
<Value name="7">
<Value>fabricanteProcessador</Value>
</Value>
<Value name="8">
<Value>numeroChips</Value>
</Value>
<Value name="9">
<Value>numeroCores</Value>
</Value>
<Value name="10">
<Value>numeroCoresPorChip</Value>
</Value>
<Value name="11">
<Value>numeroThreads</Value>
</Value>
<Value name="12">
<Value>numeroThreadsPorCore</Value>
</Value>
</Data>
</Storage>
</Class>


<Class name="Src2.Inf.DadosUsoLicencaConsistem">
<ClassType>persistent</ClassType>
<ProcedureBlock>1</ProcedureBlock>
<Super>%Persistent,%XML.Adaptor</Super>
<TimeCreated>62809,59065.309798</TimeCreated>

<Parameter name="ELEMENTQUALIFIED">
<Default>1</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Default>http://consistem.com.br</Default>
</Parameter>

<Parameter name="XMLNAME">
<Default>DadosUsoLicencaConsistem</Default>
</Parameter>

<Parameter name="XMLSEQUENCE">
<Default>1</Default>
</Parameter>

<Property name="data">
<Description>
Data</Description>
<Type>%Date</Type>
<Required>1</Required>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="hora">
<Description>
Hora</Description>
<Type>%Time</Type>
<Required>1</Required>
</Property>

<Property name="totUsuarios">
<Description>
Total de Usuários</Description>
<Type>%Integer</Type>
</Property>

<Property name="usuariosLogadosCRM">
<Description>
Usuários Logados CRM</Description>
<Type>%Integer</Type>
</Property>

<Property name="usuariosLogadosCSW">
<Description>
Usuários Logados CSW</Description>
<Type>%Integer</Type>
</Property>

<Property name="usuariosLogadosCaracter">
<Description>
Usuários Logados Caracter</Description>
<Type>%Integer</Type>
</Property>

<Property name="usuariosLogadosGrafico">
<Description>
Usuários Logados Gráfico</Description>
<Type>%Integer</Type>
</Property>

<Property name="usuariosTmpConsistem">
<Description>
Usuários Temporários Consistem</Description>
<Type>%Integer</Type>
</Property>

<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DataLocation>^Src2.Inf.DadosUsoLic4AC1D</DataLocation>
<DefaultData>DadosUsoLicencaConsistemDefaultData</DefaultData>
<IdLocation>^Src2.Inf.DadosUsoLic4AC1D</IdLocation>
<IndexLocation>^Src2.Inf.DadosUsoLic4AC1I</IndexLocation>
<StreamLocation>^Src2.Inf.DadosUsoLic4AC1S</StreamLocation>
<ExtentSize>100000</ExtentSize>
<Data name="DadosUsoLicencaConsistemDefaultData">
<Structure>listnode</Structure>
<Subscript/>
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>data</Value>
</Value>
<Value name="3">
<Value>hora</Value>
</Value>
<Value name="4">
<Value>totUsuarios</Value>
</Value>
<Value name="5">
<Value>usuariosLogadosCRM</Value>
</Value>
<Value name="6">
<Value>usuariosLogadosCSW</Value>
</Value>
<Value name="7">
<Value>usuariosLogadosCaracter</Value>
</Value>
<Value name="8">
<Value>usuariosLogadosGrafico</Value>
</Value>
<Value name="9">
<Value>usuariosTmpConsistem</Value>
</Value>
</Data>
</Storage>
</Class>


<Class name="Src2.Inf.DadosVersaoAtual">
<ClassType>persistent</ClassType>
<ProcedureBlock>1</ProcedureBlock>
<Super>%Persistent,%XML.Adaptor</Super>
<TimeCreated>62809,51244.125392</TimeCreated>

<Parameter name="ELEMENTQUALIFIED">
<Default>1</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Default>http://consistem.com.br</Default>
</Parameter>

<Parameter name="XMLNAME">
<Default>DadosVersaoAtual</Default>
</Parameter>

<Parameter name="XMLSEQUENCE">
<Default>1</Default>
</Parameter>

<Property name="produto">
<Description>
Produto</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="versao">
<Description>
Versão Atual</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="flgVersaoAlter">
<Description>
Flag para dizer se existe rotinas fora da versão (Snapshot)</Description>
<Type>%Boolean</Type>
</Property>

<Property name="revisao">
<Description>
Revisão</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DataLocation>^Src2.Inf.DadosVersaoAtualD</DataLocation>
<DefaultData>DadosVersaoAtualDefaultData</DefaultData>
<IdLocation>^Src2.Inf.DadosVersaoAtualD</IdLocation>
<IndexLocation>^Src2.Inf.DadosVersaoAtualI</IndexLocation>
<StreamLocation>^Src2.Inf.DadosVersaoAtualS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<Data name="DadosVersaoAtualDefaultData">
<Structure>listnode</Structure>
<Subscript/>
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>produto</Value>
</Value>
<Value name="3">
<Value>versao</Value>
</Value>
<Value name="4">
<Value>flgVersaoAlter</Value>
</Value>
<Value name="5">
<Value>revisao</Value>
</Value>
</Data>
</Storage>
</Class>


<Class name="Src2.IntegraGercon">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="ObterItensAlteradosChamado">
<Description>

Obter Itens Alterados do Chamado

set sc = ##class(Src2.IntegraGercon).ObterItensAlteradosChamado(999999, 1, .tabRotinas, .tabClasses, .tabReposRevis, .tabErros)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>chamado:%String,idParcGerconInf:%String,tabRotinas:%String,tabClasses:%String,tabReposRevis:%String,tabErros:%String,username:%String="",password:%String="",ticketKayako:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set strReposRevis = ""
 kill tabRotinas, tabClasses, tabReposRevis, tabErros, tabOrigem
 
 set sc = ##class(Src2.UtilsXml).ObterProjetosXML(.tabProjetos)
 if (sc'=1) quit $$$ERROR(10000,sc)
 
 set (projeto, origemGatilhos) = ""
 for {
   set projeto = $order(tabProjetos(projeto))
   if (projeto = "") quit
   set varProjetos = $get(tabProjetos(projeto))
   
   set idVersaoGercon = $piece(varProjetos,"^",5)
   set origem = $piece(varProjetos,"^",6)
   set versao = $piece(varProjetos,"^",8)
   set idParcGercon = $piece(varProjetos,"^",9)
   set customizacao = $piece(varProjetos,"^",10)
   
   if (idVersaoGercon '= "") & (origem '= "") & (versao '= "") {
     set tabOrigemDados(origem,versao) = idVersaoGercon
   }
   
   if (customizacao = 1) & (idParcGercon = idParcGerconInf) {
     set origemGatilhos = origem
   }
 }
 
 merge tabRevisoes = ^Src2DadosChamado(chamado)
 
 if (ticketKayako '= "") {
   merge tabRevisoes = ^Src2DadosTkKayako(ticketKayako)
 }
 
 set (projeto, revisao, rotina, classe) = ""
 for {
   set projeto = $order(tabRevisoes(projeto))
   if (projeto = "") quit
   set varProjetos = $get(tabProjetos(projeto))
   
   set urlRepositorio = $piece(varProjetos,"^",2)
   set idVersaoGercon = $piece(varProjetos,"^",5)
   set origem = $piece(varProjetos,"^",6)
   set versao = $piece(varProjetos,"^",8)
   set idParcGercon = $piece(varProjetos,"^",9)
   set customizacao = $piece(varProjetos,"^",10)
   
   if (idParcGercon '= "") & (idParcGercon '= idParcGerconInf) {
     ;set tabErros($order(tabErros(rotina),-1)+1) = "Projeto "_projeto_" não pode ser alterado pelo parceiro do chamado"
   }
   
   if (versao = "") {
     set tabErros($order(tabErros(rotina),-1)+1) = "Projeto "_projeto_" sem versão definida"
     continue
   }
   
   if (urlRepositorio = "") ! (origem = "") continue
   
   if (idParcGercon = idParcGerconInf) {
     set origemGatilhos = origem
   }
   
   for {
     set revisao = $order(tabRevisoes(projeto,revisao))
     if (revisao = "") quit
     for {
       set rotina = $order(^Src2DadosRevisao(projeto,revisao,5,rotina))
       if (rotina = "") quit
       
       if ($extract(rotina,1,4) = "CCVA") continue
       
       set tabOrigem(origem,versao,urlRepositorio) = projeto
       set tabOrigem(origem,versao,urlRepositorio,1,revisao) = ""
       set tabOrigem(origem,versao,urlRepositorio,2,rotina) = ""
       
       if (origem '= "gatilho") { set tabOrigemComp(origem) = "" }
       
       // Inserido desvio do CCTEL/CSWCCTEL até que o gerador de remessas envie rotinas e classes para os clientes
       if (projeto = "csw62") & (($extract(rotina,1,5) = "CCTEL") ! ($extract(rotina,1,8) = "CSWCCTEL")) continue
       
       set tabRotinas(rotina) = ""
     }
     for {
       set classe = $order(^Src2DadosRevisao(projeto,revisao,6,classe))
       if (classe = "") quit
       set tabOrigem(origem,versao,urlRepositorio) = projeto
       set tabOrigem(origem,versao,urlRepositorio,1,revisao) = ""
       set tabOrigem(origem,versao,urlRepositorio,3,classe) = ""
       
       if (origem '= "gatilho") { set tabOrigemComp(origem) = "" }
       
       set tabClasses(classe) = ""
     }
   }
 }
 
 if (origemGatilhos '= "") & ($data(tabOrigem("gatilho"))) {
   set versao = ""
   for {
     set versao = $order(tabOrigem("gatilho",versao))
     if (versao = "") quit
     merge tabOrigem(origemGatilhos,versao) = tabOrigem("gatilho",versao)
     set tabOrigemComp(origemGatilhos) = ""
   }
   kill tabOrigem("gatilho")
 }
 
 if $data(tabOrigem("gatilho")) {
   set tabErros($order(tabErros(rotina),-1)+1) = "Não foi possível determinar uma versão para documentação de gatilhos commitados"
 }
 
 set origem = $order(tabOrigemComp(""))
 if ($order(tabOrigemComp(origem)) '= "") {
   ;set tabErros($order(tabErros(rotina),-1)+1) = "Chamado com itens incompatíveis: "_##class(Src2.Utils).ConvertTabStr(.tabOrigemComp)
 }
 
 set (origem, versao) = ""
 for {
   set origem = $order(tabOrigem(origem))
   if (origem = "") quit
   for {
     set versao = $order(tabOrigem(origem,versao))
     if (versao = "") quit
     set idVersaoGercon = $get(tabOrigemDados(origem,versao))
     
     if (idVersaoGercon = "") continue
     
     kill tabTemp
     merge tabTemp = tabOrigem(origem,versao)
     
     set sc = ##class(Src2.Utils).ObterStrReposRevis(.tabTemp, .strReposRevis)
     
     set tabReposRevis(idVersaoGercon) = strReposRevis
   }
 }
 
 if ($data(tabErros)) quit $$$ERROR(10000,"Erros ao buscar os itens alterados!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarRevisoesGercon">
<Description>

Importar Revisoes

set sc = ##class(Src2.IntegraGercon).ImportarRevisoesGercon(9999, "http://192.168.15.10:18080/svn/teste/trunk;68,69,70,84,89", "C:\workspacecsw\temp\loggercon.txt")
set sc = ##class(Src2.IntegraGercon).ImportarRevisoesGercon(9999, "http://192.168.15.10:18080/svn/teste/trunk;68,69,70,84,89", "/usr/tmp/ederson/loggercon.txt", "ederson@consistem.com.br")

set sc = ##class(Src2.IntegraGercon).ImportarRevisoesGercon(1111, "http://192.168.15.10:18080/svn/teste/trunk;89", "C:\workspacecsw\temp\loggercon.txt")
set sc = ##class(Src2.IntegraGercon).ImportarRevisoesGercon(2222, "http://192.168.15.10:18080/svn/teste/trunk;69", "C:\workspacecsw\temp\loggercon.txt")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>chamado:%String,strReposRevis:%String,arquivoLog:%String,email:%String="",ipServidor:%String="",username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (sc '= 1) {
   kill ^mtempSrc2IntegraGerconErros(codTerm)
   kill ^mtempSrc2IntegraGerconAvisos(codTerm)
   set sc = ##class(Src2.IntegraGercon).GravarErro(codTerm, sc)
   set sc = ##class(Src2.IntegraGercon).GerarArquivoLog(codTerm, chamado, arquivoLog, ipServidor)
   quit $$$ERROR(10000,sc)
 }
 
 kill ^mtempSrc2IntegraGerconErros(codTerm)
 kill ^mtempSrc2IntegraGerconAvisos(codTerm)
 
 set sc = ##class(Src2.Utils).ObterTabReposRevis(strReposRevis, .tabReposRevis)
 
 set urlRepositorio = ""
 for {
   set urlRepositorio = $order(tabReposRevis(urlRepositorio))
   if (urlRepositorio = "") quit
   
   kill ^mtempSrc2Revisoes(codTerm)
   
   set revisao = ""
   for {
     set revisao = $order(tabReposRevis(urlRepositorio,revisao))
     if (revisao = "") quit
     
     set sc = ##class(Src2.Utils).ObterDadosRevisoes(codTerm, caminhoSvn, arquivoTemp, urlRepositorio, revisao, revisao, username, password)
     if (sc = 1) continue
     
     set sc = ##class(Src2.IntegraGercon).GravarErro(codTerm)
     set sc = ##class(Src2.IntegraGercon).GravarErro(codTerm, ##class(Src2.Utils).ObterBarra( , ,100))
     set sc = ##class(Src2.IntegraGercon).GravarErro(codTerm, sc)
     set sc = ##class(Src2.IntegraGercon).GravarErro(codTerm, ##class(Src2.Utils).ObterBarra( , ,100))
     set sc = ##class(Src2.IntegraGercon).GravarErro(codTerm)
   }
   
   set sc = ##class(Src2.IntegraGercon).FiltrarRevisoes(codTerm,urlRepositorio)
   
   set sc = ##class(Src2.Utils).ImportarRevisoes(codTerm, caminhoSvn, arquivoTemp, urlRepositorio, 0, 1, 1, , username, password)
   
   if ($data(^mtempSrc2Erros(codTerm))) {
     set (autor, revisao, codSeq) = ""
     for {
       set autor = $order(^mtempSrc2Erros(codTerm,autor))
       if (autor = "") quit
       for {
         set revisao = $order(^mtempSrc2Erros(codTerm,autor,revisao))
         if (revisao = "") quit
         kill tabMensagem
         set sc = ##class(Src2.Utils).ObterTabMensagensErroRevisao(codTerm, urlRepositorio, autor, revisao, .tabMensagem)
         for {
           set codSeq = $order(tabMensagem(codSeq))
           if (codSeq = "") quit
           set sc = ##class(Src2.IntegraGercon).GravarErro(codTerm, $get(tabMensagem(codSeq)))
         }
       }
     }
   }
   
   set (tipoItem, item, revisao) = ""
   for {
     set tipoItem = $order(^mtempSrc2Revisoes(codTerm,"item",tipoItem))
     if (tipoItem = "") quit
     for {
       set item = $order(^mtempSrc2Revisoes(codTerm,"item",tipoItem,item))
       if (item = "") quit
       for {
         set revisao = $order(^mtempSrc2Revisoes(codTerm,"item",tipoItem,item,revisao))
         if (revisao = "") quit
         
         // TODO - Documentar as globais ^Src2GerconItem / ^Src2GerconChamado
         set ^Src2GerconItem(tipoItem,item,urlRepositorio,revisao,1,chamado) = $horolog
         set ^Src2GerconChamado(chamado,1,urlRepositorio,revisao,1,tipoItem,item) = $horolog
       }
     }
   }
   
   kill ^mtempSrc2Revisoes(codTerm)
   kill ^mtempSrc2Erros(codTerm)
 }
 
 set sc = ##class(Src2.IntegraGercon).GerarArquivoLog(codTerm, chamado, arquivoLog, ipServidor)
 
 if (email '= "") {
   set sc = ##class(Src2.IntegraGercon).EnviarLogErrosEmail(codTerm, chamado, strReposRevis, email, ipServidor)
 }
 
 kill ^mtempSrc2IntegraGerconErros(codTerm)
 kill ^mtempSrc2IntegraGerconAvisos(codTerm)
 kill ^mtempSrc2Revisoes(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="FiltrarRevisoes">
<Description>

Filtra as Revisoes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,urlRepositorio:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 // Elimina rotina CCVA
 set (item, revisao) = ""
 for {
   set item = $order(^mtempSrc2Revisoes(codTerm,"item",1,item))
   if (item = "") quit
   if ($extract(item,1,4) = "CCVA") {
     for {
       set revisao = $order(^mtempSrc2Revisoes(codTerm,"item",1,item,revisao))
       if (revisao = "") quit
       kill ^mtempSrc2Revisoes(codTerm,"rev",revisao,1,1,item)
       kill ^mtempSrc2Revisoes(codTerm,"item",1,item,revisao)
     }
   }
 }
 
 // Importa a revisão mais recente do item
 set (tipoItem, item) = ""
 for {
   set tipoItem = $order(^mtempSrc2Revisoes(codTerm,"item",tipoItem))
   if (tipoItem = "") quit
   for {
     set item = $order(^mtempSrc2Revisoes(codTerm,"item",tipoItem,item))
     if (item = "") quit
     
     set ultimaRevisao = $order(^mtempSrc2Revisoes(codTerm,"item",tipoItem,item,""),-1)
     if (ultimaRevisao = "") continue
     
     // Deixa somente a revisão mais recente do item.
     // O chamado pode ter mais de um commit para o mesmo item, somente o último é valido
     set revisao = ""
     for {
       set revisao = $order(^mtempSrc2Revisoes(codTerm,"item",tipoItem,item,revisao))
       if (revisao = "") quit
       if (revisao '= ultimaRevisao) {
         kill ^mtempSrc2Revisoes(codTerm,"rev",revisao,1,tipoItem,item)
         kill ^mtempSrc2Revisoes(codTerm,"item",tipoItem,item,revisao)
       }
     }
     
     // Elimina a importação de um item que teve um chamado baixado anteriormente com uma revisão mais recente
     
     set revisao = $order(^Src2GerconItem(tipoItem,item,urlRepositorio,""),-1)
     
     if (revisao '= "") , (revisao > ultimaRevisao) {
       kill ^mtempSrc2Revisoes(codTerm,"rev",ultimaRevisao,1,tipoItem,item)
       kill ^mtempSrc2Revisoes(codTerm,"item",tipoItem,item,ultimaRevisao)
       
       kill tabChamados
       merge tabChamados = ^Src2GerconItem(tipoItem,item,urlRepositorio,revisao,1)
       
       set sc = ##class(Src2.IntegraGercon).GravarAviso(codTerm)
       set sc = ##class(Src2.IntegraGercon).GravarAviso(codTerm, ##class(Src2.Utils).ObterBarra( , ,100))
       set sc = ##class(Src2.IntegraGercon).GravarAviso(codTerm, "Item Baixado por um Chamado em uma Revisão mais Recente")
       set sc = ##class(Src2.IntegraGercon).GravarAviso(codTerm, "Repositório: "_urlRepositorio_" - Revisão: "_revisao)
       set sc = ##class(Src2.IntegraGercon).GravarAviso(codTerm, "Item: "_item_" / Revisão: "_revisao_" / Chamados: "_##class(Src2.Utils).ConvertTabStr(.tabChamados))
       set sc = ##class(Src2.IntegraGercon).GravarAviso(codTerm, ##class(Src2.Utils).ObterBarra( , ,100))
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarErro">
<Description>

Importar Tabela de Revisoes

set sc = ##class(Src2.IntegraGercon).GravarErro()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,msgErro:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codSeq = $order(^mtempSrc2IntegraGerconErros(codTerm,""),-1) + 1
 
 set ^mtempSrc2IntegraGerconErros(codTerm,codSeq) = msgErro
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarAviso">
<Description>

Importar Tabela de Revisoes

set sc = ##class(Src2.IntegraGercon).GravarAviso()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,msgErro:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codSeq = $order(^mtempSrc2IntegraGerconAvisos(codTerm,""),-1) + 1
 
 set ^mtempSrc2IntegraGerconAvisos(codTerm,codSeq) = msgErro
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarArquivoLog">
<Description>

Gerar Arquivo de Log de Erros
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,chamado:%String,arquivoLog:%String,ipServidor:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set objFile = ##class(%File).%New(arquivoLog)
 
 do objFile.Open("WN:/IOTABLE=""UTF8""")
 if ('objFile.IsOpen) {
   set objFile = ""
   quit "Erro ao gerar o arquivo de "_arquivoLog_"!"
 }
 
 if ('$data(^mtempSrc2IntegraGerconErros(codTerm))) {
   set sc = objFile.WriteLine("OK")
   do objFile.Close()
   set objFile = ""
   quit $$$OK
 }
 
 set sc = objFile.WriteLine(##class(Src2.Utils).ObterBarra( , ,100))
 set sc = objFile.WriteLine("Baixa de Chamado "_chamado_" :: "_ipServidor_" ("_$znspace_") :: Erros :: Compilação / Geração CSP / TODOs Pendentes")
 set sc = objFile.WriteLine(##class(Src2.Utils).ObterBarra( , ,100))
 
 set codSeq = ""
 for {
   set codSeq = $order(^mtempSrc2IntegraGerconErros(codTerm,codSeq))
   if (codSeq = "") quit
   set sc = objFile.WriteLine($get(^mtempSrc2IntegraGerconErros(codTerm,codSeq)))
 }
 
 do objFile.Close()
 set objFile = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="EnviarLogErrosEmail">
<Description>

Envia um Log de Erros por Email
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,chamado:%String,strReposRevis:%String,email:%String,ipServidor:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (('$data(^mtempSrc2IntegraGerconErros(codTerm))) & ('$data(^mtempSrc2IntegraGerconAvisos(codTerm)))) {
   quit $$$OK
 }
 
 set smtpdomain = $piece($get(^%CSMENCF),"^",30)
 
 set smtpport = $piece($get(^%CSMENCF),"^",28)
 
 set userSMTP = $piece($get(^%CSMENCF),"^",33)
 
 set passSMTP = $piece($get(^%CSMENCF),"^",34)
 
 set from="desenvolvimento@consistem.com.br"
 
 set subject="Source Control :: Baixa do Chamado "_chamado_" :: "_ipServidor_" ("_$znspace_")"
 
 set to(1) = email
 
 kill tabMensagem
 
 set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , ,100)
 set tabMensagem($order(tabMensagem(""),-1)+1) = "Baixa de Chamado "_chamado_" :: "_ipServidor_" ("_$znspace_")"
 set tabMensagem($order(tabMensagem(""),-1)+1) = "Repositorios: "_strReposRevis
 set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , ,100)
 set tabMensagem($order(tabMensagem(""),-1)+1) = ""
 
 if ($data(^mtempSrc2IntegraGerconErros(codTerm))) {
   set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , ,100)
   set tabMensagem($order(tabMensagem(""),-1)+1) = "Erros :: Compilação / Geração CSP / TODOs Pendentes"
   set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , ,100)
   
   set codSeq = ""
   for {
     set codSeq = $order(^mtempSrc2IntegraGerconErros(codTerm,codSeq))
     if (codSeq = "") quit
     set tabMensagem($order(tabMensagem(""),-1)+1) = $get(^mtempSrc2IntegraGerconErros(codTerm,codSeq))
   }
 }
 
 if ($data(^mtempSrc2IntegraGerconAvisos(codTerm))) {
   set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , ,100)
   set tabMensagem($order(tabMensagem(""),-1)+1) = "Avisos"
   set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , ,100)
   
   set codSeq = ""
   for {
     set codSeq = $order(^mtempSrc2IntegraGerconAvisos(codTerm,codSeq))
     if (codSeq = "") quit
     set tabMensagem($order(tabMensagem(""),-1)+1) = $get(^mtempSrc2IntegraGerconAvisos(codTerm,codSeq))
   }
 }
 
 set sc = $$EnviarEmail^%CSUTIEM(subject,.tabMensagem,smtpdomain,smtpport,from,.to,,,userSMTP,passSMTP)
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Item">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="ValidarItem">
<Description>

Validar Rotina

set sc = ##class(Src2.Item).ValidarItem("CCEVB9*.mac", .expressaoEdt, .qtdItens, .tabItens)
set sc = ##class(Src2.Item).ValidarItem("CCEVA300.mac", .expressaoEdt, .qtdItens, .tabItens)
set sc = ##class(Src2.Item).ValidarItem("nfe.v110.COF*.cls", .expressaoEdt, .qtdItens, .tabItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[expressao:%String,&expressaoEdt:%String,&qtdItens:%Integer,&tabItens:%String,&tipo:%Integer]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set expressaoEdt = expressao
 set qtdItens = 0
 kill tabItens
 set extencao = $zconvert($piece(expressao,".",$length(expressao,".")),"l")
 set tipo = 0
 
 if (extencao = "cls") set tipo = 1
 
 if (extencao = "int") ! (extencao = "mac") set tipo = 2
 
 if (extencao = "classes") set tipo = 3
 
 if (extencao = "rotinas") set tipo = 4
 
 if (tipo = 0) ! (tipo = 1) {
   set sc = ##class(Src2.Classe).ValidarClasse(expressao, .expressaoEdt, .qtdItens, .tabItens)
   if $$$ISOK(sc) set tipo = 1 quit $$$OK
 }
 
 if (tipo = 0) ! (tipo = 2) {
   set sc = ##class(Src2.Rotina).ValidarRotina(expressao, .expressaoEdt, .qtdItens, .tabItens)
   if $$$ISOK(sc) set tipo = 2 quit $$$OK
 }
 
 if (tipo = 3) {
   set sc = ##class(Src2.Classe).ObterClassesProjeto(expressao, .expressaoEdt, .qtdItens, .tabItens)
   if $$$ISOK(sc) set tipo = 1 quit $$$OK
 }
 
 if (tipo = 4) {
   set sc = ##class(Src2.Rotina).ObterRotinasProjeto(expressao, .expressaoEdt, .qtdItens, .tabItens)
   if $$$ISOK(sc) set tipo = 1 quit $$$OK
 }
 
 if (qtdItens = 0) quit "Nenhum item encontrado para a expressão '"_expressaoEdt_"'!"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AgruparItens">
<Description>

Agrupar Itens

set sc = ##class(Src2.Item).AgruparItens(.tabItens, .qtdade)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>tabItens:%String,qtdade:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 ;set tabItens("CCTCP020.mac")=1
 ;set tabItens("CCTCR030.mac")=1
 ;set tabItens("CCTCP*.mac")=12
 ;set tabItens("CCTCPC*.mac")=10
 ;set tabItens("Tcp.Eng*.cls")=8
 ;set tabItens("Tcp.Engenharia.cls")=1
 ;set tabItens("Tcp.Prod*.cls")=12
 ;set tabItens("Tcp.Produt*.cls")=10
 ;set tabItens("Tcp.Classificacao.cls")=1
 ;set tabItens("*.cls")=1000
 ;set tabItens("*.mac")=1000
 
 set qtdade = 0
 
 set (item, item2) = ""
 for {
   set item = $order(tabItens(item))
   if (item = "") quit
   
   set extensao = $zconvert($piece(item,".",$length(item,".")),"l")
   
   if ((extensao '= "cls") & (extensao '= "mac")) continue
   
   set item2 = $translate($piece(item,".",1,$length(item,".")-1),"*","")
   
   if (item '[ "*") {
     set tabela(extensao,1,item2) = item
     continue
   }
   
   if (item2 = "") set tabela(extensao) = 1
   else  set tabela(extensao,2,item2) = item
 }
 
 set (extensao, item) = ""
 for {
   set extensao = $order(tabela(extensao))
   if (extensao = "") quit
   
   if ($get(tabela(extensao)) = 1) {
     for {
       set item = $order(tabela(extensao,1,item))
       if (item = "") quit
       kill tabItens($piece($get(tabela(extensao,1,item)),"^",1))
     }
     for {
       set item = $order(tabela(extensao,2,item))
       if (item = "") quit
       kill tabItens($piece($get(tabela(extensao,2,item)),"^",1))
     }
     continue
   }
   
   // Elimina itens
   for {
     set item = $order(tabela(extensao,1,item))
     if (item = "") quit
     
     for cont = $length(item)-1:-1:1 {
       if $data(tabela(extensao,2,$extract(item,1,cont))) {
         kill tabItens($piece($get(tabela(extensao,1,item)),"^",1))
         kill tabela(extensao,1,item)
       }
     }
   }
   
   // Elimina grupo de itens
   for {
     set item = $order(tabela(extensao,2,item))
     if (item = "") quit
     
     for cont = $length(item)-1:-1:1 {
       if $data(tabela(extensao,2,$extract(item,1,cont))) {
         kill tabItens($piece($get(tabela(extensao,2,item)),"^",1))
         kill tabela(extensao,2,item)
       }
     }
   }
   
 }
 
 set item = ""
 for {
   set item = $order(tabItens(item))
   if (item = "") quit
   set qtdade = qtdade + $piece($get(tabItens(item)),"^",1)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirItensSistema">
<Description>

Excluir Itens do Sistema

set sc = ##class(Src2.Item).ExcluirItensSistema("csw")
set sc = ##class(Src2.Item).ExcluirItensSistema("")
set sc = ##class(Src2.Item).ExcluirItensSistema("customax")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sistema:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Item).ObterItensSistema(sistema,.tabItens)
 
 set grupoRotina = ""
 for {
   set grupoRotina = $order(tabItens(1,grupoRotina))
   if (grupoRotina = "") quit
   set sc = ##class(Src2.Item).ExcluirGrupoItens(grupoRotina_"*.mac")
 }
 
 set grupoClasse = ""
 for {
   set grupoClasse = $order(tabItens(2,grupoClasse))
   if (grupoClasse = "") quit
   set sc = ##class(Src2.Item).ExcluirGrupoItens(grupoClasse_"*.cls")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterItensSistema">
<Description>

Obter Itens do Sistema

set sc = ##class(Src2.Item).ObterItensSistema("csw",.tabItens)
set sc = ##class(Src2.Item).ObterItensSistema("customax",.tabItens)
set sc = ##class(Src2.Item).ObterItensSistema("",.tabItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,&tabItens:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabItens
 
 if (sistema '= "") {
   set sc = ##class(Src2.UtilsXml).ObterSistemasXML(.tabSistemas)
   
   set varSistema = $get(tabSistemas(sistema))
   
   if (+$piece(varSistema,"^",1) = 1) {
     set sc = ##class(Src2.UtilsXml).ObterContas(.tabContas)
     set conta = ""
     for {
       set conta = $order(tabContas(conta))
       if (conta = "") quit
       set varContas = $get(tabContas(conta))
       if ($piece(varContas,"^",4) '= 1) {
         set grupoRotina = ""
         for {
           set grupoRotina = $order(tabSistemas(sistema,1,grupoRotina))
           if (grupoRotina = "") quit
           set tabItens(1,grupoRotina_conta) = ""
         }
         set grupoClasse = ""
         for {
           set grupoClasse = $order(tabSistemas(sistema,2,grupoClasse))
           if (grupoClasse = "") quit
           set tabItens(2,grupoClasse_$zconvert(conta,"l")) = ""
         }
       }
     }
   } else {
     set grupoRotina = ""
     for {
       set grupoRotina = $order(tabSistemas(sistema,1,grupoRotina))
       if (grupoRotina = "") quit
       set tabItens(1,grupoRotina) = ""
     }
     
     set grupoClasse = ""
     for {
       set grupoClasse = $order(tabSistemas(sistema,2,grupoClasse))
       if (grupoClasse = "") quit
       set tabItens(2,grupoClasse) = ""
     }
   }
 }
 
 if (sistema = "") {
   set sc = ##class(Src2.UtilsXml).ObterContas(.tabContas)
   set conta = ""
   for {
     set conta = $order(tabContas(conta))
     if (conta = "") quit
     set varContas = $get(tabContas(conta))
     if (($piece(varContas,"^",2) = 1) & ($piece(varContas,"^",4) '= 1)) {
       set tabItens(1,conta) = ""
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirGrupoItens">
<Description>

Excluir um Grupo de Itens

set sc = ##class(Src2.Item).ExcluirGrupoItens("CCEVB99*.mac")
set sc = ##class(Src2.Item).ExcluirGrupoItens("nfe.v110.COF*.cls")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>grupo:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Item).ValidarItem(grupo, , , .tabItens)
 quit:sc'=1 sc
 
 set InternalName = ""
 for {
   set InternalName = $order(tabItens(InternalName))
   if (InternalName = "") quit
  
   set sc = ##class(Src2.Item).ExcluirItemCache(InternalName)
   
   write !,"Excluído o item: ",InternalName
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarItemArquivo">
<Description>

Compara um Item com um Arquivo

write ##class(Src2.Item).ExportarItemArquivo("CCEVA010.mac")
write ##class(Src2.Item).ExportarItemArquivo("CCEVA001.MAC")
write ##class(Src2.Item).ExportarItemArquivo("nfe.v200.avulsa.cls")
write ##class(Src2.Item).ExportarItemArquivo("Src2.Classe.cls",,"admin","admin")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>InternalName:%String,flgSubversion:%Boolean=1,username:%String="",password:%String="",flgLog:%Boolean=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Item).ObterDadosItem(InternalName, .item, , .itemCopiaTrabalho, , , , .extensao)
 quit:msgsc'=1 msgsc
 
 if (extensao = "mac") {
   quit ##class(Src2.Rotina).ExportarRotinaArquivo(item, itemCopiaTrabalho, flgSubversion, username, password, flgLog)
 }
 
 if (extensao = "cls") {
   quit ##class(Src2.Classe).ExportarClasseArquivo(item, itemCopiaTrabalho, flgSubversion, username, password, flgLog)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CompararItemArquivo">
<Description>

Compara um Item com um Arquivo

write ##class(Src2.Item).CompararItemArquivo("CCEVA010.mac")
write ##class(Src2.Item).CompararItemArquivo("Inf.ApuracaoSTAjustesOutros.cls", .linDifNr, .linDifItem, .linDifArq)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[InternalName:%String,&linDifNr:%String="",&linDifItem:%String="",&linDifArq:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, .item, , .itemCopiaTrabalho, , , , .extensao)
 
 if (extensao = "mac") {
   quit ##class(Src2.Rotina).CompararRotinaArquivo(item, itemCopiaTrabalho, .linDifNr, .linDifItem, .linDifArq)
 }
 
 if (extensao = "cls") {
   quit ##class(Src2.Classe).CompararClasseArquivo(item, itemCopiaTrabalho, .linDifNr, .linDifItem, .linDifArq)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarItemArquivo">
<Description>

Importar um Item de um Arquivo
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>InternalName:%String,flgLog:%Boolean=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, .item, , .itemCopiaTrabalho, , , , .extensao)
 
 if (extensao = "mac") {
   quit ##class(Src2.Rotina).GerarRotinaArquivo(itemCopiaTrabalho, item, "csp", , , , , , , flgLog)
 }
 
 if (extensao = "cls") {
   quit ##class(Src2.Classe).GerarClasseArquivo(itemCopiaTrabalho, item, , , , flgLog)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosItem">
<Description>

Obter Dados Item

set sc = ##class(Src2.Item).ObterDadosItem("CCEVA621.mac", .item, .pastaCopiaTrabalho, .itemCopiaTrabalho, .pastaRepositorio, .itemRepositorio, .descricao, .extensao, .pasta, .projeto, .versaoRelacionada, .sistema, .arquivo)
set sc = ##class(Src2.Item).ObterDadosItem("GCCOTCR500RG.mac", .item, .pastaCopiaTrabalho, .itemCopiaTrabalho, .pastaRepositorio, .itemRepositorio, .descricao, .extensao, .pasta, .projeto, .versaoRelacionada, .sistema, .arquivo)
set sc = ##class(Src2.Item).ObterDadosItem("%CSMEN045.mac", .item, .pastaCopiaTrabalho, .itemCopiaTrabalho, .pastaRepositorio, .itemRepositorio, .descricao, .extensao, .pasta, .projeto, .versaoRelacionada, .sistema, .arquivo)
set sc = ##class(Src2.Item).ObterDadosItem("Gcco.Tcr.Tag.cls", .item, .pastaCopiaTrabalho, .itemCopiaTrabalho, .pastaRepositorio, .itemRepositorio, .descricao, .extensao, .pasta, .projeto, .versaoRelacionada, .sistema, .arquivo)
set sc = ##class(Src2.Item).ObterDadosItem("Gcco.nfe.v200.transporta.cls", .item, .pastaCopiaTrabalho, .itemCopiaTrabalho, .pastaRepositorio, .itemRepositorio, .descricao, .extensao, .pasta, .projeto, .versaoRelacionada, .sistema, .arquivo)
set sc = ##class(Src2.Item).ObterDadosItem("nfe.v200.transporta.cls", .item, .pastaCopiaTrabalho, .itemCopiaTrabalho, .pastaRepositorio, .itemRepositorio, .descricao, .extensao, .pasta, .projeto, .versaoRelacionada, .sistema, .arquivo)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[InternalName:%String,&item:%String,&pastaCopiaTrabalho:%String,&itemCopiaTrabalho:%String,&pastaRepositorio:%String,&itemRepositorio:%String,&descricao:%String,&extensao:%String,&pasta:%String,&projeto:%String,&versaoRelacionada:%String,&sistema:%String,&arquivo:%String,&itemId:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (item, pastaCopiaTrabalho, itemCopiaTrabalho, pastaRepositorio, itemRepositorio, descricao, extensao, pasta, projeto, versaoRelacionada, sistema, arquivo, itemId) = ""
 
 set sc = ##class(Src2.Item).ObterInfoInternalName(InternalName, .item, .extensao)
 
 if (extensao = "mac") {
   quit ##class(Src2.Rotina).ObterDadosRotina(item, .pastaCopiaTrabalho, .itemCopiaTrabalho, .pastaRepositorio, .itemRepositorio, .descricao, .extensao, .InternalName, .pasta, .projeto, .versaoRelacionada, .sistema, .arquivo, .itemId)
 }
 
 if (extensao = "cls") {
   quit ##class(Src2.Classe).ObterDadosClasse(item, .pastaCopiaTrabalho, .itemCopiaTrabalho, .pastaRepositorio, .itemRepositorio, .descricao, .extensao, .InternalName, .pasta, .projeto, .versaoRelacionada, .sistema, .arquivo, .itemId)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosArquivoItem">
<Description>

Obter Dados Arquivo Item

set sc = ##class(Src2.Item).ObterDadosArquivoItem("CCEVA621.mac", .dataAlteracao, .tamanho)
set sc = ##class(Src2.Item).ObterDadosArquivoItem("nfe.v200.transporta.cls", .dataAlteracao, .tamanho)
set sc = ##class(Src2.Item).ObterDadosArquivoItem("CCEVB612.mac", .dataAlteracao, .tamanho)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[InternalName:%String,&dataAlteracao:%String,&tamanho:%Integer]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (dataAlteracao, tamanho) = ""
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, , , .itemCopiaTrabalho)
 quit:sc'=1 sc
 
 if (itemCopiaTrabalho '= "") , (##class(%File).Exists(itemCopiaTrabalho))  {
   set dataAlteracao = ##class(%File).GetFileDateModified(itemCopiaTrabalho)
   set tamanho = ##class(%File).GetFileSize(itemCopiaTrabalho)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfoInternalName">
<Description>

Obter Informações do Iternal Name

set sc = ##class(Src2.Item).ObterInfoInternalName("Src.CCTCP020.mac", .item, .extensao)
set sc = ##class(Src2.Item).ObterInfoInternalName("CCTCP020.MAC", .item, .extensao)
set sc = ##class(Src2.Item).ObterInfoInternalName("Tcp.Engenharia.cls", .item, .extensao)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[InternalName:%String,&item:%String,&extensao:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set extensao = $zconvert($piece(InternalName,".",$length(InternalName,".")),"l")
 set item = $piece(InternalName,".",1,$length(InternalName,".")-1)
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarItemControleFonte">
<Description>

Verifica se Um Item Tem Controle de Fonte

write ##class(Src2.Item).ValidarItemControleFonte("CCTCR075.mac")
write ##class(Src2.Item).ValidarItemControleFonte("CCTCR075.mac")
write ##class(Src2.Item).ValidarItemControleFonte("XXTCR075.mac")
write ##class(Src2.Item).ValidarItemControleFonte("CCTCzzz.mac")
write ##class(Src2.Item).ValidarItemControleFonte("zz.mac")
write ##class(Src2.Item).ValidarItemControleFonte("nfe.v200.avulsa.cls")
write ##class(Src2.Item).ValidarItemControleFonte("Tcp.Engenharia.cls")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>InternalName:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Item).ObterInfoInternalName(InternalName, .item, .extensao)
 
 if (extensao = "mac") {
   quit ##class(Src2.Rotina).ValidarRotinaControleFonte(item)
 }
 
 if (extensao = "cls") {
   quit ##class(Src2.Classe).ValidarClasseControleFonte(item)
 }
 
 quit 0
]]></Implementation>
</Method>

<Method name="ExcluirItemCache">
<Description>

Excluir um Item no Cache

write ##class(Src2.Item).ExcluirItemCache("CCTCR075.mac")
write ##class(Src2.Item).ExcluirItemCache("CCTCR075.mac")
write ##class(Src2.Item).ExcluirItemCache("XXTCR075.mac")
write ##class(Src2.Item).ExcluirItemCache("CCTCzzz.mac")
write ##class(Src2.Item).ExcluirItemCache("zz.mac")
write ##class(Src2.Item).ExcluirItemCache("nfe.v200.avulsa.cls")
write ##class(Src2.Item).ExcluirItemCache("Tcp.Engenharia.cls")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[InternalName:%String,&tabErros:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabErros
 
 set sc = ##class(Src2.Item).ObterInfoInternalName(InternalName, .item, .extensao)
 
 if (extensao = "mac") {
   quit ##class(Src2.Rotina).ExcluirRotina(item, .tabErros)
 }
 
 if (extensao = "cls") {
   quit ##class(Src2.Classe).ExcluirClasse(item, .tabErros)
 }
 
 quit "Item inválido para exclusão"
]]></Implementation>
</Method>

<Method name="ValidarFonteItemCache">
<Description>

Verifica se Um Item Tem o Fonte no Caché

write ##class(Src2.Item).ValidarFonteItemCache("CCTCR075.mac")
write ##class(Src2.Item).ValidarFonteItemCache("CCEVA330.mac")
write ##class(Src2.Item).ValidarFonteItemCache("XXTCR075.mac")
write ##class(Src2.Item).ValidarFonteItemCache("Src2.Utils.cls")
write ##class(Src2.Item).ValidarFonteItemCache("nfe.v200.avulsa.cls")
write ##class(Src2.Item).ValidarFonteItemCache("Tcp.Engenharia.cls")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>InternalName:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Item).ObterInfoInternalName(InternalName, .item, .extensao)
 
 if (extensao = "mac") {
   quit $data(^rMAC(item))
 }
 
 if (extensao = "cls") {
   quit $data(^oddDEF(item))
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarVersaoRelacionada">
<Description>

Verifica se Um Item Tem o Fonte no Caché

write ##class(Src2.Item).ValidarVersaoRelacionada("CCTCR075.mac")
write ##class(Src2.Item).ValidarVersaoRelacionada("CCEVA330.mac")
write ##class(Src2.Item).ValidarVersaoRelacionada("GCCOCCEVA330.mac")
write ##class(Src2.Item).ValidarVersaoRelacionada("XXTCR075.mac")
write ##class(Src2.Item).ValidarVersaoRelacionada("Gcco.nfe.v200.transporta.cls")
write ##class(Src2.Item).ValidarVersaoRelacionada("nfe.v200.avulsa.cls")
write ##class(Src2.Item).ValidarVersaoRelacionada("Tcp.Engenharia.cls")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>InternalName:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, , , , , , , , , .projeto, .versaoRelacionada)
 quit:sc'=1 sc
 
 if (versaoRelacionada '= "") , (projeto '= "") {
   set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, , , , , .versao)
   if (versaoRelacionada '= versao) {
     quit "Item "_InternalName_" está relacionado a versão "_versaoRelacionada
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirArquivoItem">
<ClassMethod>1</ClassMethod>
<FormalSpec>InternalName:%String,flgSubversion:%Boolean=1,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(, , .caminhoSvn)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, , .pastaCopiaTrabalho, .itemCopiaTrabalho)
 
 if (itemCopiaTrabalho = "") quit $$$OK
 
 if (flgSubversion) {
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "delete --force "_itemCopiaTrabalho, username, password)
   if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 }
 
 if (##class(%File).Exists(itemCopiaTrabalho)) {
   set sc = ##class(%File).Delete(itemCopiaTrabalho)
   if ('sc) quit $$$ERROR(10000,"Erro ao excluir o arquivo "_itemCopiaTrabalho_"!")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterItem">
<Description>

Obter Item

set sc = ##class(Src2.Item).ObterItem("classes/nfe_v110/TDec0803Opc.xml  (revisÃ£o 17)", .tipo, .item, .sys, .pasta, .InternalName, .itemId)
set sc = ##class(Src2.Item).ObterItem("/trunk/classes/nfe_v110/TDec0803Opc.xml  (revisÃ£o 17)", .tipo, .item, .sys, .pasta, .InternalName, .itemId)
set sc = ##class(Src2.Item).ObterItem("rotinas/CCEVA/CCEVA704.mac  (revisÃ£o 17)", .tipo, .item, .sys, .pasta, .InternalName, .itemId)
set sc = ##class(Src2.Item).ObterItem("rotinas/_CS/_CSMEN000.mac  (revisÃ£o 17)", .tipo, .item, .sys, .pasta, .InternalName, .itemId)
set sc = ##class(Src2.Item).ObterItem("/trunk/rotinas/_CS/_CSMEN000.mac  (revisÃ£o 17)", .tipo, .item, .sys, .pasta, .InternalName, .itemId)
set sc = ##class(Src2.Item).ObterItem("rotinas/ccevb/  (revisã£o 17)", .tipo, .item, .sys, .pasta, .InternalName, .itemId)
set sc = ##class(Src2.Item).ObterItem("classes/nfe_v200/  (revisÃ£o 17)", .tipo, .item, .sys, .pasta, .InternalName, .itemId)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[string:%String,&tipo:%String,&item:%String,&sys:%Boolean,&pasta:%Boolean,&InternalName:%String,&itemId:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (tipo, item, pasta, InternalName, itemId) = ""
 set sys = 0
 
 if (string [ "rotinas/") , (string [ ".mac") {
   set tipo = 1
   set itemId = $piece($piece(string,"rotinas/",2),".mac",1)_".mac"
   quit ##class(Src2.Rotina).ObterInfoRotinaId(itemId, .item, .pasta, .InternalName, .sys)
 }
 
 if (string [ "classes/") , (string [ ".xml") {
   set tipo = 2
   set itemId = $piece($piece(string,"classes/",2),".xml",1)_".xml"
   quit ##class(Src2.Classe).ObterInfoClasseId(itemId, .item, .pasta, .InternalName)
 }
 
 if (tipo = "") quit "Item não identificado!"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfoItemId">
<Description>

Obtem Informações de um ItemId

set sc = ##class(Src2.Item).ObterInfoItemId("nfe_v200\transporta.xml", .InternalName)
set sc = ##class(Src2.Item).ObterInfoItemId("nfe_v200/transporta.xml", .InternalName)
set sc = ##class(Src2.Item).ObterInfoItemId("_CSMEN\_CSMEN100.mac", .InternalName)
set sc = ##class(Src2.Item).ObterInfoItemId("_CS/_CSMEN000.mac", .InternalName)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[itemId:%String,&InternalName:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set InternalName = ""
 
 if (itemId [ ".mac") {
   quit ##class(Src2.Rotina).ObterInfoRotinaId(itemId, , , .InternalName)
 }
 
 if (itemId [ ".xml") {
   quit ##class(Src2.Classe).ObterInfoClasseId(itemId, , , .InternalName)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfoItemId2">
<Description>

Obtem Informações de um ItemId 2

set sc = ##class(Src2.Item).ObterInfoItemId2("nfe_v200\transporta.xml", "http://192.168.15.10:18080/svn/cswutil/branches/6.2", "C:\workspacecsw\projetos\6.2\csw62", .itemPastaCopiaTrabalho, .itemCopiaTrabalho, .itemPastaRepositorio, .itemRepositorio)
set sc = ##class(Src2.Item).ObterInfoItemId2("nfe_v200/transporta.xml", "http://192.168.15.10:18080/svn/cswutil/branches/6.2", "C:\workspacecsw\projetos\6.2\csw62", .itemPastaCopiaTrabalho, .itemCopiaTrabalho, .itemPastaRepositorio, .itemRepositorio)
set sc = ##class(Src2.Item).ObterInfoItemId2("_CSMEN\_CSMEN100.mac", "http://192.168.15.10:18080/svn/cswutil/branches/6.2", "C:\workspacecsw\projetos\6.2\csw62", .itemPastaCopiaTrabalho, .itemCopiaTrabalho, .itemPastaRepositorio, .itemRepositorio)
set sc = ##class(Src2.Item).ObterInfoItemId2("_CS/_CSMEN000.mac", "http://192.168.15.10:18080/svn/cswutil/branches/6.2", "C:\workspacecsw\projetos\6.2\csw62", .itemPastaCopiaTrabalho, .itemCopiaTrabalho, .itemPastaRepositorio, .itemRepositorio)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[itemId:%String,urlRepositorio:%String,caminhoCopiaTrabalho:%String,&itemPastaCopiaTrabalho:%String,&itemCopiaTrabalho:%String,&itemPastaRepositorio:%String,&itemRepositorio:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (itemPastaCopiaTrabalho, itemCopiaTrabalho, itemPastaRepositorio, itemRepositorio) = ""
 
 if (itemId [ ".mac") {
   quit ##class(Src2.Rotina).ObterInfoRotinaId2(itemId, urlRepositorio, caminhoCopiaTrabalho, .itemPastaCopiaTrabalho, .itemCopiaTrabalho, .itemPastaRepositorio, .itemRepositorio)
 }
 
 if (itemId [ ".xml") {
   quit ##class(Src2.Classe).ObterInfoClasseId2(itemId, urlRepositorio, caminhoCopiaTrabalho, .itemPastaCopiaTrabalho, .itemCopiaTrabalho, .itemPastaRepositorio, .itemRepositorio)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarSelecaoItem">
<Description>

Validar a Selecao de um Item em um Grupo de Item

write ##class(Src2.Item).ValidarSelecaoItem("CCTCR*.mac", "CCTCR075.mac")
write ##class(Src2.Item).ValidarSelecaoItem("CCTCP*.mac", "CCTCR075.mac")
write ##class(Src2.Item).ValidarSelecaoItem("CCTCR075.MAC", "CCTCR075.mac")
write ##class(Src2.Item).ValidarSelecaoItem("CCTCR07*.MAC", "CCTCR075.mac")
write ##class(Src2.Item).ValidarSelecaoItem("CCTCR07*.cls", "CCTCR075.mac")
write ##class(Src2.Item).ValidarSelecaoItem("nfe.v200.avu*.cls", "nfe.v200.avulsa.cls")
write ##class(Src2.Item).ValidarSelecaoItem("nfe.v100.avu*.cls", "nfe.v200.avulsa.cls")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>grupo:%String="",InternalName:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (grupo = "") quit $$$OK
 
 if (grupo["*") set sintetico = 1
 else  set sintetico = 0
 
 set sc = ##class(Src2.Item).ObterInfoInternalName(InternalName, .item, .extensao)
 
 set extensaoGrupo = $zconvert($piece(grupo,".",$length(grupo,".")),"l")
 
 if (extensao '= extensaoGrupo) quit "Item não selecionado!"
 
 set grupo2 = $piece($piece(grupo,".",1,$length(grupo,".")-1),"*",1)
 
 set tamGrupo = $length(grupo2)
 
 if (grupo '="") {
   if (sintetico) & ($extract(item,1,tamGrupo) '= grupo2) quit "Item não selecionado!"
   if ('sintetico) & (item '= grupo2) quit "Item não selecionado!"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarItemInf">
<Description>

Validar Item Informado
OBS: No primeiro paramatro também retorna o item ajustado. (Sem espaços e com a extensão no padrão)

set item="CCTCR*.mac",sc=##class(Src2.Item).ValidarItemInf(.item, .item2, .extensao)
set item="CCTCR700.mac",sc=##class(Src2.Item).ValidarItemInf(.item, .item2, .extensao)
set item="*TCR700.mac",sc=##class(Src2.Item).ValidarItemInf(.item, .item2, .extensao)
set item=" CCT CR*.Mac",sc=##class(Src2.Item).ValidarItemInf(.item, .item2, .extensao)
set item="CCTCR700.png",sc=##class(Src2.Item).ValidarItemInf(.item, .item2, .extensao)
set item="Tcp.Engenharia.*",sc=##class(Src2.Item).ValidarItemInf(.item, .item2, .extensao)
set item="Tcp.Engenharia.*.cls",sc=##class(Src2.Item).ValidarItemInf(.item, .item2, .extensao)
set item="Tcp.Engenharia.*.teste.cls",sc=##class(Src2.Item).ValidarItemInf(.item, .item2, .extensao)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&item:%String="",&item2:%String="",&extensao:%String="",flgOutrasExtensoes:%Boolean=0]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (item2, extensao) = ""
 
 if (item = "") quit $$$ERROR(10000,"Item não informado!")
 
 set tabExtensoes("mac") = ""
 set tabExtensoes("cls") = ""
 set tabExtensoes("zip") = ""
 set tabExtensoes("jar") = ""
 set tabExtensoes("war") = ""
 
 set item = $translate(item," ","")
 
 set item2 = $piece(item,".",1,$length(item,".")-1)
 set extensao = $zconvert($piece(item,".",$length(item,".")),"l")
 
 set item = item2_"."_extensao
 
 if ('flgOutrasExtensoes) {
   if (extensao '= "cls") & (extensao '= "mac") {
     quit $$$ERROR(10000,"A extensão do item deve ser 'mac' ou 'cls'!")
   }
 } else {
   if (extensao = "") quit $$$ERROR(10000,"Tipo de arquivo inválido!")
   if ('$data(tabExtensoes(extensao))) quit $$$ERROR(10000,"Tipo de arquivo inválido!")
 }
 
 if (item2 [ "*") {
   if ($translate(item2,"*","") '= $extract(item2,1,$length(item2)-1)) {
     quit $$$ERROR(10000,"O '*' deve ser o último caracter para a seleção de grupos itens!")
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SeparaItens">
<Description>

Separa Itens

set sc=##class(Src2.Item).SeparaItens(.tabGrupoItens, .tabGrupoRotClas, .tabArqVers)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tabGrupoItens:%String,tabGrupoRotClas:%String,&tabArqVers:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabGrupoRotClas, tabArqVers
 
 set item = ""
 for  {
   set item = $order(tabGrupoItens(item))
   if (item = "") quit
   set sc = ##class(Src2.Item).ValidarItemInf(item, , .extensao, 1)
   
   if (extensao = "cls") ! (extensao = "mac") {
     set tabGrupoRotClas(item) = ""
     continue
   }
   
   set tabArqVers(item) = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarSelecaoGrupoItens">
<Description>

Validar a Selecao de um Item em Grupos de Itens
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tabGrupoItens:%String,InternalName:%String,&grupoSelecionado:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set grupoSelecionado = ""
 set flag = 0
 
 set grupo = ""
 for  {
   set grupo = $order(tabGrupoItens(grupo))
   if (grupo = "") quit
   if (##class(Src2.Item).ValidarSelecaoItem(grupo, InternalName) = $$$OK) {
     set grupoSelecionado = grupo
     set flag = 1
     quit
   }
 }
 
 if ('flag) quit "Item não selecionado!"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CompararWorkspaceCache">
<Description>

Compara Itens do Workspace para o Cache
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,flgAcertar:%Boolean=0,strOpcoesRotinas:%String="",flagCompClasses:%String="",flgLog:%Boolean=0,grupoItensSel:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 
 if (grupoItensSel = "") ! ($zconvert(grupoItensSel,"l") [ ".cls") {
   set sc = ##class(Src2.Classe).CompararClassesWorkspaceCache(codTerm, flgAcertar, flagCompClasses, flgLog, grupoItensSel)
 }
 
 if (grupoItensSel = "") ! ($zconvert(grupoItensSel,"l") [ ".mac") {
   set sc = ##class(Src2.Rotina).CompararRotinasWorkspaceCache(codTerm, flgAcertar, strOpcoesRotinas, flgLog, grupoItensSel)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarFontes">
<Description>

Importa Rotinas/Classes a Partir de Arquivos
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,strOpcoesRotinas:%String="",flagCompClasses:%String="",flgLog:%Boolean=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Classe).AtualizarClasses(codTerm, flagCompClasses, flgLog)
 set sc = ##class(Src2.Rotina).AtualizarRotinas(codTerm, strOpcoesRotinas, flgLog)
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CompararItensArquivos">
<Description>

Comparar Itens Arquivos

  flgAcertar = 0 - Compara sem acertar as diferenças
               1 - Compara e acerta as diferenças
               2 - Acerta as diferenças sem comparar

set sc = ##class(Src2.Item).CompararItensArquivos("CCEVA*.mac")
set sc = ##class(Src2.Item).CompararItensArquivos("CCEVA*.mac", 1)
set sc = ##class(Src2.Item).CompararItensArquivos("nfe*.cls")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>grupo:%String,flgAcertar:%Boolean=0,flgSubversion:%Boolean=1,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Item).ValidarItem(grupo, , , .tabItens)
 
 set InternalName = ""
 for  {
   set InternalName = $order(tabItens(InternalName))
   if (InternalName = "") quit
   
   if ('##class(Src2.Item).ValidarItemControleFonte(InternalName)) continue
   
   // Acerta sem analisar as diferenças
   if (flgAcertar '= 2) {
     set msgsc = ##class(Src2.Item).CompararItemArquivo(InternalName, .linDifNr, .linDifItem, .linDifArq)
     if (msgsc = $$$OK) continue
   }
   
   write !,InternalName_" (Linha: "_$get(linDifNr)_")"
   
   if (flgAcertar) {
     set msgsc = ##class(Src2.Item).ExportarItemArquivo(InternalName, flgSubversion, username, password, (flgAcertar = 1))
     if (msgsc = $$$OK) {
       write " [Acertada]"
     } else {
       write " [Erro]"
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabItemArquivo">
<Description>

Obter Tab Item Arquivo

set sc = ##class(Src2.Item).ObterTabItemArquivo("C:\workspacecsw\temp\rotina2.mac", .tabRotina)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[InternalName:%String,arquivoItem:%String,&tabItem:%Integer]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabItem
 
 set sc = ##class(Src2.Item).ObterInfoInternalName(InternalName, .item, .extensao)
 
 if (extensao = "mac") {
   quit ##class(Src2.Rotina).ObterTabRotinaArquivo(item, arquivoItem, .tabItem)
 }
 
 if (extensao = "cls") {
   quit ##class(Src2.Classe).ObterTabClasseArquivo(item, arquivoItem, .tabItem)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterItensAlterados">
<Description>

Obter Itens Alterados

set sc = ##class(Src2.Item).ObterItensAlterados("sourcecontrol10", "admin", "admin", .tabItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[projeto:%String,username:%String="",password:%String="",&tabItens:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabItens
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (sc '= $$$OK) quit $$$ERROR(10000,sc)
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho)
 if (sc '= $$$OK) quit $$$ERROR(10000,sc)
 
 set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "status "_caminhoCopiaTrabalho, username, password, , arquivoTemp)
 if (sc '= $$$OK) quit $$$ERROR(10000,sc)
 
 set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp, "status")
 
 set classeId = ""
 for {
   set classeId = $order(^mtempInfoArquivo(codTerm,"classes",classeId))
   if (classeId = "") quit
   set sc = ##class(Src2.Classe).ObterInfoClasseId(classeId, , , .InternalName)
   if (sc '= $$$OK) continue
   set tabItens(InternalName) = ""
 }
 
 set rotinaId = ""
 for {
   set rotinaId = $order(^mtempInfoArquivo(codTerm,"rotinas",rotinaId))
   if (rotinaId = "") quit
   set sc = ##class(Src2.Rotina).ObterInfoRotinaId(rotinaId, , , .InternalName)
   if (sc '= $$$OK) continue
   set tabItens(InternalName) = ""
 }

 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Log.Config">
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject,%XML.Adaptor</Super>
<TimeCreated>63432,45912.959256</TimeCreated>

<Property name="situacao">
<Description>
Situação</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="DISPLAYLIST" value=",Inativo,Ativo"/>
<Parameter name="VALUELIST" value=",0,1"/>
</Property>

<Property name="horaEnvio">
<Description>
Hora de Envio do Log</Description>
<Type>%Time</Type>
</Property>

<Property name="dataInicio">
<Description>
Data Inicio do Log a Enviar</Description>
<Type>%Date</Type>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="dataFim">
<Description>
Data Fim do Log a Enviar</Description>
<Type>%Date</Type>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="dataInicioReenvio">
<Description>
Data Inicio do Período de Reenvio do Log</Description>
<Type>%Date</Type>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="dataFimReenvio">
<Description>
Data Fim do Período de Reenvio do Log</Description>
<Type>%Date</Type>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="pesquisas">
<Description>
Pesquisas</Description>
<Type>Src2.Log.Pesquisa</Type>
<Collection>list</Collection>
</Property>
</Class>


<Class name="Src2.Log.Dados">
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject,%XML.Adaptor</Super>
<TimeCreated>63432,45809.11912</TimeCreated>

<Property name="codConta">
<Description>
Conta do Cliente</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="5"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>

<Property name="data">
<Description>
Data</Description>
<Type>%Date</Type>
<Required>1</Required>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="tipo">
<Description>
Tipo</Description>
<Type>%Integer</Type>
<Parameter name="MAXVAL" value="2"/>
<Parameter name="MINVAL" value="1"/>
</Property>

<Property name="macAddress">
<Description>
MAC Address</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="30"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>

<Property name="versao">
<Description>
Versão de Componentes</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>

<Property name="logsUso">
<Description>
Logs de Uso</Description>
<Type>Src2.Log.LogUso</Type>
<Collection>list</Collection>
</Property>

<Property name="variaveis">
<Description>
Variaveis</Description>
<Type>Src2.Log.Variavel</Type>
<Collection>list</Collection>
</Property>
</Class>


<Class name="Src2.Log.LogUso">
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject,%XML.Adaptor</Super>
<TimeCreated>63432,45843.562144</TimeCreated>

<Property name="programa">
<Description>
Programa</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="20"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="tipoInterface">
<Description>
Tipo de Interface</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="DISPLAYLIST" value=",Caracter,CSP"/>
<Parameter name="VALUELIST" value=",0,1"/>
</Property>

<Property name="tipoMenu">
<Description>
Tipo de Menu</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="DISPLAYLIST" value=",Por Nível,Por Perfil"/>
<Parameter name="VALUELIST" value=",0,1"/>
</Property>

<Property name="tempo">
<Description>
Tempo de Uso em Segundos</Description>
<Type>%Integer</Type>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="qtdAcessos">
<Description>
Quantidade de Acessos</Description>
<Type>%Integer</Type>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="qtdQuebras">
<Description>
Quantidade de Acessos Quebrados</Description>
<Type>%Integer</Type>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="nrChamadaGatInter">
<Description>
Nr. de Chamadas de Gatilhos de Interface</Description>
<Type>%Integer</Type>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="nrChamadaGatRegra">
<Description>
Nr. de Chamadas de Gatilhos de Regra</Description>
<Type>%Integer</Type>
<Parameter name="MAXVAL" value="9999999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>
</Class>


<Class name="Src2.Log.Pesquisa">
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject,%XML.Adaptor</Super>
<TimeCreated>63437,31586.822279</TimeCreated>

<Property name="codPesquisa">
<Description>
Código da Pesquisa</Description>
<Type>%Integer</Type>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="regra">
<Description>
Regra</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>
</Class>


<Class name="Src2.Log.Variavel">
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject,%XML.Adaptor</Super>
<TimeCreated>63436,65141.691354</TimeCreated>

<Property name="codPesquisa">
<Description>
Código da Pesquisa</Description>
<Type>%Integer</Type>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="nome">
<Description>
Nome</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="20"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>

<Property name="valor">
<Description>
Valor</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1000"/>
<Parameter name="TRUNCATE" value="0"/>
</Property>
</Class>


<Class name="Src2.Menu.Geral">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject,%XML.Adaptor</Super>
<TimeCreated>61727,0</TimeCreated>
<Inheritance>right</Inheritance>

<Parameter name="XMLNAME">
<Default>csw</Default>
</Parameter>

<Property name="sistemas">
<Type>Src2.Menu.Sistema</Type>
<Collection>list</Collection>
<Parameter name="XMLNAME" value="sistema"/>
<Parameter name="XMLPROJECTION" value="ELEMENT"/>
</Property>

<Method name="ExportarMenu">
<Description><![CDATA[

Gera o arquivo de exportação do menu

---------------------------------------------------------------------------
Global Temporaria
---------------------------------------------------------------------------
^mtempSrc2Menu(codTerm,1,seqSistema)=id^descricao
^mtempSrc2Menu(codTerm,1,seqSistema,1,seqGrupo)=id^descricao
^mtempSrc2Menu(codTerm,1,seqSistema,1,seqGrupo,1,seqPrograma)=id^descricao
^mtempSrc2Menu(codTerm,2,1,idSistema)=seqSistema
^mtempSrc2Menu(codTerm,2,2,idGrupo)seqGrupo


 finalidade => 0 - Interno (Servidores Consistem)
 	         1 - Externo (Para cliente)]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabArquivos:%String,caminhoDestino:%String,tipoProdCsw:%String,&tabSegmentos:%String,&tabProgramasLiberados:%String,tipoProduto:%String="csw",flgAllSegmentos:%Boolean=0,finalidade:%Integer=0]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codTerm = $job
 
 kill ^mtempSrc2Menu(codTerm)
 
 set (tipo, endArqCompl) = ""
 for {
   set tipo = $order(tabArquivos(tipo))
   if (tipo = "") quit
   for {
     set endArqCompl = $order(tabArquivos(tipo,endArqCompl))
     if (endArqCompl = "") quit
     set sc = ##Class(Src2.Menu.Geral).GerarGlobalMenu(codTerm, endArqCompl, tipo, tipoProdCsw, .tabSegmentos, .tabProgramasLiberados, flgAllSegmentos, finalidade)
   }
 }
 
 // Gera novo arquivo em cima da global temporária
 
 set objGeral = ##Class(Src2.Menu.Geral).%New()
 
 set (idSistema, seqGrupo, seqPrograma) = ""
 for {
   set idSistema = $order(^mtempSrc2Menu(codTerm,1,idSistema))
   if (idSistema = "") quit
   
   set mtemp = $get(^mtempSrc2Menu(codTerm,1,idSistema))
   
   set objSistema = ##Class(Src2.Menu.Sistema).%New()
   set objSistema.codigo = $piece(mtemp,"^",1)
   set objSistema.descricao = $piece(mtemp,"^",2)
   set objSistema.isCustom = $piece(mtemp,"^",3)
   set objSistema.tipoProduto = tipoProduto
   set objSistema.area = $piece(mtemp,"^",6)
   set objSistema.segmento = $piece(mtemp,"^",7)
   
   for {
     set seqGrupo = $order(^mtempSrc2Menu(codTerm,1,idSistema,1,seqGrupo))
     if (seqGrupo = "") quit
     set mtemp = $get(^mtempSrc2Menu(codTerm,1,idSistema,1,seqGrupo))

     set objGrupo = ##Class(Src2.Menu.Grupo).%New()
     set objGrupo.codigo = $piece(mtemp,"^",1)
     set objGrupo.descricao = $piece(mtemp,"^",2)
     set objGrupo.isCustom = $piece(mtemp,"^",3)
     set objGrupo.segmento = $piece(mtemp,"^",4)
     
     for {
       set seqPrograma = $order(^mtempSrc2Menu(codTerm,1,idSistema,1,seqGrupo,1,seqPrograma))
       if (seqPrograma = "") quit
       set mtemp = $get(^mtempSrc2Menu(codTerm,1,idSistema,1,seqGrupo,1,seqPrograma))
       
       set objPrograma = ##Class(Src2.Menu.Programa).%New()
       set objPrograma.codigo = $piece(mtemp,"^",1)
       set objPrograma.descricao = $piece(mtemp,"^",2)
       set objPrograma.isCustom = $piece(mtemp,"^",3)
       set objPrograma.isAdmin = $piece(mtemp,"^",4)
       set objPrograma.situacao = $piece(mtemp,"^",5)
       set objPrograma.acesso = $piece(mtemp,"^",6)
       set objPrograma.segmento = $piece(mtemp,"^",7)
       
       do objGrupo.programas.Insert(objPrograma)
     }
     do objSistema.grupos.Insert(objGrupo)
   }
   do objGeral.sistemas.Insert(objSistema)
 }
 
 kill ^mtempSrc2Menu(codTerm)
 
 set writer = ##class(%XML.Writer).%New()
 set writer.Charset = "UTF-8"
 set writer.Indent = 1
 
 set sc = writer.OutputToFile(caminhoDestino)
 
 set sc = writer.RootObject(objGeral)
 if (sc '= 1) quit sc
 
 set sc = writer.EndDocument()
 
 set (writer,objGeral,objSistema,arquivoXML,objPrograma,objGrupo) = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarGlobalMenu">
<Description>

Gerar Global
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,endArqCompl:%String,tipoArquivo:%String,tipoProdCsw:%String,&tabSegmentos:%String,&tabProgramasLiberados:%String,flgAllSegmentos:%Boolean=0,finalidade:%Integer=0]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set arquivoXML = ##class(%XML.Reader).%New()
 do arquivoXML.OpenFile(endArqCompl)

 do arquivoXML.Correlate("csw","Src2.Menu.Geral")

 do arquivoXML.Next(.objGeral,.sc)
 if (sc '= 1) quit sc

 if (objGeral = "") quit $$$ERROR(10000,"Arquivo inválido!")

 for {
   set objSistema = objGeral.sistemas.GetNext(.keySistema)
   if (objSistema = "") quit

   set isCustomSist = 0
   set seqSistema = $get(^mtempSrc2Menu(codTerm,2,1,objSistema.codigo))
   if (seqSistema = "") {
     set seqSistema = $order(^mtempSrc2Menu(codTerm,1,""),-1) + 1
     set ^mtempSrc2Menu(codTerm,2,1,objSistema.codigo) = seqSistema
     if (tipoArquivo = 2) set isCustomSist = 1
   }

   for {
     set objGrupo = objSistema.grupos.GetNext(.keyGrupo)
     if (objGrupo = "") quit
     
     set isCustomGrupo = 0
     set seqGrupo = $get(^mtempSrc2Menu(codTerm,2,2,objGrupo.codigo))
     if (seqGrupo = "") {
       set seqGrupo = $order(^mtempSrc2Menu(codTerm,1,seqSistema,1,""),-1) + 1
       set ^mtempSrc2Menu(codTerm,2,2,objGrupo.codigo) = seqGrupo
       if (tipoArquivo = 2) set isCustomGrupo = 1
     }
     
     for {
       set objPrograma=objGrupo.programas.GetNext(.keyPrograma)
       if objPrograma=""  quit
       
       set flgCswPrograma = +(##Class(Src2.PatchUtils2).ObterVlrEscalonado(objPrograma.csw, objGrupo.csw, objSistema.csw))
       set flgCswOnePrograma = +(##Class(Src2.PatchUtils2).ObterVlrEscalonado(objPrograma.cswOne, objGrupo.cswOne, objSistema.cswOne))
       set segmentoPrograma = ##Class(Src2.PatchUtils2).ObterVlrEscalonado(objPrograma.segmento, objGrupo.segmento, objSistema.segmento)
       
       // Quando é arquivo customizado não testa csw ou cswOne e segmentos
       if (tipoArquivo '= 2) {
       	if (tipoProdCsw = 0) , (flgCswPrograma = 0) continue
       	if (tipoProdCsw = 1) , (flgCswOnePrograma = 0) continue
       	if ('flgAllSegmentos) , (segmentoPrograma'="") , ('$data(tabSegmentos(segmentoPrograma))) continue
       }
       
       set sc = ##class(Src2.PatchUtils).ValidarRotinaLiberada(.tabProgramasLiberados, , objPrograma.codigo, 2)
       if (tipoArquivo=1) , (sc'=1) continue
       
       set isCustomPrograma = 0
       if (tipoArquivo = 2) set isCustomPrograma = 1
       
       if (objPrograma.situacao = "") set objPrograma.situacao=1
       if (objPrograma.situacao = 0) continue
       if (finalidade = 1) , (objPrograma.situacao = 3) continue
       
       set seqPrograma = $order(^mtempSrc2Menu(codTerm,1,seqSistema,1,seqGrupo,1,""),-1) + 1
       set seqSistema = $get(^mtempSrc2Menu(codTerm,2,1,objSistema.codigo))
       set seqGrupo = $get(^mtempSrc2Menu(codTerm,2,2,objGrupo.codigo))
       
       // Faz teste de existencia, pois se for cutomizado não substituir o nivel do padrao
       if '$data(^mtempSrc2Menu(codTerm,1,seqSistema)) {
         set ^mtempSrc2Menu(codTerm,1,seqSistema) = objSistema.codigo_"^"_objSistema.descricao_"^"_isCustomSist_"^^^"_objSistema.area_"^"_objSistema.segmento
       }
       
       // Faz teste de existencia, pois se for cutomizado não substituir o nivel do padrao
       if '$data(^mtempSrc2Menu(codTerm,1,seqSistema,1,seqGrupo)) {
         set ^mtempSrc2Menu(codTerm,1,seqSistema,1,seqGrupo) = objGrupo.codigo_"^"_objGrupo.descricao_"^"_isCustomGrupo_"^"_objGrupo.segmento
       }
       
       set ^mtempSrc2Menu(codTerm,1,seqSistema,1,seqGrupo,1,seqPrograma) = objPrograma.codigo_"^"_objPrograma.descricao_"^"_isCustomPrograma_"^"_objPrograma.isAdmin_"^"_objPrograma.situacao_"^"_objPrograma.acesso_"^"_objPrograma.segmento
     }
   }
 }
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarMenu">
<Description>

Importa o arquivo de exportação do menu
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>endArqCompl:%String,tipoProduto:%String="csw"</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set term = $job
 
 kill ^mtempCSWINFO(term)
 
 set arquivoXML = ##class(%XML.Reader).%New()
 do arquivoXML.OpenFile(endArqCompl)
 
 do arquivoXML.Correlate("csw","Src2.Menu.Geral")
 
 do arquivoXML.Next(.objGeral, .sc)
 if (sc '= 1) quit $$$OK
 
 if (objGeral = "") quit $$$OK
 
 set chave = $$ObterNovaChave^PCATUARG002()
 
 set sc = $$GravarChave^PCATUARG002(tipoProduto, chave)
 
 set seqSistema = 0
 for {
   set objSistema = objGeral.sistemas.GetNext(.keySistema)
   if (objSistema = "") quit
   set seqSistema = seqSistema+1
   set sc = ##Class(Src2.Menu.Sistema).GravarSistemaTemp(term, objSistema.codigo, objSistema.descricao, seqSistema, objSistema.isCustom, objSistema.tipoProduto, objSistema.area, objSistema.segmento)
   set seqGrupo = 0
   for {
     set objGrupo = objSistema.grupos.GetNext(.keyGrupo)
     if (objGrupo = "") quit
     set seqGrupo = seqGrupo + 1
     set sc = ##Class(Src2.Menu.Grupo).GravarGrupoTemp(term, objGrupo.codigo, objGrupo.descricao, objSistema.codigo, seqGrupo, objGrupo.isCustom, objGrupo.segmento)
     set seqPrograma = 0
     for {
       set objPrograma = objGrupo.programas.GetNext(.keyPrograma)
       if (objPrograma = "")  quit
       set seqPrograma = seqPrograma + 1
       set sc=##Class(Src2.Menu.Programa).GravarProgramaTemp(term, objPrograma.codigo, objPrograma.descricao, objGrupo.codigo, seqPrograma, objPrograma.isCustom, objPrograma.isAdmin, $select(objPrograma.situacao=2:1, 1:0), objPrograma.acesso, objPrograma.segmento, chave)
     }
   }
 }
 
 set (arquivoXML, objGeral, objSistema, objPrograma, objGrupo) = ""
 
 set sc = ##Class(Src2.Menu.Sistema).ExcluirSistemasPorProduto(tipoProduto)
 
 merge ^%CSWINFO(1) = ^mtempCSWINFO(term,1)
 merge ^%CSWINFO(2) = ^mtempCSWINFO(term,2)
 merge ^%CSWINFO(3) = ^mtempCSWINFO(term,3)
 
 set sc = ##Class(Src2.Menu.Geral).ExcluirIndicesMenu()
 set sc = ##Class(Src2.Menu.Geral).GerarIndicesMenu()
 set sc = ##Class(Src2.Menu.Sistema).ReordenarSistema()
 set sc = ##Class(Src2.Menu.Geral).RegerarCadastrosConfiguracoes()
 
 set sc = $$ExcluirChave^PCATUARG002(tipoProduto)
 
 kill ^mtempCSWINFO(term)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarIndicesMenu">
<Description>

Gera todos os indices do menu
</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (codSistema, codGrupo, codPrograma) = ""
 
 for {
   set codSistema = $order(^%CSWINFO(1,codSistema))
   if (codSistema = "") quit
   set sc=##Class(Src2.Menu.Sistema).GerarPonteirosSistema(codSistema)
 }

 for {
   set codGrupo = $order(^%CSWINFO(2,codGrupo))
   if (codGrupo = "") quit
   set sc=##Class(Src2.Menu.Grupo).GerarPonteirosGrupo(codGrupo)
 }
 
 for {
   set codPrograma = $order(^%CSWINFO(3,codPrograma)) 
   if (codPrograma = "") quit
   set sc=##Class(Src2.Menu.Programa).GerarPonteirosPrograma(codPrograma)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirIndicesMenu">
<Description>

Exclui todos os indices do menu
</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill ^%CSWINFOSISDES
 kill ^%CSWINFOSISGRU
 kill ^%CSWINFOGRUROT
 kill ^%CSWINFONOMROT
 kill ^%CSWINFOSISPRO
 quit $$$OK
]]></Implementation>
</Method>

<Method name="RegerarCadastrosConfiguracoes">
<Description>

Regera os cadastros e configurações referente a programas alteradas/excluídas

- Excluir Sistemas, Grupos e Programas da tabela de Perfil
- Reorganiza o Programa para um grupo caso alterado

Obs: Um grupo nunca poderá ser reorganizado em outro sistema, pois deverão mudar o Id.

set sc=##Class(Src2.Menu.Geral).RegerarCadastrosConfiguracoes()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
  set (idPerfil,idSistema,idGrupo,idPrograma) = ""
  for {
    set idPerfil = $order(^%CSWPERFIL(idPerfil))
    if (idPerfil = "") quit
    
    for {
      set idSistema = $order(^%CSWPERFIL(idPerfil,1,idSistema))
      if (idSistema = "") quit
      
      // Não existe mais o sistema!
      if ('$data(^%CSWINFO(1,idSistema))) {
        kill ^%CSWPERFIL(idPerfil,1,idSistema)
        continue
      }
      
      for {
        set idGrupo = $order(^%CSWPERFIL(idPerfil,1,idSistema,idGrupo))
        if (idGrupo = "") quit
        
        // Não existe mais o grupo!
        if ('$data(^%CSWINFO(2,idGrupo))) {
          kill ^%CSWPERFIL(idPerfil,1,idSistema,idGrupo)
          continue
        }
        
        for {
          set idPrograma = $order(^%CSWPERFIL(idPerfil,1,idSistema,idGrupo,idPrograma))
          if (idPrograma = "") quit
          
          // Não existe mais o programa!
          if ('$data(^%CSWINFO(3,idPrograma))) {
            kill ^%CSWPERFIL(idPerfil,1,idSistema,idGrupo,idPrograma)
            continue
          }
          
          if ($data(^%CSWINFO(3,idPrograma,idGrupo))) continue
          
          kill ^%CSWPERFIL(idPerfil,1,idSistema,idGrupo,idPrograma)
          
          set newIdGrupo = $order(^%CSWINFO(3,idPrograma,""))
          if (newIdGrupo = "") quit
          
          if ($data(^%CSWPERFIL(idPerfil,1,idSistema,newIdGrupo))) , ($order(^%CSWPERFIL(idPerfil,1,idSistema,newIdGrupo,"")) = "") continue
          
          // Regrava com o novo grupo
          set ^%CSWPERFIL(idPerfil,1,idSistema,newIdGrupo,idPrograma) = ""
        }
      }
    }
  }
  
  quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Menu.Grupo">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject,%XML.Adaptor</Super>
<TimeCreated>61727,0</TimeCreated>
<Inheritance>right</Inheritance>

<Parameter name="XMLNAME">
<Default>grupo</Default>
</Parameter>

<Property name="codigo">
<Type>%String</Type>
<Parameter name="MAXLEN" value="500"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="descricao">
<Type>%String</Type>
<Parameter name="MAXLEN" value="500"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="csw">
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="cswOne">
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="segmento">
<Type>%String</Type>
<Parameter name="MAXLEN" value="100"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="isCustom">
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="programas">
<Type>Src2.Menu.Programa</Type>
<Collection>list</Collection>
<Parameter name="XMLNAME" value="programa"/>
<Parameter name="XMLPROJECTION" value="ELEMENT"/>
</Property>

<Property name="teste">
<Description>
Indica se os programas do grupo tem cobertura pela equipe de testes</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="doc">
<Description>
Indica se os programas do grupo tem documentação</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="serv">
<Description>
Indica se os programas do grupo são implantados por serviço</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Method name="GravarGrupoTemp">
<Description>

Grava a global temporaria referente a grupo
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>term:%String,codigo:%String,descricao:%String,idSistema:%String,sequencia:%String,isCustom:%Integer,segmento:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set $piece(cswinfo,"^",1)=descricao
 set $piece(cswinfo,"^",2)=idSistema
 set $piece(cswinfo,"^",3)=sequencia
 set $piece(cswinfo,"^",4)=isCustom
 set $piece(cswinfo,"^",5)=0
 set $piece(cswinfo,"^",6)=segmento
 
 set ^mtempCSWINFO(term,2,codigo)=cswinfo

 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarGrupo">
<Description>

Grava a global %CSWINFO referente a grupo
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String,descricao:%String,idSistema:%String,sequencia:%String,isCustom:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc=##Class(Src2.Menu.Grupo).ExcluirPonteirosGrupo(codigo)
 
 set cswinfo=$get(^%CSWINFO(2,codigo))
 
 set $piece(cswinfo,"^",1)=descricao
 set $piece(cswinfo,"^",2)=idSistema
 set $piece(cswinfo,"^",3)=sequencia
 set $piece(cswinfo,"^",4)=isCustom
 
 set ^%CSWINFO(2,codigo)=cswinfo
 
 set sc=##Class(Src2.Menu.Grupo).GerarPonteirosGrupo(codigo)

 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirGrupo">
<Description>

Exclui a global %CSWINFO referente a grupo
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc=##Class(Src2.Menu.Grupo).ExcluirPonteirosGrupo(codigo)
 
 kill ^%CSWINFO(2,codigo)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarPonteirosGrupo">
<Description>

Gera os ponteiros da global %CSWINFO referente a grupo
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set cswinfo=$get(^%CSWINFO(2,codigo))

 if $piece(cswinfo,"^",2)'="" set ^%CSWINFOSISGRU($piece(cswinfo,"^",2),codigo)=""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirPonteirosGrupo">
<Description>

Gera os ponteiros da global %CSWINFO referente a grupo
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set cswinfo=$get(^%CSWINFO(2,codigo))

 if $piece(cswinfo,"^",2)'=""  kill ^%CSWINFOSISGRU($piece(cswinfo,"^",2),codigo)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirProgramasGrupo">
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set idPrograma=""
 for {
   set idPrograma=$order(^%CSWINFOGRUROT(codigo, idPrograma))
   if idPrograma="" quit
   
   set sc=##Class(Src2.Menu.Programa).ExcluirPrograma(idPrograma)
 }
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Menu.Programa">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject,%XML.Adaptor</Super>
<TimeCreated>61727,0</TimeCreated>
<Inheritance>right</Inheritance>

<Parameter name="XMLNAME">
<Default>programa</Default>
</Parameter>

<Property name="codigo">
<Description>
Programa (Nome - Chamada)</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="500"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="descricao">
<Description>
Descrição da Programa</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="500"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="csw">
<Description>
Indica se a programa pertence ao produto CSW</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="cswOne">
<Description>
Indica se a programa pertence ao produto CSWOne</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="segmento">
<Description>
Segmento da programa</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="100"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="isAdmin">
<Description>
Indica se a programa é de Administrador</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLNAME" value="admin"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="isCustom">
<Description>
Indica se a programa é customizada</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="teste">
<Description>
Indica se o programa tem cobertura pela equipe de testes</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="doc">
<Description>
Indica se o programa tem documentação</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="serv">
<Description>
Indica se o programa é implantado por serviço</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="situacao">
<Description>

Situação da Programa

0 - Inativa
1 - Ativa (Ou nulo)
2 - Descontinuada
3 - Uso interno</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="acesso">
<Description>
Indica se a programa possui acesso liberado. Não verifica perfil quando for chamado por F7</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Method name="GravarProgramaTemp">
<Description>

Grava a global temporaria referente a programa
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>term:%String,codigo:%String,descricao:%String,idGrupo:%String,sequencia:%String,isCustom:%Integer,isAdmin:%Integer,isDescont:%Integer,acesso:%String="",segmento:%String="",chave:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set $piece(cswinfo,"^",1) = descricao
 set $piece(cswinfo,"^",2) = $piece(codigo,"(",1)
 set $piece(cswinfo,"^",3) = isAdmin
 set $piece(cswinfo,"^",4) = isCustom
 set $piece(cswinfo,"^",5) = isDescont
 set $piece(cswinfo,"^",6) = acesso
 set $piece(cswinfo,"^",7) = 0
 set $piece(cswinfo,"^",8) = segmento
 
 set sc = $$GravarAtenticacaoPrograma^PCATUARG002($piece(cswinfo,"^",2),chave)
 
 set ^mtempCSWINFO(term,3,codigo) = cswinfo
 set ^mtempCSWINFO(term,3,codigo,idGrupo) = sequencia_"^0"

 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarPrograma">
<Description>

Grava a global %CSWINFO referente a programa
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String,descricao:%String,idGrupo:%String,sequencia:%String,isCustom:%Integer,isAdmin:%Integer,isDescont:%Integer,acesso:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##Class(Src2.Menu.Programa).ExcluirPonteirosPrograma(codigo)
 
 set cswinfo = $get(^%CSWINFO(3,codigo))
 
 set $piece(cswinfo,"^",1) = descricao
 set $piece(cswinfo,"^",2) = $piece(codigo,"(",1)
 set $piece(cswinfo,"^",3) = isAdmin
 set $piece(cswinfo,"^",4) = isCustom
 set $piece(cswinfo,"^",5) = isDescont
 set $piece(cswinfo,"^",6) = acesso
 
 set ^%CSWINFO(3,codigo) = cswinfo
 set ^%CSWINFO(3,codigo,idGrupo) = sequencia
 
 set sc = ##Class(Src2.Menu.Programa).GerarPonteirosPrograma(codigo)

 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirPrograma">
<Description>

Exclui a global %CSWINFO referente a programa
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##Class(Src2.Menu.Programa).ExcluirPonteirosPrograma(codigo)
 
 kill ^%CSWINFO(3,codigo)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarPonteirosPrograma">
<Description>

Gera os ponteiros da global %CSWINFO referente a programa
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set cswinfo=$get(^%CSWINFO(3,codigo))
 
 set idGrupo=""
 for {
   set idGrupo=$order(^%CSWINFO(3,codigo,idGrupo))
   if idGrupo="" quit
   set ^%CSWINFOGRUROT(idGrupo,codigo)=""
 }

 if ($piece(cswinfo,"^",2) '= "") {
   set ^%CSWINFONOMROT($piece(cswinfo,"^",2),codigo)=""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirPonteirosPrograma">
<Description>

Gera os ponteiros da global %CSWINFO referente a programa
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set cswinfo = $get(^%CSWINFO(3,codigo))
 
 set idGrupo = ""
 for {
   set idGrupo = $order(^%CSWINFO(3,codigo,idGrupo))
   if idGrupo = "" quit
   kill ^%CSWINFOGRUROT(idGrupo,codigo)
 }

 if ($piece(cswinfo,"^",2) '= "") {
   kill ^%CSWINFONOMROT($piece(cswinfo,"^",2),codigo)
 }
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Menu.Sistema">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject,%XML.Adaptor</Super>
<TimeCreated>61727,0</TimeCreated>
<Inheritance>right</Inheritance>

<Parameter name="XMLNAME">
<Default>sistema</Default>
</Parameter>

<Property name="codigo">
<Type>%String</Type>
<Parameter name="MAXLEN" value="500"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="descricao">
<Type>%String</Type>
<Parameter name="MAXLEN" value="500"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="csw">
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="cswOne">
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="segmento">
<Type>%String</Type>
<Parameter name="MAXLEN" value="100"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="grupos">
<Type>Src2.Menu.Grupo</Type>
<Collection>list</Collection>
<Parameter name="XMLNAME" value="grupo"/>
<Parameter name="XMLPROJECTION" value="ELEMENT"/>
</Property>

<Property name="isCustom">
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="tipoProduto">
<Description>
Indica a qual produto pertence o sistema</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="20"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="area">
<Type>%String</Type>
<Parameter name="MAXLEN" value="100"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="teste">
<Description>
Indica se os programas do sistema tem cobertura pela equipe de testes</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="doc">
<Description>
Indica se os programas do sistema tem documentação</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Property name="serv">
<Description>
Indica se os programas do sistema são implantados por serviço</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="1"/>
<Parameter name="TRUNCATE" value="1"/>
<Parameter name="XMLPROJECTION" value="ATTRIBUTE"/>
</Property>

<Method name="GravarSistemaTemp">
<Description>

Grava a global temporaria da referente a sistema
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>term:%String,codigo:%String,descricao:%String,sequencia:%String,isCustom:%Integer,tipoProduto:%String,area:%String,segmento:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set $piece(cswinfo,"^",1)=descricao
 set $piece(cswinfo,"^",2)=sequencia
 set $piece(cswinfo,"^",3)=isCustom
 set $piece(cswinfo,"^",4)=tipoProduto
 set $piece(cswinfo,"^",5)=0
 set $piece(cswinfo,"^",6)=area
 set $piece(cswinfo,"^",7)=segmento
 
 set ^mtempCSWINFO(term,1,codigo)=cswinfo

 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarSistema">
<Description>

Grava a global %CSWINFO referente a sistema
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String,descricao:%String,sequencia:%String,isCustom:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##Class(Src2.Menu.Sistema).ExcluirPonteirosSistema(codigo)
 
 set cswinfo = $get(^%CSWINFO(1,codigo))
 
 set $piece(cswinfo,"^",1) = descricao
 set $piece(cswinfo,"^",2) = sequencia
 set $piece(cswinfo,"^",3) = isCustom
 
 set ^%CSWINFO(1,codigo) = cswinfo
 
 set sc = ##Class(Src2.Menu.Sistema).GerarPonteirosSistema(codigo)

 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirSistema">
<Description>

Exclui a global %CSWINFO referente a Sistema
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc=##Class(Src2.Menu.Sistema).ExcluirPonteirosSistema(codigo)
 
 kill ^%CSWINFO(1,codigo)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarPonteirosSistema">
<Description>

Gera os ponteiros da global %CSWINFO referente a Sistema
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set cswinfo=$get(^%CSWINFO(1,codigo))

 if $piece(cswinfo,"^",1)'="" set ^%CSWINFOSISDES($$ZN^%SMU($piece(cswinfo,"^",1),2+8),codigo)=""
 if $piece(cswinfo,"^",4)'="" set ^%CSWINFOSISPRO($piece(cswinfo,"^",4),codigo)=""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirPonteirosSistema">
<Description>

Gera os ponteiros da global %CSWINFO referente a Sistema
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set cswinfo = $get(^%CSWINFO(1,codigo))

 if ($piece(cswinfo,"^",1) '= "") kill ^%CSWINFOSISDES($$ZN^%SMU($piece(cswinfo,"^",1),2+8),codigo)
 if ($piece(cswinfo,"^",4) '= "") kill ^%CSWINFOSISPRO($piece(cswinfo,"^",4),codigo)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ReordenarSistema">
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
  set (descSistema, idSistema, seq)=""
  for {
    set descSistema = $order(^%CSWINFOSISDES(descSistema))
    if (descSistema = "") quit
    for {
      set idSistema = $order(^%CSWINFOSISDES(descSistema,idSistema))
      if (idSistema = "") quit
      set cswinfo = $get(^%CSWINFO(1,idSistema))
      set seq = seq + 1
      set sc = ##Class(Src2.Menu.Sistema).GravarSistema(idSistema, $piece(cswinfo,"^",1), seq, $piece(cswinfo,"^",3))
    }
  }

  quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirSistemasPorProduto">
<ClassMethod>1</ClassMethod>
<FormalSpec>tipoProduto:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set idSistema = ""
 for {
   set idSistema = $order(^%CSWINFOSISPRO(tipoProduto, idSistema))
   if (idSistema = "")  quit
   set sc = ##Class(Src2.Menu.Sistema).ExcluirGruposSistema(idSistema)
   set sc = ##Class(Src2.Menu.Sistema).ExcluirSistema(idSistema)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirGruposSistema">
<Description>

Exclui os programas e Grupos do Sistema
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codigo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set idGrupo=""
 for {
   set idGrupo = $order(^%CSWINFOSISGRU(codigo, idGrupo))
   if (idGrupo = "") quit
   set sc = ##Class(Src2.Menu.Grupo).ExcluirProgramasGrupo(idGrupo)
   set sc = ##Class(Src2.Menu.Grupo).ExcluirGrupo(idGrupo)
 }
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Menu">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="AtualizarMenuPerfilNamespace">
<Description>

Atualizar Menu no Namespace

set sc = ##class(Src2.Menu).AtualizarMenuPerfilNamespace()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= 1) quit msgsc
 
 set namespace = $znspace
 
 set arquivoTempMenu = $piece(arquivoTemp2,".txt",1)
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set msgsc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento(namespace, , .versaoNamespace)
 if (msgsc '= 1) quit msgsc
 
 set msgsc = ##class(Src2.UtilsXml).ObterProjetosXML(.tabProjetos)
 if (msgsc '= 1) quit msgsc
 
 kill ^%CSWINFO,^%CSWINFOSISGRU,^%CSWINFONOMROT,^%CSWINFOGRUROT,^%CSWINFOSISDES
 
 set cont = 0
 
 set projeto = ""
 for {
   set projeto = $order(tabProjetos(projeto))
   if (projeto = "") quit
   set varProjetos = $get(tabProjetos(projeto))
   
   set sistema = $piece(varProjetos,"^",1)
   
   if (sistema '= "csw") continue
   
   if ($piece(varProjetos,"^",5) = "") continue
   
   set urlRepositorio = $piece(varProjetos,"^",2)
   set versao = $piece(varProjetos,"^",8)
   
   if (##class(Src2.Utils2).CompararVersao(versao, "<", "6.4")) continue
   
   if ($translate(versao,".","") '= versaoNamespace) continue
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list "_urlRepositorio_"/menubase", , , autenticacao, arquivoTemp)
   if (msgsc '= $$$OK) continue
   
   set file = ##class(%File).%New(arquivoTemp)
   do file.Open("R")
   
   for {
     set tam = 32000
     set linhaFile = file.Read(.tam)
     if (tam = -1) quit
     
     if (linhaFile '[ "cswmenu2_") continue
     
     set arquivoMenu = urlRepositorio_"/menubase/"_linhaFile
     
     set arquivoTempMenu2 = arquivoTempMenu_$increment(cont)_".xml"
     
     set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "cat "_arquivoMenu, , , autenticacao, arquivoTempMenu2)
     if (msgsc '= $$$OK) continue
     
     set tabArquivos(1,arquivoTempMenu2)=""
   }
   
   do file.Close()
   set file = ""
   
   set tabRotinasLiberadas("*.mac")=""
   
   set sc=##Class(Src2.Menu.Geral).ExportarMenu(.tabArquivos, arquivoTemp, 0, , .tabRotinasLiberadas, , 1)
   
   set sc=##Class(Src2.Menu.Geral).ImportarMenu(arquivoTemp)
   
   set sc = ##class(%File).Delete(arquivoTemp)
   
   set arquivoTemp = ""
   for {
     set arquivoTemp = $order(tabProjetos(arquivoTemp))
     if (arquivoTemp = "") quit
     set sc = ##class(%File).Delete(arquivoTemp)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarMenuPerfilNamespaceConta">
<Description>

Atualizar Menu no Namespace

set sc = ##class(Src2.Menu).AtualizarMenuPerfilNamespaceConta("DESENVIC64")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>namespace:%String="",username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= 1) quit msgsc
 
 set arquivoTempMenu = $piece(arquivoTemp2,".txt",1)
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set msgsc = ##class(Src2.Utils).ValidarNamespaceBaseDados(namespace, , .codConta, .versaoNamespace)
 if (msgsc '= 1) quit msgsc
 
 set msgsc = ##class(Src2.UtilsXml).ObterProjetosXML(.tabProjetos)
 if (msgsc '= 1) quit msgsc
 
 set nspOrigem = $znspace
 
 znspace namespace
 
 kill ^%CSWINFO,^%CSWINFOSISGRU,^%CSWINFONOMROT,^%CSWINFOGRUROT,^%CSWINFOSISDES
 
 set cont = 0
 
 set projeto = ""
 for {
   set projeto = $order(tabProjetos(projeto))
   if (projeto = "") quit
   set varProjetos = $get(tabProjetos(projeto))
   
   set sistema = $piece(varProjetos,"^",1)
   
   if (sistema '= "csw") continue
   
   if ($piece(varProjetos,"^",5) = "") continue
   
   set urlRepositorio = $piece(varProjetos,"^",2)
   set versao = $piece(varProjetos,"^",8)
   
   if (##class(Src2.Utils2).CompararVersao(versao, "<", "6.4")) continue
   
   if ($translate(versao,".","") '= versaoNamespace) continue
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list "_urlRepositorio_"/menubase", , , autenticacao, arquivoTemp)
   if (msgsc '= $$$OK) continue
   
   set file = ##class(%File).%New(arquivoTemp)
   do file.Open("R")
   
   for {
     set tam = 32000
     set linhaFile = file.Read(.tam)
     if (tam = -1) quit
     
     if (linhaFile '[ "cswmenu2_") continue
     
     set arquivoMenu = urlRepositorio_"/menubase/"_linhaFile
     
     set arquivoTempMenu2 = arquivoTempMenu_$increment(cont)_".xml"
     
     set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "cat "_arquivoMenu, , , autenticacao, arquivoTempMenu2)
     if (msgsc '= $$$OK) continue
     
     set tabArquivos(1,arquivoTempMenu2) = ""
     set tabAllArquivos(arquivoTempMenu2) = ""
   }
   
   do file.Close()
   set file = ""
   
   set sc = ##class(Src2.Menu).ObterArquivosMenuCliente(codConta, caminhoSvn, arquivoTemp, arquivoTemp2, .tabMenuCliente)
   merge tabArquivos(2) = tabMenuCliente
   merge tabAllArquivos = tabMenuCliente
   
   set tabRotinasLiberadas("*.mac")=""
   
   set sc=##Class(Src2.Menu.Geral).ExportarMenu(.tabArquivos, arquivoTemp, 0, , .tabRotinasLiberadas, , 1)
   
   set sc=##Class(Src2.Menu.Geral).ImportarMenu(arquivoTemp)
   
   znspace nspOrigem
   
   set sc = ##class(%File).Delete(arquivoTemp)
   
   set sc = ##class(Src2.Menu).ExcluirArquivosMenuCliente(.tabAllArquivos)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarMenuCSW">
<Description>

Atualiza o Menu CSW
OBS: Chamar a partir do namespace de desenvolvimento (DESENV61/DESENV62/...)

set sc = ##class(Src2.Menu).AtualizarMenuCSW("DESENVIC64")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>namespace:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento($znspace, 0)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema("csw", .projeto)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, , , , .versao)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ValidarNamespaceBaseDados(namespace, , .codConta)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set caminhoMenus = caminhoCopiaTrabalho_barra_"menubase"
 
 if (namespace = "") set namespace = $znspace
 set namespaceAtual = $znspace
 
 znspace namespace
 
 set sc = $$AtualizarMenuAutomatico^CCUTIRG002(.codImport,caminhoMenus,,,arquivoTemp)
 
 if (##class(Src2.Utils2).CompararVersao(versao, ">=", "6.4")) {
   set sc = ##class(Src2.Menu).AtualizarMenuPerfilCSW(caminhoCopiaTrabalho, codConta, caminhoSvn, arquivoTemp, arquivoTemp2)
   set sc = ##class(Src2.Menu).CriarUsuarioCSW( , , , codConta)
 }
 
 set sc = ##class(Src2.Menu).CriarUsuarioCSW(1, "visitante", "ccs", codConta)
 
 znspace namespaceAtual
 
 set sc = ##class(Src2.Menu).CriarUsuarioCSW( , , , "CC")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarMenuPerfilCSW">
<Description>

Atualizar Menu por Perfil do CSW (Novo)

set sc = ##class(Src2.Menu).AtualizarMenuPerfilCSW("C:\workspacecsw\projetos\6.4\csw64", "DA")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminho:%String="",codConta:%String,caminhoSvn:%String,arquivoTemp:%String,arquivoTemp2:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill ^%CSWINFO,^%CSWINFOSISGRU,^%CSWINFONOMROT,^%CSWINFOGRUROT,^%CSWINFOSISDES
 
 set rs = ##class(%ResultSet).%New("%File:FileSet") 
 do rs.Execute(caminho_"\menubase\","cswmenu2_*.xml")
 while (rs.Next()) {
   set tabArquivos(1,caminho_"\menubase\"_rs.Get("ItemName"))=""
 }
 do rs.%Close()
 
 if (codConta '= "") {
   set sc = ##class(Src2.Menu).ObterArquivosMenuCliente(codConta, caminhoSvn, arquivoTemp, arquivoTemp2, .tabMenuCliente)
   merge tabArquivos(2) = tabMenuCliente
 }
 
 set tabRotinasLiberadas("*.mac")=""
 
 set sc=##Class(Src2.Menu.Geral).ExportarMenu(.tabArquivos, arquivoTemp, 0, , .tabRotinasLiberadas, , 1)
 
 set sc=##Class(Src2.Menu.Geral).ImportarMenu(arquivoTemp)
 
 set sc = ##class(Src2.Menu).ExcluirArquivosMenuCliente(.tabMenuCliente)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CriarEmpresaModeloCSW">
<Description>

Cria uma Empresa Modelo/Usuário para o CSW

set sc = ##class(Src2.Menu).CriarEmpresaModeloCSW()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 // Empresa
 if '$data(^%EMP) {
   set ^%EMP(1) = "Empresa Modelo^Rua Modelo^JARAGUA DO SUL^SC^79500385000106^^89250000^^000^^^1^0000-0000-0000^0000-0000-0000^^^^^^1^0^^^^^^62823^^^^^^^^^^^"
 }
 
 // Cidade
 if '$data(^%CSCI) {
   set ^%CSCI(89250) = "JARAGUA DO SUL^SC^129973^^^^4208906"
 }
 
 // Estado
 if '$data(^%CSES) {
   set ^%CSES(1,"SC") = "17^5^22^SANTA CATARINA^^^0"
 }
 
 // Alicota
 if '$data(^%CSAL) {
   set ^%CSAL(17) = "1700^0^;;^00^1^"
 }
 
 if ('$data(^%CSMENOP)) {
   set sc = ##class(Src2.Menu).CriarUsuarioCSW()
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CriarUsuarioCSW">
<Description>

Cria um Usuário CSW

set sc = ##class(Src2.Menu).CriarUsuarioCSW()
set sc = ##class(Src2.Menu).CriarUsuarioCSW(1, "visitante", "ccs")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codUsuario:%String=99,usuario:%String="consistem",senha:%String="ccs",codConta:%String="CC"</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set csmenop = "CONSISTEM SISTEMAS LTDA^1;2;3;4^0^*^*^*^0^^1;CAD;796^^"_codConta_"^^"_usuario_"^/usr/tmp/^10^1^^0^^1^^^1^^^0^^^^0^^^^^^^^^1^1^^^0"
 
 set sc = $$GravarOperador^%CSMEN050RG(codUsuario,csmenop,senha)
 
 set ^%CSMENOP(codUsuario,3,"%CSMEN050","UTI") = ""
 set ^%CSMENOP(codUsuario,3,"%CSMEN080","UTI") = ""
 set ^%CSMENOP(codUsuario,3,"%CSWMEN010","UTI") = ""
 set ^%CSMENOP(codUsuario,3,"%CSWMEN040","UTI") = ""
 set ^%CSMENOP(codUsuario,3,"%CSWMEN100","UTI") = ""
 set ^%CSMENOP(codUsuario,3,"%CSMEN775","UTI") = ""
 set ^%CSMENOP(codUsuario,3,"%CSMEN785()","UTI") = ""
 set ^%CSMENOP(codUsuario,3,"%CSTR605","UTI") = ""
 set ^%CSMENOP(codUsuario,3,"CCUTI700","UTI") = ""
 set ^%CSMENOP(codUsuario,3,"CCUTI800","UTI") = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterArquivosMenuCliente">
<Description>

Obter Arquivos Menu Cliente

set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoTemp2)
set sc = ##class(Src2.Menu).ObterArquivosMenuCliente("IC", caminhoSvn, arquivoTemp, arquivoTemp2, .tabArquivos)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codConta:%String,caminhoSvn:%String,arquivoTemp:%String,arquivoTemp2:%String,&tabArquivos:%String,username:%String="",password:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabArquivos
 
 set arquivoTempMenu = $piece(arquivoTemp2,".txt",1)
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list http://192.168.15.10:18080/svn/menucliente", , , autenticacao, arquivoTemp)
 if (msgsc '= $$$OK) quit msgsc
 
 set cont = 0
 
 set file = ##class(%File).%New(arquivoTemp)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   
   if (linhaFile '[ $zconvert(codConta,"l")_"_cswmenu2_") continue
   
   set arquivoMenu = "http://192.168.15.10:18080/svn/menucliente/"_linhaFile
   
   set arquivoTempMenu2 = arquivoTempMenu_"cust_"_$increment(cont)_".xml"
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "cat "_arquivoMenu, , , autenticacao, arquivoTempMenu2)
   if (msgsc '= $$$OK) continue
   
   set tabArquivos(arquivoTempMenu2)=""
 }
 
 do file.Close()
 set file = ""
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirArquivosMenuCliente">
<Description>

Excluir Arquivos Menu Cliente

set sc = ##class(Src2.Menu).ExcluirArquivosMenuCliente(.tabArquivos)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabArquivos:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set arquivoTemp = ""
 for {
   set arquivoTemp = $order(tabArquivos(arquivoTemp))
   if (arquivoTemp = "") quit
   set sc = ##class(%File).Delete(arquivoTemp)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarAcessoPrograma">
<Description>

Gravar Acesso a Programa

set sc = ##class(Src2.Menu).GravarAcessoPrograma()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codPrograma:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (codPrograma '= "") {
   set sc = ##class(Src2.Menu).GravarAcessoProgramaInformado(codPrograma)
 } else  {
   set sc = ##class(Src2.Menu).GravarAcessoProgramaTodos()
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarAcessoProgramaInformado">
<Description>

Gravar Acesso a Programa Informado
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codPrograma:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ('$data(^%CSWINFONOMROT(codPrograma))) quit $$$OK
 
 set codUsuario = ""
 for  {
   set codUsuario = $order(^%CSMENOP(codUsuario))
   if (codUsuario = "") quit
   set ^%CSWLOGUSO(2,codUsuario,codPrograma) = ""
 }
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarAcessoProgramaTodos">
<Description>

Gravar Acesso a Todos os Programas
</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (codUsuario, codPrograma) = ""
 for  {
   set codUsuario = $order(^%CSMENOP(codUsuario))
   if (codUsuario = "") quit
   for  {
     set codPrograma = $order(^%CSWINFONOMROT(codPrograma))
     if (codPrograma = "") quit
     set ^%CSWLOGUSO(2,codUsuario,codPrograma) = ""
   }
 }
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabelaArvquivoXMLMenu">
<Description>
set sc=##Class(Src2.Menu).ObterTabelaArvquivoXMLMenu(.tabArquivos,"6.4")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>tabArquivos,codVersao:%String</FormalSpec>
<Implementation><![CDATA[
 set sc=##class(Src2.UtilsXml).ObterProjetosXML(.tabProjetos)
 if sc'=1 quit sc
 
 set sc=##class(Src2.Utils).ObterConfig(,,.caminhoSvn,.arquivoTemp,.arquivoTemp2)
 if sc'=1 quit sc
 
 set arquivoTempMenu = $piece(arquivoTemp2,".txt",1)
 
 set projeto=""
 kill tabArquivos
 
 for {
 set projeto=$order(tabProjetos(projeto),1,varProjetos)
 if projeto="" quit
 
 if ($piece(varProjetos,"^",1)'="csw") continue
 if ($piece(varProjetos,"^",5)="") continue
 
 set sc=##class(Src2.Utils2).CompararVersao($piece(varProjetos,"^",8),"=",codVersao)
 if sc'=1 continue
 
 set sc=##class(Src2.Utils).Subversion(caminhoSvn,"list "_$piece(varProjetos,"^",2)_"/menubase",,,,arquivoTemp)
 if sc'=1 continue
 
 set file = ##class(%File).%New(arquivoTemp)
 do file.Open("R")
 
 for {
   set tam=32000
   set linhaFile=file.Read(.tam)
   if (tam=-1) quit
   
   if (linhaFile '[ "cswmenu2_") continue
   
   set arquivoMenu = $piece(varProjetos,"^",2)_"/menubase/"_linhaFile
   set arquivoTempMenu2 = arquivoTempMenu_$increment(cont)_".xml"
   
   set sc=##class(Src2.Utils).Subversion(caminhoSvn,"cat "_arquivoMenu,,,,arquivoTempMenu2)
   if (sc '= 1) continue
   
   set tabArquivos(arquivoTempMenu2)=""
 }
 
 do file.Close()
 set sc = ##class(%File).Delete(arquivoTemp)
 }
 
 quit 1
]]></Implementation>
</Method>

<Method name="ExcluirTabelaArvquivoXMLMenu">
<Description>
set sc=##Class(Src2.Menu).ExcluirTabelaArvquivoXMLMenu(.tabArquivos)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>tabArquivos</FormalSpec>
<Implementation><![CDATA[
 set codArquivo = ""
 for {
   set codArquivo = $order(tabArquivos(codArquivo))
   if codArquivo = "" quit
   set sc = ##class(%File).Delete(codArquivo)
 }
 
 quit 1
]]></Implementation>
</Method>

<Method name="ValidarParamRotinaXMLMenu">
<Description>
set sc=##Class(Src2.Menu).ValidarParamRotinaXMLMenu(.tabArquivos)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>tabArquivos</FormalSpec>
<Implementation><![CDATA[
 
 set codArquivo=""
 kill ^mtempCCGERC305($job)
 
 for  {
   set codArquivo=$order(tabArquivos(codArquivo))
   quit:codArquivo=""
   
   set arquivoXML=##class(%XML.Reader).%New()
   do arquivoXML.OpenFile(codArquivo)
   do arquivoXML.Correlate("csw","Src2.Menu.Geral")
   
   do arquivoXML.Next(.objGeral,.sc)
   if (sc'=1) ! (objGeral="") continue
   
   set objSistema=""
   for  {
     set objSistema=objGeral.sistemas.GetNext(.keySistema)
     if objSistema="" quit
     
     set objGrupo=""
     for  {
       set objGrupo=objSistema.grupos.GetNext(.keyGrupo)
       if (objGrupo="") quit
       
       set objRotina=""
       for  {
         set objRotina=objGrupo.programas.GetNext(.keyRotina)
         if (objRotina = "") quit
         if (objRotina.codigo '[ "(") continue
         
         set codPrograma = $piece(objRotina.codigo,"(",1)
         set rMAC = $get(^rMAC(codPrograma,0,1))
         
         if (rMAC '[ (codPrograma_"(")) {
           set codMsg="Programa "_codPrograma_" possui parâmetro no xml e não possui parâmetro no programa!"
           set ^mtempCCGERC305($job,$increment(^mtempCCGERC305($job)))=codMsg
         }
       }
     }
   }
 }
 
 quit 1
]]></Implementation>
</Method>

<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DataLocation>^Src2.MenuD</DataLocation>
<DefaultData>MenuDefaultData</DefaultData>
<IdLocation>^Src2.MenuD</IdLocation>
<IndexLocation>^Src2.MenuI</IndexLocation>
<StreamLocation>^Src2.MenuS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<Data name="MenuDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
</Data>
</Storage>
</Class>


<Class name="Src2.Patch.Item">
<Super>%RegisteredObject,%XML.Adaptor</Super>
<TimeCreated>63450,43575.141383</TimeCreated>

<Property name="tipo">
<Description>
Tipo (1 - Classe / 2 - Rotina)</Description>
<Type>%Integer</Type>
<Parameter name="MAXVAL" value="2"/>
<Parameter name="MINVAL" value="1"/>
</Property>

<Property name="item">
<Description>
Item (CCTCP023 / Tcp.BookCorSortimento)</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="internalName">
<Description>
Internal Name (CCTCP023.MAC / Tcp.BookCorSortimento.cls)</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="itemId">
<Description>
Item ID (CCESA/CCESA710.mac / Fat/NotaFiscalImagemCaixas.xml)</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="sistema">
<Description>
Sistema</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="pasta">
<Description>
Pasta</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="package">
<Description>
Package</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="arquivo">
<Description>
Arquivo</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>
</Class>


<Class name="Src2.Patch.Itens">
<Super>%RegisteredObject,%XML.Adaptor</Super>
<TimeCreated>63450,43578.761876</TimeCreated>

<Property name="itens">
<Description>
Itens do Patch</Description>
<Type>Src2.Patch.Item</Type>
<Collection>list</Collection>
</Property>
</Class>


<Class name="Src2.Patch">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="ObterVersaoPatchSrc">
<Description>

Obtem a Versao do Patch
</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Integer</ReturnType>
<Implementation><![CDATA[ quit 323
]]></Implementation>
</Method>

<Method name="GerarPatchDocumento">
<Description>

Gerar Patch por Documento

set sc = ##class(Src2.Patch).GerarPatchDocumento("CO",1,231465,.tabPatchs)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codConta:%String,tipoDocumento:%Integer,documento:%String,&tabPatchs:%String,email:%String="",flgManterCod:%Boolean=0,force:%Boolean=0,codEquipe:%Integer="",usuarioGercon:%String="",flgEmailCliente:%Boolean=1,observacao:%String="",flgServTeste:%Boolean=0]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabPatchs
 
 set sc = ##class(Src2.PatchUtils).ObterTabTiposDocumentos(.tabTiposDoc)
 
 set sc = ##class(Src2.PatchUtils).ObterItensDocumento(codConta, tipoDocumento, documento, .tabItens)
 if $$$ISERR(sc) quit sc
 
 set projeto = ""
 for {
   set projeto = $order(tabItens(projeto))
   if (projeto = "") quit
   set var = $get(tabItens(projeto))
   
   set sistema = $piece(var,"^",1)
   
   set versaoReferencia = $piece(var,"^",2)
   
   kill tabGrupoItens
   merge tabGrupoItens = tabItens(projeto,1)
   merge tabGrupoItens = tabItens(projeto,2)
   
   set sc = ##class(Src2.Patch).ExportarPatch(sistema, codConta, 4, , versaoReferencia, .tabGrupoItens, 1, .idPatch, , email, , , tipoDocumento, documento, flgManterCod, force, codEquipe, , usuarioGercon, flgEmailCliente, observacao, , flgServTeste)
   if $$$ISERR(sc) continue
   
   if (idPatch '= "") set tabPatchs(idPatch) = ""
 }
 
 if ('$data(tabPatchs)) quit $$$ERROR(10000,"Não foi possível gerar os patchs para o "_$get(tabTiposDoc(tipoDocumento))_" "_documento_"!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarPatchJob">
<Description>

Gerar Patch em Job

set sc = ##class(Src2.Patch).GerarPatchJob("csw", "CC", "6.3.1", "6.3.2", .idPatch)
set sc = ##class(Src2.Patch).GerarPatchJob("csw", "CC", "6.3.2", "6.3.3", .idPatch)
set sc = ##class(Src2.Patch).GerarPatchJob("csw", "CC", "6.3.2", "6.3.2", .idPatch)
set sc = ##class(Src2.Patch).GerarPatchJob("csw", "CC", "6.3.6", , .idPatch)
set sc = ##class(Src2.Patch).GerarPatchJob("csw", "CC", "6.3.2", , .idPatch)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,codConta:%String,versaoOrigemInf:%String,versaoReferenciaInf:%String="",&idPatch:%String,email:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set idPatch = ""
 
 set token = $job_"-"_$ztimestamp
 
 if (email = "") & (codConta '= "CC") {
   quit $$$ERROR(10000,"Usuário logado no sistema não possui email cadastrado!")
 }
 
 set ^mtempSrc2PatchToken(token) = ""
 
 xecute "job ##class(Src2.Patch).ExportarPatch("""_sistema_""","""_codConta_""", 1, """_versaoOrigemInf_""", """_versaoReferenciaInf_""", """", 1, """", """_token_""", """_email_""")"
 
 while ($get(^mtempSrc2PatchToken(token)) = "") {
 }
 
 set var = $get(^mtempSrc2PatchToken(token))
 
 kill ^mtempSrc2PatchToken(token)
 
 if ($piece(var,"^",1) = 0) {
   quit $$$ERROR(10000,"Não foi possível gerar o patch de atualização! Favor entrar em contato com a Consistem.")
 }
 
 if ($piece(var,"^",1) = 1) {
   quit $$$ERROR(10000,$piece(var,"^",2))
 }
 
 if ($piece(var,"^",1) = 2) {
   set idPatch = $piece(var,"^",2)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarPatch">
<Description>

Gerar Patch

set sc = ##class(Src2.Patch).ExportarPatch("csw", "CC", 1, "6.3.1")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "CC", 1, "6.3.1", "6.3.3", , 0,,,"ederson@consistem.com.br")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "CC", 2, "6.3.3", "6.3.3", "CCUTI7*.mac;Tcp.Eng*.cls")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "CC", 3, "6.3.3", "6.3.5", "CCUTI7*.mac;Tcp.Eng*.cls")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "CC", 4, , "6.3", "CCUTI7*.mac;Tcp.Eng*.cls")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "CC", 5, , "6.3", , 0, , , "ederson@consistem.com.br")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "CC", 5, , "6.3", , 0, , , "ederson@consistem.com.br", , , , , , , , 11523)

set sc = ##class(Src2.Patch).ExportarPatch("csw", "CC", 5, , "6.4", , 1, , , "ederson@consistem.com.br", , , , , , , , , , 0, "Observação")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "CC", 1, "6.4.2", "6.4.15", , 1, , , "ederson@consistem.com.br", , , , , , , , , , 0, "Observação")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "CC", 1, "6.4.15", "6.4.2", , 1, , , "ederson@consistem.com.br", , , , , , , , , , 0, "Observação")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "CC", 1, "6.4.6", "6.4.4", , 1, , , "ederson@consistem.com.br", , , , , , , , , , 0, "Observação")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "CC", 1, "6.3.10", "6.3.20", , 1, , , "ederson@consistem.com.br", , , , , , , , , , 0, "Observação")

set sc = ##class(Src2.Patch).ExportarPatch("csw", "EI", 1, "6.4.151", "6.4.155", , 0, , , "ederson@consistem.com.br", , , , , , , , , , 0, "Observação")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "EI", 2, "6.4.155", "6.4.155", "CCMRPSP10*.mac;CCESA71*.mac;Fat.NotaFiscalImagem*.cls;Fat.NotaFiscalImagem*.cls;Gql.InspecaoResultados*.cls", 0, , , "ederson@consistem.com.br", , , , , , , , , , 0, "Observação")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "EI", 3, "6.4.156", "6.4.155", "CCMRPSP10*.mac;CCESA71*.mac;Fat.NotaFiscalImagem*.cls;Fat.NotaFiscalImagem*.cls;Gql.InspecaoResultados*.cls", 0, , , "ederson@consistem.com.br", , , , , , , , , , 0, "Observação")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "EI", 4, , "6.4", "CCPME02*.mac;CCMRPSP10*.mac;CCESA71*.mac;Fat.NotaFiscalImagem*.cls;Fat.NotaFiscalImagem*.cls;Gql.InspecaoResultados*.cls", 0, , , "ederson@consistem.com.br", , , , , , , , , , 0, "Observação")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "EI", 5, , "6.4", , 0, , , "ederson@consistem.com.br", , , , , , , , "35700", , 0, "Observação")

set sc = ##class(Src2.Patch).ExportarPatch("csw", "DA", 6, , "6.4.74", , 1, , , "ederson@consistem.com.br", , , , , , , , , , 0, "Observação")
set sc = ##class(Src2.Patch).ExportarPatch("cswutil", "DA", 6, , "6.4.16", , 1, , , "ederson@consistem.com.br", , , , , , , , , , 0, "Observação")

set sc = ##class(Src2.Patch).ExportarPatch("csw", "EI", 4, , "6.4", , , , , "ederson@consistem.com.br", , , , , , , , , , 0, "Envio de base sem sobreposição", , , 1, 0, "1;2")
set sc = ##class(Src2.Patch).ExportarPatch("csw", "GE", 4, , "6.4", , , , , "ederson@consistem.com.br", , , , , , , , , , 0, "Envio de base com sobreposição", , , 1, 1, "1;2", "^CGICFG;^CGICFM")
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,codConta:%String,tipoPatch:%Integer,versaoOrigemInf:%String="",versaoReferenciaInf:%String="",strTabGrupoItensInf:%String="",flgIntegraGercon:%Boolean=1,&idPatch:%String,token:%String="",email:%String="",username:%String="",password:%String="",tipoDocumento:%String="",documento:%String="",flgManterCod:%Boolean=0,force:%Boolean=0,codEquipe:%Integer="",revisaoInf:%String="",usuarioGercon:%String="",flgEmailCliente:%Boolean=1,observacao:%String="",flgMenu:%Boolean=0,flgServTeste:%Boolean=0,flgBaseIni:%Boolean=0,flgSobreporBase:%Boolean=0,strEmpBasesIni:%String="",strGlobaisBasesIni:%String="",flgDescItensBloqLimit:%Boolean=0]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set idPatch = ""
 
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 set origem = 1
 if (token '= "") set origem = 2
 
 if ($get(revisaoInf) = "") set revisaoInf = "head"
 
 set flgBase = flgBaseIni
 
 set sc = ##class(Src2.Utils).ConvertStrTab(strTabGrupoItensInf, .tabGrupoItens)
 merge strTabGrupoItensInf = tabGrupoItens
 
 set stringGrupoItens = ##class(Src2.Utils).ConvertTabStr(.strTabGrupoItensInf,,";")
 
 set sc = ##class(Src2.Item).SeparaItens(.strTabGrupoItensInf, .tabGrupoRotClasInf, .tabArqVersInf)
 
 set tabLog("codConta") = codConta
 set tabLog("usuarioGercon") = usuarioGercon
 set tabLog("email") = email
 set tabLog("sistema") = sistema
 set tabLog("tipoPatch") = tipoPatch
 set tabLog("idPatch") = idPatch
 set tabLog("versaoReleaseOrigem") = versaoOrigemInf
 set tabLog("versaoReleaseRef") = versaoReferenciaInf
 set tabLog("tipoDocumento") = tipoDocumento
 set tabLog("documento") = documento
 set tabLog("force") = force
 set tabLog("flgManterCod") = flgManterCod
 set tabLog("stringGrupoItens") = stringGrupoItens
 set tabLog("revisaoInf") = revisaoInf
 set tabLog("origem") = origem
 set tabLog("timestampInicio") = timestampInicio
 
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) {
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 0, msgsc)
 }
 
 if (sistema = "") {
   set msgsc = "Sistema não informado!"
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 0, msgsc)
 }
 
 if (tipoPatch = "") {
   set msgsc = "Tipo do patch não informado!"
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 0, msgsc)
 }
 
 if (codConta = "") {
   set msgsc = "Conta não informada!"
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 0, msgsc)
 }
 
 set msgsc = ##class(Src2.Utils).UpdateConfigGeralWorkspace()
 if (msgsc '= $$$OK) {
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 0, msgsc, , 1)
 }
 
 set horolog = $horolog
 set codParceiro = 1
 set tipoProdCsw = 0
 set revisaoRef = "head"
 set flgRetorno = 0
 set (nomeCliente, emailsCliente, flgEnviaTudo) = ""
 
 if (codConta = "CC") ! (codConta = "GE") {
   set flgEnviaTudo = 1
 }
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sc = ##class(Src2.UtilsXml).ObterContas(.tabContas)
 
 if ('$data(tabContas(codConta))) {
   set msgsc = "Conta "_codConta_" não possui configurações para geração de patch!"
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 0, msgsc)
 }
 
 if (flgBaseIni) && (strEmpBasesIni = "") {
   set msgsc = "Empresas para geração de base de inicalização não informadas!"
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 0, msgsc)
 }
 
 set versaoConta = $piece($get(tabContas(codConta)),"^",3)
 set codConta2 = $piece($get(tabContas(codConta)),"^",6)
 
 if (versaoConta = "") {
   set msgsc = "Conta "_codConta_" não possui versão definida nas configurações para geração de patch!"
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 0, msgsc)
 }
 
 kill tabContas
 
 set msgsc = ##class(Src2.UtilsXml).ObterAtualizacaoXML(.tabSistemas, .caminhoPatch, .tabItensLiberados, .tabItensBloqueados, .flgAtuBloq, .tabItensLimitados)
 if (msgsc '= $$$OK) {
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 0, msgsc)
 }
 
 if (tipoPatch '= 1) & (tipoPatch '= 5) {
   kill tabItensBloqueados(1,2,"Cad.Empresa.cls")
 }
 
 set msgsc = ##class(Src2.UtilsXml).ObterTabInterfaceAux(codTerm)
 if (msgsc '= $$$OK) {
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 0, msgsc)
 }
 
 if (caminhoPatch = "") {
   set msgsc = "Caminho para geração do patch de atualização não encontrado!"
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 0, msgsc)
 }
 
 if ('$data(tabSistemas(sistema))) {
   set msgsc = "Sistema "_sistema_" não encontrado!"
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 0, msgsc)
 }
 
 set ipMaquina = ""
 
 if (tipoPatch = 7) {
   set sc = ##class(Src2.PatchUtils).ObterIPMaquina(email, .ipMaquina)
   if $$$ISERR(sc) {
     set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
     quit ##class(Src2.Patch).ErrorPatch(token, 1, , sc)
   }
 }
 
 set var = $get(tabSistemas(sistema))
 
 set repositorio = $piece(var,"^",1)
 set rotinaVersao = $piece(var,"^",3)
 set flgTag = +$piece(var,"^",4)
 set idProdutoRedmine = $piece(var,"^",6)
 set dsSistema = $piece(var,"^",7)
 
 set sc = ##class(Src2.PatchUtils2).ValidarPermissaoGeracaoPatch(tipoPatch, sistema, codConta, codEquipe, .tabSistemas, email, flgAtuBloq, force, flgBaseIni)
 if $$$ISERR(sc) {
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
   quit ##class(Src2.Patch).ErrorPatch(token, 1, , sc)
 }
 
 if (sistema = "csw") {
   set sc = ##class(Src2.PatchUtils2).ValidarServicoNexus()
   if $$$ISERR(sc) {
     set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
     quit ##class(Src2.Patch).ErrorPatch(token, 0, , sc, 1)
   }
 }
 
 kill tabRotinasLiberadas, tabProgramasMenu, tabSiglas
 
 if (flgIntegraGercon) {
   set sc = ##class(Src2.PatchUtils2).ValidarBloqueioCredito(codConta, force)
   if $$$ISERR(sc) {
     set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
     quit ##class(Src2.Patch).ErrorPatch(token, 0, , sc)
   }
   
   set sc = ##class(Src2.PatchUtils2).ValidarAtualizacaoBloqueada(codConta)
   if $$$ISERR(sc) {
     set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
     quit ##class(Src2.Patch).ErrorPatch(token, 1, , sc)
   }
   
   if (username = "") ! (password = "") {
     set sc = ##class(Src2.PatchUtils).ObterAutSubversionGercon(.username, .password)
     if $$$ISERR(sc) {
       set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
       quit ##class(Src2.Patch).ErrorPatch(token, 0, , sc)
     }
   }
   
   if ('flgEnviaTudo) {
     set sc = ##class(Src2.PatchUtils).ObterItensLiberadosConta(sistema, codConta, codConta2, versaoConta, tipoPatch, .tabItensLiberados, .tabItensBloqueados, .tabRotinasLiberadas, .tabRotinasBloqueadas, .tabClassesLiberadas, .tabClassesBloqueadas)
     set sc = ##class(Src2.PatchUtils).ObterProgramasMenuConta(sistema, codConta, .tabProgramasMenu, .tabSiglas)
     set sc = ##class(Src2.PatchUtils).ObterDadosCliente(codConta, .tipoProdCsw, .tabSegmentos, .nomeCliente, .emailsCliente)
   }
   
   if (flgDescItensBloqLimit) {
     kill tabRotinasBloqueadas
     kill tabClassesBloqueadas
   }
 }
 
 set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 kill tabStrVersoesPreReq, tabTags
 set (versaoReleaseOrigem, versaoReleaseAfetada, tabStrVersoesPreReq) = ""
 
 if (tipoPatch = 1) {
   set sc = ##class(Src2.PatchUtils).ObterInfPatchTipo1(sistema, versaoOrigemInf, versaoReferenciaInf, repositorio, flgTag, .repositorioOrig, .repositorioRef, .versaoReleaseOrigem, .versaoReleaseRef, autenticacao, .tabVersoes, .tabSistemas, .tabStrVersoesPreReq, force, .flgRetorno, .tabTags, .repositorioBranche)
 }
 if (tipoPatch = 2) {
   set sc = ##class(Src2.PatchUtils).ObterInfPatchTipo2(sistema, versaoOrigemInf, versaoReferenciaInf, repositorio, flgTag, .strTabGrupoItensInf, (flgMenu + flgBaseIni), .repositorioRef, .versaoReleaseOrigem, .versaoReleaseRef, autenticacao, .tabTags, .repositorioBranche)
 }
 if (tipoPatch = 3) {
   set sc = ##class(Src2.PatchUtils).ObterInfPatchTipo3(sistema, versaoOrigemInf, versaoReferenciaInf, repositorio, flgTag, .strTabGrupoItensInf, (flgMenu + flgBaseIni), .repositorioRef, .versaoReleaseOrigem, .versaoReleaseRef, autenticacao, .tabTags, .repositorioBranche)
 }
 if (tipoPatch = 4) {
   set sc = ##class(Src2.PatchUtils).ObterInfPatchTipo4(sistema, versaoReferenciaInf, repositorio, flgTag, .strTabGrupoItensInf, (flgMenu + flgBaseIni), .repositorioRef, .versaoReleaseRef, .versaoReleaseAfetada, autenticacao, .tabTags, .repositorioBranche)
 }
 if (tipoPatch = 5) {
   set sc = ##class(Src2.PatchUtils).ObterInfPatchTipo5(sistema, versaoReferenciaInf, revisaoInf, repositorio, flgTag, .repositorioOrig, .repositorioRef, .revisaoRef, .versaoReleaseOrigem, .versaoReleaseRef, .versaoReleaseAfetada, autenticacao, .tabVersoes, .tabSistemas, .tabStrVersoesPreReq, .repositorioBranche)
 }
 if (tipoPatch = 6) {
   set sc = ##class(Src2.PatchUtils).ObterInfPatchTipo6(sistema, versaoReferenciaInf, repositorio, flgTag, .repositorioRef, .versaoReleaseRef, autenticacao, .tabTags, .repositorioBranche)
 }
 if (tipoPatch = 7) {
   set sc = ##class(Src2.PatchUtils).ObterInfPatchTipo7(sistema, versaoReferenciaInf, repositorio, flgTag, .strTabGrupoItensInf, (flgMenu + flgBaseIni), .repositorioRef, .versaoReleaseRef, .versaoReleaseAfetada, autenticacao, .repositorioBranche)
 }
 
 if $$$ISERR(sc) {
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
   quit ##class(Src2.Patch).ErrorPatch(token, 1, , sc)
 }
 
 set msgsc = ""
 lock +^Src2PatchExport(codConta,sistema):0
 else  set msgsc = "A conta '"_codConta_"' já possui um patch do produto '"_sistema_"' sendo gerado neste momento!"
 if (msgsc '= "") {
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit ##class(Src2.Patch).ErrorPatch(token, 1, msgsc)
 }
 
 set sc = ##class(Src2.PatchUtils).ObterIdPatch(sistema, codConta, tipoPatch, horolog, barra, versaoReleaseRef, .idPatch, .caminhoPatch, .arquivoXmlPatch)
 if $$$ISERR(sc) {
   lock -^Src2PatchExport(codConta,sistema)
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
   quit ##class(Src2.Patch).ErrorPatch(token, 1, , sc)
 }
 
 set tabLog("idPatch") = idPatch
 
 set ^mtempSrc2PatchGeracao(idPatch) = sistema_"^"_tipoPatch_"^"_versaoReleaseOrigem_"^"_versaoReleaseRef_"^"_dsSistema_"^"_tipoDocumento_"^"_documento_"^"_codConta_"^"_$job_"^"_revisaoRef_"^"_$horolog
 
 if (token '= "") set ^mtempSrc2PatchToken(token) = 2_"^"_idPatch
 
 kill ^mtempSrc2Patch(codTerm)
 
 if (tipoPatch = 1) ! (tipoPatch = 5) {
   set sc = ##class(Src2.PatchUtils).ObterDadosSvnDiff(repositorioOrig, repositorioRef, versaoReleaseRef, revisaoRef, .tabRotinasLiberadas, .tabRotinasBloqueadas, .tabClassesLiberadas, .tabClassesBloqueadas, username, password, codConta)
   if $$$ISERR(sc) {
     set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
     set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
     quit sc
   }
   
   set sc = ##class(Src2.PatchUtils2).ObterDadosReleaseSistema(sistema, .tabVersoes, .tabGrupoItensAdic, .tabBloqUsoAtua, .obsRelease, .tabGlobais)
   if ($data(tabGrupoItensAdic)) {
     set sc = ##class(Src2.PatchUtils).ObterDadosSvnList(repositorioRef, versaoReleaseRef, revisaoRef, sistema, tipoPatch, .tabGrupoItensAdic, .tabRotinasLiberadas, .tabRotinasBloqueadas, .tabClassesLiberadas, .tabClassesBloqueadas, username, password)
   }
   
   if (obsRelease '= "") {
     if (observacao = "") set observacao = obsRelease
     else  set observacao = observacao_$char(10)_obsRelease
   }
   
   set strGlobaisBasesIni = ##class(Src2.Utils).ConvertTabStr(.tabGlobais,,";")
   if (strGlobaisBasesIni '= "") {
     set flgSobreporBase = 1
     set strEmpBasesIni = ""
     set flgBase = 1
   }
 }
 
 if (tipoPatch = 2) ! (tipoPatch = 3) ! (tipoPatch = 4) ! (tipoPatch = 6) {
   set sc = ##class(Src2.PatchUtils).ObterDadosSvnList(repositorioRef, versaoReleaseRef, , sistema, tipoPatch, .tabGrupoRotClasInf, .tabRotinasLiberadas, .tabRotinasBloqueadas, .tabClassesLiberadas, .tabClassesBloqueadas, username, password)
   if $$$ISERR(sc) {
     set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
     set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
     quit sc
   }
 }
 
 if (tipoPatch = 7) {
   set sc = ##class(Src2.PatchUtils).ObterDadosMaquinaDesenv(codTerm, ipMaquina, versaoReleaseRef, sistema, .tabGrupoRotClasInf, .tabRotinasLiberadas, .tabRotinasBloqueadas, .tabClassesLiberadas, .tabClassesBloqueadas)
   if $$$ISERR(sc) {
     set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
     set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
     quit sc
   }
 }
 
 set sc = ##class(Src2.PatchUtils2).ObterArquivosVersionadosEnviar(codTerm, sistema, tipoPatch, codConta, versaoReleaseOrigem, versaoReleaseRef, versaoReleaseAfetada, flgRetorno, .tabTags, .tabVersoes, flgEnviaTudo, .tabSiglas, .tabArqVersInf, .obsArqVers)
 if $$$ISERR(sc) {
   set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
   quit sc
 }
 
 if (obsArqVers '= "") {
   if (observacao = "") set observacao = obsArqVers
   else  set observacao = observacao_$char(10)_obsArqVers
 }
 
 if (flgMenu) , ((sistema = "csw") ! (sistema = "gercon")) {
   set ^mtempSrc2Patch(codTerm,"flags","flgMenu") = ""
   set ^mtempSrc2Patch(codTerm,"dados") = ""
 }
 
 if $data(^mtempSrc2Patch(codTerm,"arquivosVersionados","consistem_server")) {
   set tabBloqUsoAtua(2,"BloqueioTotal") = ""
 }
 
 set sc = ##class(Src2.PatchUtils2).ValidarExportacaoMenuPatch(caminhoPatch, repositorioRef, revisaoRef, codConta, username, password)
 if $$$ISERR(sc) {
   set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc, , 1)
   quit sc
 }
 
 kill ^mtempSrc2BaseIni(codTerm)
 
 if (flgBase) & (sistema = "csw") {
   set sc = ##class(Src2.PatchUtils2).ValidarExportacaoBaseIniPatch(caminhoPatch, repositorioRef, revisaoRef, codConta, .tabSiglas, .tabSegmentos, flgSobreporBase, strEmpBasesIni, strGlobaisBasesIni, username, password)
   if $$$ISERR(sc) {
     set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
     set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc, , 1)
     quit sc
   }
   if (flgBaseIni) {
     if (observacao = "") set observacao = "ATENÇÃO: Este patch possui base de inicialização"
     else  set observacao = "ATENÇÃO: Este patch possui base de inicialização"_$char(10)_observacao
   }
 }
 
 if ('$data(^mtempSrc2Patch(codTerm,"dados"))) {
   set msgsc = "Não existem dados para gerar o patch!"
   set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, msgsc)
   quit $$$ERROR(10000,msgsc)
 }
 
 set sc = ##class(Src2.PatchUtils).ObterRotinasIntAux(codTerm)
 
 if ('flgDescItensBloqLimit) && ((sistema = "csw") ! (sistema = "cswutil")) {
   set sc = ##class(Src2.PatchUtils2).AjustarItensLimitados(codTerm, tipoPatch, versaoConta, codConta, repositorio, versaoReleaseRef, .tabItensLimitados)
 }
 
 if (flgIntegraGercon) {
   if ('flgRetorno) & ((tipoPatch = 1) ! (tipoPatch = 5)) {
     set sc = ##class(Src2.PatchUtils2).ObterReleaseNotes(codTerm, codConta, idProdutoRedmine, .tabVersoes, flgEnviaTudo)
     if $$$ISERR(sc) {
       set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
       set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
       quit sc
     }
   }
   if (tipoPatch = 4) {
     set sc = ##class(Src2.PatchUtils2).ObterDocumentacaoDocumento(codTerm, codConta, tipoDocumento, documento, .tabDocumentacao, .codParceiro)
   }
 }
 
 set sc = ##class(Src2.Utils2).ObterDadosUltimaRevisao(repositorioRef, revisaoRef, , username, password, , .revisao, .autor, .data)
 if $$$ISERR(sc) {
   set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
   quit sc
 }
 
 set sc = ##class(Src2.Utils2).CriarPasta(caminhoPatch)
 
 set sc = ##class(Src2.Patch).ExportarRotinasClassesPatchSubversion(caminhoPatch, username, password)
 if $$$ISERR(sc) {
   set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
   quit sc
 }
 
 if (tipoPatch = 7) {
   set sc = ##class(Src2.Patch).ExportarRotinasClassesPatchMaqDesenv(codTerm, sistema, ipMaquina, versaoReleaseRef, caminhoPatch)
   if $$$ISERR(sc) {
     set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
     set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
     quit sc
   }
 }
 
 set sc = ##class(Src2.Patch).ExportarDadosFlagsPatch(caminhoPatch, repositorioRef, revisaoRef, codConta, username, password)
 if $$$ISERR(sc) {
   set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
   quit sc
 }
 
 set sc = ##class(Src2.Patch).ExportarGenericoPatch(caminhoPatch, "relatorios", username, password)
 if $$$ISERR(sc) {
   set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
   quit sc
 }
 
 if (flgManterCod) {
   set pasta = caminhoPatch_barra_"outros"_barra_##class(Src2.PatchUtils).ObterCodigo(idPatch, 1)
 } else {
   set pasta = caminhoPatch_barra_"outros"_barra_##class(Src2.PatchUtils).ObterCodigo(idPatch, 2)
 }
 set sc = ##class(Src2.Utils2).CriarPasta(pasta)
 
 set sc = ##class(Src2.PatchUtils2).ExportarArquivosVersionados(codTerm, caminhoPatch)
 if $$$ISERR(sc) {
   set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
   quit sc
 }
 
 set sc = ##class(Src2.PatchUtils2).ExportarMenuPatch(caminhoPatch, codConta, sistema, tipoProdCsw, .tabSegmentos, .tabProgramasMenu)
 if $$$ISERR(sc) {
   set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
   quit sc
 }
 
 set sc = ##class(Src2.PatchUtils2).ExportarBaseIniPatch(codTerm, caminhoPatch)
 if $$$ISERR(sc) {
   set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
   set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(0, .tabLog, , sc)
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ExportarControleFonteWorkspace(caminhoPatch_barra_"outros"_barra_"Src2.xml")
 
 set sc = ##class(%File).RemoveDirectoryTree(caminhoPatch_barra_"temp_menus")
 
 set sc = ##class(%File).RemoveDirectoryTree(caminhoPatch_barra_"temp_bases")
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 set sc = ##class(Src2.PatchUtils2).ExportarPatchXml(codTerm, idPatch, arquivoXmlPatch, .tabSistemas, horolog, tipoPatch, sistema, codConta, versaoReleaseOrigem, versaoReleaseRef, repositorioRef, revisao, autor, data, rotinaVersao, .strTabGrupoItensInf, tempoTotalEdt, flgTag, tipoDocumento, documento, versaoReleaseAfetada, .tabStrVersoesPreReq, observacao, .tabSegmentos, .tabBloqUsoAtua, flgServTeste)
 if $$$ISERR(sc) {
   set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
   quit sc
 }
 
 if (flgIntegraGercon) {
   set sc = ##class(Src2.PatchUtils).DisponibilizarPatch(idPatch)
   if $$$ISERR(sc) {
     set sc2 = ##class(Src2.Patch).ExcluirGeracaoPatch(codTerm, caminhoPatch, idPatch, codConta, sistema)
     quit sc
   }
 }
 
 set sc = ##class(Src2.PatchUtils2).EnviarEmailPatch(codTerm, idPatch, arquivoXmlPatch, .tabSistemas, horolog, tipoPatch, sistema, codConta, versaoReleaseOrigem, versaoReleaseRef, versaoReleaseAfetada, .strTabGrupoItensInf, nomeCliente, emailsCliente, email, tipoDocumento, documento, .tabDocumentacao, codParceiro, flgEmailCliente, observacao, .tabStrVersoesPreReq, .tabBloqUsoAtua, flgServTeste)
 
 set tabLog("versaoReleaseOrigem") = versaoReleaseOrigem
 set tabLog("versaoReleaseRef") = versaoReleaseRef
 
 set sc2 = ##class(Src2.Patch).GerarLogGeracaoPatch(1, .tabLog, , , .tabVersoes)
 
 kill ^mtempSrc2PatchGeracao(idPatch)
 kill ^mtempSrc2Patch(codTerm)
 kill ^mtempSrc2InterfaceAux(codTerm)
 kill ^mtempSrc2BaseIni(codTerm)
 lock -^Src2PatchExport(codConta,sistema)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ErrorPatch">
<Description>

Error Patch

flag = 0 - Retorna uma mensagem padrão para o cliente
       1 - Retorna a mensagem real para o cliente
       
write ##class(Src2.Patch).ErrorPatch(1111, 0, "Serviço do nexus fora!",,1)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>token:%String="",flag:%Integer=0,msgErro:%String="",sc:%String="",flgEmail:%Boolean=0</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (msgErro = "") {
   set msgErro = ##class(Src2.Utils).ObterMensagemStatusCode(sc)
 }
 
 if (token '= "") set ^mtempSrc2PatchToken(token) = flag_"^"_msgErro
 
 if (flgEmail) {
   set titulo = "ATENÇÃO: Erro na Geração de Patch"
   set emailDe = "infraestrutura@consistem.com.br"
   set tabEmail(1) = "gestor.desenvolvimento@consistem.com.br"
   set tabEmail(2) = "infraestrutura@consistem.com.br"
   set tabMsg($order(tabMsg(""),-1)+1) = "Mensagem de erro: "_msgErro
   set tabMsg($order(tabMsg(""),-1)+1) = "Data/hora: "_$zdatetime($horolog,4)
   set sc = ##class(Src2.Utils2).EnviarEmail(titulo, emailDe, .tabEmail, .tabMsg, 0)
 }
 
 quit $$$ERROR(10000,msgErro)
]]></Implementation>
</Method>

<Method name="GerarLogGeracaoPatch">
<Description>

Gerar Log da Geracao de Patch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tipoLog:%Integer,&tabLog:%String,mensagem:%String="",sc:%Status="",&tabVersoes:%String,flgEmail:%Boolean=0]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 lock +^Src2PatchLogGeracao
 
 set horolog = $horolog
 
 if (sc '= "") {
   set mensagem = ##class(Src2.Utils).ObterMensagemStatusCode(sc)
 }
 
 set email = $get(tabLog("email"))
 set timestampInicio = $get(tabLog("timestampInicio"))
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, , .tempoTotal)
 
 set $piece(var,"^",1) = tipoLog
 set $piece(var,"^",2) = horolog
 set $piece(var,"^",3) = $get(tabLog("codConta"))
 set $piece(var,"^",4) = $get(tabLog("usuarioGercon"))
 set $piece(var,"^",5) = email
 set $piece(var,"^",6) = $get(tabLog("sistema"))
 set $piece(var,"^",7) = $get(tabLog("tipoPatch"))
 set $piece(var,"^",8) = $get(tabLog("idPatch"))
 set $piece(var,"^",9) = $get(tabLog("versaoReleaseOrigem"))
 set $piece(var,"^",10) = $get(tabLog("versaoReleaseRef"))
 set $piece(var,"^",11) = $get(tabLog("tipoDocumento"))
 set $piece(var,"^",12) = $get(tabLog("documento"))
 set $piece(var,"^",13) = mensagem
 set $piece(var,"^",14) = $get(tabLog("force"))
 set $piece(var,"^",15) = $get(tabLog("flgManterCod"))
 set $piece(var,"^",16) = $get(tabLog("stringGrupoItens"))
 set $piece(var,"^",17) = $get(tabLog("origem"))
 set $piece(var,"^",18) = $get(tabLog("revisaoInf"))
 set $piece(var,"^",19) = tempoTotal
 
 set codSeq = $order(^Src2PatchLogGeracao(1,""),-1) + 1
 
 set ^Src2PatchLogGeracao(1,codSeq) = var
 
 if ($get(tabLog("codConta")) '= "") {
   set ^Src2PatchLogGeracao(2,+horolog,$get(tabLog("codConta")),codSeq) = ""
   if (tipoLog = 1) & ($get(tabLog("sistema")) '= "") {
     set versao = ""
     for {
       set versao = $order(tabVersoes(versao))
       if (versao = "") quit
       set ^Src2PatchLogGeracao(3,$get(tabLog("codConta")),$get(tabLog("sistema")),versao,codSeq) = $get(tabLog("tipoPatch"))_"^"_$get(tabLog("idPatch"))
     }
   }
 }
 
 lock -^Src2PatchLogGeracao
 
 if (flgEmail) {
   set titulo = "ATENÇÃO: Log da Geração de Patch"
   set emailDe = "infraestrutura@consistem.com.br"
   set tabEmail(1) = "gestor.desenvolvimento@consistem.com.br"
   if (email [ "@consistem.com.br") set tabEmail(2) = email
   set tabMsg($order(tabMsg(""),-1)+1) = "Mensagem: "_mensagem
   set tabMsg($order(tabMsg(""),-1)+1) = "Data/hora: "_$zdatetime($horolog,4)
   set sc = ##class(Src2.Utils2).EnviarEmail(titulo, emailDe, .tabEmail, .tabMsg, 0)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirGeracaoPatch">
<Description>

Excluir Geração de Patch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,caminhoPatch:%String,idPatch:%String,codConta:%String,sistema:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set status = ##class(%File).RemoveDirectoryTree(caminhoPatch)
 kill ^mtempSrc2PatchGeracao(idPatch)
 kill ^mtempSrc2Patch(codTerm)
 kill ^mtempSrc2InterfaceAux(codTerm)
 kill ^mtempSrc2BaseIni(codTerm)
 lock -^Src2PatchExport(codConta,sistema)
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarPatch">
<Description>

Importar Patch

set sc = ##class(Src2.Patch).ImportarPatch("CC-2012-08-06-10-14-27-CSW-1-6-3-2B1")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[idPatch:%String,&codAtualizacao:%String,flgLinhaCmd=0,senhaSystem:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codTerm = $job
 
 set (codAtualizacao, versaoLog) = ""
 set flgBackUp = 1
 
 lock +^Src2PatchImport:0
 else  quit $$$ERROR(10000,"Importação de patch sendo realizada por outro usuário!")
 
 set horolog = $horolog
 
 set sc = ##class(Src2.Patch).PrepararImportacaoPatch(codTerm, idPatch, .caminhoPatch, .caminhoBackup, .tabInfoPatch, .versaoSistemaCliente, .flgExcluirCod, .tabAplicacoes, senhaSystem, flgLinhaCmd)
 if $$$ISERR(sc) {
   kill ^mtempSrc2PatchImport(codTerm)
   lock -^Src2PatchImport
   quit sc
 }
 
 set tipoPatch = $get(tabInfoPatch("tipo"))
 set sistema = $get(tabInfoPatch("sistema"))
 set versaoOrigemRef = $get(tabInfoPatch("versaoOrigemRef"))
 set versaoFontesPatch = $get(tabInfoPatch("versaoFontesPatch"))
 set versaoAfetada = $get(tabInfoPatch("versaoAfetada"))
 set repositorioRef = $get(tabInfoPatch("repositorioRef"))
 set rotinaVersao = $get(tabInfoPatch("rotinaVersao"))
 set revisao = $get(tabInfoPatch("revisao"))
 set autor = $get(tabInfoPatch("autor"))
 set data = $get(tabInfoPatch("data"))
 set flgTag = $get(tabInfoPatch("flgTag"))
 set codConta = $get(tabInfoPatch("conta"))
 set bloqueioTotal = $get(tabInfoPatch("bloqueioTotal"))
 merge tabGruposRotBloquear = tabInfoPatch("gruposRotBloquear")
 
 if (codConta = "CC") ! (codConta = "GE") {
   set flgBackUp = 0
 }
 
 set sc = ##class(Src2.PatchUtils2).EfetivarBloqueiosAtualizacao(tipoPatch, bloqueioTotal, .tabGruposRotBloquear)
 if $$$ISERR(sc) {
   kill ^mtempSrc2PatchImport(codTerm)
   lock -^Src2PatchImport
   quit sc
 }
 
 set codAtualizacao = $order(^%CSW1ATULOG(1,""),-1) + 1
 
 set $piece(^%CSW1ATULOG(1,codAtualizacao),"^",1) = horolog
 set $piece(^%CSW1ATULOG(1,codAtualizacao),"^",3) = tipoPatch
 set $piece(^%CSW1ATULOG(1,codAtualizacao),"^",4) = sistema
 set $piece(^%CSW1ATULOG(1,codAtualizacao),"^",5) = versaoSistemaCliente
 set $piece(^%CSW1ATULOG(1,codAtualizacao),"^",6) = versaoFontesPatch
 set $piece(^%CSW1ATULOG(1,codAtualizacao),"^",7) = idPatch
 set $piece(^%CSW1ATULOG(1,codAtualizacao),"^",8) = versaoAfetada
 set $piece(^%CSW1ATULOG(1,codAtualizacao),"^",9) = ##class(Src2.Patch).ObterVersaoPatchSrc()
 set $piece(^%CSW1ATULOG(1,codAtualizacao),"^",10) = revisao
 
 set ^%CSW1ATULOG(2,+horolog,codAtualizacao) = ""
 
 set versaoLog = versaoFontesPatch
 if (flgTag) & ((tipoPatch = 4) ! (tipoPatch = 5) ! (tipoPatch = 7)) {
   set versaoLog = versaoAfetada
 }
 
 if (tipoPatch = 1) {
   set sc = ##class(Src2.PatchUtils2).EliminarVersoesLog(codTerm, sistema, versaoOrigemRef, versaoFontesPatch)
 }
 
 if (tipoPatch = 6) {
   set flgBackUp = 0
   kill ^%CSW1ATUCONF(6,sistema)
   
   // Cria o Empresa/Usuário Padrão
   set sc = ##class(Src2.Menu).CriarEmpresaModeloCSW()
 }
 
 if (sistema = "cswutil") {
   if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Importando Componentes - Parte 1")
   set sc = ##class(Src2.PatchUtils).ImportarComponentesParte1(codTerm, codAtualizacao, codConta, .tabAplicacoes)
 }
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Importando as Rotinas e Classes")
 set sc = ##class(Src2.PatchUtils).ImportarRotinasClasses(codTerm, codAtualizacao, sistema, flgExcluirCod, flgBackUp, tipoPatch, versaoLog, revisao, caminhoBackup)
 
 if (sistema = "cswutil") {
   if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Instalando o Serviço Consistem")
   set sc = ##class(Src2.PatchUtils2).AtualizarServicoConsistem(codTerm, codAtualizacao, codConta, flgLinhaCmd, senhaSystem)
   
   if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Importando Componentes - Parte 2")
   set sc = ##class(Src2.PatchUtils).ImportarComponentesParte2(codTerm, codAtualizacao, codConta)
 }
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Instalando Aplicações Web Java")
 set sc = ##class(Src2.PatchUtils).ImportarAplicacoesWebJava(codTerm, codAtualizacao, .tabAplicAtualizadas)
 
 if (sistema = "cswutil") {
   if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Deploy das Aplicações Web Java não Atualizadas")
   set sc = ##class(Src2.PatchUtils).DeployAplicacoesWebJava(codTerm, codAtualizacao, .tabAplicAtualizadas)
 }
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Importando Arquivos para Lib/Componentes")
 set sc = ##class(Src2.PatchUtils).ImportarArquivosLibComponentes(codTerm, codAtualizacao)
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Instalando as Keystores")
 set sc = ##class(Src2.PatchUtils).ImportarKeystore(codTerm, codAtualizacao)
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Instalando os Relatórios")
 set sc = ##class(Src2.PatchUtils).ImportarRelatorios(codTerm, codAtualizacao)
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Instalando o Menu do CSW")
 set sc = ##class(Src2.PatchUtils).ImportarMenu(codTerm, codAtualizacao, sistema, tipoPatch, versaoLog, revisao)
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Importando Arquivos Versionados - Temporários")
 set sc = ##class(Src2.PatchUtils).ImportarArquivosTemporarios(codTerm, codAtualizacao)
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Instalando os Release Notes")
 set sc = ##class(Src2.PatchUtils).ImportarReleaseNotes(codTerm, codAtualizacao)
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Atualizando a Versão do Sistema")
 if (tipoPatch = 1) ! (tipoPatch = 6) {
   set sc = ##class(Src2.PatchUtils).AlterarVersaoSistema(sistema, versaoFontesPatch, codAtualizacao, rotinaVersao)
 }
 
 if (tipoPatch = 5) , (revisao > $piece($get(^%CSW1ATUCONF(3,sistema)),"^",2)) {
   set $piece(^%CSW1ATUCONF(3,sistema),"^",2) = revisao
 }
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Atualizando Base de Inicialização")
 set sc = ##class(Src2.PatchUtils2).ImportarBaseInicalizacao(codTerm, codAtualizacao, codConta)
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Executando os Procedimentos de Base")
 set sc = ##class(Src2.PatchUtils2).ExecutarProcedimentos(codTerm, codAtualizacao)
 
 set $piece(^%CSW1ATULOG(1,codAtualizacao),"^",2) = $horolog
 
 kill ^mtempSrc2PatchImport(codTerm)
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Finalizando a Atualização")
 
 set sc = ##class(Src2.PatchUtils2).ExcluirBloqueiosAtualizacao()
 
 set sc = $$FinalizarAtualizacao^PCATUARG002()
 
 set sc = ##class(Src2.PatchUtils2).EliminarLogsAtualizacao()
 
 set sc = ##class(Src2.PatchUtils2).EliminarBackupsAtualizacao()
 
 lock -^Src2PatchImport
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="PrepararImportacaoPatch">
<Description>

Validar Importacao do Patch

flgExcluirCod = 0 - Não exclui
                1 - Exclui a .MAC (Deixa a .INT)
                2 - Exclui a .INT/.MAC</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,idPatch:%String,&caminhoPatch:%String,&caminhoBackup:%String,&tabInfoPatch:%String,&versaoSistemaCliente:%String,&flgExcluirCod:%Boolean,&tabAplicacoes:%Boolean,senhaSystem:%String="",flgLinhaCmd=0]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabAplicacoes
 
 set (versaoSistemaCliente, caminhoPatch, caminhoBackup, tabInfoPatch, versaoSistemaCliente, flgExcluirCod) = ""
 
 set flgExcluirCod = 2
 
 kill ^mtempSrc2PatchImport(codTerm)
 
 set sc = ##class(Src2.Patch).ValidarImportacaoPatch(idPatch, 2, .tabInfoPatch, , flgLinhaCmd)
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.Patch).ValidarCaminhosPatch(idPatch, .caminhoPatch, .caminhoPatchXml, .caminhoBackup)
 if $$$ISERR(sc) quit sc
 
 set codConta = $get(tabInfoPatch("conta"))
 set sistema = $get(tabInfoPatch("sistema"))
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set msgsc = ##class(Src2.Utils).ObterConsistemHome(.consistemHome)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 //set caminhoRelatoriosCust = $piece($get(^%CSMENCF),"^",62)
 
 set sc = ##class(Src2.PatchUtils).ObterAplicacoesCsp(sistema, .tabAplicacoes)
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(%XML.TextReader).ParseFile(caminhoPatchXml,.reader)
 if $$$ISERR(sc) quit $$$ERROR(10000,"Erro ao ler o arquivo "_idPatch_".xml!")
 
 set flgPatchDesatualizado = 0
 
 set (arquivoItem, path, versao, tarefa, tipo, tipoArquivo, menus, nomeArquivo, localizacao, rotinaProcedimento) = ""
 
 while (reader.Read()) {
   if (reader.Path '= "") {
     set path = reader.Path
   }
   if (path = "/Patch/Rotinas/RotinasImportar/Rotina") & (reader.NodeType = "element") {
     set arquivoItem = ""
     if reader.MoveToAttributeName("arquivo") set arquivoItem = reader.ValueGet()
   }
   if (path = "/Patch/Rotinas/RotinasImportar/Rotina") & (reader.NodeType="chars") {
     set sc = ##class(Src2.PatchUtils).SelecionarRotina(codTerm, sistema, barra, caminhoPatch, 1, reader.ValueGet(), arquivoItem)
   }
   if (path = "/Patch/Rotinas/RotinasExcluir/Rotina") & (reader.NodeType="chars") {
     set sc = ##class(Src2.PatchUtils).SelecionarRotina(codTerm, sistema, barra, caminhoPatch, 2, reader.ValueGet(), arquivoItem)
   }
   if (path = "/Patch/Classes/ClassesImportar/Classe") & (reader.NodeType = "element") {
     set arquivoItem = ""
     if reader.MoveToAttributeName("arquivo") set arquivoItem = reader.ValueGet()
   }
   if (path = "/Patch/Classes/ClassesImportar/Classe") & (reader.NodeType="chars") {
     set sc = ##class(Src2.PatchUtils).SelecionarClasse(codTerm, sistema, barra, caminhoPatch, 1, reader.ValueGet(), arquivoItem)
   }
   if (path = "/Patch/Classes/ClassesExcluir/Classe") & (reader.NodeType="chars") {
     set sc = ##class(Src2.PatchUtils).SelecionarClasse(codTerm, sistema, barra, caminhoPatch, 2, reader.ValueGet(), arquivoItem)
   }
   if (path = "/Patch/Outros/DiversosXml") & (reader.NodeType="chars") {
     set sc = ##class(Src2.PatchUtils).SelecionarDiversosXml(codTerm, sistema, barra, caminhoPatch, reader.ValueGet())
   }
   if (path = "/Patch/Outros/Paginas") & (reader.NodeType="chars") {
     set sc = ##class(Src2.PatchUtils).SelecionarPaginasObjetos(codTerm, sistema, barra, caminhoPatch, reader.ValueGet(), .tabAplicacoes)
   }
   if (path = "/Patch/Outros/Procedimentos") & (reader.NodeType="chars") {
     set ^mtempSrc2PatchImport(codTerm,"procedimentos") = caminhoPatch_barra_"outros"_barra_"procedimentos.xml"
   }
   if (path = "/Patch/Outros/Menu") & (reader.NodeType="chars") {
     set ^mtempSrc2PatchImport(codTerm,"menu") = caminhoPatch_barra_"outros"_barra_"menu.xml"
   }
   if (path = "/Patch/BaseInicializacao/SobreporBase") & (reader.NodeType="chars") {
     set $piece(^mtempSrc2PatchImport(codTerm,"baseinicializacao"),"^",1) = caminhoPatch_barra_"outros"_barra_"base_inicializacao.xml"
     set $piece(^mtempSrc2PatchImport(codTerm,"baseinicializacao"),"^",2) = +reader.ValueGet()
   }
   if (path = "/Patch/BaseInicializacao/StrEmpresas") & (reader.NodeType="chars") {
     set $piece(^mtempSrc2PatchImport(codTerm,"baseinicializacao"),"^",1) = caminhoPatch_barra_"outros"_barra_"base_inicializacao.xml"
     set $piece(^mtempSrc2PatchImport(codTerm,"baseinicializacao"),"^",3) = reader.ValueGet()
   }
   if (path = "/Patch/Outros/SerasaHttpKeystore") & (reader.NodeType="chars") {
     set sc = ##class(Src2.PatchUtils).SelecionarSerasaHttp(codTerm, barra, caminhoPatch, reader.ValueGet(), consistemHome)
   }
   if (path = "/Patch/Outros/ServerProducaoKeystore") & (reader.NodeType="chars") {
     set sc = ##class(Src2.PatchUtils).SelecionarServerProducao(codTerm, barra, caminhoPatch, reader.ValueGet(), consistemHome)
   }
   
   if (path [ "/Patch/ArquivosVersionados") {
     if (reader.NodeType="chars") {
       set versao = reader.ValueGet()
     }
     if (reader.NodeType="element") {
       set (tipoArquivo, nomeArquivo, localizacao, rotinaProcedimento, versao)=""
       if reader.MoveToAttributeName("tipo") set tipoArquivo = reader.ValueGet()
       if reader.MoveToAttributeName("nome") set nomeArquivo = reader.ValueGet()
       if reader.MoveToAttributeName("localizacao") set localizacao = reader.ValueGet()
       if reader.MoveToAttributeName("rotinaProcedimento") set rotinaProcedimento = reader.ValueGet()
     }
     if (reader.NodeType="endelement") {
       if (localizacao = "objetos/java") {
         set sc = ##class(Src2.PatchUtils).SelecionarParaObjetosJava(codTerm, sistema, barra, caminhoPatch, .tabAplicacoes, tipoArquivo, versao, nomeArquivo)
       }
       if (localizacao = "consistem/cswapp") {
         set sc = ##class(Src2.PatchUtils).SelecionarAplicacaoWebJava(codTerm, sistema, barra, caminhoPatch, consistemHome, tipoArquivo, versao, nomeArquivo)
       }
       if (localizacao = "consistem/lib/componentes") {
         set sc = ##class(Src2.PatchUtils).SelecionarArquivoLibComponentes(codTerm, sistema, barra, caminhoPatch, consistemHome, tipoArquivo, versao, nomeArquivo)
       }
       if (tipoArquivo = "consistem_server") {
         set sc = ##class(Src2.PatchUtils).SelecionarConsistemServerRpm(codTerm, sistema, barra, caminhoPatch, consistemHome, tipoArquivo, versao, nomeArquivo)
       }
       if (localizacao = "patch/temp") {
         set sc = ##class(Src2.PatchUtils).SelecionarArquivosTemporarios(codTerm, sistema, barra, caminhoPatch, consistemHome, tipoArquivo, versao, nomeArquivo, rotinaProcedimento)
       }
       set (tipoArquivo, nomeArquivo, localizacao, rotinaProcedimento, versao)=""
     }
   }
   
   if (path = "/Patch/Relatorios/Importar/Arquivo") & (reader.NodeType="chars") {
     if ('$data(^mtempSrc2PatchImport(codTerm,"relatorios","relatoriosImportar"))) {
       set sc = ##class(Src2.PatchUtils).SelecionarRelatoriosImportar(codTerm, barra, caminhoPatch, consistemHome)
     }
   }
   if (path = "/Patch/Relatorios/Excluir/Arquivos/Arquivo") & (reader.NodeType="chars") {
     set sc = ##class(Src2.PatchUtils).SelecionarRelatoriosExcluir(codTerm, barra, 1, reader.ValueGet(), consistemHome)
   }
   if (path = "/Patch/Relatorios/Excluir/Pastas/Pasta") & (reader.NodeType="chars") {
     set sc = ##class(Src2.PatchUtils).SelecionarRelatoriosExcluir(codTerm, barra, 2, reader.ValueGet(), consistemHome)
   }
   if (path = "/Patch/ReleaseNotes/Note") & (reader.NodeType = "element") {
     set (versao, tarefa, tipo, menus) = ""
     if reader.MoveToAttributeName("versao") set versao = reader.ValueGet()
     if reader.MoveToAttributeName("tarefa") set tarefa = reader.ValueGet()
     if reader.MoveToAttributeName("tipo") set tipo = reader.ValueGet()
     if reader.MoveToAttributeName("sistema") set sistema = reader.ValueGet()
     if reader.MoveToAttributeName("funcionalidade") set funcionalidade = reader.ValueGet()
     if reader.MoveToAttributeName("menus") set menus = reader.ValueGet()
   }
   if (path = "/Patch/ReleaseNotes/Note") & (reader.NodeType="chars") {
     set sc = ##class(Src2.PatchUtils).SelecionarReleaseNotes(codTerm, versao, tarefa, tipo, sistema, funcionalidade, menus, reader.ValueGet())
   }
   
   //==================================================================================
   // Tratamento para Patchs Legados - No Futuro Retirar
   if (path = "/Patch/Outros/VersaoConsistemGeralJar") & (reader.NodeType="chars") {
     set flgPatchDesatualizado = 1
   }
   if (path = "/Patch/Outros/VersaoConsistemWebappWar") & (reader.NodeType="chars") {
     set flgPatchDesatualizado = 1
   }
   if (path = "/Patch/Outros/VersaoConsistemServerRpm") & (reader.NodeType="chars") {
     set flgPatchDesatualizado = 1
   }
   if (path = "/Patch/Outros/ConsistemAppletJar") & (reader.NodeType="chars") {
     set flgPatchDesatualizado = 1
   }
   if (path = "/Patch/Outros/CswBrowserWinJar") & (reader.NodeType="chars") {
     set flgPatchDesatualizado = 1
   }
   if (path = "/Patch/Outros/CswBrowserLinux") & (reader.NodeType="chars") {
     set flgPatchDesatualizado = 1
   }
   if (path = "/Patch/Outros/CswBrowserMacJar") & (reader.NodeType="chars") {
     set flgPatchDesatualizado = 1
   }
   if (path = "/Patch/Outros/CswBrowserLoader") & (reader.NodeType="chars") {
     set flgPatchDesatualizado = 1
   }
   //==================================================================================
 }
 
 set reader = ""
 
 if $$$ISERR(sc) quit $$$ERROR(10000,sc)
 
 if (flgPatchDesatualizado) {
   quit $$$ERROR(10000,"Patch com informações desatualizadas! Excluir este patch e solicitar um novo.")
 }
 
 set sc = ##class(Src2.PatchUtils).ValidarPermissoes(codTerm)
 if $$$ISERR(sc) quit $$$ERROR(10000,sc)
 
 set pasta = caminhoPatch_barra_"outros"_barra_##class(Src2.PatchUtils).ObterCodigo(idPatch, 1)
 if (##class(%File).DirectoryExists(pasta)) {
   set flgExcluirCod = 1
 }
 if (sistema = "gatilho") ! (sistema = "custinter") ! (sistema = "customax") ! (sistema = "adapcon") ! (sistema = "especifico") {
   set flgExcluirCod = 1
 }
 if (codConta = "CC") ! (codConta = "GE") {
   set flgExcluirCod = 0
 }
 
 if ($data(^mtempSrc2PatchImport(codTerm,"consistem_server"))) {
   set sc = ##class(Src2.PatchUtils2).ValidarInstalacaoServicoConsistem(senhaSystem)
   if $$$ISERR(sc) quit sc
 }
 
 set sc = ##class(Src2.Patch).ExcluirRotinasControleFonte(codConta)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirRotinasControleFonte">
<Description>

Excluir Rotinas do Controle de Fonte

set sc = ##class(Src2.Patch).ExcluirRotinasControleFonte("CC")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codConta:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (codConta = "CC") ! (codConta = "GE") quit $$$OK
 
 set sc = ##class(Src2.Item).ValidarItem("PCATUA*.*", , , .tabItens)
 
 set rotina = ""
 for {
   set rotina = $order(tabItens(rotina))
   if (rotina = "") quit
   set sc = ##class(%Library.Routine).Delete(rotina, 2)
   set sc = ##class(%Library.Routine).Delete(rotina, 2)
 }
 
 set sc = ##class(Src2.PatchUtils).ObterNamespacesAtualizacao(.tabNamespace)
 
 set namespaceOrigem = $znspace
 
 kill tabNamespace(namespaceOrigem)
 
 set namespace = ""
 for {
   set namespace = $order(tabNamespace(namespace))
   if (namespace = "") quit
   znspace namespace
   set rotina = ""
   for {
     set rotina = $order(tabItens(rotina))
     if (rotina = "") quit
     set sc = ##class(%Library.Routine).Delete(rotina, 2)
     set sc = ##class(%Library.Routine).Delete(rotina, 2)
   }
 }
 znspace namespaceOrigem
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarImportacaoPatch">
<Description>

Validar Importacao Inicial do Patch
local = 1 - Pasta dos patchs
        2 - Pasta do patch descompactado

set sc = ##class(Src2.Patch).ValidarImportacaoPatch("PATCH-CC-2012-12-21-12-36-12-CSW-T5-6-3")
set sc = ##class(Src2.Patch).ValidarImportacaoPatch("PATCH-CC-2012-12-21-09-56-13-CSW-T1-6-3-23")
set sc = ##class(Src2.Patch).ValidarImportacaoPatch("PATCH-CC-2012-12-21-13-40-14-CSW-T1-6-3-22", , , .flgExcluir)
set sc = ##class(Src2.Patch).ValidarImportacaoPatch("PATCH-CC-2012-12-21-09-59-01-CSW-T5-6-3", 2, .tabInfoPatch)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[idPatch:%String,&local:%String=1,&tabInfoPatch:%String,&flgExcluir:%Boolean,flgLinhaCmd=0,&flgAtuLinhaCmd]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabInfoPatch
 
 set (flgExcluir, flgAtuLinhaCmd) = 0
 
 set sc = ##class(Src2.PatchUtils2).ValidarNamespaces()
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.Patch).ValidarCaminhosPatchXmlOrigem(idPatch, local, .caminhoPatchXml)
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.Patch).ObterDadosPatch(caminhoPatchXml, .tabInfoPatch)
 if $$$ISERR(sc) quit sc
 
 set codConta = $get(tabInfoPatch("conta"))
 set tipoPatch = $get(tabInfoPatch("tipo"))
 set sistema = $get(tabInfoPatch("sistema"))
 set dsSistema = $get(tabInfoPatch("dsSistema"))
 set revisao = $get(tabInfoPatch("revisao"))
 set versaoOrigemRef = $get(tabInfoPatch("versaoOrigemRef"))
 set versaoReleaseDestino = $get(tabInfoPatch("versaoFontesPatch"))
 set bloqueioTotal = $get(tabInfoPatch("bloqueioTotal"))
 set flgServTeste = $get(tabInfoPatch("flgServTeste"))
 merge tabGruposRotBloquear = tabInfoPatch("gruposRotBloquear")
 set flgServicoConsistem = $get(tabInfoPatch("flgServicoConsistem"))
 
 if ($get(tabInfoPatch("versaoFontesPatch")) = "") ! ($get(tabInfoPatch("versaoPatch")) = "") {
   quit $$$ERROR(10000,"Versões do patch não encontradas!")
 }
 
 if (sistema = "") quit $$$ERROR(10000,"Sistema do patch não encontrado!")
 
 if ('$data(^%CSW1ATUCONF(3,sistema))) quit $$$ERROR(10000,"Sistema "_sistema_" não configurado para receber atualização!")
 
 if (flgServTeste) & (+$piece($get(^%CSMENCF),"^",79) = 0) {
   quit $$$ERROR(10000,"Este patch só pode ser baixado em um servidor de testes!")
 }
 
 set sc = ##class(Src2.PatchUtils).ObterVersaoProdutoCliente(sistema, .versaoReleaseAtual)
 
 set sc = ##class(Src2.Utils2).ObterVersao(versaoReleaseAtual, , .versaoSistemaCliente)
 
 if ((tipoPatch = 1) ! (tipoPatch = 2) ! (tipoPatch = 5)) & (versaoOrigemRef '= versaoSistemaCliente) {
   if ((tipoPatch = 1) ! (tipoPatch = 5)) & (##class(Src2.Utils2).CompararVersao(versaoSistemaCliente, "<", versaoOrigemRef)) {
     quit $$$ERROR(10000,"O sistema """_dsSistema_""" deve estar na versão "_versaoOrigemRef_" para a importação deste patch!")
   }
   set flgExcluir = 1
   quit $$$ERROR(10000,"Versão do patch ("_versaoOrigemRef_") incompatível com o versão do sistema """_dsSistema_""" ("_versaoSistemaCliente_")! Este patch pode ser excluído.")
 }
 
 if (tipoPatch = 5) , (revisao '> $piece($get(^%CSW1ATUCONF(3,sistema)),"^",2)) {
   set flgExcluir = 1
   quit $$$ERROR(10000,"A versão atual do sistema """_dsSistema_""" ("_versaoReleaseAtual_") possui um Patch Snapshot mais atual instalado!")
 }
 
 set sc = ##class(Src2.PatchUtils2).ValidarPreRequisitosImportacao($get(tabInfoPatch("versoesPreRequisito")))
 if $$$ISERR(sc) quit sc
 
 set flgPatchRetorno = 0
 if (tipoPatch = 1) & (##class(Src2.Utils2).CompararVersao(versaoReleaseDestino, "<", versaoOrigemRef)) {
   set flgPatchRetorno = 1
 }
 
 if ((flgPatchRetorno) & ($piece($get(^%CSW1ATUCONF(3,sistema)),"^",2) '= "")) {
   set flgExcluir = 1
   quit $$$ERROR(10000,"Não é possível retornar para um release anterior! A versão atual do sistema """_dsSistema_""" ("_versaoReleaseAtual_") possui Patch Snapshot instalado.")
 }
 
 set namespace = $znspace
 
 set tipoNamespace = $piece($get(^%CSW1ATUCONF(4,namespace)),"^",1)
 if ((codConta '= "CC") & (tipoNamespace '= "sistemas")) quit $$$ERROR(10000,"Namespace "_namespace_" inválido para instalar atualização do sistema!")
 
 if ($get(tabInfoPatch("procedimentos")) = "1") && (tipoPatch '= 6) {
   if ((sistema = "csw") ! (sistema = "cswutil")) {
     if (##class(Src2.Utils2).CompararVersao(versaoSistemaCliente, ">", "6.3")) {
       set sc = ##class(Src2.PatchUtils).ValidarNamespacesProcedimento()
       if $$$ISERR(sc) quit sc
     }
   }
 }
 
 if ((tipoPatch = 1) & (sistema = "cswutil") & (##class(Src2.Utils2).CompararVersao(versaoReleaseDestino, ">=", "6.4"))) {
   if ($SYSTEM.Security.Check("%DB_CACHESYS","READ") '= "1") {
     quit $$$ERROR(10000,"O recurso %DB_CACHESYS do Caché deve estar com permissão de leitura para atualizar esta versão!")
   }
   if ($SYSTEM.Security.Check("%DB_%DEFAULT","READ") '= "1") {
     quit $$$ERROR(10000,"O recurso %DB_%DEFAULT do Caché deve estar com permissão de leitura para atualizar esta versão!")
   }
 }
 
 if (flgServicoConsistem) && ('flgLinhaCmd) {
   set flgAtuLinhaCmd = 1
   quit $$$ERROR(10000,"A atualização deste patch deve ser realizada por linha de comando! set sc=##class(Src2.PatchImport2).Atualizar("""_idPatch_""")")
 }
 
 set sc = ##class(Src2.PatchUtils2).ValidarBloqueioAtualizacao(tipoPatch, bloqueioTotal, .tabGruposRotBloquear)
 if $$$ISERR(sc) quit sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarCaminhosPatch">
<Description>

Validar Caminhos do Patch

set sc = ##class(Src2.Patch).ValidarCaminhosPatch("PATCH-CC-2012-09-14-07-51-57-CSW-T1-6-3-2", .caminhoPatch, .caminhoPatchXml, .caminhoBackup, .arquivoSrc2)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[idPatch:%String,&caminhoPatch:%String,&caminhoPatchXml:%String,&caminhoBackup:%String,&arquivoSrc2:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (caminhoPatch, caminhoPatchXml, caminhoBackup, arquivoSrc2) = ""
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 if ($piece($get(^%CSW1ATUCONF(2)),"^",2) = "") quit $$$ERROR(10000,"Caminho do patch não encontrado!")
 
 set caminhoPatch = ##class(Src2.Utils).AcertarCaminhoArquivo($piece($get(^%CSW1ATUCONF(2)),"^",2)_barra_idPatch)
 
 if ('##class(%File).DirectoryExists(caminhoPatch)) quit $$$ERROR(10000,"Patch "_idPatch_" não encontrado!")
 
 set caminhoPatchXml = ##class(Src2.Utils).AcertarCaminhoArquivo($piece($get(^%CSW1ATUCONF(2)),"^",2)_barra_idPatch_".xml")
 
 if ($piece($get(^%CSW1ATUCONF(2)),"^",3) = "") quit $$$ERROR(10000,"Caminho do backup não encontrado!")
 
 set caminhoBackup = ##class(Src2.Utils).AcertarCaminhoArquivo($piece($get(^%CSW1ATUCONF(2)),"^",3)_barra_idPatch)
 
 set arquivoSrc2 = ##class(Src2.Utils).AcertarCaminhoArquivo(caminhoPatch_barra_"outros"_barra_"Src2.xml")
 
 if ('##class(%File).Exists(caminhoPatchXml)) quit $$$ERROR(10000,"Arquivo "_idPatch_".xml não encontrado!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarCaminhosPatchXmlOrigem">
<Description>

Validar Caminhos do Patch Xml Origem
local = 1 - Pasta dos patchs
        2 - Pasta do patch descompactado

set sc = ##class(Src2.Patch).ValidarCaminhosPatchXmlOrigem("PATCH-CC-2012-12-21-09-59-01-CSW-T5-6-3", 1, .caminhoPatchXml)
set sc = ##class(Src2.Patch).ValidarCaminhosPatchXmlOrigem("PATCH-CC-2012-12-21-09-59-01-CSW-T5-6-3", 2, .caminhoPatchXml)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[idPatch:%String,&local:%String=1,&caminhoPatchXml:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (caminhoPatch, caminhoPatchXml, caminhoBackup, arquivoSrc2) = ""
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 if (local = 2) {
   if ($piece($get(^%CSW1ATUCONF(2)),"^",2) = "") quit $$$ERROR(10000,"Caminho do patch não encontrado!")
   set caminhoPatchXml = ##class(Src2.Utils).AcertarCaminhoArquivo($piece($get(^%CSW1ATUCONF(2)),"^",2)_barra_idPatch_".xml")
 } else {
   if ($piece($get(^%CSW1ATUCONF(2)),"^",1) = "") quit $$$ERROR(10000,"Caminho dos patchs não encontrado!")
   set caminhoPatchXml = ##class(Src2.Utils).AcertarCaminhoArquivo($piece($get(^%CSW1ATUCONF(2)),"^",1)_barra_idPatch_".xml")
 }
 
 if ('##class(%File).Exists(caminhoPatchXml)) quit $$$ERROR(10000,"Arquivo "_idPatch_".xml não encontrado!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosPatch">
<Description>

Obter Dados do Patch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[caminhoPatchXml:%String,&tabInfoPatch:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabInfoPatch
 
 set sc = ##class(Src2.PatchUtils).ObterTabTiposPatchs(.tabTiposPatch)
 
 set sc = ##class(Src2.PatchUtils).ObterTabTiposDocumentos(.tabTiposDoc)
 
 if ('##class(%File).Exists(caminhoPatchXml)) quit $$$ERROR(10000,"Arquivo "_caminhoPatchXml_" não encontrado!")
 
 set sc = ##class(%XML.TextReader).ParseFile(caminhoPatchXml, .reader)
 if $$$ISERR(sc) quit $$$ERROR(10000,"Erro ao ler o arquivo "_caminhoPatchXml_"!")
 
 set tabInfoPatch("bloqueioTotal") = 0
 set tabInfoPatch("flgServTeste") = 0
 set tabInfoPatch("flgLinhaCmd") = 0
 
 set path = ""
 
 while (reader.Read()) {
   if (reader.Path '= "") {
     set path = reader.Path
   }
   if (path = "/Patch/Informacoes/Tipo") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("tipo") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/VersaoPatch") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("versaoPatch") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/Sistema") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("sistema") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/DsSistema") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("dsSistema") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/Tag") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("flgTag") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/VersaoOrigemRef") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("versaoOrigemRef") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/VersaoAfetada") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("versaoAfetada") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/VersoesPreRequisito") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("versoesPreRequisito") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/FontesPatch/Versao") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("versaoFontesPatch") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/RotinaVersao") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("rotinaVersao") = reader.ValueGet()
   }
    if (path = "/Patch/Informacoes/FontesPatch/Repositorio") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("repositorioRef") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/FontesPatch/Revisao") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("revisao") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/FontesPatch/AutorRevisao") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("autor") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/FontesPatch/DataHoraRevisao") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("data") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/TipoDocumento") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("tipoDocumento") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/Documento") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("documento") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/Conta") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("conta") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/Observacao") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("observacao") = reader.ValueGet()
   }
   if (path = "/Patch/Informacoes/ServidorTeste") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("flgServTeste") = reader.ValueGet()
   }
   if (path = "/Patch/Outros/Procedimentos") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("procedimentos") = reader.ValueGet()
   }
   if (path = "/Patch/BloquearUsoAtualizacao/GrupoRotina") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("gruposRotBloquear",reader.ValueGet()) = ""
   }
   if (path = "/Patch/BloquearUsoAtualizacao/BloqueioTotal") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") set tabInfoPatch("bloqueioTotal") = 1
   }
   
   if (path [ "/Patch/ArquivosVersionados") {
     if (reader.NodeType="chars") {
       set versao = reader.ValueGet()
     }
     if (reader.NodeType="element") {
       set (tipoArquivo, nomeArquivo, localizacao, versao)=""
       if reader.MoveToAttributeName("tipo") set tipoArquivo = reader.ValueGet()
       if reader.MoveToAttributeName("nome") set nomeArquivo = reader.ValueGet()
       if reader.MoveToAttributeName("localizacao") set localizacao = reader.ValueGet()
     }
     if (reader.NodeType="endelement") {
       if (tipoArquivo = "consistem_server") {
         set tabInfoPatch("flgServicoConsistem") = 1
         set tabInfoPatch("flgLinhaCmd") = 1
       }
       set (tipoArquivo, nomeArquivo, localizacao, versao)=""
     }
   }
 }
 
 set reader = ""
 
 set tipoDocumento = $get(tabInfoPatch("tipoDocumento"))
 set documento = $get(tabInfoPatch("documento"))
 set tipoPatch = $get(tabInfoPatch("tipo"))
 
 if (tipoDocumento '= "") & (documento '= "") {
   set tabInfoPatch("dsDocumento") = $get(tabTiposDoc(tipoDocumento))_" "_documento
 }
 
 set tabInfoPatch("dsTipo") = $get(tabTiposPatch(tipoPatch))
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarRotinasClassesPatchSubversion">
<Description>

Exportar Rotinas/Classes Patch do Subversion
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminhoPatch:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set msgsc = $$$OK
 
 set classe = ""
 for {
   set classe = $order(^mtempSrc2Patch(codTerm,"classes",1,classe))
   if (classe = "") quit
   set var = $get(^mtempSrc2Patch(codTerm,"classes",1,classe))
   
   set itemRepositorio = $piece(var,"^",1)
   if (itemRepositorio = "") continue
   
   set pasta = $piece(var,"^",2)
   set itemId = $translate($piece(var,"^",3),"/\",barra_barra)
   
   set pasta = caminhoPatch_barra_"classes"_barra_pasta
   set arquivo = caminhoPatch_barra_"classes"_barra_itemId
   
   if ('$data(^mtempSrc2Patch(codTerm,"pastas",pasta))) {
     set sc = ##class(Src2.Utils2).CriarPasta(pasta)
     set ^mtempSrc2Patch(codTerm,"pastas",pasta) = ""
   }
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "export --force --quiet "_itemRepositorio_" "_arquivo, , , autenticacao)
   if (msgsc '= $$$OK) quit
 }
 
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set rotina = ""
 for {
   set rotina = $order(^mtempSrc2Patch(codTerm,"rotinas",1,rotina))
   if (rotina = "") quit
   set var = $get(^mtempSrc2Patch(codTerm,"rotinas",1,rotina))
   
   set itemRepositorio = $piece(var,"^",1)
   if (itemRepositorio = "") continue
   
   set pasta = $piece(var,"^",2)
   set itemId = $translate($piece(var,"^",3),"/\",barra_barra)
   
   set pasta = caminhoPatch_barra_"rotinas"_barra_pasta
   set arquivo = caminhoPatch_barra_"rotinas"_barra_itemId
   
   if ('$data(^mtempSrc2Patch(codTerm,"pastas",pasta))) {
     set sc = ##class(Src2.Utils2).CriarPasta(pasta)
     set ^mtempSrc2Patch(codTerm,"pastas",pasta) = ""
   }
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "export --force --quiet "_itemRepositorio_" "_arquivo, , , autenticacao)
   if (msgsc '= $$$OK) quit
 }
 
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarRotinasClassesPatchMaqDesenv">
<Description>

Exportar Rotinas/Classes Patch da Máquina do Desenvolvedor
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,sistema:%String,ipMaquina:%String,versaoReleaseRef:%String,caminhoPatch:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Patch).DownloadRotinasClassesPatch(codTerm, ipMaquina, caminhoPatch)
 
 set sc2 = ##class(Src2.Patch).ExcluirArquivosMaquinaDesenv(sistema, ipMaquina, versaoReleaseRef)
 
 if $$$ISERR(sc) quit sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirArquivosMaquinaDesenv">
<Description>

Excluir Arquivos da Maquina do Desenvolvedor
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sistema:%String,ipMaquina:%String,versaoReleaseRef:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils).ObterNamespaceConexao(sistema, versaoReleaseRef, .namespace)
 if $$$ISERR(sc) quit sc
 
 set objService = ##class(Src2.Web.Cliente.Patch2Soap).%New()
 
 set objService.Location = "http://"_ipMaquina_"/csp/"_namespace_"/Src2.Web.Service.Patch.cls"
 
 set usertoken = ##class(%SOAP.Security.UsernameToken).Create("_system","ccscache")
 do objService.SecurityOut.AddToken(usertoken)
 
 try {
   set sc = objService.ExcluirItensPatchTemp()
   set status = $$$OK
 } catch {
   If $ZERROR["<ZSOAP>" { set status = %objlasterror }
   else { set status = $$$ERROR($$$CacheError,$ZERROR)}
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="DownloadRotinasClassesPatch">
<Description>

Exportar Rotinas/Classes Patch da Máquina do Desenvolvedor
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,ipMaquina:%String,caminhoPatch:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set obj = ##class(%Net.HttpRequest).%New()
 set obj.Server = ipMaquina
 set obj.Port = 80
 set obj.Timeout = 60
 
 set msgsc = $$$OK
 
 set classe = ""
 for {
   set classe = $order(^mtempSrc2Patch(codTerm,"classes",1,classe))
   if (classe = "") quit
   set var = $get(^mtempSrc2Patch(codTerm,"classes",1,classe))
   
   set itemRepositorio = $piece(var,"^",1)
   if (itemRepositorio '= "") continue
   
   set pasta = $piece(var,"^",2)
   set itemId = $translate($piece(var,"^",3),"/\",barra_barra)
   
   set origem = "/csp/patchstmp/"_$translate($piece(var,"^",3),"\","/")
   set pasta = caminhoPatch_barra_"classes"_barra_pasta
   set arquivo = caminhoPatch_barra_"classes"_barra_itemId
   
   if ('$data(^mtempSrc2Patch(codTerm,"pastas",pasta))) {
     set sc = ##class(Src2.Utils2).CriarPasta(pasta)
     set ^mtempSrc2Patch(codTerm,"pastas",pasta) = ""
   }
   
   do obj.Get(origem)
   if (obj.HttpResponse.StatusCode '= 200) {
     set msgsc = "Não foi possível baixar o arquivo "_origem_"! Erro Http: "_obj.HttpResponse.StatusLine
     quit
   }
   
   set stream = ##class(%FileBinaryStream).%New()
   set stream.Filename = arquivo
   do stream.CopyFrom(obj.HttpResponse.Data)
   do stream.Flush()
   do stream.SaveStream()
   do stream.%Close()
 }
 
 if (msgsc '= $$$OK) {
   set (obj, stream) = ""
   quit $$$ERROR(10000,msgsc)
 }
 
 set rotina = ""
 for {
   set rotina = $order(^mtempSrc2Patch(codTerm,"rotinas",1,rotina))
   if (rotina = "") quit
   set var = $get(^mtempSrc2Patch(codTerm,"rotinas",1,rotina))
   
   set itemRepositorio = $piece(var,"^",1)
   if (itemRepositorio '= "") continue
   
   set pasta = $piece(var,"^",2)
   set itemId = $translate($piece(var,"^",3),"/\",barra_barra)
   
   set origem = "/csp/patchstmp/"_$translate($piece(var,"^",3),"\","/")
   set pasta = caminhoPatch_barra_"rotinas"_barra_pasta
   set arquivo = caminhoPatch_barra_"rotinas"_barra_itemId
   
   if ('$data(^mtempSrc2Patch(codTerm,"pastas",pasta))) {
     set sc = ##class(Src2.Utils2).CriarPasta(pasta)
     set ^mtempSrc2Patch(codTerm,"pastas",pasta) = ""
   }
   
   do obj.Get(origem)
   if (obj.HttpResponse.StatusCode '= 200) {
     set msgsc = "Não foi possível baixar o arquivo "_origem_"! Erro Http: "_obj.HttpResponse.StatusLine
     quit
   }
   
   set stream = ##class(%FileBinaryStream).%New()
   set stream.Filename = arquivo
   do stream.CopyFrom(obj.HttpResponse.Data)
   do stream.Flush()
   do stream.SaveStream()
   do stream.%Close()
 }
 
 set (obj, stream) = ""
 
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarDadosFlagsPatch">
<Description>

Exportar Utilitarios Patch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminhoPatch:%String,repositorioRef:%String,revisaoRef:%String,codConta:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 if ($data(^mtempSrc2Patch(codTerm,"flags","flgDiversos"))) {
   set repositorioDiversos = repositorioRef_"/outros/diversos.xml"
   set caminhoOutrosPatch = caminhoPatch_barra_"outros"
   set sc = ##class(Src2.Utils2).CriarPasta(caminhoOutrosPatch)
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "export --force --quiet "_repositorioDiversos_"@"_revisaoRef_" "_caminhoOutrosPatch_barra_"diversos.xml", username, password)
   if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 }
 
 if ($data(^mtempSrc2Patch(codTerm,"flags","flgProcedimentos"))) {
   set repositorioDiversos = repositorioRef_"/outros/procedimentos.xml"
   set caminhoOutrosPatch = caminhoPatch_barra_"outros"
   set sc = ##class(Src2.Utils2).CriarPasta(caminhoOutrosPatch)
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "export --force --quiet "_repositorioDiversos_"@"_revisaoRef_" "_caminhoOutrosPatch_barra_"procedimentos.xml", username, password)
   if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 }
 
 if ($data(^mtempSrc2Patch(codTerm,"flags","flgPaginas"))) {
   set repositorioPaginas = repositorioRef_"/paginas"
   set caminhoPaginasPatch = caminhoPatch_barra_"paginas"
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "export --force --quiet "_repositorioPaginas_"@"_revisaoRef_" "_caminhoPaginasPatch, username, password)
   if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
   if (codConta '= "CC") {
     set sc = ##class(%File).Delete(caminhoPaginasPatch_barra_"csw1documentacao.csp")
   }
 }
 
 if ($data(^mtempSrc2Patch(codTerm,"flags","flgSerasahttp"))) {
   set repositorioDiversos = repositorioRef_"/outros/serasahttp.keystore"
   set caminhoOutrosPatch = caminhoPatch_barra_"outros"
   set sc = ##class(Src2.Utils2).CriarPasta(caminhoOutrosPatch)
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "export --force --quiet "_repositorioDiversos_"@"_revisaoRef_" "_caminhoOutrosPatch_barra_"serasahttp.keystore", username, password)
   if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 }
 
 if ($data(^mtempSrc2Patch(codTerm,"flags","flgServerProducao"))) {
   set repositorioDiversos = repositorioRef_"/outros/server_producao.keystore"
   set caminhoOutrosPatch = caminhoPatch_barra_"outros"
   set sc = ##class(Src2.Utils2).CriarPasta(caminhoOutrosPatch)
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "export --force --quiet "_repositorioDiversos_"@"_revisaoRef_" "_caminhoOutrosPatch_barra_"server_producao.keystore", username, password)
   if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarGenericoPatch">
<Description>

Exportar Generico Patch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminhoPatch:%String,opcao:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set msgsc = $$$OK
 
 set itemRepositorio = ""
 for {
   set itemRepositorio = $order(^mtempSrc2Patch(codTerm,opcao,"importar","arquivo",itemRepositorio))
   if (itemRepositorio = "") quit
   set var = $get(^mtempSrc2Patch(codTerm,opcao,"importar","arquivo",itemRepositorio))
   
   set itemId = $translate($piece(var,"^",1),"/\",barra_barra)
   set arquivo = caminhoPatch_barra_opcao_barra_itemId
   set pasta = $piece(arquivo,barra,1,$length(arquivo,barra)-1)
   
   if ('$data(^mtempSrc2Patch(codTerm,"pastas",pasta))) {
     set sc = ##class(Src2.Utils2).CriarPasta(pasta)
     set ^mtempSrc2Patch(codTerm,"pastas",pasta) = ""
   }
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "export --force --quiet "_itemRepositorio_" '"_arquivo_"'", , , autenticacao)
   if (msgsc '= $$$OK) quit
 }
 
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="DownloadPatch">
<Description>

Efetua um Download de Patch

set sc = ##class(Src2.Patch).DownloadPatch("PATCH-EI-2013-12-19-12-28-21-CSW-T4-6-4")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>idPatch:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils).DownloadPatch(idPatch)
 if $$$ISERR(sc) quit sc
 
 try {
   set objServico = ##Class(Src2.Web.Cliente.PatchSoap).%New()
   if (objServico = "") {
     set sc = $$$ERROR(10000,"Não foi possível conectar-se ao servidor Consistem!")
     quit
   }
   set sc = objServico.ExcluirPatch(idPatch)
 } catch {
   if $zerror["<ZSOAP>" set sc = $$$ERROR(10000,"Não foi possível conectar-se ao servidor Consistem!")
   else  set sc = $$$ERROR($$$CacheError,$zerror)
 }
 
 set objServico = ""
 
 if $$$ISERR(sc) quit sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterPatchsServer">
<Description>

Obter Patchs no Server

set sc = ##class(Src2.Patch).ObterPatchsServer("CC", .ObterPatchsServer)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codConta:%String,&tabPatchs:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabPatchs
 
 set sc = $$$OK
 
 try {
   set objServico = ##Class(Src2.Web.Cliente.PatchSoap).%New()
   if (objServico = "") {
     set sc = $$$ERROR(10000,"Não foi possível conectar-se ao servidor Consistem!")
     quit
   }
   set strPatch = objServico.ListarRemessasServidor(codConta)
   for i = 1:1:$length(strPatch,";") {
     set idPatch = $piece(strPatch,";",i)
     if (idPatch = "") continue
     set tabPatchs(idPatch) = objServico.ObterDadosPatch(codConta, idPatch)
   }
 } catch {
   if $zerror["<ZSOAP>" set sc = $$$ERROR(10000,"Não foi possível conectar-se ao servidor Consistem!")
   else  set sc = $$$ERROR($$$CacheError,$zerror)
 }
 
 set objServico = ""
 
 if $$$ISERR(sc) quit sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterPatchsClient">
<Description>

Obter Patchs no Client

set sc = ##class(Src2.Patch).ObterPatchsClient("CC", .tabPatchs)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codConta:%String="",&tabPatchs:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabPatchs
 
 set caminhoPatch = $piece($get(^%CSW1ATUCONF(2)),"^",1)
 
 set rs = ##class(%ResultSet).%New("%File:FileSet") 
 do rs.Execute(caminhoPatch,"*.xml")
 while (rs.Next()) {
   if (rs.Get("ItemName") = "") continue
   set tabArquivos(rs.Get("ItemName")) = rs.Get("Name")
 }
 do rs.%Close()
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set nomeArquivo = ""
 for {
   set nomeArquivo = $order(tabArquivos(nomeArquivo))
   if (nomeArquivo = "") quit
   set idPatch = $piece(nomeArquivo,".",1)
   
   set caminhoPatchXml = caminhoPatch_barra_idPatch_".xml"
   
   set sc=##class(Src2.Patch).ObterDadosPatch(caminhoPatchXml, .tabInfoPatch)
   if $$$ISERR(sc) continue
   
   if ((codConta '= "") & ($get(tabInfoPatch("conta")) '= codConta)) continue
   
   set $piece(dadosPatch,"^",1) = $get(tabInfoPatch("dsSistema"))
   set $piece(dadosPatch,"^",2) = $get(tabInfoPatch("dsTipo"))
   set $piece(dadosPatch,"^",3) = $get(tabInfoPatch("versaoOrigemRef"))
   set $piece(dadosPatch,"^",4) = $get(tabInfoPatch("versaoFontesPatch"))
   set $piece(dadosPatch,"^",5) = 2
   set $piece(dadosPatch,"^",6) = $get(tabInfoPatch("dsDocumento"))
   set $piece(dadosPatch,"^",7) = $get(tabInfoPatch("observacao"))
   set $piece(dadosPatch,"^",8) = $get(tabInfoPatch("flgLinhaCmd"))
   
   set tabPatchs(idPatch)=dadosPatch
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarConfPadrao">
<Description>

Gerar Configuração Padrão

set sc = ##class(Src2.Patch).GerarConfPadrao()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>namespace:%String="SISTEMAS",flgTeste1:%String=0</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if $data(^%CSW1ATUCONF) quit $$$OK
 
 if (##class(Src2.Utils).ObterSistOper() = "linux") {
   set $piece(^%CSW1ATUCONF(2),"^",1) = "/dados/consistem/atualizacao/patchs"
   set $piece(^%CSW1ATUCONF(2),"^",2) = "/dados/consistem/atualizacao/temp"
   set $piece(^%CSW1ATUCONF(2),"^",3) = "/dados/consistem/atualizacao/patchsback"
 } else {
   set $piece(^%CSW1ATUCONF(2),"^",1) = "C:\dados\consistem\atualizacao\patchs"
   set $piece(^%CSW1ATUCONF(2),"^",2) = "C:\dados\consistem\atualizacao\temp"
   set $piece(^%CSW1ATUCONF(2),"^",3) = "C:\dados\consistem\atualizacao\patchsback"
 }
 
 if (namespace = "SISTEMAS") {
   set ^%CSW1ATUCONF(3,"csw") = ""
   set ^%CSW1ATUCONF(3,"csw",1,"SISTEMAS") = ""
   set ^%CSW1ATUCONF(3,"cswutil") = ""
   set ^%CSW1ATUCONF(3,"cswutil",1,"SISTEMAS") = ""
   set ^%CSW1ATUCONF(3,"cswutil",1,"%SYS") = ""
   set ^%CSW1ATUCONF(3,"gatilho") = ""
   set ^%CSW1ATUCONF(3,"gatilho",1,"SISTEMAS") = ""
   set ^%CSW1ATUCONF(3,"custinter") = ""
   set ^%CSW1ATUCONF(3,"custinter",1,"SISTEMAS") = ""
   set ^%CSW1ATUCONF(3,"customax") = ""
   set ^%CSW1ATUCONF(3,"customax",1,"SISTEMAS") = ""
   set ^%CSW1ATUCONF(3,"adapcon") = ""
   set ^%CSW1ATUCONF(3,"adapcon",1,"SISTEMAS") = ""
   set ^%CSW1ATUCONF(3,"especifico") = ""
   set ^%CSW1ATUCONF(3,"especifico",1,"SISTEMAS") = ""
   
   set ^%CSW1ATUCONF(4,"SISTEMAS") = "sistemas"
   set ^%CSW1ATUCONF(4,"%SYS") = "%sys"
   
   if (flgTeste1) {
     set ^%CSW1ATUCONF(3,"csw",1,"TESTE1") = ""
     set ^%CSW1ATUCONF(3,"cswutil",1,"TESTE1") = ""
     set ^%CSW1ATUCONF(3,"gatilho",1,"TESTE1") = ""
     set ^%CSW1ATUCONF(3,"custinter",1,"TESTE1") = ""
     set ^%CSW1ATUCONF(3,"customax",1,"TESTE1") = ""
     set ^%CSW1ATUCONF(3,"adapcon",1,"TESTE1") = ""
     set ^%CSW1ATUCONF(3,"especifico",1,"TESTE1") = ""
     
     set ^%CSW1ATUCONF(4,"TESTE1") = "teste1"
     set ^%CSW1ATUCONF(4,"TESTE2") = "teste2"
   }
 }
 
 if (namespace '= "SISTEMAS") {
   set ^%CSW1ATUCONF(3,"csw") = ""
   set ^%CSW1ATUCONF(3,"csw",1,namespace) = "1^2^1^1^1^1"
   set ^%CSW1ATUCONF(3,"cswutil") = ""
   set ^%CSW1ATUCONF(3,"cswutil",1,namespace) = "1^1^1^1^1^1"
   set ^%CSW1ATUCONF(3,"gatilho") = ""
   set ^%CSW1ATUCONF(3,"gatilho",1,namespace) = "1^2^1^1^1^1"
   set ^%CSW1ATUCONF(3,"custinter") = ""
   set ^%CSW1ATUCONF(3,"custinter",1,namespace) = "1^2^1^1^1^1"
   set ^%CSW1ATUCONF(3,"customax") = ""
   set ^%CSW1ATUCONF(3,"customax",1,namespace) = "1^2^1^1^1^1"
   set ^%CSW1ATUCONF(3,"adapcon") = ""
   set ^%CSW1ATUCONF(3,"adapcon",1,namespace) = "1^2^1^1^1^1"
   set ^%CSW1ATUCONF(3,"especifico") = ""
   set ^%CSW1ATUCONF(3,"especifico",1,namespace) = "1^2^1^1^1^1"
   
   set ^%CSW1ATUCONF(4,namespace) = "sistemas"
 }
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.PatchImport">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="ImportarPatch">
<Description>
================================================================================

ATENÇÃO: CLASSE DESCONTINUADA - UTILIZADA SOMENTE NAS VERSÕES 6.2 E 6.3 DO CSW
         SUBSTITUIDA PELA Src2.PatchImport2 - SEM O TRATAMENTO DO CACHÉ 5

CASO SEJA NECESSÁRIA A ALTERAÇÃO DO FONTE DESTA CLASSE ELA DEVE
TER O FONTE ATUALIZADO EM TODOS OS CLIENTES, POIS É A UNICA DO
PACKAGE SRC2*.CLS QUE NÃO É ATUALIZADA AUTOMATICAMENTE.

OBSERVAÇÕES: ESTA CLASSE DEVE POSSUIR SOMENTE O MÉTODO "ImportarPatch",
             QUE TEM POR OBJETIVO, VERIFICAR SE O PACKAGE SRC2*.CLS ESTA
             ATUALIZADO EM TODOS OS NAMESPACES QUE PODEM SOFREM ATUALIZAÇÃO,
             CASO TENHA ALGUM NAMESPACE DESATUALIZADO, ATUALIZAR AS CLASSES
             SRC2*.CLS E CHAMAR O MÉTODO QUE REALMENTE IMPORTA O PATCH.

================================================================================
set sc = ##class(Src2.PatchImport).ImportarPatch("CC-2012-08-11-12-29-40-CSW-T1-6-3-2")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[idPatch:%String,&codAtualizacao:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codAtualizacao = ""
 
 set sc = ##class(Src2.PatchUtils2).ValidarNamespaces()
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.Patch).ValidarCaminhosPatch(idPatch, , .caminhoPatchXml, , .arquivoSrc2)
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.Patch).ObterDadosPatch(caminhoPatchXml, .tabInfoPatch)
 if $$$ISERR(sc) quit sc
 
 lock +^Src2PatchImport:0
 else  quit $$$ERROR(10000,"Importação de patch sendo realizada por outro usuário!")
 
 set versaoPatch = $get(tabInfoPatch("versaoPatch"))
 
 set sc = ##class(Src2.UtilsXml).ObterClassesArquivo(arquivoSrc2, .tabItens)
 
 // TODO - PARA CACHE 2010 DEIXAR IMPORTAR A CLASSE Src2.PatchImport.cls
 kill tabItens("Src2.PatchImport.cls")
 set tabItens("PCATUARG001.MAC")=""
 
 set sc = ##class(Src2.PatchUtils).ValidarVersaoPatch(versaoPatch, .tabNamespace)
 if $$$ISERR(sc) {
   set flagComp = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(2)
   set namespaceOrigem = $znspace
   set namespace = ""
   for {
     set namespace = $order(tabNamespace(namespace))
     if (namespace = "") quit
     znspace namespace
     set sc = $system.OBJ.Load(arquivoSrc2, flagComp, , , , .tabItens)
   }
   znspace namespaceOrigem
 }
 
 set sc = ##class(Src2.Patch).ImportarPatch(idPatch, .codAtualizacao)
 
 lock -^Src2PatchImport
 
 quit sc
]]></Implementation>
</Method>
</Class>


<Class name="Src2.PatchImport2">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="AtualizarPatch">
<Description>
================================================================================

OBSERVAÇÕES: ESTA CLASSE DEVE POSSUIR SOMENTE O MÉTODO "ImportarPatch",
             QUE TEM POR OBJETIVO, VERIFICAR SE O PACKAGE SRC2*.CLS ESTA
             ATUALIZADO EM TODOS OS NAMESPACES QUE PODEM SOFREM ATUALIZAÇÃO,
             CASO TENHA ALGUM NAMESPACE DESATUALIZADO, ATUALIZAR AS CLASSES
             SRC2*.CLS E CHAMAR O MÉTODO QUE REALMENTE IMPORTA O PATCH.

================================================================================

Atualizar Patch (Descompacta / Importa / Elimina Arquivos Temporários)
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[idPatch:%String,&idAtualizacao:%String,flgAtuCompleta:%String=0,flgLinhaCmd:%String=0,senhaSystem:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set idAtualizacao=""
 
 set sc = ##class(Src2.Patch).ValidarImportacaoPatch(idPatch, , .tabInfoPatch, , flgLinhaCmd)
 if (sc '= 1) quit sc
 
 set codConta = $get(tabInfoPatch("conta"))
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Descompactando o Patch de Atualização")
 
 set sc = ##class(Src2.PatchUtils).PrepararPatch(idPatch, flgAtuCompleta)
 if (sc '= 1) quit sc
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Iniciando a Atualização")
 
 set sc=##class(Src2.PatchImport2).ImportarPatch(idPatch, .idAtualizacao, flgLinhaCmd, senhaSystem)
 if (sc '= 1) {
   set sc2 = ##class(Src2.PatchUtils).ExcluirPatchClient(idPatch,1)
   quit sc
 }
 
 set sc = ##class(Src2.PatchUtils).ExcluirPatchClient(idPatch)
 
 if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Fim da Atualização")
 
 set sc = ##class(Src2.PatchUtils).AtualizarVersoesConsistem(codConta)
 if (sc '= 1) quit sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarPatch">
<Description>

Importar Patch (Atualizando as Classes do Atualizador - Src2*.cls)

set sc = ##class(Src2.PatchImport2).ImportarPatch("CC-2012-08-11-12-29-40-CSW-T1-6-3-2")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[idPatch:%String,&codAtualizacao:%String,flgLinhaCmd:%String=0,senhaSystem:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codAtualizacao = ""
 
 set sc = ##class(Src2.PatchUtils2).ValidarNamespaces()
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.Patch).ValidarCaminhosPatch(idPatch, , .caminhoPatchXml, , .arquivoSrc2)
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.Patch).ObterDadosPatch(caminhoPatchXml, .tabInfoPatch)
 if $$$ISERR(sc) quit sc
 
 lock +^Src2PatchImport:0
 else  quit $$$ERROR(10000,"Importação de patch sendo realizada por outro usuário!")
 
 set versaoPatch = $get(tabInfoPatch("versaoPatch"))
 set codConta = $get(tabInfoPatch("conta"))
 
 set sc = ##class(Src2.Patch).ExcluirRotinasControleFonte(codConta)
 
 set sc = ##class(Src2.PatchUtils).ValidarVersaoPatch(versaoPatch, .tabNamespace)
 if $$$ISERR(sc) {
   set flagComp = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(2)
   set namespaceOrigem = $znspace
   set namespace = ""
   for {
     set namespace = $order(tabNamespace(namespace))
     if (namespace = "") quit
     znspace namespace
     set sc = $system.OBJ.Load(arquivoSrc2, flagComp)
   }
   znspace namespaceOrigem
 }
 
 set sc = ##class(Src2.Patch).ExcluirRotinasControleFonte(codConta)
 
 set sc = ##class(Src2.Patch).ImportarPatch(idPatch, .codAtualizacao, flgLinhaCmd, senhaSystem)
 
 lock -^Src2PatchImport
 
 quit sc
]]></Implementation>
</Method>

<Method name="Atualizar">
<Description>
 
Atualizar por Linha de Comando

set sc = ##class(Src2.PatchImport2).Atualizar()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>idPatch:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 // Valida Usuário Root no Linux
 
 set msgsc = ##class(Src2.Utils2).ValidarUsuarioRoot()
 if (msgsc '= 1) {
   write !!,"ERRO: ",msgsc
   quit $$$ERROR(10000,msgsc)
 }
 
 if (idPatch = "") {
   write !!,"ERRO: Patch não informado!"
   quit $$$ERROR(10000,"Patch não informado!")
 }
 
 // Instancias
 
 set sc = ##class(Src2.PatchUtils).ObterTabTiposInstancias(.tabInstancias, .strInstancias)
 
 set tipoInstanciaSug = $piece($get(^%CSW1ATUCONF(2)),"^",7)
 if (tipoInstanciaSug = "") set tipoInstanciaSug = 1
 
 set sc = ##class(Src2.PatchUtils2).VerificarHostnameLinux()
 if $$$ISERR(sc) {
   write !,"ERRO: "_##class(Src2.Utils).ObterMensagemStatusCode(sc)
   quit $$$OK
 } 	
 
 // Senha do _system do Caché
 do {
   write #,##class(Src2.Utils).ObterBarra("Configuracoes")
   write !!,"Senha do Usuario _SYSTEM no Cache: "
   do ##class(Src2.Utils).ReadPassword(.senhaSystem)
   if (senhaSystem = "") quit
   set sc = $SYSTEM.Security.Login("_SYSTEM",senhaSystem)
 } while (sc = 0)
 
 if (senhaSystem = "") {
   write !,"ERRO: Senha do _SYSTEM não informada!"
   quit $$$ERROR(10000,"Senha do _SYSTEM não informada!")
 }
 
 // Tipo de Instâncias da Aplicação
 do {
   write !!,"Tipos de Instancias da Aplicacao: ",strInstancias
   write !,"Selecionada ["_tipoInstanciaSug_"]: "
   read tipoInstancia
   if (tipoInstancia = "") set tipoInstancia = tipoInstanciaSug
 } while ('$data(tabInstancias(tipoInstancia)))
 
 // Display das Configurações Informadas
 
 set $piece(^%CSW1ATUCONF(2),"^",7) = tipoInstancia
 
 write #,##class(Src2.Utils).ObterBarra("Configuracoes")
 write !,"Tipo de Instancia da Aplicacao: "_$get(tabInstancias(tipoInstancia))
 
 // Instalar
 
 set sc = ##class(Src2.PatchImport2).AtualizarPatch(idPatch, , , 1, senhaSystem)
 if $$$ISERR(sc) {
   write !!,"ERRO: "_##class(Src2.Utils).ObterMensagemStatusCode(sc)
   quit $$$OK
 }
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.PatchLogGeracao">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>Src2PatchLogGeracaoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62761,35593.507944</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Controle de Fontes</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Log de Geração de Patch</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Log de Geração de Patch</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Parameter name="Src2PatchLogGeracao">
<Default>Log de Geração de Patch por Data e Conta</Default>
</Parameter>

<Property name="codSeq">
<Description>
Código da Sequência</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="tipoLog">
<Description>
Tipo do log</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="DISPLAYLIST" value=",Erro na Geração,Patch Gerado"/>
<Parameter name="VALUELIST" value=",0,1"/>
</Property>

<Property name="dataLog">
<Description>
Data do log - Sistema</Description>
<Type>%Date</Type>
<Required>1</Required>
<Parameter name="FORMAT" value="4"/>
</Property>

<Property name="horaLog">
<Description>
Hora do log - Sistema</Description>
<Type>%Time</Type>
<Required>1</Required>
</Property>

<Property name="conta">
<Description>
Conta do Cliente</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="3"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="usuarioGercon">
<Description>
Usuário do Gercon</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="3"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="email">
<Description>
Email do Usuário</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="40"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="sistema">
<Description>
Sistema do Patch</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="tipoPatch">
<Description>
Tipo do Patch</Description>
<Type>%Integer</Type>
<Parameter name="DISPLAYLIST" value=",Atualização,Reenvio de Itens,Envio de Itens,Envio de Itens (Versão),Snapshot"/>
<Parameter name="VALUELIST" value=",1,2,3,4,5"/>
</Property>

<Property name="idPatch">
<Description>
ID do Patch Gerado</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="10"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="versaoReleaseOrigem">
<Description>
Versão release de origem</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="10"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="versaoReleaseRef">
<Description>
Versão release de referência (Destino)</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="10"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="tipoDocumento">
<Description>
Tipo do documento</Description>
<Type>%Integer</Type>
<Parameter name="DISPLAYLIST" value=",Chamado,Projeto,Atendimento,Tarefa"/>
<Parameter name="VALUELIST" value=",1,2,3,4"/>
</Property>

<Property name="documento">
<Description>
Documento na Geração</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="20"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="mensagem">
<Description>
Mensagem de Erro</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="60"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="force">
<Description>
Geração Forçada</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="1"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="flgManterCod">
<Description>
Manter Código Fonte</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="MAXVAL" value="1"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="stringGrupoItens">
<Description>
Grupo de Itens Selecionados</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="50"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="origem">
<Description>
Origem da Geração do Patch</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="DISPLAYLIST" value=",Interna,Externa"/>
<Parameter name="VALUELIST" value=",0,1"/>
</Property>

<Property name="revisao">
<Description>
Revisão</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="10"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="tempoGeracao">
<Description>
Tempo de Geração do Patch</Description>
<Type>%Float</Type>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>codSeq</Properties>
</Index>

<Storage name="Src2PatchLogGeracaoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.PatchLogGeracaoS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2PatchLogGeracao2Map">
<Type>index</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2PatchLogGeracao</Global>
<Subscript name="1">
<Expression>2</Expression>
</Subscript>
<Subscript name="2">
<Expression>{dataLog}</Expression>
</Subscript>
<Subscript name="3">
<Expression>{conta}</Expression>
</Subscript>
<Subscript name="4">
<Expression>{codSeq}</Expression>
</Subscript>
</SQLMap>
<SQLMap name="Src2PatchLogGeracaoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2PatchLogGeracao</Global>
<Subscript name="1">
<Expression>1</Expression>
</Subscript>
<Subscript name="2">
<Expression>{codSeq}</Expression>
</Subscript>
<Data name="conta">
<Delimiter>"^"</Delimiter>
<Piece>3</Piece>
</Data>
<Data name="dataLog">
<Delimiter>"^",","</Delimiter>
<Piece>2,1</Piece>
</Data>
<Data name="documento">
<Delimiter>"^"</Delimiter>
<Piece>12</Piece>
</Data>
<Data name="email">
<Delimiter>"^"</Delimiter>
<Piece>5</Piece>
</Data>
<Data name="flgManterCod">
<Delimiter>"^"</Delimiter>
<Piece>15</Piece>
</Data>
<Data name="force">
<Delimiter>"^"</Delimiter>
<Piece>14</Piece>
</Data>
<Data name="horaLog">
<Delimiter>"^",","</Delimiter>
<Piece>2,2</Piece>
</Data>
<Data name="idPatch">
<Delimiter>"^"</Delimiter>
<Piece>8</Piece>
</Data>
<Data name="mensagem">
<Delimiter>"^"</Delimiter>
<Piece>13</Piece>
</Data>
<Data name="origem">
<Delimiter>"^"</Delimiter>
<Piece>17</Piece>
</Data>
<Data name="revisao">
<Delimiter>"^"</Delimiter>
<Piece>18</Piece>
</Data>
<Data name="sistema">
<Delimiter>"^"</Delimiter>
<Piece>6</Piece>
</Data>
<Data name="stringGrupoItens">
<Delimiter>"^"</Delimiter>
<Piece>16</Piece>
</Data>
<Data name="tempoGeracao">
<Delimiter>"^"</Delimiter>
<Piece>19</Piece>
</Data>
<Data name="tipoDocumento">
<Delimiter>"^"</Delimiter>
<Piece>11</Piece>
</Data>
<Data name="tipoLog">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
<Data name="tipoPatch">
<Delimiter>"^"</Delimiter>
<Piece>7</Piece>
</Data>
<Data name="usuarioGercon">
<Delimiter>"^"</Delimiter>
<Piece>4</Piece>
</Data>
<Data name="versaoReleaseOrigem">
<Delimiter>"^"</Delimiter>
<Piece>9</Piece>
</Data>
<Data name="versaoReleaseRef">
<Delimiter>"^"</Delimiter>
<Piece>10</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.PatchLogGeracaoConta">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<SqlRowIdPrivate>1</SqlRowIdPrivate>
<StorageStrategy>Src2PatchLogGeracaoStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62875,61722.975083</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Controle de Fontes</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Log de Geração de Patch por Conta</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Log de Geração de Patch por Conta</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Parameter name="Src2PatchLogGeracao">
<Default>Log de Geração de Patch por Data e Conta</Default>
</Parameter>

<Property name="conta">
<Description>
Conta do Cliente</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="MAXLEN" value="3"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="sistema">
<Description>
Sistema do Patch</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="15"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="versao">
<Description>
Versão</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="10"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="codSeq">
<Description>
Código da Sequência do Log</Description>
<Type>%Integer</Type>
<Required>1</Required>
<Parameter name="CAPTION" value="Src2.PatchLogGeracao"/>
<Parameter name="MAXVAL" value="999999"/>
<Parameter name="MINVAL" value="0"/>
</Property>

<Property name="tipoPatch">
<Description>
Tipo do Patch</Description>
<Type>%Integer</Type>
<Parameter name="DISPLAYLIST" value=",Atualização,Reenvio de Itens,Envio de Itens,Envio de Itens (Versão),Snapshot"/>
<Parameter name="VALUELIST" value=",1,2,3,4,5"/>
</Property>

<Property name="idPatch">
<Description>
ID do Patch Gerado</Description>
<Type>%String</Type>
<Parameter name="MAXLEN" value="10"/>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>conta,sistema,versao,codSeq</Properties>
</Index>

<Storage name="Src2PatchLogGeracaoStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.PatchLogGeracaoContaS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2PatchLogGeracaoMap">
<Type>data</Type>
<ConditionalWithHostVars>0</ConditionalWithHostVars>
<Global>^Src2PatchLogGeracao</Global>
<Subscript name="1">
<Expression>3</Expression>
</Subscript>
<Subscript name="2">
<Expression>{conta}</Expression>
</Subscript>
<Subscript name="3">
<Expression>{sistema}</Expression>
</Subscript>
<Subscript name="4">
<Expression>{versao}</Expression>
</Subscript>
<Subscript name="5">
<Expression>{codSeq}</Expression>
</Subscript>
<Data name="idPatch">
<Delimiter>"^"</Delimiter>
<Piece>2</Piece>
</Data>
<Data name="tipoPatch">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.PatchTeste">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>62736,40699.51885</TimeCreated>

<Method name="TestarEliminarLog">
<Description>

Testar Eliminar Log - Para Frente

set sc = ##class(Src2.PatchTeste).TestarEliminarLog()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill ^%CSW1ATUCONF
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV100")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV120")="6.3.5^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV130")="6.3.5^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV140")="6.3.6^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV150")="6.3.6^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV160")="6.3.7^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV170")="6.3.8^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV180")="6.3.9^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV190")="6.3.10^11111^90"
 
 set sc = ##class(Src2.PatchUtils2).EliminarVersoesLog("aa" ,"csw", "6.3.5", "6.3.8")
 
 write !
 zwrite ^%CSW1ATUCONF
 
 /*
^%CSW1ATUCONF(6,"csw",1,"CCPV100")="6.3.4^11111^90"
^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
^%CSW1ATUCONF(6,"csw",1,"CCPV180")="6.3.9^11111^90"
^%CSW1ATUCONF(6,"csw",1,"CCPV190")="6.3.10^11111^90"
 */
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TestarEliminarLog2">
<Description>

Testar Eliminar Log - Para Traz

set sc = ##class(Src2.PatchTeste).TestarEliminarLog2()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill ^%CSW1ATUCONF
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV100")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV120")="6.3.5^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV130")="6.3.5^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV140")="6.3.6^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV150")="6.3.6^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV160")="6.3.7^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV170")="6.3.8^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV180")="6.3.9^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV190")="6.3.10^11111^90"
 
 set sc = ##class(Src2.PatchUtils2).EliminarVersoesLog("aa" ,"csw", "6.3.8", "6.3.5")
 
 write !
 zwrite ^%CSW1ATUCONF
 
 /*
^%CSW1ATUCONF(6,"csw",1,"CCPV100")="6.3.4^11111^90"
^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
^%CSW1ATUCONF(6,"csw",1,"CCPV180")="6.3.9^11111^90"
^%CSW1ATUCONF(6,"csw",1,"CCPV190")="6.3.10^11111^90"
 */
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TestarImportacaoTipo1">
<Description>

Testar Importacao do Tipo 1 - (Sistema com Tag)

set sc = ##class(Src2.PatchTeste).TestarImportacaoTipo1()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set codTerm = "xx"
 set codAtualizacao = 100
 set tipoPatch = 1
 set sistema = "csw"
 set versaoOrigem = "6.3.5"
 set versao = "6.3.10"
 set revisao = "55555"
 
 kill ^%CSW1ATUCONF
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV010")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV020")="6.3.6^22222^91"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV120")="6.3.6^22222^91"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV030")="6.3.10^55555^92"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV130")="6.3.10^55555^92"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV040")="6.3.11^66666^93"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV140")="6.3.11^66666^93"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV150")="6.3.11^66666^93"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV170")="6.3.11^66666^93"
 
 set sc = ##class(Src2.PatchUtils2).EliminarVersoesLog(codTerm , sistema, versaoOrigem, versao)
 
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV100", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV110", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV120", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV130", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV140", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV150", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV160", versao, revisao)
 write !,sc
 
 write !
 zwrite ^%CSW1ATUCONF
 
 /*
1
1
1
1
Rotina CCPV140 atualizada por versão futura! (Release: 6.3.11)
Rotina CCPV150 atualizada por versão futura! (Release: 6.3.11)
1
^%CSW1ATUCONF(6,"csw",1,"CCPV010")="6.3.4^11111^90"
^%CSW1ATUCONF(6,"csw",1,"CCPV040")="6.3.11^66666^93"
^%CSW1ATUCONF(6,"csw",1,"CCPV140")="6.3.11^66666^93"
^%CSW1ATUCONF(6,"csw",1,"CCPV150")="6.3.11^66666^93"
^%CSW1ATUCONF(6,"csw",1,"CCPV170")="6.3.11^66666^93"
 */
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TestarImportacaoTipo2">
<Description>

Testar Importacao do Tipo 2 - (Sistema com Tag)

set sc = ##class(Src2.PatchTeste).TestarImportacaoTipo2()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set codTerm = "xx"
 set codAtualizacao = 100
 set tipoPatch = 2
 set sistema = "csw"
 set versaoOrigem = "6.3.10"
 set versao = "6.3.10"
 set revisao = "55555"
 
 kill ^%CSW1ATUCONF
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV100")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV120")="6.3.6^22222^91"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV130")="6.3.6^22222^91"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV140")="6.3.10^55555^92"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV150")="6.3.10^55555^92"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV160")="6.3.11^66666^93"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV170")="6.3.11^66666^93"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV180")="6.3.11^66666^93"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV190")="6.3.11^66666^93"
 
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV100", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV120", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV140", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV160", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV180", versao, revisao)
 write !,sc
 
 write !
 zwrite ^%CSW1ATUCONF
 
 /*
1
1
1
1
1
^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
^%CSW1ATUCONF(6,"csw",1,"CCPV130")="6.3.6^22222^91"
^%CSW1ATUCONF(6,"csw",1,"CCPV150")="6.3.10^55555^92"
^%CSW1ATUCONF(6,"csw",1,"CCPV170")="6.3.11^66666^93"
^%CSW1ATUCONF(6,"csw",1,"CCPV190")="6.3.11^66666^93"
 */
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TestarImportacaoTipo3">
<Description>

Testar Importacao do Tipo 3 - (Sistema com Tag)

set sc = ##class(Src2.PatchTeste).TestarImportacaoTipo3()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set codTerm = "xx"
 set codAtualizacao = 100
 set tipoPatch = 3
 set sistema = "csw"
 set versaoOrigem = "6.3.5"
 set versao = "6.3.10"
 set revisao = "55555"
 
 kill ^%CSW1ATUCONF
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV100")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV120")="6.3.6^22222^91"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV130")="6.3.6^22222^91"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV140")="6.3.10^55555^92"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV150")="6.3.10^55555^92"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV160")="6.3.11^66666^93"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV170")="6.3.11^66666^93"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV180")="6.3.11^66666^93"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV190")="6.3.11^66666^93"
 
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV100", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV120", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV140", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV160", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV180", versao, revisao)
 write !,sc
 
 write !
 zwrite ^%CSW1ATUCONF
 
 /*
1
1
1
1
1
^%CSW1ATUCONF(6,"csw",1,"CCPV100")="6.3.10^55555^100^3"
^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
^%CSW1ATUCONF(6,"csw",1,"CCPV120")="6.3.10^55555^100^3"
^%CSW1ATUCONF(6,"csw",1,"CCPV130")="6.3.6^22222^91"
^%CSW1ATUCONF(6,"csw",1,"CCPV140")="6.3.10^55555^100^3"
^%CSW1ATUCONF(6,"csw",1,"CCPV150")="6.3.10^55555^92"
^%CSW1ATUCONF(6,"csw",1,"CCPV160")="6.3.10^55555^100^3"
^%CSW1ATUCONF(6,"csw",1,"CCPV170")="6.3.11^66666^93"
^%CSW1ATUCONF(6,"csw",1,"CCPV180")="6.3.10^55555^100^3"
^%CSW1ATUCONF(6,"csw",1,"CCPV190")="6.3.11^66666^93"
 */
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TestarImportacaoTipo4ComTag">
<Description>

Testar Importacao do Tipo 4 - (Sistema com Tag)

set sc = ##class(Src2.PatchTeste).TestarImportacaoTipo4ComTag()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set codTerm = "xx"
 set codAtualizacao = 100
 set tipoPatch = 4
 set sistema = "csw"
 set versaoOrigem = "6.3.5"
 set versao = "6.3.11"
 set revisao = "66666"
 
 kill ^%CSW1ATUCONF
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV100")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV120")="6.3.6^22222^91"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV130")="6.3.6^22222^91"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV140")="6.3.10^33333^92"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV150")="6.3.10^33333^92"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV160")="6.3.11^44444^93"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV170")="6.3.11^55555^94"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV180")="6.3.11^66666^95"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV190")="6.3.11^77777^96"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV200")="6.3.11^88888^97"
 
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV100", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV120", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV140", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV160", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV170", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV180", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV190", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV210", versao, revisao)
 write !,sc
 
 write !
 zwrite ^%CSW1ATUCONF
 
 /*
1
1
1
1
1
1
Rotina CCPV190 atualizada por versão futura! (Release: 6.3.11 Revisão: 77777)
1
^%CSW1ATUCONF(6,"csw",1,"CCPV100")="6.3.11^66666^100^4"
^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
^%CSW1ATUCONF(6,"csw",1,"CCPV120")="6.3.11^66666^100^4"
^%CSW1ATUCONF(6,"csw",1,"CCPV130")="6.3.6^22222^91"
^%CSW1ATUCONF(6,"csw",1,"CCPV140")="6.3.11^66666^100^4"
^%CSW1ATUCONF(6,"csw",1,"CCPV150")="6.3.10^33333^92"
^%CSW1ATUCONF(6,"csw",1,"CCPV160")="6.3.11^66666^100^4"
^%CSW1ATUCONF(6,"csw",1,"CCPV170")="6.3.11^66666^100^4"
^%CSW1ATUCONF(6,"csw",1,"CCPV180")="6.3.11^66666^100^4"
^%CSW1ATUCONF(6,"csw",1,"CCPV190")="6.3.11^77777^96"
^%CSW1ATUCONF(6,"csw",1,"CCPV200")="6.3.11^88888^97"
^%CSW1ATUCONF(6,"csw",1,"CCPV210")="6.3.11^66666^100^4"
 */
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TestarImportacaoTipo4SemTag">
<Description>

Testar Importacao do Tipo 4 - (Sistema sem Tag)

set sc = ##class(Src2.PatchTeste).TestarImportacaoTipo4SemTag()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set codTerm = "xx"
 set codAtualizacao = 100
 set tipoPatch = 4
 set sistema = "custinter"
 set versao = "6.3"
 set revisao = "44444"
 
 kill ^%CSW1ATUCONF
 set ^%CSW1ATUCONF(6,"custinter",1,"CIDAPV100")="6.2^11111^90"
 set ^%CSW1ATUCONF(6,"custinter",1,"CIDAPV110")="6.2^11111^90"
 set ^%CSW1ATUCONF(6,"custinter",1,"CIDAPV120")="6.2^66666^91"
 set ^%CSW1ATUCONF(6,"custinter",1,"CIDAPV130")="6.2^66666^91"
 set ^%CSW1ATUCONF(6,"custinter",1,"CIDAPV140")="6.3^33333^92"
 set ^%CSW1ATUCONF(6,"custinter",1,"CIDAPV150")="6.3^33333^92"
 set ^%CSW1ATUCONF(6,"custinter",1,"CIDAPV160")="6.3^44444^93"
 set ^%CSW1ATUCONF(6,"custinter",1,"CIDAPV170")="6.3^44444^93"
 set ^%CSW1ATUCONF(6,"custinter",1,"CIDAPV180")="6.3^55555^94"
 set ^%CSW1ATUCONF(6,"custinter",1,"CIDAPV190")="6.3^55555^94"
 
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CIDAPV100", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CIDAPV120", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CIDAPV140", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CIDAPV160", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CIDAPV180", versao, revisao)
 write !,sc
 
 write !
 zwrite ^%CSW1ATUCONF
 
 /*
1
1
1
1
Rotina CIDAPV180 atualizada por versão futura! (Release: 6.3 Revisão: 55555)
^%CSW1ATUCONF(6,"custinter",1,"CIDAPV100")="6.3^44444^100^4"
^%CSW1ATUCONF(6,"custinter",1,"CIDAPV110")="6.2^11111^90"
^%CSW1ATUCONF(6,"custinter",1,"CIDAPV120")="6.3^44444^100^4"
^%CSW1ATUCONF(6,"custinter",1,"CIDAPV130")="6.2^66666^91"
^%CSW1ATUCONF(6,"custinter",1,"CIDAPV140")="6.3^44444^100^4"
^%CSW1ATUCONF(6,"custinter",1,"CIDAPV150")="6.3^33333^92"
^%CSW1ATUCONF(6,"custinter",1,"CIDAPV160")="6.3^44444^100^4"
^%CSW1ATUCONF(6,"custinter",1,"CIDAPV170")="6.3^44444^93"
^%CSW1ATUCONF(6,"custinter",1,"CIDAPV180")="6.3^55555^94"
^%CSW1ATUCONF(6,"custinter",1,"CIDAPV190")="6.3^55555^94"
 */
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TestarImportacaoTipo5">
<Description>

Testar Importacao do Tipo 5 - (Sistema com Tag)

set sc = ##class(Src2.PatchTeste).TestarImportacaoTipo5()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set codTerm = "xx"
 set codAtualizacao = 100
 set tipoPatch = 5
 set sistema = "csw"
 set versaoOrigem = "6.3.5"
 set versao = "6.3.11"
 set revisao = "66666"
 
 kill ^%CSW1ATUCONF
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV100")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV120")="6.3.6^22222^91"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV130")="6.3.6^22222^91"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV140")="6.3.10^33333^92"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV150")="6.3.10^33333^92"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV160")="6.3.11^44444^93"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV170")="6.3.11^55555^94"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV180")="6.3.11^66666^95"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV190")="6.3.11^77777^96"
 set ^%CSW1ATUCONF(6,"csw",1,"CCPV200")="6.3.11^88888^97"
 
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV100", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV120", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV140", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV160", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV170", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV180", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV190", versao, revisao)
 write !,sc
 set sc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, "CCPV210", versao, revisao)
 write !,sc
 
 write !
 zwrite ^%CSW1ATUCONF
 
 /*
1
1
1
1
1
1
Rotina CCPV190 atualizada por versão futura! (Release: 6.3.11 Revisão: 77777)
1
^%CSW1ATUCONF(6,"csw",1,"CCPV100")="6.3.11^66666^100^5"
^%CSW1ATUCONF(6,"csw",1,"CCPV110")="6.3.4^11111^90"
^%CSW1ATUCONF(6,"csw",1,"CCPV120")="6.3.11^66666^100^5"
^%CSW1ATUCONF(6,"csw",1,"CCPV130")="6.3.6^22222^91"
^%CSW1ATUCONF(6,"csw",1,"CCPV140")="6.3.11^66666^100^5"
^%CSW1ATUCONF(6,"csw",1,"CCPV150")="6.3.10^33333^92"
^%CSW1ATUCONF(6,"csw",1,"CCPV160")="6.3.11^66666^100^5"
^%CSW1ATUCONF(6,"csw",1,"CCPV170")="6.3.11^66666^100^5"
^%CSW1ATUCONF(6,"csw",1,"CCPV180")="6.3.11^66666^100^5"
^%CSW1ATUCONF(6,"csw",1,"CCPV190")="6.3.11^77777^96"
^%CSW1ATUCONF(6,"csw",1,"CCPV200")="6.3.11^88888^97"
^%CSW1ATUCONF(6,"csw",1,"CCPV210")="6.3.11^66666^100^5"
 */
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TestarPreRequisitosImportacao">
<Description>

Testar Pre-Requisitos Importacao

set sc = ##class(Src2.PatchTeste).TestarPreRequisitosImportacao()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill ^%CSW1ATUCONF
 set ^%CSW1ATUCONF(3,"cswutil") = "6.3.5"
 
 set strPreRequisitos = "cswutil,6.3.6"
 set sc = ##class(Src2.PatchUtils2).ValidarPreRequisitosImportacao(strPreRequisitos)
 write !,"=>",##class(Src2.Utils).ObterMensagemStatusCode(sc)
 
 set strPreRequisitos = "cswutil,6.3.5"
 set sc = ##class(Src2.PatchUtils2).ValidarPreRequisitosImportacao(strPreRequisitos)
 write !,"=>",##class(Src2.Utils).ObterMensagemStatusCode(sc)
 
 set strPreRequisitos = "cswutil,6.3.4"
 set sc = ##class(Src2.PatchUtils2).ValidarPreRequisitosImportacao(strPreRequisitos)
 write !,"=>",##class(Src2.Utils).ObterMensagemStatusCode(sc)
 
 set strPreRequisitos = "cswutil,6.3.4;customax,6.2.2;gatilho,6.3.8"
 set sc = ##class(Src2.PatchUtils2).ValidarPreRequisitosImportacao(strPreRequisitos)
 write !,"=>",##class(Src2.Utils).ObterMensagemStatusCode(sc)
 
 /*
=>O sistema 'cswutil' na versão 6.3.6 é pré-requisito para esta atualização!
=>
=>
=>O sistema 'customax' na versão 6.2.2 é pré-requisito para esta atualização!
 */
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.PatchUtils">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="ObterIdPatch">
<Description>

Obter Id Patch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,codConta:%String,tipoPatch:%String,horolog:%String,barra:%String,versaoRef:%String,&idPatch:%String,&caminhoPatch:%String,&arquivoXmlPatch:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set idPatch = "PATCH-"_$zconvert(codConta_"-"_$translate($zdatetime(horolog,3),": ","--")_"-"_sistema_"-T"_tipoPatch_"-"_$translate(versaoRef,".","-"),"U")
 
 set arquivoXmlPatch = caminhoPatch_barra_idPatch_".xml"
 set caminhoPatch = caminhoPatch_barra_idPatch
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfPatchTipo1">
<Description>

Obter Informações Patch Tipo 1
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,versaoOrigemInf:%String,versaoReferenciaInf:%String,repositorio:%String,flgTag:%Boolean,&repositorioOrig:%String,&repositorioRef:%String,&versaoReleaseOrigem:%String,&versaoReleaseRef:%String,autenticacao:%String="",&tabVersoes:%String="",&tabSistemas:%String,tabStrVersoesPreReq:%String,force:%Boolean=0,&flgRetorno:%Boolean,&tabTags:%Boolean,repositorioBranche:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabVersoes, tabStrVersoesPreReq, tabTags
 
 set (repositorioOrig, repositorioRef, versaoReleaseOrigem, versaoReleaseRef, tabStrVersoesPreReq, repositorioBranche) = ""
 set flgRetorno = 0
 
 if (flgTag '= 1) quit $$$ERROR(10000,"Sistema não possui atualização por tag!")
 
 if (versaoOrigemInf = "") quit $$$ERROR(10000,"Versão origem não informada!")
 
 set sc = ##class(Src2.Utils2).ObterVersao(versaoOrigemInf, .versaoOrigem, .versaoReleaseOrigem)
 
 set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versaoOrigem, .tabTags, .versaoReleaseUltima)
 
 if (versaoOrigem '= "") , ($piece($get(tabSistemas(sistema,3,versaoOrigem)),"^",1) '= "") {
   set versaoReleaseUltima = $piece($get(tabSistemas(sistema,3,versaoOrigem)),"^",1)
 }
 
 if ('$data(tabTags(versaoReleaseOrigem))) quit $$$ERROR(10000,"Versão origem informada "_versaoOrigemInf_" não encontrada ou inválida!")
 
 if (versaoReferenciaInf = "") {
   set versaoReleaseRef = versaoReleaseUltima
   if (##class(Src2.Utils2).CompararVersao(versaoReleaseRef, "'>", versaoReleaseOrigem)) {
     quit $$$ERROR(10000,"Produto "_sistema_" já está atualizado com a última versão!")
   }
 }
 
 if (versaoReferenciaInf '= "") {
   set sc = ##class(Src2.Utils2).ObterVersao(versaoReferenciaInf, , .versaoReleaseRef)
   if ('$data(tabTags(versaoReleaseRef))) {
     quit $$$ERROR(10000,"Versão destino informada "_versaoReferenciaInf_" não encontrada!")
   }
   if (versaoReleaseRef = versaoReleaseOrigem) quit $$$ERROR(10000,"Versão destino igual a versão origem!")
 }
 
 if ('$data(tabTags(versaoReleaseRef))) {
   quit $$$ERROR(10000,"Versão destino "_versaoReleaseRef_" inválida!")
 }
 
 set repositorioOrig = ##class(Src2.PatchUtils).ObterTag(repositorio, versaoReleaseOrigem)
 set repositorioRef = ##class(Src2.PatchUtils).ObterTag(repositorio, versaoReleaseRef)
 set repositorioBranche = ##class(Src2.PatchUtils).ObterBranchTrunk(repositorio, versaoOrigem)
 
 set sc = ##class(Src2.PatchUtils).ObterVersoesIntervalo(.tabTags, versaoReleaseOrigem, versaoReleaseRef, .tabVersoes, , .flgRetorno)
 
 set sc = ##class(Src2.PatchUtils2).ValidarVersaoBloqueada(sistema, .tabSistemas, .tabVersoes, force)
 if $$$ISERR(sc) quit sc
 
 if ('flgRetorno) {
   set sc = ##class(Src2.PatchUtils2).ObterVersoesPreRequisitos(sistema, .tabSistemas, .tabVersoes, .tabStrVersoesPreReq)
   if $$$ISERR(sc) quit sc
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfPatchTipo2">
<Description>

Obter Informações Patch Tipo 2
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,versaoOrigemInf:%String,versaoReferenciaInf:%String,repositorio:%String,flgTag:%Boolean,&strTabGrupoItens:%String,flgMenuBase:%Boolean,&repositorioRef:%String,&versaoReleaseOrigem:%String,&versaoReleaseRef:%String,autenticacao:%String="",&tabTags:%Boolean,repositorioBranche:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (repositorioRef, versaoReleaseOrigem, versaoReleaseRef, repositorioBranche) = ""
 
 if (flgTag '= 1) quit $$$ERROR(10000,"Sistema não possui atualização por tag!")
 
 if (versaoOrigemInf = "") quit $$$ERROR(10000,"Versão origem não informada!")
 
 if (versaoReferenciaInf = "") quit $$$ERROR(10000,"Versão de referência não informada!")
 
 set sc = ##class(Src2.Utils2).ObterVersao(versaoOrigemInf, .versaoOrigem, .versaoReleaseOrigem)
 
 set sc = ##class(Src2.Utils2).ObterVersao(versaoReferenciaInf, , .versaoReleaseRef)
 
 if (versaoReleaseRef '= versaoReleaseOrigem) quit $$$ERROR(10000,"Versão de referência não pode ser diferente da versão origem para este tipo de patch!")
 
 set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versaoOrigem, .tabTags)
 
 if ('$data(tabTags(versaoReleaseOrigem))) quit $$$ERROR(10000,"Versão origem informada "_versaoOrigemInf_" não encontrada!")
 
 if ('flgMenuBase) & ($order(strTabGrupoItens("")) = "") quit $$$ERROR(10000,"Grupos de itens ou envio de menu/base não definidos!")
 
 set versaoReleaseRef = versaoReleaseOrigem
 set repositorioRef = ##class(Src2.PatchUtils).ObterTag(repositorio, versaoReleaseRef)
 set repositorioBranche = ##class(Src2.PatchUtils).ObterBranchTrunk(repositorio, versaoOrigem)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfPatchTipo3">
<Description>

Obter Informações Patch Tipo 3
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,versaoOrigemInf:%String,versaoReferenciaInf:%String,repositorio:%String,flgTag:%Boolean,&strTabGrupoItens:%String,flgMenuBase:%Boolean,&repositorioRef:%String,&versaoReleaseOrigem:%String,&versaoReleaseRef:%String,autenticacao:%String="",&tabTags:%Boolean,repositorioBranche:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (repositorioRef, versaoReleaseOrigem, versaoReleaseRef, repositorioBranche) = ""
 
 if (flgTag '= 1) quit $$$ERROR(10000,"Sistema não possui atualização por tag!")
 
 if (versaoOrigemInf = "") quit $$$ERROR(10000,"Versão origem não informada!")
 
 set sc = ##class(Src2.Utils2).ObterVersao(versaoOrigemInf, .versaoOrigem, .versaoReleaseOrigem)
 
 set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versaoOrigem, .tabTags)
 
 if ('$data(tabTags(versaoReleaseOrigem))) quit $$$ERROR(10000,"Versão origem informada "_versaoOrigemInf_" não encontrada!")
 
 if ('flgMenuBase) & ($order(strTabGrupoItens("")) = "") quit $$$ERROR(10000,"Grupos de itens ou envio de menu/base não definidos!")
 
 if (versaoReferenciaInf = "") quit $$$ERROR(10000,"Versão destino não informada!")
 
 set sc = ##class(Src2.Utils2).ObterVersao(versaoReferenciaInf, , .versaoReleaseRef)
 if ('$data(tabTags(versaoReleaseRef))) quit $$$ERROR(10000,"Versão destino informada "_versaoReferenciaInf_" não encontrada!")
 
 if (versaoReleaseRef = versaoReleaseOrigem) quit $$$ERROR(10000,"Versão de referência não pode ser igual a versão origem para este tipo de patch!")
 
 set repositorioRef = ##class(Src2.PatchUtils).ObterTag(repositorio, versaoReleaseRef)
 set repositorioBranche = ##class(Src2.PatchUtils).ObterBranchTrunk(repositorio, versaoOrigem)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfPatchTipo4">
<Description>

Obter Informações Patch Tipo 4
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,versaoReferenciaInf:%String,repositorio:%String,flgTag:%Boolean,&strTabGrupoItens:%String,flgMenuBase:%Boolean,&repositorioRef:%String,&versaoReleaseRef:%String,&versaoReleaseAfetada:%String,autenticacao:%String="",&tabTags:%Boolean,repositorioBranche:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (repositorioRef, versaoReleaseRef, versaoReleaseAfetada, repositorioBranche) = ""
 
 set sc = ##class(Src2.Utils2).ObterVersao(versaoReferenciaInf, .versaoReferencia)
 
 set sc = ##class(Src2.PatchUtils).ObterVersoesRepositorio(repositorio, .tabVersoes, autenticacao)
 
 if ('$data(tabVersoes(versaoReferencia))) quit $$$ERROR(10000,"Versão de referência informada "_versaoReferenciaInf_" não encontrada!")
 
 set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versaoReferencia, .tabTags)
 
 if (flgTag) {
   set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versaoReferencia, , , autenticacao, .versaoReleaseAfetada)
   if $$$ISERR(sc) quit $$$ERROR(10000,"Não foi possível identificar a versão afetada para a geração do patch!")
 }
 
 if (versaoReleaseAfetada '= "") set tabTags(versaoReleaseAfetada) = ""
 
 if ('flgMenuBase) & ($order(strTabGrupoItens("")) = "") quit $$$ERROR(10000,"Grupos de itens ou envio de menu/base não definidos!")
 
 set versaoReleaseRef = versaoReferencia
 set repositorioRef = ##class(Src2.PatchUtils).ObterBranchTrunk(repositorio, versaoReferencia)
 set repositorioBranche = repositorioRef
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfPatchTipo5">
<Description>

Obter Informações Patch Tipo 5
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,versaoReferenciaInf:%String,revisaoInf:%String,repositorio:%String,flgTag:%Boolean,repositorioOrig:%String,&repositorioRef:%String,&revisaoRef:%String,&versaoReleaseOrigem:%String,&versaoReleaseRef:%String,&versaoReleaseAfetada:%String,autenticacao:%String="",&tabVersoes:%String,&tabSistemas:%String,tabStrVersoesPreReq:%String,repositorioBranche:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabVersoes, tabStrVersoesPreReq
 
 set (repositorioOrig, repositorioRef, revisaoRef, versaoReleaseOrigem, versaoReleaseRef, versaoReleaseAfetada, tabStrVersoesPreReq, repositorioBranche) = ""
 
 if (flgTag '= 1) quit $$$ERROR(10000,"Sistema não possui atualização por tag!")
 
 set sc = ##class(Src2.Utils2).ObterVersao(versaoReferenciaInf, .versaoReferencia)
 
 set sc = ##class(Src2.PatchUtils).ObterVersoesRepositorio(repositorio, .tabVersoes2, autenticacao)
 
 if ('$data(tabVersoes2(versaoReferencia))) quit $$$ERROR(10000,"Versão de referência informada "_versaoReferenciaInf_" não encontrada!")
 
 set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versaoReferencia, , .versaoReleaseUltima, autenticacao, .versaoReleaseAfetada)
 if $$$ISERR(sc) quit $$$ERROR(10000,"Não foi possível identificar a versão afetada para a geração do patch!")
 
 set versaoReleaseOrigem = versaoReleaseUltima
 set versaoReleaseRef = versaoReferencia
 
 set repositorioOrig = ##class(Src2.PatchUtils).ObterTag(repositorio, versaoReleaseUltima)
 set repositorioRef = ##class(Src2.PatchUtils).ObterBranchTrunk(repositorio, versaoReferencia)
 set revisaoRef = revisaoInf
 set repositorioBranche = repositorioRef
 
 set sc = ##class(Src2.Utils2).ObterDadosUltimaRevisao(repositorioOrig, , 1, , , autenticacao, .revisao)
 if $$$ISERR(sc) quit sc
 
 if (revisaoInf '= "") & (revisaoInf '= "head") & (revisaoInf '> revisao) {
   quit $$$ERROR(10000,"A revisão informada "_revisaoInf_" deve ser maior que a revisão do release "_versaoReleaseUltima_"!")
 }
 
 if (versaoReleaseAfetada '= "") {
   set tabVersoes(versaoReleaseAfetada) = ""
 }
 
 set sc = ##class(Src2.PatchUtils2).ObterVersoesPreRequisitos(sistema, .tabSistemas, .tabVersoes, .tabStrVersoesPreReq)
 if $$$ISERR(sc) quit sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfPatchTipo6">
<Description>

Obter Informações Patch Tipo 6
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,versaoReferenciaInf:%String,repositorio:%String,flgTag:%Boolean,&repositorioRef:%String,&versaoReleaseRef:%String,autenticacao:%String="",&tabTags:%Boolean,repositorioBranche:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (repositorioRef, versaoReleaseRef, repositorioBranche) = ""
 
 if (flgTag '= 1) quit $$$ERROR(10000,"Sistema não possui atualização por tag!")
 
 if (versaoReferenciaInf = "") quit $$$ERROR(10000,"Versão destino não informada!")
 
 set sc = ##class(Src2.Utils2).ObterVersao(versaoReferenciaInf, .versaoRef, .versaoReleaseRef)
 
 set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versaoRef, .tabTags)
 
 if ('$data(tabTags(versaoReleaseRef))) quit $$$ERROR(10000,"Versão destino informada "_versaoReferenciaInf_" não encontrada!")
 
 set repositorioRef = ##class(Src2.PatchUtils).ObterTag(repositorio, versaoReleaseRef)
 set repositorioBranche = ##class(Src2.PatchUtils).ObterBranchTrunk(repositorio, versaoRef)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfPatchTipo7">
<Description>

Obter Informações Patch Tipo 7
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,versaoReferenciaInf:%String,repositorio:%String,flgTag:%Boolean,&strTabGrupoItens:%String,flgMenuBase:%Boolean,&repositorioRef:%String,&versaoReleaseRef:%String,&versaoReleaseAfetada:%String,autenticacao:%String="",repositorioBranche:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (repositorioRef, versaoReleaseRef, versaoReleaseAfetada, repositorioBranche) = ""
 
 set sc = ##class(Src2.Utils2).ObterVersao(versaoReferenciaInf, .versaoReferencia)
 
 set sc = ##class(Src2.PatchUtils).ObterVersoesRepositorio(repositorio, .tabVersoes, autenticacao)
 
 if ('$data(tabVersoes(versaoReferencia))) quit $$$ERROR(10000,"Versão de referência informada "_versaoReferenciaInf_" não encontrada!")
 
 if (flgTag) {
   set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versaoReferencia, , , autenticacao, .versaoReleaseAfetada)
   if $$$ISERR(sc) quit $$$ERROR(10000,"Não foi possível identificar a versão afetada para a geração do patch!")
 }
 
 if ('flgMenuBase) & ($order(strTabGrupoItens("")) = "") quit $$$ERROR(10000,"Grupos de itens ou envio de menu/base não definidos!")
 
 set versaoReleaseRef = versaoReferencia
 set repositorioRef = ##class(Src2.PatchUtils).ObterBranchTrunk(repositorio, versaoReferencia)
 set repositorioBranche = repositorioRef
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterBranchTrunk">
<Description>

Obtem o Endereço de uma Branch ou Trunk

write ##class(Src2.PatchUtils).ObterBranchTrunk("http://192.168.15.10:18080/svn/csw", "6.3")
write ##class(Src2.PatchUtils).ObterBranchTrunk("http://192.168.15.10:18080/svn/csw", "6.4")
write ##class(Src2.PatchUtils).ObterBranchTrunk("http://192.168.15.10:18080/svn/csw", "6.5")
write ##class(Src2.PatchUtils).ObterBranchTrunk("http://192.168.15.10:18080/svn/gercon", "1.0")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>repositorio:%String,versao:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set endereco = repositorio_"/branches/"_versao
 
 set sc = ##class(Src2.PatchUtils).ObterVersaoTrunk(repositorio, .versaoTrunk)
 
 if (versaoTrunk '= "") & (versao = versaoTrunk) {
   set endereco = repositorio_"/trunk"
 }
 
 quit endereco
]]></Implementation>
</Method>

<Method name="ObterVersaoTrunk">
<Description>

Obtem Versão Trunk

set sc=##class(Src2.PatchUtils).ObterVersaoTrunk("http://192.168.15.10:18080/svn/csw", .versao)
set sc=##class(Src2.PatchUtils).ObterVersaoTrunk("http://192.168.15.10:18080/svn/customax", .versao)
set sc=##class(Src2.PatchUtils).ObterVersaoTrunk("http://192.168.15.10:18080/svn/csw", .versao)
set sc=##class(Src2.PatchUtils).ObterVersaoTrunk("http://192.168.15.10:18080/svn/gercon", .versao)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>repositorio:%String,versao:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set versao = ""
 
 set tabTrunk("http://192.168.15.10:18080/svn/csw") = "6.6"
 set tabTrunk("http://192.168.15.10:18080/svn/cswutil") = "6.6"
 set tabTrunk("http://192.168.15.10:18080/svn/gercon") = "1.0"
 
 if ('$data(tabTrunk(repositorio))) {
   quit $$$ERROR(10000,"Trunk do repositório '"_repositorio_"' sem versão definida!")
 }
 
 set versao = $get(tabTrunk(repositorio))
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTag">
<Description>

Obtem o Endereço de uma Tag

write ##class(Src2.PatchUtils).ObterTag("http://192.168.15.10:18080/svn/csw", "6.3.2")
write ##class(Src2.PatchUtils).ObterTag("http://192.168.15.10:18080/svn/csw", "6.5.2b2")
write ##class(Src2.PatchUtils).ObterTag("http://192.168.15.10:18080/svn/csw", "6.6.4b6.+")
write ##class(Src2.PatchUtils).ObterTag("http://192.168.15.10:18080/svn/csw", "6.3.55.+")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>repositorio:%String,versaoReleaseInf:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils2).ObterVersao(versaoReleaseInf, .versao, .versaoRelease)
 
 quit repositorio_"/tags/"_versao_"/"_versaoRelease
]]></Implementation>
</Method>

<Method name="ObterVersaoProdutoConta">
<Description>

Obter Versao Produto Conta

set sc = ##class(Src2.PatchUtils).ObterVersaoProdutoConta("csw", "CO", .versaoRelease)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sistema:%String,codConta:%String,versaoRelease:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set versaoRelease = ""
 
 set sc = ##class(Src2.UtilsXml).ObterAtualizacaoXML(.tabSistemas)
 
 if ('$data(tabSistemas(sistema))) quit $$$OK
 
 set sc = $$ObterVersaoCliPro^CCGERRG011(codConta, sistema, .versaoRelease)
 
 if (versaoRelease = "") quit $$$ERROR(10000,"Sistema '"_sistema_"' sem versão definida para a conta "_codConta_"!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterPatchs">
<Description>

Retorma uma Tabela de Patchs Gerados por Conta

set sc = ##class(Src2.PatchUtils).ObterPatchs("CC", .tabPatchs)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[conta:%String="",&tabPatchs:%List]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.UtilsXml).ObterAtualizacaoXML(, .caminhoPatch)
 if $$$ISERR(sc) quit sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 kill tabPatchs
 
 set idPatch = ""
 for {
   set idPatch = $order(^mtempSrc2PatchGeracao(idPatch))
   if (idPatch = "") quit
   set var = $get(^mtempSrc2PatchGeracao(idPatch))
   
   if ($piece(idPatch,"-",1) '= "PATCH") continue
   if (conta '= "") , ($piece(var,"^",8) '= conta) continue
   
   set tabPatchs(idPatch) = 0
   set tabPatchs(idPatch,1,"sistema") = $piece(var,"^",1)
   set tabPatchs(idPatch,1,"dsSistema") = $piece(var,"^",5)
   set tabPatchs(idPatch,1,"tipo") = $piece(var,"^",2)
   set tabPatchs(idPatch,1,"versaoOrigemRef") = $piece(var,"^",3)
   set tabPatchs(idPatch,1,"versaoFontesPatch") = $piece(var,"^",4)
   set tabPatchs(idPatch,1,"tipoDocumento") = $piece(var,"^",6)
   set tabPatchs(idPatch,1,"documento") = $piece(var,"^",7)
   set tabPatchs(idPatch,1,"conta") = $piece(var,"^",8)
   set tabPatchs(idPatch,1,"revisao") = $piece(var,"^",10)
 }
 
 set rs = ##class(%ResultSet).%New("%File:FileSet") 
 do rs.Execute(caminhoPatch)
 while rs.Next() {
   set caminhoPasta = rs.Get("Name")
   set type = rs.Get("Type")
   
   if (type '= "D") continue
   
   set idPatch = $piece(caminhoPasta,barra,$length(caminhoPasta,barra))
   
   if (idPatch = "") continue
   
   if ($piece(idPatch,"-",1) '= "PATCH") continue
   if (conta '= "") , ($piece(idPatch,"-",2) '= conta) continue
   
   if ($data(^mtempSrc2PatchGeracao(idPatch))) continue
   
   set caminhoPatchXml = caminhoPatch_barra_idPatch_".xml"
   
   set sc = ##class(Src2.Patch).ObterDadosPatch(caminhoPatchXml, .tabInfoPatch)
   if $$$ISERR(sc) continue
   
   if (conta '= "") , ($get(tabInfoPatch("conta")) '= conta) continue
   
   set tabPatchs(idPatch) = 1
   merge tabPatchs(idPatch,1) = tabInfoPatch
 }
 do rs.%Close()
 set rs = ""
 
 set sc = ##class(Src2.PatchUtils).ObterTabTiposPatchs(.tabTiposPatch)
 
 set sc = ##class(Src2.PatchUtils).ObterTabTiposDocumentos(.tabTiposDoc)
 
 set idPatch = ""
 for {
   set idPatch = $order(tabPatchs(idPatch))
   if (idPatch = "") quit
   
   set tipoDocumento = $get(tabPatchs(idPatch,1,"tipoDocumento"))
   set documento = $get(tabPatchs(idPatch,1,"documento"))
   set tipoPatch = $get(tabPatchs(idPatch,1,"tipo"))
   
   if (tipoDocumento '= "") & (documento '= "") {
     set tabPatchs(idPatch,1,"dsDocumento") = $get(tabTiposDoc(tipoDocumento))_" "_documento
   }
   
   set tabPatchs(idPatch,1,"dsTipo") = $get(tabTiposPatch(tipoPatch))
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTagsRepositorio">
<Description>

Obter Tags por versão do Repositório

set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio("http://192.168.15.10:18080/svn/csw", "6.1", .tabTags, .versaoReleaseUltima, , .versaoReleaseProxima)
set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio("http://192.168.15.10:18080/svn/csw", "6.3", .tabTags, .versaoReleaseUltima, , .versaoReleaseProxima)
set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio("http://192.168.15.10:18080/svn/customax", "6.3", .tabTags, .versaoReleaseUltima, , .versaoReleaseProxima)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[repositorio:%String,versao:%String,&tabTags:%String,&versaoReleaseUltima:%String,autenticacao:%String="",&versaoReleaseProxima:%String,&versaoReleasePrimeira:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabTags
 
 set (versaoReleasePrimeira, versaoReleaseUltima, versaoReleaseProxima) = ""
 
 if ($get(versao) = "") quit $$$ERROR(10000,"Versão não informada para a busca dos releases!")
 
 set msgsc = ##class(Src2.Utils).ObterConfig(, , .caminhoSvn, .arquivoTemp)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list "_repositorio_"/tags", , , autenticacao, arquivoTemp)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set file = ##class(%File).%New(arquivoTemp)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   set $extract(linhaFile,$length(linhaFile)) = ""
   set sc = ##class(Src2.Utils2).ObterVersao(linhaFile, .versao2)
   set tabVersoes(versao2) = ""
 }
 
 do file.Close()
 set file = ""
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 if ('$data(tabVersoes(versao))) quit $$$ERROR(10000,"Não existem releases para a versão "_versao_"!")
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list "_repositorio_"/tags/"_versao, , , autenticacao, arquivoTemp)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set file = ##class(%File).%New(arquivoTemp)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   set $extract(linhaFile,$length(linhaFile)) = ""
   set sc = ##class(Src2.Utils2).ObterVersao(linhaFile, .versao2, .versaoRelease2)
   if (versao '= versao2) continue
   set tabTags(versaoRelease2) = ""
 }
 
 do file.Close()
 set file = ""
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 set sc = ##class(Src2.PatchUtils).ObterVersoesOrdenadas(.tabTags, , .versaoReleaseUltima, , .versaoReleasePrimeira)
 
 set versaoReleaseProxima = versaoReleaseUltima
 
 if (versaoReleaseProxima '= "") {
   set $piece(versaoReleaseProxima,".",3) = $piece(versaoReleaseProxima,".",3) + 1
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterVersoesOrdenadas">
<Description>

Obter Tabela de Versões Ordenadas

set sc = ##class(Src2.PatchUtils).ObterVersoesOrdenadas(.tabTags, .tabTagsOrdem, .versaoReleaseUltima, .flgRetorno, .versaoReleasePrimeira)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabTags:%String,&tabTagsOrdem:%String,&versaoReleaseUltima:%String,&flgRetorno:%Boolean=0,&versaoReleasePrimeira:%String,flgBeta:%Boolean=1]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabTagsOrdem
 
 set (versaoReleasePrimeira, versaoReleaseUltima) = ""
 
 set ordem = $select(flgRetorno:-1,1:1)
 
 set versaoRelease = ""
 for {
   set versaoRelease = $order(tabTags(versaoRelease))
   if (versaoRelease = "") quit
   set sc = ##class(Src2.Utils2).ObterVersao(versaoRelease, , , , , , .identificador, .flgBeta2)
   if (identificador = "") continue 
   set tabTags2(identificador) = versaoRelease_"^"_flgBeta2
 }
 
 set identificador = ""
 for {
   set identificador = $order(tabTags2(identificador),ordem)
   if (identificador = "") quit
   set var = $get(tabTags2(identificador))
   
   set versaoRelease = $piece(var,"^",1)
   set flgBeta2 = $piece(var,"^",2)
   
   if ('flgBeta) && (flgBeta2) continue
   
   // Atenção: Nunca criar o piece dois nesta tabela 'tabTagsOrdem'. É utilizada em COMBOS.
   set tabTagsOrdem($increment(codSeq)) = versaoRelease
   
   if (versaoReleasePrimeira = "") set versaoReleasePrimeira = versaoRelease
   
   if (flgBeta2) continue
   
   set versaoReleaseUltima = versaoRelease
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterVersoesIntervalo">
<Description>

Obter Versões de um Intervalo

set sc = ##class(Src2.PatchUtils).ObterVersoesIntervalo(, "6.3.2b1", "6.3.6b2", .tabVersoes, .tabVersoesOrdem, .flgRetorno)
set sc = ##class(Src2.PatchUtils).ObterVersoesIntervalo(, "6.3.2b2", "6.3.6", .tabVersoes, .tabVersoesOrdem, .flgRetorno)
set sc = ##class(Src2.PatchUtils).ObterVersoesIntervalo(, "6.3.2", "6.3.6", .tabVersoes, .tabVersoesOrdem, .flgRetorno)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabTags:%String,versaoOrigem:%String,versaoDestino:%String,&tabVersoes:%String,&tabVersoesOrdem:%String,&flgRetorno:%Boolean]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set flgRetorno = 0
 kill tabVersoes, tabVersoesOrdem
 
 if (##class(Src2.Utils2).CompararVersao(versaoOrigem, ">", versaoDestino)) {
   set flgRetorno = 1
 }
 
 set sc = ##class(Src2.PatchUtils).ObterVersoesOrdenadas(.tabTags, .tabTagsOrdem2, , flgRetorno)
 
 set (codSeq, codSeqOrdem, flag) = ""
 for {
   set codSeq = $order(tabTagsOrdem2(codSeq))
   if (codSeq = "") quit
   set versaoRelease = $get(tabTagsOrdem2(codSeq))
   if (flag) {
     set tabVersoes(versaoRelease) = ""
     set tabVersoesOrdem($increment(codSeqOrdem)) = versaoRelease
   }
   if (versaoRelease = versaoOrigem) set flag = 1
   if (versaoRelease = versaoDestino) set flag = 0
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterBranchesRepositorio">
<Description>

Obter Branches do Repositório

set sc = ##class(Src2.PatchUtils).ObterBranchesRepositorio("http://192.168.15.10:18080/svn/cswutil", .tabBranches)
set sc = ##class(Src2.PatchUtils).ObterBranchesRepositorio("http://192.168.15.10:18080/svn/custinter", .tabBranches)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[repositorio:%String,&tabBranches:%Boolean,autenticacao:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabBranches
 
 set msgsc = ##class(Src2.Utils).ObterConfig(, , .caminhoSvn, .arquivoTemp)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list "_repositorio_"/branches", , , autenticacao, arquivoTemp)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set file = ##class(%File).%New(arquivoTemp)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   
   set $extract(linhaFile,$length(linhaFile)) = ""
   
   set sc = ##class(Src2.Utils2).ObterVersao(linhaFile, .versao2, .versaoRelease2)
   
   set tabBranches(versaoRelease2) = ""
 }
 
 do file.Close()
 set file = ""
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterVersoesRepositorio">
<Description>

Obter Versões do Repositório

set sc = ##class(Src2.PatchUtils).ObterVersoesRepositorio("http://192.168.15.10:18080/svn/csw", .tabVersoes)
set sc = ##class(Src2.PatchUtils).ObterVersoesRepositorio("http://192.168.15.10:18080/svn/cswutil", .tabVersoes)
set sc = ##class(Src2.PatchUtils).ObterVersoesRepositorio("http://192.168.15.10:18080/svn/custinter", .tabVersoes)
set sc = ##class(Src2.PatchUtils).ObterVersoesRepositorio("http://192.168.15.10:18080/svn/gercon", .tabVersoes)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[repositorio:%String,&tabVersoes:%Boolean,autenticacao:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabVersoes
 
 set sc = ##class(Src2.PatchUtils).ObterBranchesRepositorio(repositorio, .tabVersoes, autenticacao)
 
 set sc = ##class(Src2.PatchUtils).ObterVersaoTrunk(repositorio, .versao)
 
 if (versao '= "") {
   set tabVersoes(versao) = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosSvnDiff">
<Description>

Obter Dados Svn Diff

set sc = ##class(Src2.Patch).ObterDadosSvnDiff("http://repositorios:18080/svn/teste/aproject/tags/1.0.1", "http://repositorios:18080/svn/teste/aproject/tags/1.0.2")
set sc = ##class(Src2.Patch).ObterDadosSvnDiff("http://192.168.15.10:18080/svn/cswutil/tags/6.3.3", "http://192.168.15.10:18080/svn/cswutil/tags/6.3.7")
set sc = ##class(Src2.Patch).ObterDadosSvnDiff("http://192.168.15.10:18080/svn/cswutil/tags/6.3.6", "http://192.168.15.10:18080/svn/cswutil/tags/6.3.7")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[repositorioOrig:%String,repositorioDest:%String,versaoReleaseRef:%String,revisaoDest:%String,&tabRotinasLiberadas:%String,&tabRotinasBloqueadas:%String,&tabClassesLiberadas:%String,&tabClassesBloqueadas:%String,username:%String="",password:%String="",codConta:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "diff --summarize "_repositorioOrig_"@head "_repositorioDest_"@"_revisaoDest, username, password, , arquivoTemp)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set msgsc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp, "diff", , .tabFlags, codConta)
 
 set sc = ##class(Src2.PatchUtils).ObterDadosSvnDiffClasse(codTerm, repositorioOrig, repositorioDest, versaoReleaseRef, revisaoDest, .tabClassesLiberadas, .tabClassesBloqueadas)
 
 set sc = ##class(Src2.PatchUtils).ObterDadosSvnDiffRotina(codTerm, repositorioOrig, repositorioDest, versaoReleaseRef, revisaoDest, .tabRotinasLiberadas, .tabRotinasBloqueadas)
 
 set sc = ##class(Src2.PatchUtils).ObterDadosSvnDiffGen(codTerm, "relatorios", repositorioOrig, repositorioDest, revisaoDest)
 
 if ($data(tabFlags("flgPaginas"))) {
   set ^mtempSrc2Patch(codTerm,"flags","flgPaginas") = ""
   set ^mtempSrc2Patch(codTerm,"dados") = ""
 }
 if ($data(tabFlags("flgDiversos"))) {
   set ^mtempSrc2Patch(codTerm,"flags","flgDiversos") = ""
   set ^mtempSrc2Patch(codTerm,"dados") = ""
 }
 if ($data(tabFlags("flgProcedimentos"))) {
   set ^mtempSrc2Patch(codTerm,"flags","flgProcedimentos") = ""
   set ^mtempSrc2Patch(codTerm,"dados") = ""
 }
 if ($data(tabFlags("flgSerasahttp"))) {
   set ^mtempSrc2Patch(codTerm,"flags","flgSerasahttp") = ""
   set ^mtempSrc2Patch(codTerm,"dados") = ""
 }
 if ($data(tabFlags("flgServerProducao"))) {
   set ^mtempSrc2Patch(codTerm,"flags","flgServerProducao") = ""
   set ^mtempSrc2Patch(codTerm,"dados") = ""
 }
 if ($data(tabFlags("flgMenu"))) {
   set ^mtempSrc2Patch(codTerm,"flags","flgMenu") = ""
   set ^mtempSrc2Patch(codTerm,"dados") = ""
 }
 
 kill ^mtempInfoArquivo(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosSvnDiffClasse">
<Description>

Obter Dados Svn Diff Classe
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,repositorioOrig:%String,repositorioDest:%String,versaoReleaseRef:%String,revisaoDest:%String,&tabClassesLiberadas:%String,&tabClassesBloqueadas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ($order(^mtempInfoArquivo(codTerm,"classes","")) = "") quit $$$OK
 
 set itemId = ""
 for {
   set itemId = $order(^mtempInfoArquivo(codTerm,"classes",itemId))
   if (itemId = "") quit
   set var = $get(^mtempInfoArquivo(codTerm,"classes",itemId))
   
   set msgsc = ##class(Src2.Classe).ObterInfoClasseId(itemId, .classe, .pasta, , .package)
   if (msgsc '= $$$OK) continue
   
   set sc = ##class(Src2.PatchUtils).ValidarClasseLiberada(.tabClassesLiberadas, .tabClassesBloqueadas, classe)
   if (sc '= 1) {
     set ^mtempSrc2Patch(codTerm,"classes",3,classe) = ""
     set ^mtempSrc2Patch(codTerm,"classes",3) = $increment(^mtempSrc2Patch(codTerm,"classes",3))
     continue
   }
   
   if ($piece(var,"^",1) = 2) {
     set ^mtempSrc2Patch(codTerm,"classes",2,classe) = ""
     set ^mtempSrc2Patch(codTerm,"classes",2) = $increment(^mtempSrc2Patch(codTerm,"classes",2))
     set ^mtempSrc2Patch(codTerm,"dados") = ""
     continue
   }
   
   if ($piece(var,"^",1) = 1) {
     set itemRepositorio = repositorioDest_$piece($piece(var,"^",2),repositorioOrig,2)_"@"_revisaoDest
     set ^mtempSrc2Patch(codTerm,"classes",1,classe) = itemRepositorio_"^"_pasta_"^"_itemId_"^"_versaoReleaseRef_"^"_revisaoDest_"^0"
     set ^mtempSrc2Patch(codTerm,"classes",1) = $increment(^mtempSrc2Patch(codTerm,"classes",1))
     set ^mtempSrc2Patch(codTerm,"dados") = ""
     if (package '= "") {
       set ^mtempSrc2Patch(codTerm,"classes",4,package) = ""
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosSvnDiffRotina">
<Description>

Obter Dados Svn Diff Rotina
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,repositorioOrig:%String,repositorioDest:%String,versaoReleaseRef:%String,revisaoDest:%String,&tabRotinasLiberadas,&tabRotinasBloqueadas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ($order(^mtempInfoArquivo(codTerm,"rotinas","")) = "") quit $$$OK
 
 set itemId = ""
 for {
   set itemId = $order(^mtempInfoArquivo(codTerm,"rotinas",itemId))
   if (itemId = "") quit
   set var = $get(^mtempInfoArquivo(codTerm,"rotinas",itemId))
   
   set msgsc = ##class(Src2.Rotina).ObterInfoRotinaId(itemId, .rotina, .pasta)
   if (msgsc '= $$$OK) continue
   
   set sc = ##class(Src2.PatchUtils).ValidarRotinaLiberada(.tabRotinasLiberadas, .tabRotinasBloqueadas, rotina)
   if (sc '= 1) {
     set ^mtempSrc2Patch(codTerm,"rotinas",3,rotina) = ""
     set ^mtempSrc2Patch(codTerm,"rotinas",3) = $increment(^mtempSrc2Patch(codTerm,"rotinas",3))
     continue
   }
   
   if ($piece(var,"^",1) = 2) {
     set ^mtempSrc2Patch(codTerm,"rotinas",2,rotina) = ""
     set ^mtempSrc2Patch(codTerm,"rotinas",2) = $increment(^mtempSrc2Patch(codTerm,"rotinas",2))
     set ^mtempSrc2Patch(codTerm,"dados") = ""
     continue
   }
   
   if ($piece(var,"^",1) = 1) {
     set itemRepositorio = repositorioDest_$piece($piece(var,"^",2),repositorioOrig,2)_"@"_revisaoDest
     set ^mtempSrc2Patch(codTerm,"rotinas",1,rotina) = itemRepositorio_"^"_pasta_"^"_itemId_"^"_versaoReleaseRef_"^"_revisaoDest_"^0"
     set ^mtempSrc2Patch(codTerm,"rotinas",1) = $increment(^mtempSrc2Patch(codTerm,"rotinas",1))
     set ^mtempSrc2Patch(codTerm,"dados") = ""
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterRotinasIntAux">
<Description>

Obter Rotinas com Interface Auxiliar
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ($order(^mtempSrc2Patch(codTerm,"rotinas",1,"")) = "") quit $$$OK
 
 set (rotina, rotinaAux) = ""
 for {
   set rotina = $order(^mtempSrc2Patch(codTerm,"rotinas",1,rotina))
   if (rotina = "") quit
   set var = $get(^mtempSrc2Patch(codTerm,"rotinas",1,rotina))
   
   set itemRepositorio = $piece(var,"^",1)
   if (itemRepositorio = "") continue
   
   if ('$data(^mtempSrc2InterfaceAux(codTerm, 2, rotina))) continue
   
   set rotinaPrincipal = $piece($get(^mtempSrc2InterfaceAux(codTerm, 2, rotina)),"^",1)
   
   set rotinaAux = ""
   for {
     set rotinaAux = $order(^mtempSrc2InterfaceAux(codTerm, 1, rotinaPrincipal, rotinaAux))
     if (rotinaAux = "") quit
     
     if ($data(^mtempSrc2Patch(codTerm,"rotinas",1,rotinaAux))) continue
     
     set var2 = var
     set $piece(var2,"^",1) = $piece($piece(var,"^",1),"/"_rotina_".",1)_"/"_rotinaAux_"."_$piece($piece(var,"^",1),"/"_rotina_".",2)
     set $piece(var2,"^",3) = $piece($piece(var,"^",3),"/"_rotina_".",1)_"/"_rotinaAux_"."_$piece($piece(var,"^",3),"/"_rotina_".",2)
     
     set ^mtempSrc2Patch(codTerm,"rotinas",1,rotinaAux) = var2
     set ^mtempSrc2Patch(codTerm,"rotinas",1) = $increment(^mtempSrc2Patch(codTerm,"rotinas",1))
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosSvnDiffGen">
<Description>

Obter Dados Svn Diff Genérico
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,opcao:%String,repositorioOrig:%String,repositorioDest:%String,revisaoDest:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (status, tipo, caminhoItem) = ""
 for {
   set status = $order(^mtempInfoArquivo(codTerm,opcao,status))
   if (status = "") quit
   for {
     set tipo = $order(^mtempInfoArquivo(codTerm,opcao,status,tipo))
     if (tipo = "") quit
     for {
       set caminhoItem = $order(^mtempInfoArquivo(codTerm,opcao,status,tipo,caminhoItem))
       if (caminhoItem = "") quit
       set var = $get(^mtempInfoArquivo(codTerm,opcao,status,tipo,caminhoItem))
       
       set caminhoItemRepos = "'"_repositorioDest_$piece(caminhoItem,repositorioOrig,2)_"'@"_revisaoDest
       
       set status2 = $select(status="A":"importar",status="M":"importar",status="D":"excluir",1:"")
       if (status2 = "") continue
       
       set ^mtempSrc2Patch(codTerm,opcao,status2,tipo,caminhoItemRepos) = var
       set ^mtempSrc2Patch(codTerm,opcao,status2,tipo) = $increment(^mtempSrc2Patch(codTerm,opcao,status2,tipo))
       set ^mtempSrc2Patch(codTerm,"dados") = ""
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosSvnList">
<Description>

Obter Dados Svn List
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[repositorio:%String,versaoReleaseRef:%String,revisao:%String="head",sistema:%String,tipoPatch:%String,tabGrupoItens:%String="",&tabRotinasLiberadas:%String,&tabRotinasBloqueadas:%String,&tabClassesLiberadas:%String,&tabClassesBloqueadas:%String,username:%String="",password:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 if (revisao = "") set revisao = "head"
 
 set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list "_repositorio_" --revision "_revisao_" -R", , , autenticacao, arquivoTemp)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set sc = ##class(Src2.Utils).ObterDadosArquivoSvnList(codTerm, arquivoTemp, repositorio)
 
 set itemId = ""
 for {
   set itemId = $order(^mtempInfoArquivo(codTerm,"classes",itemId))
   if (itemId = "") quit
   set var = $get(^mtempInfoArquivo(codTerm,"classes",itemId))
   
   set msgsc = ##class(Src2.Classe).ObterInfoClasseId(itemId, .classe, .pasta, , .package)
   if (msgsc '= $$$OK) continue
   
   set itemRepositorio = $piece(var,"^",4)
   set InternalName = $piece(var,"^",5)
   set item = $piece(var,"^",6)
   
   if (tipoPatch '= 6) {
     set sc = ##class(Src2.Item).ValidarSelecaoGrupoItens(.tabGrupoItens, InternalName)
     if (sc '= 1) continue
   }
   
   set sc = ##class(Src2.PatchUtils).ValidarClasseLiberada(.tabClassesLiberadas, .tabClassesBloqueadas, classe)
   if (sc '= 1) {
     set ^mtempSrc2Patch(codTerm,"classes",3,classe) = ""
     set ^mtempSrc2Patch(codTerm,"classes",3) = $increment(^mtempSrc2Patch(codTerm,"classes",3))
     continue
   }
   
   set var2 = ""
   set $piece(var2,"^",1) = itemRepositorio_"@"_revisao_"^"_pasta
   set $piece(var2,"^",2) = pasta
   set $piece(var2,"^",3) = itemId
   set $piece(var2,"^",4) = versaoReleaseRef
   set $piece(var2,"^",5) = revisao
   set $piece(var2,"^",6) = 0
   set ^mtempSrc2Patch(codTerm,"classes",1,classe) = var2
   
   set ^mtempSrc2Patch(codTerm,"classes",1) = $increment(^mtempSrc2Patch(codTerm,"classes",1))
   set ^mtempSrc2Patch(codTerm,"dados") = ""
   if (package '= "") {
     set ^mtempSrc2Patch(codTerm,"classes",4,package) = ""
   }
 }
 
 set itemId = ""
 for {
   set itemId = $order(^mtempInfoArquivo(codTerm,"rotinas",itemId))
   if (itemId = "") quit
   set var = $get(^mtempInfoArquivo(codTerm,"rotinas",itemId))
   
   set msgsc = ##class(Src2.Rotina).ObterInfoRotinaId(itemId, .rotina, .pasta)
   if (msgsc '= $$$OK) continue
   
   set itemRepositorio = $piece(var,"^",4)
   set InternalName = $piece(var,"^",5)
   set item = $piece(var,"^",6)
   
   if (tipoPatch '= 6) {
     set sc = ##class(Src2.Item).ValidarSelecaoGrupoItens(.tabGrupoItens, InternalName)
     if (sc '= 1) continue
   }
   
   set sc = ##class(Src2.PatchUtils).ValidarRotinaLiberada(.tabRotinasLiberadas, .tabRotinasBloqueadas, rotina)
   if (sc '= 1) {
     set ^mtempSrc2Patch(codTerm,"rotinas",3,rotina) = ""
     set ^mtempSrc2Patch(codTerm,"rotinas",3) = $increment(^mtempSrc2Patch(codTerm,"rotinas",3))
     continue
   }
   
   set var2 = ""
   set $piece(var2,"^",1) = itemRepositorio_"@"_revisao
   set $piece(var2,"^",2) = pasta
   set $piece(var2,"^",3) = itemId
   set $piece(var2,"^",4) = versaoReleaseRef
   set $piece(var2,"^",5) = revisao
   set $piece(var2,"^",6) = 0
   set ^mtempSrc2Patch(codTerm,"rotinas",1,rotina) = var2
   
   set ^mtempSrc2Patch(codTerm,"rotinas",1) = $increment(^mtempSrc2Patch(codTerm,"rotinas",1))
   set ^mtempSrc2Patch(codTerm,"dados") = ""
 }
 
 if (tipoPatch = 6) {
   if (sistema = "cswutil") {
     set ^mtempSrc2Patch(codTerm,"flags","flgProcedimentos") = ""
     set ^mtempSrc2Patch(codTerm,"flags","flgPaginas") = ""
     set ^mtempSrc2Patch(codTerm,"flags","flgDiversos") = ""
     set ^mtempSrc2Patch(codTerm,"dados") = ""
   }
   if (sistema = "csw") {
     set ^mtempSrc2Patch(codTerm,"flags","flgMenu") = ""
     set ^mtempSrc2Patch(codTerm,"flags","flgProcedimentos") = ""
     set ^mtempSrc2Patch(codTerm,"flags","flgSerasahttp") = ""
     set ^mtempSrc2Patch(codTerm,"flags","flgServerProducao") = ""
     set ^mtempSrc2Patch(codTerm,"dados") = ""
   }
   if (sistema = "gercon") {
     set ^mtempSrc2Patch(codTerm,"flags","flgMenu") = ""
     set ^mtempSrc2Patch(codTerm,"dados") = ""
   }
   
   set (tipo, arquivo) = ""
   for {
     set tipo = $order(^mtempInfoArquivo(codTerm,"relatorios",tipo))
     if (tipo = "") quit
     for {
       set arquivo = $order(^mtempInfoArquivo(codTerm,"relatorios",tipo,arquivo))
       if (arquivo = "") quit
       set ^mtempSrc2Patch(codTerm,"relatorios","importar",tipo,"'"_repositorio_"/relatorios/"_arquivo_"'@"_revisao) = arquivo
       set ^mtempSrc2Patch(codTerm,"relatorios","importar",tipo) = $increment(^mtempSrc2Patch(codTerm,"relatorios","importar",tipo))
       set ^mtempSrc2Patch(codTerm,"dados") = ""
     }
   }
 }
 
 kill ^mtempInfoArquivo(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosMaquinaDesenv">
<Description>

Obter Dados Máquina Desenvolvedor
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,ipMaquina:%String,versaoReleaseRef:%String,sistema:%String,tabGrupoItens:%String="",&tabRotinasLiberadas:%String,&tabRotinasBloqueadas:%String,&tabClassesLiberadas:%String,&tabClassesBloqueadas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set strGrupoItens = ##class(Src2.Utils).ConvertTabStr(.tabGrupoItens,,";")
 
 set sc = ##class(Src2.PatchUtils).ObterNamespaceConexao(sistema, versaoReleaseRef, .namespace)
 if $$$ISERR(sc) quit sc
 
 set objService = ##class(Src2.Web.Cliente.Patch2Soap).%New()
 
 set objService.Location = "http://"_ipMaquina_"/csp/"_namespace_"/Src2.Web.Service.Patch.cls"
 
 set usertoken = ##class(%SOAP.Security.UsernameToken).Create("_system","ccscache")
 do objService.SecurityOut.AddToken(usertoken)
 
 try {
   set objItens = objService.PrepararItensPatchTemp(strGrupoItens)
   set status = $$$OK
 } catch {
   If $ZERROR["<ZSOAP>" { set status = %objlasterror }
   else { set status = $$$ERROR($$$CacheError,$ZERROR)}
 }
 
 if $$$ISERR(status) quit status
 
 set (codSeq, msgErro) = ""
 for {
   set objItem = objItens.itens.GetNext(.codSeq)
   if objItem = "" quit
   
   set itemId = $translate(objItem.itemId,"\","/")
   set pasta = objItem.pasta
   set arquivo = objItem.arquivo
   
   if (sistema '= objItem.sistema) {
     set dsSistema = ##class(Src2.PatchUtils).ObterDescricaoSistema(sistema)
     set msgErro = $$$ERROR(10000,"Item "_objItem.item_" não pertence ao sistema "_dsSistema_"!")
     quit
   }
   
   if (objItem.tipo = 1) {
     set classe = objItem.item
     set package = objItem.package
     
     set sc = ##class(Src2.PatchUtils).ValidarClasseLiberada(.tabClassesLiberadas, .tabClassesBloqueadas, classe)
     if (sc '= 1) {
       set ^mtempSrc2Patch(codTerm,"classes",3,classe) = ""
       set ^mtempSrc2Patch(codTerm,"classes",3) = $increment(^mtempSrc2Patch(codTerm,"classes",3))
       continue
     }
     
     set var2 = ""
     set $piece(var2,"^",2) = pasta
     set $piece(var2,"^",3) = itemId
     set $piece(var2,"^",4) = versaoReleaseRef
     set $piece(var2,"^",6) = 0
     set ^mtempSrc2Patch(codTerm,"classes",1,classe) = var2
     
     set ^mtempSrc2Patch(codTerm,"classes",1) = $increment(^mtempSrc2Patch(codTerm,"classes",1))
     set ^mtempSrc2Patch(codTerm,"dados") = ""
     if (package '= "") {
       set ^mtempSrc2Patch(codTerm,"classes",4,package) = ""
     }
   }
   
   if (objItem.tipo = 2) {
     set rotina = objItem.item
     
     set sc = ##class(Src2.PatchUtils).ValidarRotinaLiberada(.tabRotinasLiberadas, .tabRotinasBloqueadas, rotina)
     if (sc '= 1) {
       set ^mtempSrc2Patch(codTerm,"rotinas",3,rotina) = ""
       set ^mtempSrc2Patch(codTerm,"rotinas",3) = $increment(^mtempSrc2Patch(codTerm,"rotinas",3))
       continue
     }
     
     set var2 = ""
     set $piece(var2,"^",2) = pasta
     set $piece(var2,"^",3) = itemId
     set $piece(var2,"^",4) = versaoReleaseRef
     set $piece(var2,"^",6) = 0
     set ^mtempSrc2Patch(codTerm,"rotinas",1,rotina) = var2
     
     set ^mtempSrc2Patch(codTerm,"rotinas",1) = $increment(^mtempSrc2Patch(codTerm,"rotinas",1))
     set ^mtempSrc2Patch(codTerm,"dados") = ""
   }
 }
 
 if (msgErro '= "") quit msgErro
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarRotinaLiberada">
<Description>

Validar Rotina Liberada
tipo = 1 - Envio de Rotina
       2 - Item no Menu</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabRotinasLiberadas:%String,&tabRotinasBloqueadas:%String,rotina:%String,tipo:%Integer=1]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Item).ValidarSelecaoGrupoItens(.tabRotinasBloqueadas, rotina_".mac")
 if (sc = $$$OK) quit $$$ERROR(10000,"Rotina bloqueada!")
 
 if ('$data(tabRotinasLiberadas)) quit $$$OK
 
 set sc = ##class(Src2.Item).ValidarSelecaoGrupoItens(.tabRotinasLiberadas, rotina_".mac")
 if (sc = $$$OK) quit $$$OK
 
 if (tipo = 1) {
   set sc = ##class(Src2.Rotina).ValidarRotinaLiberadaPatch(rotina)
   if (sc = $$$OK) quit $$$OK
 }
 
 quit $$$ERROR(10000,"Rotina "_rotina_" bloqueada!")
]]></Implementation>
</Method>

<Method name="ValidarClasseLiberada">
<Description>

Validar Classe Liberada
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabClassesLiberadas:%String,&tabClassesBloqueadas:%String,classe:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Item).ValidarSelecaoGrupoItens(.tabClassesBloqueadas, classe_".cls")
 if (sc = $$$OK) quit $$$ERROR(10000,"Classe bloqueada!")
 
 if ('$data(tabClassesLiberadas)) quit $$$OK
 
 set sc = ##class(Src2.Item).ValidarSelecaoGrupoItens(.tabClassesLiberadas, classe_".cls")
 if (sc = 1) quit $$$OK
 
 quit $$$ERROR(10000,"Classe bloqueada!")
]]></Implementation>
</Method>

<Method name="ObterNamespaceConexao">
<Description>

Obter Namespace de Conexao

set sc = ##class(Src2.PatchUtils).ObterNamespaceConexao("csw", "6.4", .namespace)
set sc = ##class(Src2.PatchUtils).ObterNamespaceConexao("gercon", "1.0", .namespace)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sistema:%String,versaoReleaseRef:%String,namespace:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set namespace = "desenv"_$translate(versaoReleaseRef,".","")
 if (sistema = "gercon") set namespace = "desenv64"
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterAutSubversionGercon">
<Description>

Obter Autenticacao do Subversion do Gercon

set sc = ##class(Src2.PatchUtils).ObterAutSubversionGercon(.username, .password)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (username, password) = ""
 
 set sc = $$GetNumeroConfiguracao^CCGER280RG(.idConfiguracao)
 if $$$ISERR(sc) quit sc
 
 set sc = $$ObterDadosSubversion^CCGER280RG(idConfiguracao, .username, .password)
 if $$$ISERR(sc) quit sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterItensLiberadosConta">
<Description>

Obtem as Rotinas Liberadas por Conta

set msgsc = ##class(Src2.UtilsXml).ObterAtualizacaoXML(.tabSistemas, .caminhoPatch, .tabItensLiberados, .tabItensBloqueados)
set msgsc = ##class(Src2.PatchUtils).ObterItensLiberadosConta("csw", "NA" , , "6.4", 1, .tabItensLiberados, .tabItensBloqueados, .tabRotinasLiberadas, .tabRotinasBloqueadas, .tabClassesLiberadas, .tabClassesBloqueadas)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,codConta:%String,codConta2:%String="",versaoConta:%String="",tipoPatch:%Integer,&tabItensLiberados:%String,&tabItensBloqueados:%String,&tabRotinasLiberadas:%String,&tabRotinasBloqueadas:%String,&tabClassesLiberadas:%String,&tabClassesBloqueadas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabRotinasLiberadas, tabRotinasBloqueadas, tabClassesLiberadas, tabClassesBloqueadas
 
 set sc = $$GetSistemasCliente^CCGERRG007(codConta, .tabSiglas)
 
 set sc = $$ObterRotinasBloqueadasCliente^CCGERPRG001(codConta, .tabRotBloConta)
 
 merge tabRotinasBloqueadas = tabRotBloConta
 
 merge tabRotinasBloqueadas = tabItensBloqueados(1,1)
 merge tabClassesBloqueadas = tabItensBloqueados(1,2)
 
 if (versaoConta '= "") {
   merge tabRotinasBloqueadas = tabItensBloqueados(2,versaoConta,1)
   merge tabClassesBloqueadas = tabItensBloqueados(2,versaoConta,2)
 }
 
 set sc = ##class(Src2.UtilsXml).ObterSistemasXML(.tabSistemas)
 
 set var = $get(tabSistemas(sistema))
 
 if (sistema = "csw") {
   if ((tipoPatch = 1) ! (tipoPatch = 5) ! (tipoPatch = 6)) {
     // Patch de Atualização / Snapshot / Atualização Completa
     //   Obtem as rotinas liberadas pelas siglas cadastradas no gercon para o cliente
     //   Classes fica tudo liberado
     set grupoRotina = ""
     for {
       set grupoRotina = $order(tabSistemas("csw",1,grupoRotina))
       if (grupoRotina = "") quit
       set var2 = $get(tabSistemas("csw",1,grupoRotina))
       if ($piece(var2,"^",1) '= 1) continue
       if ($piece(var2,"^",2) = "") continue
       if '$data(tabSiglas($piece(var2,"^",2))) continue
       set tabRotinasLiberadas(grupoRotina_"*.mac") = ""
     }
     set grupoRotina = ""
     for {
       set grupoRotina = $order(tabSistemas("csw",5,grupoRotina))
       if (grupoRotina = "") quit
       set var2 = $get(tabSistemas("csw",5,grupoRotina))
       if '$data(tabSiglas($piece(var2,"^",1))) continue
       set tabRotinasLiberadas(grupoRotina) = ""
     }
   } else {
     // Outros Patchs - Libera todas as rotinas do CSW
     //   Classes fica tudo liberado
     set grupoRotina = ""
     for {
       set grupoRotina = $order(tabSistemas("csw",3,grupoRotina))
       if (grupoRotina = "") quit
       set tabRotinasLiberadas(grupoRotina_"*.mac") = ""
     }
   }
   merge tabRotinasLiberadas = tabItensLiberados(1)
 }
 
 if (sistema = "cswutil") {
   set grupoRotina = ""
   for {
     set grupoRotina = $order(tabSistemas("cswutil",3,grupoRotina))
     if (grupoRotina = "") quit
     set tabRotinasLiberadas(grupoRotina_"*.mac") = ""
   }
 }
 
 // Rotinas e Classes em Sistemas por Conta
 if ($piece(var,"^",1) = 1) {
   set grupoRotina = ""
   for { 
     set grupoRotina = $order(tabSistemas(sistema,1,grupoRotina))
     if (grupoRotina = "") quit
     set tabRotinasLiberadas(grupoRotina_codConta_"*.mac") = ""
     if (codConta2 '= "") set tabRotinasLiberadas(grupoRotina_codConta2_"*.mac") = ""
   }
   set grupoClasse = ""
   for { 
     set grupoClasse = $order(tabSistemas(sistema,2,grupoClasse))
     if (grupoClasse = "") quit
     set tabClassesLiberadas(grupoClasse_$zconvert(codConta,"l")_"*.cls") = ""
     if (codConta2 '= "") set tabClassesLiberadas(grupoClasse_$zconvert(codConta2,"l")_"*.cls") = ""
   }
 }
 
 if (sistema = "especifico") {
   set tabRotinasLiberadas(codConta_"*.mac") = ""
   if (codConta2 '= "") set tabRotinasLiberadas(codConta2_"*.mac") = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterProgramasMenuConta">
<Description>

Obtem os Programas Liberados para o Menu

set msgsc = ##class(Src2.PatchUtils).ObterProgramasMenuConta("csw", "RO", .tabProgramasMenu, .tabSiglas)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,codConta:%String,&tabProgramasMenu:%String,&tabSiglas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabProgramasMenu, tabSiglas
 
 set sc = $$GetSistemasCliente^CCGERRG007(codConta, .tabSiglas)
 
 set sc = ##class(Src2.UtilsXml).ObterSistemasXML(.tabSistemas)
 
 set grupoRotina = ""
 for {
   set grupoRotina = $order(tabSistemas("csw",1,grupoRotina))
   if (grupoRotina = "") quit
   set var2 = $get(tabSistemas("csw",1,grupoRotina))
   if ($piece(var2,"^",1) '= 1) continue
   if ($piece(var2,"^",2) = "") continue
   if ('$data(tabSiglas($piece(var2,"^",2)))) continue
   set tabProgramasMenu(grupoRotina_"*.mac") = ""
 }
 
 set grupoRotina = ""
 for {
   set grupoRotina = $order(tabSistemas("csw",5,grupoRotina))
   if (grupoRotina = "") quit
   set var2 = $get(tabSistemas("csw",5,grupoRotina))
   if ('$data(tabSiglas($piece(var2,"^",1)))) continue
   set tabProgramasMenu(grupoRotina) = ""
 }
 
 set grupoRotina = ""
 for {
   set grupoRotina = $order(tabSistemas("cswutil",3,grupoRotina))
   if (grupoRotina = "") quit
   if (grupoRotina '= "Z") {
     set tabProgramasMenu(grupoRotina_"*.mac") = ""
   }
 }
 
 set tabProgramasMenu(codConta_"*.mac") = ""
 
 set (sistema2, grupoRotina) = ""
 for { 
   set sistema2 = $order(tabSistemas(sistema2))
   if (sistema2 = "") quit
   set var = $get(tabSistemas(sistema2))
   if ($piece(var,"^",1) = 1) {
     for { 
       set grupoRotina = $order(tabSistemas(sistema2,1,grupoRotina))
       if (grupoRotina = "") quit
       set tabProgramasMenu(grupoRotina_codConta_"*.mac") = ""
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosCliente">
<Description>

Obter Dados do Cliente

set sc = ##class(Src2.PatchUtils).ObterDadosCliente("CO", .tipoProdCsw, .tabSegmentos, .nomeCliente, .emailsCliente)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codConta:%String,&tipoProdCsw:%String,&tabSegmentos:%Integer,&nomeCliente:%Integer,&emailsCliente:%Integer]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (nomeCliente, emailsCliente) = ""
 set tipoProdCsw = 0
 kill tabSegmentos
 
 set sc = $$ObterDadosCliente^CCGER020RG(codConta, .tabInformacao)
 
 set nomeCliente = $piece(tabInformacao,"^",1)
 
 set emailsCliente = $piece(tabInformacao,"^",18)
 
 set tipoProdCsw = +$piece(tabInformacao,"^",45)
 
 set codCliente = $$GetIdCliente^CCGERRG003(codConta)
 
 set sc = $$ObterSegmentosCliente^CCUTI010RG(codCliente, .tabSegmentos)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterLicenca">
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
  set dadosLicenca = $get(^%CSW1LICENCA(1))
  if (dadosLicenca = "") quit ""

  set dadosLicenca = ##class(%SYSTEM.Encryption).AESCBCDecrypt(##class(%SYSTEM.Encryption).Base64Decode($list(dadosLicenca,1)),$list(dadosLicenca,2))

  quit dadosLicenca
]]></Implementation>
</Method>

<Method name="AtualizarVersoesConsistem">
<Description>

Atualizar Versoes Consistem

set sc = ##class(Src2.PatchUtils).AtualizarVersoesConsistem()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codConta:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils2).ValidarServidorOficial()
 if $$$ISERR(sc) quit $$$OK
 
 if (codConta = "") {
   set sc = ##class(Src2.ConsistemLog).ObterContaCliente(.codConta)
 }
 
 if (codConta = "") quit $$$ERROR(10000,"Conta do cliente não informada!")
 
 set $zerror = ""
 set $ztrap = "AtualizarVersoesConsistemErro"
 
 set sc = ##class(Src2.Utils2).ObterDadosServidor(.macAddress)
 
 set objServico = ##Class(Src2.Web.Cliente.ClienteGerconSoap).%New()
 if (objServico = "") {
   set $ztrap = ""
   quit $$$ERROR(10000,"Não foi possível conectar-se aos servidores Consistem! Tente novamente mais tarde.")
 }
 
 set objDadosCliente = ##Class(Src2.Inf.DadosCliente).%New()
 set objDadosCliente.conta = codConta
 set objDadosCliente.dataHoraAtualizaoCliente = $horolog
 set objDadosCliente.macAddress = macAddress
 
 set produto = ""
 for  {
   set produto = $order(^%CSW1ATUCONF(3,produto))
   if (produto = "") quit
   set versao = $piece($get(^%CSW1ATUCONF(3,produto)),"^",1)
   set revisao = $piece($get(^%CSW1ATUCONF(3,produto)),"^",2)
   
   set objVersao = ##Class(Src2.Inf.DadosVersaoAtual).%New()
   set objVersao.produto = produto
   set objVersao.versao = versao
   set objVersao.flgVersaoAlter = 0
   set objVersao.revisao = ""
   if ($piece($get(^%CSW1ATUCONF(3,produto)),"^",2) '= "") {
     set objVersao.flgVersaoAlter = 1
     set objVersao.revisao = revisao
   }
   
   do objDadosCliente.dadosVersaoAtual.Insert(objVersao)
 }
 
 set objLicCache = ##Class(Src2.Inf.DadosLicencaCache).%New()
 set objLicCache.numeroLicencasCache = $system.License.KeyLicenseUnits()
 set objLicCache.dataLicencasCache = $system.License.KeyExpirationDate()
 set objLicCache.nomeClienteLicenca = $system.License.KeyCustomerName()
 set objDadosCliente.dadosLicencaCache = objLicCache
 
 set objServidor = ##Class(Src2.Inf.DadosServidor).%New()
 set objServidor.sistemaOperacional = $system.Version.GetCompBuildOS()
 set objServidor.versaoCache = $system.Version.GetNumber()
 set objServidor.plataforma = $system.Version.GetPlatform()
 
 set objCPU = ##Class(%SYSTEM.CPU).%New()
 
 set objServidor.velocidadeProcessador = objCPU.MHz
 set objServidor.modeloProcessador = objCPU.Model
 set objServidor.fabricanteProcessador = objCPU.Vendor
 set objServidor.numeroChips = objCPU.nChips
 set objServidor.numeroCores = objCPU.nCores
 set objServidor.numeroCoresPorChip = objCPU.nCoresPerChip
 set objServidor.numeroThreads = objCPU.nThreads
 set objServidor.numeroThreadsPorCore = objCPU.nThreadsPerCore
 
 set objCPU = ""
 
 set objDadosCliente.dadosServidor = objServidor
 
 set csw1infuso = $get(^%CSW1INFUSO(1))
 set (data, ultData) = $piece(csw1infuso,"^",1)
 set (hora, ultHora) = $piece(csw1infuso,"^",2)	; Ainda não é utilizado!
 
 // Trazer somente os ultimos 30 dias caso não tenha configuração
 if (data = "") set data = +$horolog-30

 set sc = ##Class(Src2.PatchUtils).GerarGlobalTempUsoLicencas(data)
 
 set (data, hora)=""
 for {
   set data = $order(^mtempLICENCA($job,data))
   if (data = "") quit
   
   for {
     set hora = $order(^mtempLICENCA($job,data,hora))
     if (hora = "") quit
     
     set csw1licenca=$get(^mtempLICENCA($job,data,hora))
     
     set objUsoLicCCS = ##Class(Src2.Inf.DadosUsoLicencaConsistem).%New()
     
     set objUsoLicCCS.data = data
     set objUsoLicCCS.hora = hora
     set objUsoLicCCS.totUsuarios = $piece(csw1licenca,"^",1)
     set objUsoLicCCS.usuariosLogadosCSW = $piece(csw1licenca,"^",2)
     set objUsoLicCCS.usuariosLogadosCRM = $piece(csw1licenca,"^",3)
     set objUsoLicCCS.usuariosLogadosCaracter = $piece(csw1licenca,"^",4)
     set objUsoLicCCS.usuariosLogadosGrafico = $piece(csw1licenca,"^",5)
     set objUsoLicCCS.usuariosTmpConsistem = $piece(csw1licenca,"^",6)
     
     do objDadosCliente.dadosUsoLicencaConsistem.Insert(objUsoLicCCS)
     
     set ultData = data
     set ultHora = hora
   }
 }
 
 // Global Temporaria para Uso da licença
 kill ^mtempLICENCA($job)
 
 set objLicCCS = ##Class(Src2.Inf.DadosLicencaConsistem).%New()
 
 if ($get(^%CSW1LICENCA(1)) '= "") {
   set dadosLicenca = $get(^%CSW1LICENCA(1))
   
   set objLicCCS.licenca = $list(dadosLicenca,1)
   set objLicCCS.chaveLicenca = $list(dadosLicenca,2)
   set objLicCCS.tipoLicenca = 1
   
   set objDadosCliente.dadosLicencaConsistem = objLicCCS
 } else {
   set csmencf = $get(^%CSMENCF)
   
   if ($piece(csmencf,"^",55) '= "") , ($piece(csmencf,"^",56) '= "") {
     set file = ##Class(%File).%New($piece(csmencf,"^",56))
     do file.Open("RU")
   
     set cnpj = $extract($piece($get(^%EMP($piece(csmencf,"^",55))),"^",5),1,8)
     
     set len = 32000
     set objLicCCS.licenca = file.Read(.len)
     set objLicCCS.chaveLicenca = $translate($system.Encryption.Base64Encode(cnpj),"=","")
     set objLicCCS.tipoLicenca = 0
     
     do file.Close()
     set file = ""
     
     set objDadosCliente.dadosLicencaConsistem = objLicCCS
   }
 }
 
 set sc = objServico.GravarDadosCliente(objDadosCliente)
 if (sc '= 1) quit sc
 
 set $piece(csw1infuso,"^",1) = ultData
 set $piece(csw1infuso,"^",2) = ultHora
 set ^%CSW1INFUSO(1) = csw1infuso
 
 set $ztrap = ""
 
 quit $$$OK
 
AtualizarVersoesConsistemErro	;
 
 set $ztrap = ""
 
 if ($zerror [ "<ZSOAP>") quit $$$ERROR(10000,"Não foi possível conectar-se aos servidores Consistem! Tente novamente mais tarde.")
 else  quit $$$ERROR($$$CacheError,$zerror)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarGlobalTempUsoLicencas">
<Description>

Method para gerar uma global resumida do uso da licença
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>dataInicial:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill ^mtempLICENCA($job)
   
 set data=dataInicial
 set hora=""
  
 for {
   set data = $order(^%CSW1LICENCA(1,data))
   if (data = "")!(data'<+$horolog) quit
   
   for {
     set hora = $order(^%CSW1LICENCA(1,data,hora))
     if (hora = "") quit
     
     set horaCheia=$ztimeh($piece($ztime(hora,2),":",1)_":00",2)
     
     set csw1licenca=$get(^%CSW1LICENCA(1,data,hora))
     set mtempLicenca=$get(^mtempLICENCA($job,data,horaCheia))
     
     if $piece(csw1licenca,"^",1)<$piece(mtempLicenca,"^",1) continue
     
     set ^mtempLICENCA($job,data,horaCheia)=csw1licenca
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarLogOK">
<Description>

Gerar Log de OK
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codAtualizacao:%String,origem:%Integer,mensagem:%String,&tabDetalhes:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[ quit ##class(Src2.PatchUtils).GerarLog(codAtualizacao, origem, 1, mensagem, .tabDetalhes)
]]></Implementation>
</Method>

<Method name="GerarLogErro">
<Description>

Gerar Log de Erro
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codAtualizacao:%String,origem:%Integer,mensagem:%String,&tabDetalhes:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[ quit ##class(Src2.PatchUtils).GerarLog(codAtualizacao, origem, 2, mensagem, .tabDetalhes)
]]></Implementation>
</Method>

<Method name="GerarLogAviso">
<Description>

Gerar Log de Aviso
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codAtualizacao:%String,origem:%Integer,mensagem:%String,&tabDetalhes:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[ quit ##class(Src2.PatchUtils).GerarLog(codAtualizacao, origem, 3, mensagem, .tabDetalhes)
]]></Implementation>
</Method>

<Method name="GerarLog">
<Description>

Gerar Log de Erro

origem =  1 - Rotinas
          2 - Classes
          3 - Ajuda
          4 - Relatórios
          5 - Componentes
          6 - Procedimento
          7 - Páginas/Objetos da Aplicação CSP
          8 - Arquivos Versionados
          9 - Keystores
         10 - Menu
         11 - Backup
         12 - Geração de Base</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codAtualizacao:%String,origem:%Integer,tipo:%Integer,mensagem:%String,&tabDetalhes:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codSeq = $order(^%CSW1ATULOG(1,codAtualizacao,1,tipo,""),-1) + 1
 
 set ^%CSW1ATULOG(1,codAtualizacao,1,tipo,codSeq) = origem_"^"_$znspace
 set ^%CSW1ATULOG(1,codAtualizacao,1,tipo,codSeq,1) = mensagem
 
 if (tabDetalhes '= "") , ($order(tabDetalhes("")) = "") {
   set tabDetalhes(1) = tabDetalhes
 }
 
 if ($order(tabDetalhes("")) '= "") {
   zkill tabDetalhes
   merge ^%CSW1ATULOG(1,codAtualizacao,1,tipo,codSeq,2) = tabDetalhes
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabOrigemLog">
<Description>

Obter Tabela de Origens dos Logs

set sc = ##class(Src2.PatchUtils).ObterTabOrigemLog(.tabTipos)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>tabTipos:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabTipos
 set tabTipos(1) = "Rotinas"
 set tabTipos(2) = "Classes"
 set tabTipos(3) = "Ajuda"
 set tabTipos(4) = "Relatórios"
 set tabTipos(5) = "Utilitários"
 set tabTipos(6) = "Procedimento"
 set tabTipos(7) = "Páginas/Objetos da Aplicação CSP"
 set tabTipos(8) = "Arquivos Versionados"
 set tabTipos(9) = "Keystores"
 set tabTipos(10) = "Menu"
 set tabTipos(11) = "Backup"
 set tabTipos(12) = "Geração de Base"
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarSelecaoNamespace">
<Description>

Validar Importacao de um Item

tipo = 1 - Rotina
       2 - Rotina % / Rotina Z*
       3 - Classe
       4 - Diversos.xml
       5 - Aplicação CSP
       6 - Gerar Paginas CSP

Pieces da Configuração
       1 - Rotina                ("" ou "0" - Padrão / 1 - Sim / 2 - Não)
       2 - Rotina % / Rotina Z*  ("" ou "0" - Padrão / 1 - Sim / 2 - Não)
       3 - Classe                ("" ou "0" - Padrão / 1 - Sim / 2 - Não)
       4 - Diversos.xml          ("" ou "0" - Padrão / 1 - Sim / 2 - Não)
       5 - Aplicação CSP         ("" ou "0" - Padrão / 1 - Sim / 2 - Não)
       6 - Gerar Paginas CSP     ("" ou "0" - Padrão / 1 - Sim / 2 - Não)

Configuração padrão para SISTEMAS = "1^2^1^1^1^1"
                         %SYS     = "1^1^2^1^2^2"
                         TESTE1     "1^2^1^1^2^2"
                         TESTE2     "1^2^1^1^2^2"

write ##class(Src2.PatchUtils).ValidarSelecaoNamespace("csw","TESTE1",5)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sistema:%String,namespace:%String,tipo:%String,item:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils2).ValidarVersaoSistema("cswutil", ">", "6.4.8", .flgSemCSPT1)
 if ('flgSemCSPT1) {
   quit ##class(Src2.PatchUtils).ValidarSelecaoNamespaceOld(sistema, namespace, tipo, $get(item))
 }
 
 set var = $get(^%CSW1ATUCONF(3,sistema,1,namespace))
 
 set flgRotina = +$piece(var,"^",1)
 set flgRotinaSYS = +$piece(var,"^",2)
 set flgClasse = +$piece(var,"^",3)
 set flgDiversos = +$piece(var,"^",4)
 set flgAplicCsp = +$piece(var,"^",5)
 set flgGerarCsp = +$piece(var,"^",6)
 
 set flgRotZ = 0
 if ($extract(item,1) = "Z") set flgRotZ = 1
 
 if (tipo = 1) & (($extract(item,1) = "%") ! (flgRotZ)) set tipo = 2
 
 if (flgRotina = 0) set flgRotina = 1             // Atualiza rotinas por padrão
 if (flgDiversos = 0) set flgDiversos = 1         // Atualiza diversos por padrão
 
 if (namespace = "%SYS") {
   if (flgRotinaSYS = 0) set flgRotinaSYS = 1     // No namespace %SYS atualiza rotinas percento por padrão
   if (flgClasse = 0) set flgClasse = 2           // No namespace %SYS não atualiza classes por padrão
 } else {
   if (flgRotinaSYS = 0) set flgRotinaSYS = 2     // Em namespaces não %SYS não atualiza rotinas percento por padrão
   if (flgClasse = 0) set flgClasse = 1           // Em namespaces não %SYS atualiza classes por padrão
 }
 
 if (flgAplicCsp = 0) {
   if (namespace = "SISTEMAS") set flgAplicCsp = 1
   else  set flgAplicCsp = 2
 }
 
 if (flgGerarCsp = 0) {
   if (namespace = "SISTEMAS") set flgGerarCsp = 1
   else  set flgGerarCsp = 2
 }
 
 if (flgRotZ) set flgGerarCsp = 2
 
 if (tipo = 1) & (flgRotina '= 1) quit $$$ERROR(10000,"Não importar rotina!")
 if (tipo = 2) & (flgRotinaSYS '= 1) quit $$$ERROR(10000,"Não importar rotina % ou Z!")
 if (tipo = 3) & (flgClasse '= 1) quit $$$ERROR(10000,"Não importar classe!")
 if (tipo = 4) & (flgDiversos '= 1) quit $$$ERROR(10000,"Não importar diversos.xml!")
 if (tipo = 5) & (flgAplicCsp '= 1) quit $$$ERROR(10000,"Não importar aplicação CSP!")
 if (tipo = 6) & (flgGerarCsp '= 1) quit $$$ERROR(10000,"Não gerar página CSP!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarSelecaoNamespaceOld">
<Description>

ATENÇÃO
* Método antigo para ser utilizado em atualizações com os componentes antes da versão 6.4.9.
* A partir da verão 6.4.9 de componentes não existe mais aplicação CSP para os namespaces diferentes de SISTEMAS. </Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sistema:%String,namespace:%String,tipo:%String,item:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set var = $get(^%CSW1ATUCONF(3,sistema,1,namespace))
 
 set flgRotina = +$piece(var,"^",1)
 set flgRotinaSYS = +$piece(var,"^",2)
 set flgClasse = +$piece(var,"^",3)
 set flgDiversos = +$piece(var,"^",4)
 set flgAplicCsp = +$piece(var,"^",5)
 set flgGerarCsp = +$piece(var,"^",6)
 
 set flgRotZ = 0
 if ($extract(item,1) = "Z") set flgRotZ = 1
 
 if (tipo = 1) & (($extract(item,1) = "%") ! (flgRotZ)) set tipo = 2
 
 if (flgRotina = 0) set flgRotina = 1             // Atualiza rotinas por padrão
 if (flgDiversos = 0) set flgDiversos = 1         // Atualiza rotinas por padrão
 
 if (namespace = "%SYS") {
   if (flgRotinaSYS = 0) set flgRotinaSYS = 1   // No namespace %SYS atualiza rotinas percento por padrão
   if (flgClasse = 0) set flgClasse = 2           // No namespace %SYS não atualiza classes por padrão
 } else {
   if (flgRotinaSYS = 0) set flgRotinaSYS = 2   // Em namespaces não %SYS não atualiza rotinas percento por padrão
   if (flgClasse = 0) set flgClasse = 1           // Em namespaces não %SYS atualiza classes por padrão
 }
 
 if (flgAplicCsp = 0) {
   set sistOper = ##class(Src2.Utils).ObterSistOper()
   if (sistOper = "linux") {
     // OBS: No linux a aplicação csp é mapeada para os namespaces TESTE1 / TESTE2
     if (namespace = "SISTEMAS") {
       set flgAplicCsp = 1       // No namespace SISTEMAS atualiza as paginas por padrão
     } else {
       set flgAplicCsp = 2       // Em namespaces não SISTEMAS não atualiza as paginas por padrão
     }
   } else {
     if (namespace = "SISTEMAS") ! (namespace = "TESTE1") ! (namespace = "TESTE2") {
       set flgAplicCsp = 1       // Nos namespaces SISTEMAS/TESTE1/TESTE2 atualiza as paginas por padrão
     } else {
       set flgAplicCsp = 2       // Em outros namespaces não atualiza as paginas por padrão
     }
   }
 }
 
 if (flgGerarCsp = 0) {
   if (namespace = "SISTEMAS") ! (namespace = "TESTE1") {
     set flgGerarCsp = 1
   } else {
     set flgGerarCsp = 2
   }
 }
 
 if (flgRotZ) set flgGerarCsp = 2
 
 if (tipo = 1) & (flgRotina '= 1) quit $$$ERROR(10000,"Não importar rotina!")
 if (tipo = 2) & (flgRotinaSYS '= 1) quit $$$ERROR(10000,"Não importar rotina % ou Z!")
 if (tipo = 3) & (flgClasse '= 1) quit $$$ERROR(10000,"Não importar classe!")
 if (tipo = 4) & (flgDiversos '= 1) quit $$$ERROR(10000,"Não importar diversos.xml!")
 if (tipo = 5) & (flgAplicCsp '= 1) quit $$$ERROR(10000,"Não importar aplicação CSP!")
 if (tipo = 6) & (flgGerarCsp '= 1) quit $$$ERROR(10000,"Não gerar página CSP!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterItensDocumento">
<Description>

set sc = ##class(Src2.PatchUtils).ObterItensDocumento("CO",1,231465,.tabItens)
set sc = ##class(Src2.PatchUtils).ObterItensDocumento("CO",1,246353,.tabItens)
set sc = ##class(Src2.PatchUtils).ObterItensDocumento("CO",1,4454545,.tabItens)
set sc = ##class(Src2.PatchUtils).ObterItensDocumento("CO",1,249222,.tabItens)

tipoDocumento = 1 - Chamado
                2 - Projeto
                3 - Ticket Kayako
                4 - Ticket Redmine
                5 - Chamado Adapcon</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codConta:%String,tipoDocumento:%Integer,documento:%String,tabItens:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabItens
 
 set sc = ##class(Src2.PatchUtils).ObterTabTiposDocumentos(.tabTiposDoc)
 
 set sc = ##class(Src2.UtilsXml).ObterContas(.tabContas)
 
 if ('$data(tabContas(codConta))) quit $$$ERROR(10000,"Conta "_codConta_" não encontrada!")
 
 set versaoConta = $piece($get(tabContas(codConta)),"^",3)
 if (versaoConta = "") quit $$$ERROR(10000,"Versão da conta "_codConta_" não encontrada!")
 
 kill tabContas
 
 set sc = ##class(Src2.UtilsXml).ObterProjetosXML(.tabProjetos)
 
 set projeto = ""
 for {
   set projeto = $order(tabProjetos(projeto))
   if (projeto = "") quit
   set var = $get(tabProjetos(projeto))
   
   if ($piece(var,"^",8) '= versaoConta) continue
   
   set tabItens(projeto) = $piece(var,"^",6)_"^"_$piece(var,"^",8)_"^"_$piece(var,"^",2)
 }
 
 kill tabProjetos, tabRevisoes
 
 if (tipoDocumento = 1) merge tabRevisoes = ^Src2DadosChamado(documento)
 if (tipoDocumento = 2) merge tabRevisoes = ^Src2DadosProjeto(documento)
 if (tipoDocumento = 3) merge tabRevisoes = ^Src2DadosTkKayako(documento)
 if (tipoDocumento = 4) merge tabRevisoes = ^Src2DadosTkRedmine(documento)
 if (tipoDocumento = 5) merge tabRevisoes = ^Src2DadosChAdapcon(documento)
 
 set (projeto, revisao, rotina, classe) = ""
 for {
   set projeto = $order(tabRevisoes(projeto))
   if (projeto = "") quit
   if ('$data(tabItens(projeto))) continue
   for {
     set revisao = $order(tabRevisoes(projeto,revisao))
     if (revisao = "") quit
     for {
       set rotina = $order(^Src2DadosRevisao(projeto,revisao,5,rotina))
       if (rotina = "") quit
       set tabItens(projeto,1,rotina_".mac") = ""
     }
     for {
       set classe = $order(^Src2DadosRevisao(projeto,revisao,6,classe))
       if (classe = "") quit
       set tabItens(projeto,2,classe_".cls") = ""
     }
   }
 }
 
 set projeto = ""
 for {
   set projeto = $order(tabItens(projeto))
   if (projeto = "") quit
   if ($order(tabItens(projeto,"")) = "") {
     kill tabItens(projeto)
   }
 }
 
 if ($order(tabItens("")) = "") quit $$$ERROR(10000,$get(tabTiposDoc(tipoDocumento))_" "_documento_" sem dados a serem exportados!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarRotinasClasses">
<Description>

Importar Rotinas/Classes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer,sistema:%String,flgExcluirCod:%Boolean,flgBackUp:%Boolean,tipoPatch:%String,versaoLog:%String,revisao:%Integer,caminhoBackup:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set namespaceOrigem = $znspace
 
 if (flgBackUp) {
   set namespace = ""
   for {
     set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
     if (namespace = "") quit
     znspace namespace
     set sc = ##class(Src2.PatchUtils).BackupRotinasClasses(codTerm, codAtualizacao, caminhoBackup, namespace)
   }
 }
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
   if (namespace = "") quit
   znspace namespace
   set sc = ##class(Src2.PatchUtils).ExcluirRotinasClasses(codTerm, codAtualizacao, sistema, tipoPatch, versaoLog, revisao, namespace)
 }
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
   if (namespace = "") quit
   znspace namespace
   set sc = ##class(Src2.PatchUtils).ImportarClasses(codTerm, codAtualizacao, sistema, tipoPatch, versaoLog, revisao, namespace)
 }
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
   if (namespace = "") quit
   znspace namespace
   set sc = ##class(Src2.PatchUtils).ImportarRotinas(codTerm, codAtualizacao, sistema, tipoPatch, versaoLog, revisao, namespace)
 }
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
   if (namespace = "") quit
   znspace namespace
   set sc = ##class(Src2.PatchUtils).GerarPaginasCSPRotinas(codTerm, codAtualizacao, namespace)
 }
 
 if (flgExcluirCod) {
   set namespace = ""
   for {
     set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
     if (namespace = "") quit
     znspace namespace
     set sc = ##class(Src2.PatchUtils).ExcluirFontesRotinas(codTerm, codAtualizacao, namespace, flgExcluirCod)
   }
 }
 
 znspace namespaceOrigem
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="BackupRotinasClasses">
<Description>

Backup das Rotinas e Classes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer,caminhoBackup:%String,namespace:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils2).CriarPasta(caminhoBackup, 0)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set horolog = $horolog
 
 // Classes - Backup de 500 em 500 para não dar erro no Caché
 
 kill tabItens
 set (classe, cont, contBack) = ""
 for {
   set classe = $order(^mtempSrc2PatchImport(codTerm,"classes",namespace,3,classe))
   if (classe = "") quit
   set cont = $increment(cont)
   set tabItens(classe) = ""
   if (cont > 500) {
     set contBack = $increment(contBack)
     set sc = $system.OBJ.Export(.tabItens, caminhoBackup_barra_$translate($zdatetime(horolog,3),": ","--")_"-"_namespace_"-CLASSES-"_contBack_".xml", "-d")
     kill tabItens
     set cont = ""
   }
 }
 if $data(tabItens) {
   set contBack = $increment(contBack)
   set sc = $system.OBJ.Export(.tabItens, caminhoBackup_barra_$translate($zdatetime(horolog,3),": ","--")_"-"_namespace_"-CLASSES-"_contBack_".xml", "-d")
 }
 
 if ($order(^mtempSrc2PatchImport(codTerm,"classes",namespace,3,"")) '= "") {
   set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 11, "Gerado Backup das Classes")
 }
 
 // Rotinas - Backup de 500 em 500 para não dar erro no Caché
 
 kill tabItens
 set (rotina, cont, contBack) = ""
 for {
   set rotina = $order(^mtempSrc2PatchImport(codTerm,"rotinas",namespace,3,rotina))
   if (rotina = "") quit
   set cont = $increment(cont)
   set tabItens(rotina) = ""
   if (cont > 500) {
     set contBack = $increment(contBack)
     set sc = $system.OBJ.Export(.tabItens, caminhoBackup_barra_$translate($zdatetime(horolog,3),": ","--")_"-"_namespace_"-ROTINAS-"_contBack_".xml", "-d")
     kill tabItens
     set cont = ""
   }
 }
 if $data(tabItens) {
   set contBack = $increment(contBack)
   set sc = $system.OBJ.Export(.tabItens, caminhoBackup_barra_$translate($zdatetime(horolog,3),": ","--")_"-"_namespace_"-ROTINAS-"_contBack_".xml", "-d")
 }
 
 if ($order(^mtempSrc2PatchImport(codTerm,"rotinas",namespace,3,"")) '= "") {
   set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 11, "Gerado Backup das Rotinas")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirRotinasClasses">
<Description>

Exclui Rotinas e Classes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer,sistema:%String,tipoPatch:%String,versaoLog:%String,revisao:%Integer,namespace:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set classe = ""
 for {
   set classe = $order(^mtempSrc2PatchImport(codTerm,"classes",namespace,2,classe))
   if (classe = "") quit
   
   set msgsc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 2, classe, versaoLog, revisao)
   if (msgsc '= $$$OK) {
     set msgsc = ##class(Src2.PatchUtils).GerarLogAviso(codAtualizacao, 2, msgsc)
     continue
   }
   
   set msgsc = ##class(Src2.Classe).ExcluirClasse(classe)
   if (msgsc '= $$$OK) {
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 2, "Exclusão da classe "_classe)
   }
   
   set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 2, "Exclusão da classe "_classe)
 }
 
 set rotina = ""
 for {
   set rotina = $order(^mtempSrc2PatchImport(codTerm,"rotinas",namespace,2,rotina))
   if (rotina = "") quit
   
   set msgsc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, rotina, versaoLog, revisao)
   if (msgsc '= $$$OK) {
     set msgsc = ##class(Src2.PatchUtils).GerarLogAviso(codAtualizacao, 1, msgsc)
     continue
   }
   
   set msgsc = ##class(Src2.Rotina).ExcluirRotina(rotina)
   if (msgsc '= $$$OK) {
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 1, "Exclusão da rotina "_rotina)
   }
   
   set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 1, "Exclusão da rotina "_rotina)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarClasses">
<Description>

Importa Classes do Patch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer,sistema:%String,tipoPatch:%String,versaoLog:%String,revisao:%Integer,namespace:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set flagCompClasses = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(1)
 
 set classe = ""
 for {
   set classe = $order(^mtempSrc2PatchImport(codTerm,"classes",namespace,1,classe))
   if (classe = "") quit
   set arquivo = $piece($get(^mtempSrc2PatchImport(codTerm,"classes",namespace,1,classe)),"^",1)
   
   set msgsc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 2, classe, versaoLog, revisao)
   if (msgsc '= $$$OK) {
     set msgsc = ##class(Src2.PatchUtils).GerarLogAviso(codAtualizacao, 2, msgsc)
     continue
   }
   
   set msgsc = ##class(Src2.Classe).GerarClasseArquivo(arquivo, classe, flagCompClasses, .tabErros, .tabOK)
   if (msgsc '= $$$OK) & ('$data(tabErros)) {
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 2, "Importação da classe "_classe, msgsc)
     continue
   }
   if ($data(tabErros(1))) {
     kill tabTemp
     merge tabTemp = tabErros(1)
     if ('$data(tabTemp(2))) , ($get(tabTemp(1)) [ "Unknown tag found during import of class, ignoring item: <Inheritance>") {
       continue
     }
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 2, "Importação da classe "_classe, .tabTemp)
     continue
   }
   
   set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 2, "Importação da classe "_classe)
   set tabClasses(classe_".cls") = ""
 }
 
 if ('$data(tabClasses)) quit $$$OK
 
 set flagCompClasses = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(2)
 
 do $system.OBJ.CompileList(.tabClasses,flagCompClasses,.errorLog)
 
 if ($order(errorLog("")) '= "") {
   set lin = ""
   for {
     set lin = $order(errorLog(lin))
     if (lin = "") quit
     set tabTemp(lin) = $piece($get(errorLog(lin)),$char(13)_$char(10)_$char(32),1)
   }
   set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 2, "Compilação de classes", .tabTemp)
 } else {
   set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 2, "Compilação de classes")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarRotinas">
<Description>

Importa Rotinas do Patch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer,sistema:%String,tipoPatch:%String,versaoLog:%String,revisao:%Integer,namespace:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set rotina = ""
 for {
   set rotina = $order(^mtempSrc2PatchImport(codTerm,"rotinas",namespace,1,rotina))
   if (rotina = "") quit
   set arquivo = $piece($get(^mtempSrc2PatchImport(codTerm,"rotinas",namespace,1,rotina)),"^",1)
   
   set msgsc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 1, rotina, versaoLog, revisao)
   if (msgsc '= $$$OK) {
     set msgsc = ##class(Src2.PatchUtils).GerarLogAviso(codAtualizacao, 1, msgsc)
     set ^mtempSrc2PatchImport(codTerm,"rotinasBloquedas",rotina) = ""
     continue
   }
   
   set msgsc = ##class(Src2.Rotina).GerarRotinaArquivo(arquivo, rotina, , .tabErros, .tabOK)
   if (msgsc '= $$$OK) & ('$data(tabErros)) {
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 1, "Importação da rotina "_rotina, msgsc)
     continue
   }
   if ($data(tabErros(2))) {
     kill tabTemp
     merge tabTemp = tabErros(2)
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 1, "Compilação da rotina "_rotina, .tabTemp)
     continue
   }
   
   set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 1, "Importação da rotina "_rotina)
   
   set sc = ##class(Src2.Rotina).ObterInforRotina2(rotina, .tipoRotCsp)
   if (tipoRotCsp = "naogerar") ! (tipoRotCsp = "naoconverter") {
     kill ^mtempSrc2PatchImport(codTerm,"rotinas",namespace,4,rotina)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarPaginasCSPRotinas">
<Description>

Gerar Paginas CSP Rotinas
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer,namespace:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set flgValidarRetErro = ##Class(Src2.PatchUtils).ValidarTesteErroCsp()
 
 set rotina = ""
 for {
   set rotina = $order(^mtempSrc2PatchImport(codTerm,"rotinas",namespace,4,rotina))
   if (rotina = "") quit
   
   if ($data(^mtempSrc2PatchImport(codTerm,"rotinasBloquedas",rotina))) {
     continue
   }
   
   set msgsc = ##class(Src2.Rotina).GerarPaginaCSP(rotina, .tabErros, , flgValidarRetErro)
   if (msgsc '= $$$OK) {
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 1, "Geração da página csp da rotina "_rotina, .tabErros)
     continue
   }
   
   set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 1, "Geração da página csp da rotina "_rotina)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirFontesRotinas">
<Description>

Excluir Fontes das Rotinas
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer,namespace:%String,flag:%String=0</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set rotina = ""
 for {
   set rotina = $order(^mtempSrc2PatchImport(codTerm,"rotinas",namespace,1,rotina))
   if (rotina = "") quit
   
   if ($data(^mtempSrc2PatchImport(codTerm,"rotinasBloquedas",rotina))) {
     continue
   }
   
   set msgsc = ##class(Src2.Rotina).ExcluirRotina(rotina, , , flag)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarComponentesParte1">
<Description>

Importar Componentes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,codAtualizacao:%Integer,codConta:%String,&tabAplicacoes:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ('$data(^mtempSrc2PatchImport(codTerm,"diversosXml"))) & ('$data(^mtempSrc2PatchImport(codTerm,"paginas"))) quit $$$OK
 
 // Linha provisória até que todos os clientes estejam acima da versão de componentes 6.4.9
 if $isobject($get(%session)) set %session.Data("AppConsistem") = 1
 
 set namespaceOrigem = $znspace
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,"cswutil",1,namespace))
   if (namespace = "") quit
   
   znspace namespace
   
   if $data(^mtempSrc2PatchImport(codTerm,"diversosXml",namespace)) {
     set arquivo = $piece($get(^mtempSrc2PatchImport(codTerm,"diversosXml",namespace)),"^",1)
     set sc = ##class(Src2.Utils).ImportarArquivoDiversosXml2(arquivo)
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 5, "Importado o arquivo diversos.xml")
   }
   
   if ($piece($get(^%CSMENCF),"^",46) = "") {
     set $piece(^%CSMENCF,"^",46) = $piece($get(tabAplicacoes(namespace)),"^",2)
   }
 }
 
 znspace namespaceOrigem
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarComponentesParte2">
<Description>

Importar Componentes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer,codConta:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ('$data(^mtempSrc2PatchImport(codTerm,"diversosXml"))) & ('$data(^mtempSrc2PatchImport(codTerm,"paginas"))) quit $$$OK
 
 // Linha provisória até que todos os clientes estejam acima da versão de componentes 6.4.9
 if $isobject($get(%session)) set %session.Data("AppConsistem") = 1
 
 set namespaceOrigem = $znspace
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,"cswutil",1,namespace))
   if (namespace = "") quit
   
   znspace namespace
   
   if $data(^mtempSrc2PatchImport(codTerm,"paginas",namespace)) {
     set var = $get(^mtempSrc2PatchImport(codTerm,"paginas",namespace))
     set sc = ##class(Src2.PatchUtils).ExportarPaginasObjetos(codAtualizacao, codConta, $piece(var,"^",1), $piece(var,"^",2), $piece(var,"^",3))
     do utilitario^%CSW1LOADPAGES(,0,0)
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 5, "Realizado o LoadPages")
   }
   
   if $data(^mtempSrc2PatchImport(codTerm,"objetos_jars",namespace)) {
     set sc = ##class(Src2.PatchUtils).ExportarJarsObjetos(codTerm, codAtualizacao, namespace)
   }
   
   if (namespace = "%SYS") {
     do ^%CSUTICSP
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 5, "Geradas as mensagens de erro")
   }
 }
 
 znspace namespaceOrigem
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarPaginasObjetos">
<Description>

Exporta Paginas/Objetos
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codAtualizacao:%Integer,codConta:%String,caminhoOrigem:%String,caminhoDestino:%String,caminhoBackupJars:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 // Limpa pasta de backup
 set sc = ##class(%File).RemoveDirectoryTree(caminhoBackupJars)
 
 // Backup dos Jars "objetos/java" para "backupjars"
 set sc = ##class(%File).CopyDir(caminhoDestino_"objetos"_barra_"java", caminhoBackupJars, 1)
 
 // Remove a pasta "objetos"
 set sc = ##class(%File).RemoveDirectoryTree(caminhoDestino_"objetos")
 if (sc) {
   set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 7, "Remover os antigos objetos da aplicação CSP")
 } else {
   set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 7, "Remover os antigos objetos da aplicação CSP")
 }
 
 // Copia do patch o novo "objetos"
 set sc = ##class(%File).CopyDir(caminhoOrigem, caminhoDestino, 1)
 if (sc) {
   set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 7, "Importação dos objetos da aplicação CSP")
 } else {
   set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 7, "Importação dos objetos da aplicação CSP")
 }
 
 // Recupera o backup dos Jars "backupjars" para "objetos/java"
 set sc = ##class(%File).CopyDir(caminhoBackupJars, caminhoDestino_"objetos"_barra_"java", 1)
 if (sc) {
   set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 7, "Importação dos objetos/java da aplicação CSP")
 } else {
   set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 7, "Importação dos objobjetos/javaetos da aplicação CSP")
 }
 
 if (codConta '= "CC") {
   set sc = ##class(%File).Delete(caminhoDestino_"csw1documentacao.csp")
 }
 
 if (##class(Src2.Utils).ObterSistOper() = "linux") {
   set status = $zf(-1,"chmod -R 775 "_caminhoDestino_" > /dev/null 2>&1")
   set status = $zf(-1,"chown -R cacheusr:cacheusr "_caminhoDestino_" > /dev/null 2>&1")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarJarsObjetos">
<Description>

Exporta Jars para Paginas/Objetos/Java
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer,namespace:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set tipoArquivo = ""
 for {
   set tipoArquivo = $order(^mtempSrc2PatchImport(codTerm,"objetos_jars",namespace,tipoArquivo))
   if (tipoArquivo = "") quit
   set var = $get(^mtempSrc2PatchImport(codTerm,"objetos_jars",namespace,tipoArquivo))
   
   set caminhoOrigem = $piece(var,"^",1)
   set caminhoDestino = $piece(var,"^",2)
   set nomeArquivo = $piece(var,"^",3)
   set versao = $piece(var,"^",4)
   
   set sc = ##Class(%File).CopyFile(caminhoOrigem, caminhoDestino)
   if (sc) {
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 8, "Importação do arquivo "_nomeArquivo_" em "_namespace_" (versão: "_versao_")")
   } else {
     kill tabDetalhes
     set tabDetalhes(1) = "Origem: "_caminhoOrigem
     set tabDetalhes(2) = "Destino: "_caminhoDestino
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 8, "Importação do arquivo "_nomeArquivo_" em "_namespace_" (versão: "_versao_")", .tabDetalhes)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarRelatorios">
<Description>

Importar Relatorios
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
  if ($data(^mtempSrc2PatchImport(codTerm,"relatorios","relatoriosImportar"))) {
   set var = $get(^mtempSrc2PatchImport(codTerm,"relatorios","relatoriosImportar"))
   set status = ##class(%File).CopyDir($piece(var,"^",1), $piece(var,"^",2), 1)
   if (status = $$$OK) {
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 4, "Importação dos relatórios - "_$piece(var,"^",2))
   } else {
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 4, "Importação dos relatórios - "_$piece(var,"^",2))
   }
 }
 
 set arquivo = ""
 for {
   set arquivo = $order(^mtempSrc2PatchImport(codTerm,"relatorios","relatoriosExcluir",1,arquivo))
   if (arquivo = "") quit
   set var = $get(^mtempSrc2PatchImport(codTerm,"relatorios","relatoriosExcluir",1,arquivo))
   
   if ('##class(%File).Exists($piece(var,"^",1))) continue
   
   set status = ##class(%File).Delete($piece(var,"^",1))
   if (status = $$$OK) {
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 4, "Exclusão do relatorio "_arquivo)
   } else {
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 4, "Exclusão do relatorio "_arquivo)
   }
 }
 
 set pasta = ""
 for {
   set pasta = $order(^mtempSrc2PatchImport(codTerm,"relatorios","relatoriosExcluir",2,pasta))
   if (pasta = "") quit
   set var = $get(^mtempSrc2PatchImport(codTerm,"relatorios","relatoriosExcluir",2,pasta))
   
   if ('##class(%File).DirectoryExists($piece(var,"^",1))) continue
   
   set status = ##class(%File).RemoveDirectoryTree($piece(var,"^",1))
   if (status = $$$OK) {
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 4, "Exclusão da pasta de relatorios "_pasta)
   } else {
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 4, "Exclusão da pasta de relatorios "_pasta)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarArquivosLibComponentes">
<Description>

Importa os Arquivos para Consistem/Lib/Componentes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ('$data(^mtempSrc2PatchImport(codTerm,"consistem_lib_componentes"))) quit $$$OK
 
 set tipoArquivo = ""
 for {
   set tipoArquivo = $order(^mtempSrc2PatchImport(codTerm,"consistem_lib_componentes",tipoArquivo))
   if (tipoArquivo = "") quit
   set var = $get(^mtempSrc2PatchImport(codTerm,"consistem_lib_componentes",tipoArquivo))
   
   set arquivoOrigem = $piece(var,"^",1)
   set arquivoDestino = $piece(var,"^",2)
   set versao = $piece(var,"^",3)
   set nomeArquivo = $piece(var,"^",4)
   
   set sc = ##Class(%File).CopyFile(arquivoOrigem, arquivoDestino)
   if (sc) {
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 8, "Importação do arquivo "_nomeArquivo_" (versão: "_versao_")")
   } else {
     kill tabDetalhes
     set tabDetalhes(1) = "Origem: "_arquivoOrigem
     set tabDetalhes(2) = "Destino: "_arquivoDestino
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 8, "Importação do arquivo "_nomeArquivo_" (versão: "_versao_")", .tabDetalhes)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarAplicacoesWebJava">
<Description>

Importar Aplicações Web Java
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,codAtualizacao:%Integer,&tabAplicAtualizadas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabAplicAtualizadas
 
 if ('$data(^mtempSrc2PatchImport(codTerm,"cswapp"))) quit $$$OK
 
 set tipoArquivo = ""
 for {
   set tipoArquivo = $order(^mtempSrc2PatchImport(codTerm,"cswapp",tipoArquivo))
   if (tipoArquivo = "") quit
   set var = $get(^mtempSrc2PatchImport(codTerm,"cswapp",tipoArquivo))
   
   set arquivoOrigem = $piece(var,"^",1)
   set arquivoDestino = $piece(var,"^",2)
   set versao = $piece(var,"^",3)
   set nomeArquivo = $piece(var,"^",4)
   set arquivoLog = $piece(var,"^",5)
   
   if (nomeArquivo = "") continue
   
   set tabAplicAtualizadas(tipoArquivo) = ""
   
   set sc = ##Class(%File).CopyFile(arquivoOrigem, arquivoDestino)
   if (sc) {
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 8, "Importação da Aplicação Web Java "_nomeArquivo_" (versão: "_versao_")")
   } else {
     kill tabDetalhes
     set tabDetalhes(1) = "Origem: "_arquivoOrigem
     set tabDetalhes(2) = "Destino: "_arquivoDestino
     if ($get(%objlasterror) '= "") & ($get(%objlasterror) '= 1) { set tabDetalhes(3) = $get(%objlasterror) }
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 8, "Importação da Aplicação Web Java "_nomeArquivo_" (versão: "_versao_")", .tabDetalhes)
   }
   
   set sc = ##class(Src2.WildFly).Undeploy(arquivoLog, tipoArquivo)
   if (sc = 0) {
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 8, "Undeploy da Aplicação Web Java "_nomeArquivo_" (versão: "_versao_")")
   } else {
     set sc = ##class(Src2.Utils2).ConverteArquivoTabela(arquivoLog, .tabDetalhes)
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 8, "Undeploy da Aplicação Web Java "_nomeArquivo_" (versão: "_versao_")", .tabDetalhes)
   }
   
   set sc = ##class(Src2.WildFly).Deploy(arquivoLog, tipoArquivo)
   if (sc = 0) {
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 8, "Deploy da Aplicação Web Java "_nomeArquivo_" (versão: "_versao_")")
   } else {
     set sc = ##class(Src2.Utils2).ConverteArquivoTabela(arquivoLog, .tabDetalhes)
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 8, "Deploy da Aplicação Web Java "_nomeArquivo_" (versão: "_versao_")", .tabDetalhes)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="DeployAplicacoesWebJava">
<Description>

Deploy das Aplicações Web Java não Atualizadas

OBS: Quando atualiza o serviço consistem, este método faz o deploy das aplicações existentes
     e que não foram atualizadas.
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,codAtualizacao:%Integer,&tabAplicAtualizadas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if '$data(^mtempSrc2PatchImport(codTerm,"consistem_server")) quit $$$OK
 
 set var = $get(^mtempSrc2PatchImport(codTerm,"consistem_server"))
 
 set arquivoLog = $piece(var,"^",6)
 
 set sc = ##class(Src2.PatchUtils).ObterAplicacoesWeb(.tabAplicacoesWeb)
 
 set aplicacaoWeb = ""
 for {
   set aplicacaoWeb = $order(tabAplicacoesWeb(aplicacaoWeb))
   if (aplicacaoWeb = "") quit
   
   if ($data(tabAplicAtualizadas(aplicacaoWeb))) continue
   
   set nomeArquivo = aplicacaoWeb_".war"
   
   set sc = ##class(Src2.WildFly).Undeploy(arquivoLog, aplicacaoWeb)
   if (sc = 0) {
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 8, "Undeploy da Aplicação Web Java "_nomeArquivo)
   } else {
     set sc = ##class(Src2.Utils2).ConverteArquivoTabela(arquivoLog, .tabDetalhes)
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 8, "Undeploy da Aplicação Web Java "_nomeArquivo, .tabDetalhes)
   }
   
   set sc = ##class(Src2.WildFly).Deploy(arquivoLog, aplicacaoWeb)
   if (sc = 0) {
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 8, "Deploy da Aplicação Web Java "_nomeArquivo)
   } else {
     set sc = ##class(Src2.Utils2).ConverteArquivoTabela(arquivoLog, .tabDetalhes)
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 8, "Deploy da Aplicação Web Java "_nomeArquivo, .tabDetalhes)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterAplicacoesWeb">
<Description>

Obter Aplicações Web
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabAplicacoesWeb:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabAplicacoesWeb
 
 set msgsc = ##class(Src2.Utils).ObterConsistemHome(.consistemHome)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set rs = ##class(%ResultSet).%New("%File:FileSet")
 do rs.Execute(consistemHome_barra_"cswapp","*.war")
 while rs.Next() {
   set arquivo = rs.Get("Name")
   set nomeArquivo = $piece(rs.Get("ItemName"),".war",1)
   if (nomeArquivo = "") continue
   set tabAplicacoesWeb(nomeArquivo) = arquivo
 }
 do rs.%Close()
 set rs = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarArquivosTemporarios">
<Description>

Importa os Arquivos Versionados Temporários
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ('$data(^mtempSrc2PatchImport(codTerm,"patch_temp"))) quit $$$OK
 
 set tipoArquivo = ""
 for {
   set tipoArquivo = $order(^mtempSrc2PatchImport(codTerm,"patch_temp",tipoArquivo))
   if (tipoArquivo = "") quit
   set var = $get(^mtempSrc2PatchImport(codTerm,"patch_temp",tipoArquivo))
   
   set arquivo = $piece(var,"^",1)
   set pastaTemp = $piece(var,"^",2)
   set versao = $piece(var,"^",3)
   set nomeArquivo = $piece(var,"^",4)
   
   set sc = ##class(%File).CreateDirectoryChain(pastaTemp)
   
   set rotinaProcedimento = $get(^mtempSrc2PatchImport(codTerm,"patch_temp",tipoArquivo,1))
   
   set resultado = "^mtempSrc2PatchImport("""_codTerm_""",""sc"")"
   
   set procedimento = "set "_resultado_" = $$"_rotinaProcedimento_"("""_codTerm_""","""_arquivo_""","""_pastaTemp_""")"
   
   try {
     xecute procedimento
     set sc = $get(^mtempSrc2PatchImport(codTerm,"sc"))
     if (sc = 1) {
       set sc2 = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 8, "Importação do arquivo "_nomeArquivo_" (versão: "_versao_")")
     } else {
       kill tabDetalhes
       set tabDetalhes(1) = "Arquivo: "_arquivo
       set tabDetalhes(2) = "Versão: "_versao
       set tabDetalhes(3) = "Rotina de Procedimento: "_rotinaProcedimento
       set tabDetalhes(4) = "Erro: "_##class(Src2.Utils).ObterMensagemStatusCode(sc)
       set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 8, "Importação do arquivo "_nomeArquivo_" (versão: "_versao_")", .tabDetalhes)
     }
   } catch {
     kill tabDetalhes
     set tabDetalhes(1) = "Arquivo: "_arquivo
     set tabDetalhes(2) = "Versão: "_versao
     set tabDetalhes(3) = "Rotina de Procedimento: "_rotinaProcedimento
     set tabDetalhes(4) = "Erro: "_$zerror
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 8, "Importação do arquivo "_nomeArquivo_" (versão: "_versao_")", .tabDetalhes)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarKeystore">
<Description>

Importar Keystore
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ($data(^mtempSrc2PatchImport(codTerm,"SerasaHttpKeystore"))) {
   set var = $get(^mtempSrc2PatchImport(codTerm,"SerasaHttpKeystore"))
   set sc = ##Class(%File).CopyFile($piece(var,"^",1),$piece(var,"^",2))
   if (sc) {
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 9, "Importação do arquivo serasahttp.keystore")
   } else {
     kill tabDetalhes
     set tabDetalhes(1) = "Origem: "_$piece(var,"^",1)
     set tabDetalhes(2) = "Destino: "_$piece(var,"^",2)
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 9, "Importação do arquivo serasahttp.keystore", .tabDetalhes)
   }
 }
 
 if ($data(^mtempSrc2PatchImport(codTerm,"ServerProducaoKeystore"))) {
   set var = $get(^mtempSrc2PatchImport(codTerm,"ServerProducaoKeystore"))
   set sc = ##Class(%File).CopyFile($piece(var,"^",1),$piece(var,"^",2))
   if (sc) {
     set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 9, "Importação do arquivo server_producao.keystore")
   } else {
     kill tabDetalhes
     set tabDetalhes(1) = "Origem: "_$piece(var,"^",1)
     set tabDetalhes(2) = "Destino: "_$piece(var,"^",2)
     set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 9, "Importação do arquivo server_producao.keystore", .tabDetalhes)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarReleaseNotes">
<Description>

Importar Release Notes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (tarefa, menu) = ""
 for {
   set tarefa = $order(^mtempSrc2PatchImport(codTerm,"notes",tarefa))
   if (tarefa = "") quit
   set var = $get(^mtempSrc2PatchImport(codTerm,"notes",tarefa,2))
   set ^%CSW1ATUNOTES(1,tarefa) = codAtualizacao_"^"_$get(^mtempSrc2PatchImport(codTerm,"notes",tarefa,1))
   merge ^%CSW1ATUNOTES(1,tarefa,2) = ^mtempSrc2PatchImport(codTerm,"notes",tarefa,3)
   merge tabMenus = ^mtempSrc2PatchImport(codTerm,"notes",tarefa,3)
   set texto = ""
   for cont = 1:1:$length(var,$char(10)) {
     set ^%CSW1ATUNOTES(1,tarefa,1,cont) = $piece(var,$char(10),cont)
   }
   for {
     set menu = $order(^%CSW1ATUNOTES(1,tarefa,2,menu))
     if (menu = "") quit
     set ^%CSW1ATUNOTES(2,menu) = codAtualizacao
   }
   set ^%CSW1ATULOG(1,codAtualizacao,2,tarefa) = ""
 }
 
 if $data(tabMenus) {
   merge ^%CSW1ATULOG(1,codAtualizacao,3) = tabMenus
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarMenu">
<Description>

Importar Menu
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer,sistema:%Integer,tipoPatch:%String,versaoLog:%String,revisao:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ('$data(^mtempSrc2PatchImport(codTerm,"menu"))) quit $$$OK
 
 set var = $get(^mtempSrc2PatchImport(codTerm,"menu"))
 
 set msgsc = ##class(Src2.PatchUtils2).RegistrarAtualizacaoOutraVersao(codAtualizacao, tipoPatch, sistema, 3, sistema, versaoLog, revisao)
 if (msgsc '= $$$OK) {
   set msgsc = ##class(Src2.PatchUtils).GerarLogAviso(codAtualizacao, 10, msgsc)
   quit $$$OK
 }
 
 set arquivoMenu = $piece(var,"^",1)
 
 set sc = ##class(Src2.Menu.Geral).ImportarMenu(arquivoMenu, sistema)
 
 set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 10, "Importação do menu")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="LimparDiretorio">
<Description>

Remove Todos os Arquivos e Pastas de um Diretorio

set sc = ##class(Src2.PatchUtils).LimparDiretorio("C:\dados\consistem\atualizacao\temp")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminho:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set rs = ##class(%ResultSet).%New("%File:FileSet")
 do rs.Execute(caminho)
 while (rs.Next()) {
   set type = rs.Get("Type")
   set caminhoItem = caminho_barra_rs.Get("ItemName")
   if (type = "F") {
     set sc = ##Class(%File).Delete(caminhoItem)
   } elseif (type = "D") {
     set sc = ##class(%File).RemoveDirectoryTree(caminhoItem)
   }
 }
 do rs.%Close()
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarRotina">
<Description>

Selecionar Rotina

operacao = 1 - Importar
           2 - Excluir</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,sistema:%String,barra:%String,caminhoPatch:%String,operacao:%String,rotina:%String,arquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (sistema = "") ! (arquivo = "") quit $$$OK
 
 set arquivo = caminhoPatch_barra_"rotinas"_barra_$translate(arquivo,"/\",barra_barra)
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
   if (namespace = "") quit
   
   set sc = ##class(Src2.PatchUtils).ValidarSelecaoNamespace(sistema,namespace,1,rotina)
   if (sc = $$$OK) {
     // Importar/Excluir Rotina
     set ^mtempSrc2PatchImport(codTerm,"rotinas",namespace,operacao,rotina) = arquivo
     // Fazer backup
     set ^mtempSrc2PatchImport(codTerm,"rotinas",namespace,3,rotina_".*") = ""
   }
   
   if (operacao = 1) {
     set sc = ##class(Src2.PatchUtils).ValidarSelecaoNamespace(sistema,namespace,6,rotina)
     if (sc = $$$OK) {
       // Gerar Página CSP
       set ^mtempSrc2PatchImport(codTerm,"rotinas",namespace,4,rotina) = ""
     }
   }
   
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarClasse">
<Description>

Selecionar Classe

operacao = 1 - Importar
           2 - Excluir</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,sistema:%String,barra:%String,caminhoPatch:%String,operacao:%String,classe:%String,arquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (sistema = "") ! (arquivo = "") quit $$$OK
 
 set arquivo = caminhoPatch_barra_"classes"_barra_$translate(arquivo,"/\",barra_barra)
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
   if (namespace = "") quit
   
   set sc = ##class(Src2.PatchUtils).ValidarSelecaoNamespace(sistema,namespace,3,classe)
   if $$$ISERR(sc) continue
   
   set ^mtempSrc2PatchImport(codTerm,"classes",namespace,operacao,classe) = arquivo
   set ^mtempSrc2PatchImport(codTerm,"classes",namespace,3,classe_".cls") = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarDiversosXml">
<Description>

Selecionar Diversos Xml
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,sistema:%String,barra:%String,caminhoPatch:%String,flag:%String,arquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (sistema = "") ! (flag '= 1) quit $$$OK
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
   if (namespace = "") quit
   
   set sc = ##class(Src2.PatchUtils).ValidarSelecaoNamespace(sistema,namespace,4)
   if $$$ISERR(sc) continue
   
   set ^mtempSrc2PatchImport(codTerm,"diversosXml",namespace) = caminhoPatch_barra_"outros"_barra_"diversos.xml"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarPaginasObjetos">
<Description>

Selecionar Paginas/Objetos
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,sistema:%String,barra:%String,caminhoPatch:%String,flag:%String,&tabAplicacoes:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (sistema = "") ! (flag '= 1) quit $$$OK
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
   if (namespace = "") quit
   
   set sc = ##class(Src2.PatchUtils).ValidarSelecaoNamespace(sistema,namespace,5)
   if $$$ISERR(sc) continue
   
   set caminhoAplicWeb = $piece($get(tabAplicacoes(namespace)),"^",1)
   
   set ^mtempSrc2PatchImport(codTerm,"paginas",namespace) = caminhoPatch_barra_"paginas"_"^"_caminhoAplicWeb_"^"_caminhoPatch_barra_"backupjars"
   set ^mtempSrc2PatchImport(codTerm,"permissao","pasta",caminhoAplicWeb) = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterConfigSerasaHttp">
<Description>

Obter Configuração serasahttp.keystore

set sc = ##class(Src2.PatchUtils).ObterConfigSerasaHttp(.arquivo,,.pastaArquivo)
set sc = ##class(Src2.PatchUtils).ObterConfigSerasaHttp(.arquivo, "C:\consistem", .pastaArquivo)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&arquivo:%String,consistemHome:%String="",&pastaArquivo:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (arquivo, codEmp) = ""
 for {
   set codEmp = $order(^CCSCNF(codEmp))
   if (codEmp = "") quit
   set arquivo = $piece($get(^CCSCNF(codEmp,4,1)),"^",1)
   if (arquivo '= "") quit
 }
 
 if (arquivo = "") , (consistemHome '= "") {
   set barra = ##class(Src2.Utils).ObterBarraSistOper()
   set arquivo = consistemHome_barra_"lib"_barra_"keystores"_barra_"serasahttp.keystore"
 }
 
 if (arquivo = "") {
   set arquivo = "/consistem/lib/keystores/serasahttp.keystore"
   if (##class(Src2.Utils).ObterSistOper() = "windows") {
     set arquivo = "C:\consistem\lib\keystores\serasahttp.keystore"
   }
 }
 
 set pastaArquivo = $piece(arquivo,"serasahttp.keystore",1)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterConfigServerProducao">
<Description>

Obter Configuração server_producao.keystore

set sc = ##class(Src2.PatchUtils).ObterConfigServerProducao(.arquivo, , .pastaArquivo)
set sc = ##class(Src2.PatchUtils).ObterConfigServerProducao(.arquivo, "C:\consistem", .pastaArquivo)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&arquivo:%String,consistemHome:%String="",&pastaArquivo:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (arquivo, codEmp) = ""
 for {
   set codEmp = $order(^FTBNFE(codEmp))
   if (codEmp = "") quit
   set arquivo = $piece($get(^FTBNFE(codEmp)),"^",5)
   if (arquivo '= "") quit
 }
 
 if (arquivo = "") , (consistemHome '= "") {
   set barra = ##class(Src2.Utils).ObterBarraSistOper()
   set arquivo = consistemHome_barra_"lib"_barra_"keystores"_barra_"server_producao.keystore"
 }
 
 if (arquivo = "") {
   set arquivo = "/consistem/lib/keystores/server_producao.keystore"
   if (##class(Src2.Utils).ObterSistOper() = "windows") {
     set arquivo = "C:\consistem\lib\keystores\server_producao.keystore"
   }
 }
 
 set pastaArquivo = $piece(arquivo,"server_producao.keystore",1)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarSerasaHttp">
<Description>

Selecionar serasahttp.keystore
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,barra:%String,caminhoPatch:%String,flag:%String,consistemHome:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (flag '= 1) quit $$$OK
 
 set sc = ##class(Src2.PatchUtils).ObterConfigSerasaHttp(.destino, consistemHome)
 if $$$ISERR(sc) quit $$$OK
 
 set pastaDestino = ##class(Src2.Utils).ObterCaminhoArquivo(destino)
 if (pastaDestino = "") quit $$$OK
 
 set origem = caminhoPatch_barra_"outros"_barra_"serasahttp.keystore"
 
 set ^mtempSrc2PatchImport(codTerm,"SerasaHttpKeystore") = origem_"^"_destino
 
 set ^mtempSrc2PatchImport(codTerm,"permissao","pasta",pastaDestino) = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarServerProducao">
<Description>

Selecionar server_producao.keystore
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,barra:%String,caminhoPatch:%String,flag:%String,consistemHome:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (flag '= 1) quit $$$OK
 
 set sc = ##class(Src2.PatchUtils).ObterConfigServerProducao(.destino, consistemHome)
 if $$$ISERR(sc) quit $$$OK
 
 set pastaDestino = ##class(Src2.Utils).ObterCaminhoArquivo(destino)
 if (pastaDestino = "") quit $$$OK
 
 set origem = caminhoPatch_barra_"outros"_barra_"server_producao.keystore"
 
 set ^mtempSrc2PatchImport(codTerm,"ServerProducaoKeystore") = origem_"^"_destino
 
 set ^mtempSrc2PatchImport(codTerm,"permissao","pasta",pastaDestino) = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarParaObjetosJava">
<Description>

Selecionar Arquivo para Objetos/Java
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,sistema:%String,barra:%String,caminhoPatch:%String,&tabAplicacoes:%String,tipoArquivo:%String,versao:%String,nomeArquivo:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (versao = "") quit $$$OK
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
   if (namespace = "") quit
   
   set sc = ##class(Src2.PatchUtils).ValidarSelecaoNamespace(sistema,namespace,5)
   if $$$ISERR(sc) continue
   
   set caminhoAplicWeb = $piece($get(tabAplicacoes(namespace)),"^",1)
   if (caminhoAplicWeb = "") continue
   
   set caminhoOrigem = caminhoPatch_barra_"outros"_barra_nomeArquivo
   set caminhoDestino = caminhoAplicWeb_"objetos"_barra_"java"_barra_nomeArquivo
   
   set ^mtempSrc2PatchImport(codTerm,"objetos_jars",namespace,tipoArquivo) = caminhoOrigem_"^"_caminhoDestino_"^"_nomeArquivo_"^"_versao
   set ^mtempSrc2PatchImport(codTerm,"permissao","pasta",caminhoAplicWeb) = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarAplicacaoWebJava">
<Description>

Selecionar Aplicação Web Java
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,sistema:%String,barra:%String,caminhoPatch:%String,consistemHome:%String,tipoArquivo:%String,versao:%String,nomeArquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (versao = "") quit $$$OK
 
 set origem = caminhoPatch_barra_"outros"_barra_nomeArquivo
 
 set pastaDestino = consistemHome_barra_"cswapp"
 
 set destino = pastaDestino_barra_nomeArquivo
 
 set arquivoLog = caminhoPatch_barra_"install.log"
 
 set ^mtempSrc2PatchImport(codTerm,"cswapp",tipoArquivo) = origem_"^"_destino_"^"_versao_"^"_nomeArquivo_"^"_arquivoLog
 
 set ^mtempSrc2PatchImport(codTerm,"permissao","pasta",pastaDestino) = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarArquivoLibComponentes">
<Description>

Selecionar Arquivo para Consistem/Lib/Componentes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,sistema:%String,barra:%String,caminhoPatch:%String,consistemHome:%String,tipoArquivo:%String,versao:%String,nomeArquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (versao = "") quit $$$OK
 
 set origem = caminhoPatch_barra_"outros"_barra_nomeArquivo
 
 set pastaComponentes = ##class(Src2.Utils2).ObterCaminhoComponentes(consistemHome)
 
 set destino = pastaComponentes_barra_nomeArquivo
 
 set ^mtempSrc2PatchImport(codTerm,"consistem_lib_componentes",tipoArquivo) = origem_"^"_destino_"^"_versao_"^"_nomeArquivo
 
 set ^mtempSrc2PatchImport(codTerm,"permissao","pasta",pastaComponentes) = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarConsistemServerRpm">
<Description>

Selecionar consistem_server.rpm
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,sistema:%String,barra:%String,caminhoPatch:%String,consistemHome:%String,tipoArquivo:%String,versao:%String,nomeArquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (versao = "") quit $$$OK
 
 set arquivoRpm = caminhoPatch_barra_"outros"_barra_nomeArquivo
 
 set caminho = caminhoPatch_barra_"outros"
 
 set caminhoTemp = caminhoPatch_barra_"temp"
 
 set arquivoLog = caminhoPatch_barra_"install.log"
 
 set ^mtempSrc2PatchImport(codTerm,"consistem_server") = caminho_"^"_arquivoRpm_"^"_versao_"^"_caminhoTemp_"^"_consistemHome_"^"_arquivoLog_"^"_nomeArquivo
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarArquivosTemporarios">
<Description>

Selecionar Arquivos Temporarios
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,sistema:%String,barra:%String,caminhoPatch:%String,consistemHome:%String,tipoArquivo:%String,versao:%String,nomeArquivo:%String,rotinaProcedimento:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (versao = "") ! (rotinaProcedimento = "") quit $$$OK
 
 set arquivo = caminhoPatch_barra_"outros"_barra_nomeArquivo
 
 set pastaTemp = caminhoPatch_barra_"temp"_barra_tipoArquivo
 
 set ^mtempSrc2PatchImport(codTerm,"patch_temp",tipoArquivo) = arquivo_"^"_pastaTemp_"^"_versao_"^"_nomeArquivo
 set ^mtempSrc2PatchImport(codTerm,"patch_temp",tipoArquivo,1) = rotinaProcedimento
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterAplicacoesCsp">
<Description>

Obter Aplicacoes Csp

set sc = ##class(Src2.PatchUtils).ObterAplicacoesCsp("csw", .tabAplicacoes)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,&tabAplicacoes:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgError = $$$OK
 
 set namespaceOrigem = $znspace
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
   if (namespace = "") quit
   
   set sc1 = ##class(Src2.PatchUtils).ValidarSelecaoNamespace(sistema,namespace,5)
   set sc2 = ##class(Src2.PatchUtils).ValidarSelecaoNamespace(sistema,namespace,6)
   
   if (sc1 = $$$OK) ! (sc2 = $$$OK) {
     znspace namespace
     set msgsc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb(, , 1, .caminhoAplicWeb, .caminhoAplicWebRed)
     znspace namespaceOrigem
     
     if (msgsc '= $$$OK) {
       set msgError = $$$ERROR(10000,msgsc)
       quit
     }
     
     set tabAplicacoes(namespace) = caminhoAplicWeb_"^"_caminhoAplicWebRed
   }
 }
 
 quit msgError
]]></Implementation>
</Method>

<Method name="ValidarPermissoes">
<Description>

Validar Permissoes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set msgError = ""
 
 set pasta = ""
 for {
   set pasta = $order(^mtempSrc2PatchImport(codTerm,"permissao","pasta",pasta))
   if (pasta = "") quit
   
   set pasta2 = pasta
   
   if ($extract(pasta2,$length(pasta2)) = barra) {
     set $extract(pasta2,$length(pasta2)) = ""
   }
   
   if ('##class(Src2.Utils2).CriarPasta(pasta2_barra_"teste")) {
     set msgError = $$$ERROR(10000,"Não foi possível acessar a pasta "_pasta2_"!")
     quit
   }
   
   set status = ##class(%File).RemoveDirectoryTree(pasta2_barra_"teste")
 }
 
 if (msgError '= "") quit msgError
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarRelatoriosImportar">
<Description>

Selecionar Relatorios - Importar
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,barra:%String,caminhoPatch:%String,consistemHome:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set pastaRelatorios = consistemHome_barra_"lib"_barra_"relatorios"
 set ^mtempSrc2PatchImport(codTerm,"relatorios","relatoriosImportar") = caminhoPatch_barra_"relatorios"_"^"_pastaRelatorios
 set ^mtempSrc2PatchImport(codTerm,"permissao","pasta",pastaRelatorios) = ""
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarRelatoriosExcluir">
<Description>

Selecionar Relatorios - Excluir
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,barra:%String,tipo:%Integer,item:%String,&consistemHome:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set pastaRelatorios = consistemHome_barra_"lib"_barra_"relatorios"
 set ^mtempSrc2PatchImport(codTerm,"relatorios","relatoriosExcluir",tipo,item) = pastaRelatorios_barra_$translate(item,"/\",barra_barra)
 set ^mtempSrc2PatchImport(codTerm,"permissao","pasta",pastaRelatorios) = ""
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SelecionarReleaseNotes">
<Description>

Selecionar Release Notes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,versao:%String,tarefa:%String,tipo:%Integer,sistema:%Integer,funcionalidade:%Integer,menus:%String,descricao:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (tarefa = "") quit $$$OK
 
 set sc = ##class(Src2.Utils).ConvertStrTab(menus, .tabMenus, "/")
 
 set ^mtempSrc2PatchImport(codTerm,"notes",tarefa,1) = versao_"^"_tipo_"^"_sistema_"^"_funcionalidade
 set ^mtempSrc2PatchImport(codTerm,"notes",tarefa,2) = descricao
 merge ^mtempSrc2PatchImport(codTerm,"notes",tarefa,3) = tabMenus
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterNamespacesAtualizacao">
<Description>

Obter Namespaces com Configuração de Atualização

set sc = ##class(Src2.PatchUtils).ObterNamespacesAtualizacao(.tabNamespace)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>tabNamespace:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabNamespace
 
 set (sistema, namespace) = ""
 for {
   set sistema = $order(^%CSW1ATUCONF(3,sistema))
   if (sistema = "") quit
   for {
     set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
     if (namespace = "") quit
     set tabNamespace(namespace) = ""
   }
 }
 
 set sc = ##class(Src2.PatchUtils).ObterNamespacesProcedimento(.tabNspProced)
 
 merge tabNamespace = tabNspProced
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterNamespacesProcedimento">
<Description>

Obter Namespaces com Execução de Procedimento

set sc = ##class(Src2.PatchUtils).ObterNamespacesProcedimento(.tabNspProced, .tabNspProced2)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>tabNspProced:%String,tabNspProced2:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabNspProced
 
 set tabTiposNamespace("sistemas") = ""
 set tabTiposNamespace("teste1") = ""
 set tabTiposNamespace("teste2") = ""
 set tabTiposNamespace("%sys") = ""
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(4,namespace))
   if (namespace = "") quit
   
   set tipoNamespace = $piece($get(^%CSW1ATUCONF(4,namespace)),"^",1)
   if (tipoNamespace = "") continue
   
   if ($data(tabTiposNamespace(tipoNamespace))) {
     set tabNspProced(namespace) = ""
     set tabNspProced2(tipoNamespace,namespace) = ""
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarNamespacesProcedimento">
<Description>

Validar Namespaces com Execução de Procedimento

set sc = ##class(Src2.PatchUtils).ValidarNamespacesProcedimento()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 // Configura dos Namespaces Abaixo Automaticamente
 set tabNspConfig(1,"USER") = "sem_procedimento"
 set tabNspConfig(1,"SAMPLES") = "sem_procedimento"
 set tabNspConfig(1,"TRABALHO") = "sem_procedimento"
 set tabNspConfig(1,"RESTORE") = "sem_procedimento"
 set tabNspConfig(1,"DOCBOOK") = "sem_procedimento"
 set tabNspConfig(1,"SISTEMASLOG") = "sem_procedimento"
 
 // Configura dos Namespaces que Iniciam com a Expressão Abaixo Automaticamente
 set tabNspConfig(2,"CTB") = "sistemas"
 set tabNspConfig(2,"CONTAB") = "sistemas"
 set tabNspConfig(2,"RCONNECT") = "sem_procedimento"
 set tabNspConfig(2,"MOVTECH") = "sem_procedimento"
 
 merge tabNamespaces = ^%SMConf("DirOutIn")
 
 set namespace = ""
 for {
   set namespace = $order(tabNamespaces(namespace))
   if (namespace = "") quit
   
   if ($data(^%CSW1ATUCONF(4,namespace))) continue
   
   if ($data(tabNspConfig(1,namespace))) {
     set ^%CSW1ATUCONF(4,namespace) = $get(tabNspConfig(1,namespace))
     continue
   }
   
   set (namespace2, flag) = ""
   for {
     set namespace2 = $order(tabNspConfig(2,namespace2))
     if (namespace2 = "") quit
     if ($extract(namespace,1,$length(namespace2)) = namespace2) {
       set ^%CSW1ATUCONF(4,namespace) = $get(tabNspConfig(2,namespace2))
       set flag = 1
       quit
     }
   }
   
   if (flag) continue
   
   set tabNspSemDef(namespace) = ""
 }
 
 if ($data(tabNspSemDef)) quit $$$ERROR(10000,"Namespaces sem definição para execução de procedimentos! Favor entrar em contato com o Suporte Consistem. ("_##class(Src2.Utils).ConvertTabStr(.tabNspSemDef)_")")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarVersaoPatch">
<Description>

Valida a Versão do Controle de Fonte nos Namespaces

set sc = ##class(Src2.PatchUtils).ValidarVersaoPatch(1, .tabNamespace)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[versaoRef:%Integer,&tabNamespace:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabNamespace
 
 set sc = ##class(Src2.PatchUtils).ObterNamespacesAtualizacao(.tabNamespace)
 
 set flag = ""
 
 set namespaceOrigem = $znspace
 
 set namespace = ""
 for {
   set namespace = $order(tabNamespace(namespace))
   if (namespace = "") quit
   znspace namespace
   set $ztrap = "ValidarVersaoPatchErro"
   set versaoSrc2 = ##class(Src2.Patch).ObterVersaoPatchSrc()
   set $ztrap = ""
   if (versaoSrc2 < versaoRef) {
     set flag = 1
     quit
   }
   continue
ValidarVersaoPatchErro
   set $ztrap = ""
   set flag = 1
 }
 
 znspace namespaceOrigem
 
 if (flag) quit $$$ERROR(10000,"Classes do atualizador de patchs desatualizadas!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDescricaoSistema">
<Description>

Obter Descrição do Sistema

write ##class(Src2.PatchUtils).ObterDescricaoSistema("cswutil")
write ##class(Src2.PatchUtils).ObterDescricaoSistema("teste")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sistema:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils).ObterTabSistemas(.tabSistemas)
 if ($data(tabSistemas(sistema))) quit $get(tabSistemas(sistema))
 quit sistema
]]></Implementation>
</Method>

<Method name="ObterTabSistemas">
<Description>

Obter Tabela de Sistemas
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabSistemas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabSistemas
 set tabSistemas("csw") = "CSW"
 set tabSistemas("cswutil") = "Componentes CSW"
 set tabSistemas("gercon") = "Gercon"
 set tabSistemas("gatilho") = "Gatilhos"
 set tabSistemas("custinter") = "Customização Consistem"
 set tabSistemas("customax") = "Customax"
 set tabSistemas("especifico") = "Programas Específicos"
 set tabSistemas("adapcon") = "Adapcon"
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabTiposPatchs">
<Description>

Obter Tabela de Tipos de Patchs
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabTipos:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabTipos
 set tabTipos(1) = "Atualização"
 set tabTipos(2) = "Reenvio de Itens"
 set tabTipos(3) = "Envio de Itens"
 set tabTipos(4) = "Envio de Itens (Versão)"
 set tabTipos(5) = "Snapshot"
 set tabTipos(6) = "Atualização Completa"
 set tabTipos(7) = "Temporário"
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabTiposDocumentos">
<Description>

Obter Tabela de Tipos de Documentos
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabTipos:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabTipos
 set tabTipos(1) = "Chamado"
 set tabTipos(2) = "Projeto"
 set tabTipos(3) = "Atendimento"
 set tabTipos(4) = "Tarefa"
 set tabTipos(5) = "Chamado Adapcon"
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabStatus">
<Description>

Obter Tabela de Status do Patch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabStatus:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabStatus
 set tabStatus(0) = "Em processamento"
 set tabStatus(1) = "Disponível para Download"
 set tabStatus(2) = "Pendente para Atualização"
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabTiposInstancias">
<Description>

Obter Tabela de Tipos de Instancias no Wildfly
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabInstancias:%String,&strInstancias:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabInstancias
 set tabInstancias(1) = "1 - Minima"     ; 1 Cluster
 set tabInstancias(2) = "2 - Media"      ; 2 Clusters
 set tabInstancias(3) = "3 - Completa"   ; 4 Clusters
 set strInstancias= "1 - Minima / 2 - Media / 3 - Completa"
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterVersaoProdutoCliente">
<Description>

Obter Versao do Produto

set sc = ##class(Src2.PatchUtils).ObterVersaoProdutoCliente("csw", .versao)
set sc = ##class(Src2.PatchUtils).ObterVersaoProdutoCliente("cswutil", .versao)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,&versao:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set versao = ""
 if ('$data(^%CSW1ATUCONF(3,sistema))) quit $$$ERROR(10000,"Sistema '"_sistema_"' não encontrado!")
 set versao = $piece($get(^%CSW1ATUCONF(3,sistema)),"^",1)
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterStrVersoesProdutoCliente">
<Description>

Obter String de Sistemas/Versao

set sc = ##class(Src2.PatchUtils).ObterStrVersoesProdutoCliente(.strSistemasVersoes)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&strSistemasVersoes:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (sistema, strSistemasVersoes)=""
 for {
   set sistema = $order(^%CSW1ATUCONF(3,sistema))
   if (sistema = "") quit
   set versao = $piece($get(^%CSW1ATUCONF(3,sistema)),"^",1)
   
   if (versao '= "") {
     set strSistemasVersoes = strSistemasVersoes_$select(strSistemasVersoes="":"",1:"^")_sistema_";"_versao
   }
 }
 
 if (strSistemasVersoes = "") quit $$$ERROR(10000,"Nenhum sitema com versão não encontrado!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AlterarVersaoSistemaZZZ">
<Description>

Altera a Versao do Sistema pela Rotina ZZZ
OBS: Método utilizado pelo atualizar geral de versão
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sistema:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if '$data(^%CSW1ATUCONF(3,sistema)) quit $$$OK
 
 set $ztrap = "AlterarVersaoSistemaZZZErro"
 
 if (sistema = "csw") {
   set versao = $$ObterVersaoRelease^CCCSWzzz()
   if (versao '= "") {
     set sc = ##class(Src2.PatchUtils).AlterarVersaoSistema("csw", versao)
   }
 }
 
 if (sistema = "cswutil") {
   set versao = $$ObterVersaoRelease^%CSzzz()
   if (versao '= "") {
     set sc = ##class(Src2.PatchUtils).AlterarVersaoSistema("cswutil", versao)
   }
 }
 
 set $ztrap = ""
 
 quit $$$OK
 
AlterarVersaoSistemaZZZErro	;
 set $ztrap = ""
 write !,"erro"
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AlterarVersaoSistema">
<Description>

Altera a Versao do Sistema

set sc = ##class(Src2.PatchUtils).AlterarVersaoSistema("csw", "6.3.3", 1)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sistema:%String,versao:%String,codAtualizacao:%String="",rotinaVersao:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ('$data(^%CSW1ATUCONF(3,sistema))) quit $$$OK
 
 set versaoAnterior = $piece($get(^%CSW1ATUCONF(3,sistema)),"^",1)
 
 set $piece(^%CSW1ATUCONF(3,sistema),"^",1) = versao
 set $piece(^%CSW1ATUCONF(3,sistema),"^",2) = ""
 if (rotinaVersao '= "") {
   set $piece(^%CSW1ATUCONF(3,sistema),"^",3) = rotinaVersao
 }
 
 if $data(^%CSW1ATUCONF(3,sistema)) {
   set codSeq = $order(^%CSW1ATUCONF(3,sistema,2,""),-1) + 1
   set ^%CSW1ATUCONF(3,sistema,2,codSeq) = versaoAnterior_"^"_versao_"^"_codAtualizacao_"^"_$horolog
 }
 
 set sc = ##class(Src2.PatchUtils).AtualizarRotinasVersoes()
 
 set sc = ##class(Src2.PatchUtils2).AtualizarIndexHtml(sistema)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarRotinasVersoes">
<Description>

Atualizar Rotinas de Versoes

set sc = ##class(Src2.Teste).AtualizarRotinasVersoes()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (sistema, namespace) = ""
 for {
   set sistema = $order(^%CSW1ATUCONF(3,sistema))
   if (sistema = "") quit
   set var = $get(^%CSW1ATUCONF(3,sistema))
   set rotina = $piece(var,"^",3)
   if (rotina = "") continue
   for {
     set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
     if (namespace = "") quit
     set sc = ##class(Src2.PatchUtils).ValidarSelecaoNamespace(sistema,namespace,1,rotina)
     if (sc '= $$$OK) continue
     set dataHora = ""
     set codSeq = $order(^%CSW1ATUCONF(3,sistema,2,""),-1)
     if (codSeq '= "") {
       set dataHora = $piece($get(^%CSW1ATUCONF(3,sistema,2,codSeq)),"^",4)
     }
     if (dataHora = "") set dataHora = $horolog
     set tabAtu(namespace,rotina) = $piece(var,"^",1)_"^"_dataHora
   }
 }
 
 set namespaceOrigem = $znspace
 
 set (namespace, rotina) = ""
 for {
   set namespace = $order(tabAtu(namespace))
   if (namespace = "") quit
   for {
     set rotina = $order(tabAtu(namespace,rotina))
     if (rotina = "") quit
     set var = $get(tabAtu(namespace,rotina))
     znspace namespace
     set sc = ##class(Src2.Utils2).GerarRotinaZZZ(rotina, $piece(var,"^",1), , "Atualizador Consistem", $zdatetime($piece(var,"^",2),4))
   }
 }
 
 znspace namespaceOrigem
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterEnderecosWebServices">
<Description>

Obter Endereços dos WebServices

set sc = ##class(Src2.PatchUtils).ObterEnderecosWebServices(.servidor, .namespace, .usuario, .senha, .location)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&servidor:%String,&namespace:%String,&usuario,&senha,&location:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (servidor, namespace, location) = ""
 
 set var = $get(^%CSW1ATUCONF(1))
 
 set servidor = $piece(var,"^",1)
 
 set namespace = $piece(var,"^",2)
 
 if (servidor = "") {
   set tabServidor(1) = "gercon.consistem.com.br"
   set tabServidor(2) = "gercon1.consistem.com.br"
   set tabServidor(3) = "177.99.185.248"
   set tabServidor(4) = "189.22.81.38"
   
   set servidor = $piece(var,"^",3)
   
   set dataHoraVerificacao = $piece(var,"^",4)
   if (dataHoraVerificacao = "") set dataHoraVerificacao = $horolog
   
   set sc = ##class(Src2.Utils).CalcularPeriodo(dataHoraVerificacao, $horolog, , , .minutos)
   
   if (servidor = "") ! (minutos > 10) {
     set httprequest = ##Class(%Net.HttpRequest).%New()
     set httprequest.Timeout = 5
     
     for i = 1:1:4 {
       set httprequest.Server = $get(tabServidor(i))
       if httprequest.Post() {
         set servidor = $get(tabServidor(i))
         set dataHoraVerificacao = $horolog
         quit
       }
     }
     
     set $piece(^%CSW1ATUCONF(1),"^",3) = servidor
     set $piece(^%CSW1ATUCONF(1),"^",4) = dataHoraVerificacao
     
     if (servidor = "") set servidor = $get(tabServidor(1))
   }
 }
 
 if (namespace = "") set namespace = "sistemas"
 
 set usuario = "atualizador"
 set senha = "atualizador"
 
 set location = "http://"_servidor_"/csp/"_namespace_"/br.com.consistem.gercon.service"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="DownloadPatch">
<Description>

Efetua um Download de Patch

set sc = ##class(Src2.PatchUtils).DownloadPatch("PATCH-CO-2012-09-18-14-15-17-CUSTOMAX-T4-6-2")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>idPatch:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils).ObterEnderecosWebServices(.servidor)
 
 set nomArqZip = idPatch_".cswpatch"
 set nomArqXML = idPatch_".xml"
 set folderDownload = ##class(Src2.Utils).AcertarCaminhoArquivo($piece($get(^%CSW1ATUCONF(2)),"^",1))
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set obj = ##class(%Net.HttpRequest).%New()
 set obj.Server = servidor
 set obj.Port = "80"
 set obj.Timeout = 10
 
 do obj.Get("/csp/patchs/"_nomArqZip)
 if (obj.HttpResponse.StatusCode '= 200) quit $$$ERROR(10000,"Não foi possível baixar o arquivo "_nomArqZip_"! Erro Http: "_obj.HttpResponse.StatusLine)
 
 set streamZip = ##class(%FileBinaryStream).%New()
 set streamZip.Filename = folderDownload_barra_nomArqZip
 do streamZip.CopyFrom(obj.HttpResponse.Data)
 do streamZip.Flush()
 do streamZip.SaveStream()
 do streamZip.%Close()
 
 do obj.Get("/csp/patchs/"_nomArqXML)
 if obj.HttpResponse.StatusCode'=200 quit $$$ERROR(10000,"Não foi possível baixar o arquivo "_nomArqZip_"! Erro Http: "_obj.HttpResponse.StatusLine)
 
 set streamXML = ##class(%FileBinaryStream).%New()
 set streamXML.Filename = folderDownload_barra_nomArqXML
 do streamXML.CopyFrom(obj.HttpResponse.Data)
 do streamXML.Flush()
 do streamXML.SaveStream()
 do streamXML.%Close()
 
 if ('##class(%File).Exists(folderDownload_barra_nomArqZip)) quit $$$ERROR(10000,"Não foi possível salvar o arquivo no diretório configurado! Verifique as configurações do atualizador.")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="DisponibilizarPatch">
<Description>

Disponibilizar Patch para Download
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>idPatch:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set msgsc = ##class(Src2.UtilsXml).ObterAtualizacaoXML(,.caminhoPatch)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set caminho = caminhoPatch_barra_idPatch
 set arquivoPatch = ##class(Src2.PatchUtils).ObterEndDispDownload()_idPatch_".cswpatch"
 set code = ##class(Src2.PatchUtils).ObterCodigo(idPatch)
 
 set sc = ##class(Src2.Utils).ObterConsistemHome(.consistemHome)
 
 // Somente Linux
 set caminhoZip = consistemHome_barra_"lib"_barra_"bin"_barra
 set sc = $zf(-1,caminhoZip_"7za a -tzip -p"_code_" "_arquivoPatch_" "_caminho_" >>/dev/null")
 if (sc '= 0) quit $$$ERROR(10000,"Erro ao compactar o patch: "_sc_"!")
 
 set sc = ##Class(%File).CopyFile(caminhoPatch_barra_idPatch_".xml",##class(Src2.PatchUtils).ObterEndDispDownload()_idPatch_".xml")
 
 set sc = ##Class(%File).CopyFile(caminhoPatch_barra_idPatch_".xml",##class(Src2.PatchUtils).ObterEndXmlPatch()_idPatch_".xml")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="PrepararPatch">
<Description>

Preparar Patch Instalação:
	- Descompacta
	- Copia XML
	- Apaga arquivos
	
set sc = ##class(Src2.PatchUtils).PrepararPatch("PATCH-CO-2012-09-18-14-15-17-CUSTOMAX-T4-6-2")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>idPatch:%String,flgAtuCompleta:%Boolean=0</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sc = ##class(Src2.Utils).ObterConsistemHome(.consistemHome)
 
 set caminhoZip = consistemHome_barra_"lib"_barra_"bin"_barra
 
 set caminhoPatch = ##class(Src2.Utils).AcertarCaminhoArquivo($piece($get(^%CSW1ATUCONF(2)),"^",1))
 set destinoPatch = ##class(Src2.Utils).AcertarCaminhoArquivo($piece($get(^%CSW1ATUCONF(2)),"^",2))
 
 set arquivoPatch = caminhoPatch_barra_idPatch_".cswpatch"
 set code = ##class(Src2.PatchUtils).ObterCodigo(idPatch)
 
 set sc = ##Class(%File).Delete(destinoPatch_barra_idPatch_".xml")
 set sc = ##class(%File).RemoveDirectoryTree(destinoPatch_barra_idPatch)
 set sc = ##class(Src2.PatchUtils).LimparDiretorio(destinoPatch)
 
 if ('flgAtuCompleta) {
   set jarZip = ##class(Src2.Utils2).ObterCamihoJAR(flgAtuCompleta)_" com.consistem.geral.zip.ZipExtract"
   set sc = $zf(-1,jarZip_" "_destinoPatch_barra_" "_arquivoPatch_" "_code)
   if (sc '= 0) quit $$$ERROR(10000,"Erro ao executar o programa java: "_sc_"!")
 }
 
 if (flgAtuCompleta) {
   set sc = $zf(-1,caminhoZip_"7za x "_arquivoPatch_" -p"_code_" -o"_destinoPatch)
   if (sc '= 0) quit $$$ERROR(10000,"Erro ao descompactar o patch de atualização: "_sc_"!")
 }
 
 set sc = ##Class(%File).CopyFile(caminhoPatch_barra_idPatch_".xml",destinoPatch_barra_idPatch_".xml")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterCodigo">
<Description>

Retorna o Codigo do Patch

write ##class(Src2.PatchUtils).ObterCodigo("PATCH-CC-2012-09-19-13-47-49-CSW-T1-6-3-3")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>valor:%String,tipo:%Integer=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (tipo = 0) quit $translate(valor,"1029384756PATCH-","67584930104562")
 if (tipo = 1) quit $translate(valor,"5647382910PATCH-","67584930104562")
 if (tipo = 2) quit $translate(valor,"1829564730PATCH-","67584930104562")
]]></Implementation>
</Method>

<Method name="ObterEndDispDownload">
<Description>

Retorna o endereço da aplicação CSP onde deve ser disponibilizado o zip para futuro download
</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb(, , 1, , .caminhoServAplic)
 
 quit caminhoServAplic_"patchs"_barra
]]></Implementation>
</Method>

<Method name="ObterEndXmlPatch">
<Description>

Retorna o endereço da aplicação CSP onde deve ser disponibilizado uma cópia de todos os arquivos xml de patchs
</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb(, , 1, , .caminhoServAplic)
 
 quit caminhoServAplic_"patchsxml"_barra
]]></Implementation>
</Method>

<Method name="ExcluirPatchClient">
<Description>

Exclui os arquivos de um Patch

flgTemp: Se igual a 1 somente apaga os arquivos descompactados na pasta temporária</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>idPatch:%String,flgTemp:%Boolean=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set csw1atuconf = $get(^%CSW1ATUCONF(2))
 
 set endPatchs = ##class(Src2.Utils).AcertarCaminhoArquivo($piece(csw1atuconf,"^",1))
 set endTemp = ##class(Src2.Utils).AcertarCaminhoArquivo($piece(csw1atuconf,"^",2))
 
 set status = ##class(%File).RemoveDirectoryTree(endTemp_barra_idPatch)
 
 set sc = ##Class(%File).Delete(endTemp_barra_idPatch_".xml")
 
 if ('flgTemp) {
   set sc = ##Class(%File).Delete(endPatchs_barra_idPatch_".cswpatch")
   set sc = ##Class(%File).Delete(endPatchs_barra_idPatch_".xml")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarTesteErroCsp">
<Description>

Valida a Existencia do Parametro de Erro do Gerador CSP

write ##Class(Src2.PatchUtils).ValidarTesteErroCsp()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
 set $ztrap = "ValidarTesteErroCspErro"
 set sc = $$GerarCSP^%CSW1("XXTESTE",0,,,,,,,.flgErroCSP)
 set $ztrap = ""
 quit 1
ValidarTesteErroCspErro	;
 set $ztrap = ""
 quit 0
]]></Implementation>
</Method>

<Method name="ObterIPMaquina">
<Description>

Obter IP Máquina pelo Email

set sc = ##class(Src2.PatchUtils).ObterIPMaquina("ederson@consistem.com.br", .ipMaquina)
set sc = ##class(Src2.PatchUtils).ObterIPMaquina("teste@consistem.com.br", .ipMaquina)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[email:%String,&ipMaquina:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set ipMaquina = ""
 
 set sc = ##class(Src2.UtilsXml).ObterParametrosXML(, .tabUsuarios)
 
 set usuario = ""
 for {
   set usuario = $order(tabUsuarios(usuario))
   if (usuario = "") quit
   if (email = $piece($get(tabUsuarios(usuario)),"^",2)) {
     set ipMaquina = $piece($get(tabUsuarios(usuario)),"^",3)
     quit
   }
 }
 
 if (ipMaquina = "") quit $$$ERROR(10000,"Usuário sem máquina definida para geração de patch temporário!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterArquivosVersionadosPatch">
<Description>

Obter Arquivos Versionados Patch

set sc = ##class(Src2.PatchUtils).ObterArquivosVersionadosPatch("csw", "1", , .tabArqVers)
set sc = ##class(Src2.PatchUtils).ObterArquivosVersionadosPatch("cswutil", "1", , .tabArqVers)
set sc = ##class(Src2.PatchUtils).ObterArquivosVersionadosPatch("cswutil", "6", , .tabArqVers)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,tipoPatch:%String,codConta:%String="",&tabArqVers:%String,flgEnviaTudo:%Boolean=0,&tabSiglas:%String,&tabArquivos:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabArquivos
 
 set sc = ##class(Src2.UtilsXml).ObterArquivosVersionados(.tabArqVers)
 if $$$ISERR(sc) quit sc
 
 set tipo = ""
 for {
   set tipo = $order(tabArqVers(tipo))
   if (tipo = "") quit
   
   // Filtra o Sistema
   if ($get(tabArqVers(tipo,"sistema")) '= sistema) {
     kill tabArqVers(tipo)
     continue
   }
   
   // Filtra o Tipo de Patch
   if ('$data(tabArqVers(tipo,"tiposPatch",tipoPatch))) {
     kill tabArqVers(tipo)
     continue
   }
   
   // Filtra a Conta
   if ($get(tabArqVers(tipo,"conta")) '= "") & ($get(tabArqVers(tipo,"conta")) '= codConta) {
     kill tabArqVers(tipo)
     continue
   }
   
   // Filtra o Sistemas do Cliente
   if (('flgEnviaTudo) && ($data(tabArqVers(tipo,"siglas"))) && ($data(tabSiglas))) {
     set (sigla, flgSigla) = ""
     for {
       set sigla = $order(tabSiglas(sigla))
       if (sigla = "") quit
       if $data(tabArqVers(tipo,"siglas",sigla)) {
         set flgSigla = 1
         quit
       }
     }
     if ('flgSigla) {
       kill tabArqVers(tipo)
       continue
     }
   }
 }
 
 set tipo = ""
 for {
   set tipo = $order(tabArqVers(tipo))
   if (tipo = "") quit
   
   set nomeArquivo = $get(tabArqVers(tipo,"nome"))
   if (nomeArquivo = "") continue
   
   set tabArquivos(nomeArquivo) = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.PatchUtils2">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="ObterVersoesSistemas">
<Description>

Obter Versoes dos Sistemas

set sc = ##class(Src2.PatchUtils2).ObterVersoesSistemas("6.3.1",, .tabVersoesSistemas)
set sc = ##class(Src2.PatchUtils2).ObterVersoesSistemas("6.2.1",, .tabVersoesSistemas)
set sc = ##class(Src2.PatchUtils2).ObterVersoesSistemas(,"csw;6.3.2^gercon;1.0.1", .tabVersoesSistemas)
set sc = ##class(Src2.PatchUtils2).ObterVersoesSistemas(,"csw;6.3.2^cswutil;6.2.3", .tabVersoesSistemas)
set sc = ##class(Src2.PatchUtils2).ObterVersoesSistemas(,"csw;6.3.2^cswutil;6.2.3^gercon;1.0.1", .tabVersoesSistemas)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[versaoInf:%String="",strSistemasVersoes:%String="",&tabVersoesSistemas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabVersoesSistemas
 
 if (strSistemasVersoes = "") {
   quit ##class(Src2.PatchUtils2).ObterVersoesSistemasAntigo(versaoInf, .tabVersoesSistemas)
 }
 
 set msgsc = ##class(Src2.UtilsXml).ObterAtualizacaoXML(.tabSistemas, .caminhoPatch, .tabItensLiberados, .tabItensBloqueados)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 for cont = 1:1:$length(strSistemasVersoes,"^") {
   set var = $piece(strSistemasVersoes,"^",cont)
   if ($piece(var,";",1)'="") & ($piece(var,";",2)'="") {
     
     set sc = ##class(Src2.Utils2).ObterVersao($piece(var,";",2), .versao)
     if $$$ISERR(sc) continue
     
     set tabSistemasVersoes($piece(var,";",1)) = versao
   }
 }
 
 set sistema = ""
 for {
   set sistema = $order(tabSistemasVersoes(sistema))
   if (sistema = "") quit
   set versao = $piece($get(tabSistemasVersoes(sistema)),"^",1)
   
   if ('$data(tabSistemas(sistema))) continue
   
   set var = $get(tabSistemas(sistema))
   
   if ($piece(var,"^",4) '= 1) continue
   
   set repositorio = $piece(var,"^",1)
   
   set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versao, .tabTags, .versaoReleaseUltima)
   
   if (versao '= "") , ($piece($get(tabSistemas(sistema,3,versao)),"^",1) '= "") {
     set versaoReleaseUltima = $piece($get(tabSistemas(sistema,3,versao)),"^",1)
   }
   
   if (versaoReleaseUltima '= "") {
     set tabVersoesSistemas(sistema) = versaoReleaseUltima
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterVersoesSistemasAntigo">
<Description>

Obter Versoes dos Sistemas
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[versaoInf:%String,&tabVersoesSistemas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabVersoesSistemas
 
 set msgsc = ##class(Src2.UtilsXml).ObterAtualizacaoXML(.tabSistemas, .caminhoPatch, .tabItensLiberados, .tabItensBloqueados)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set sc = ##class(Src2.Utils2).ObterVersao(versaoInf, .versao)
 if $$$ISERR(sc) quit sc
 
 set sistema = ""
 for {
   set sistema = $order(tabSistemas(sistema))
   if (sistema = "") quit
   set var = $get(tabSistemas(sistema))
   
   if ($piece(var,"^",4) '= 1) continue
   
   set repositorio = $piece(var,"^",1)
   
   set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versao, .tabTags, .versaoReleaseUltima)
   
   if (versao '= "") , ($piece($get(tabSistemas(sistema,3,versao)),"^",1) '= "") {
     set versaoReleaseUltima = $piece($get(tabSistemas(sistema,3,versao)),"^",1)
   }
   
   if (versaoReleaseUltima '= "") {
     set tabVersoesSistemas(sistema) = versaoReleaseUltima
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarPatchXml">
<Description>

Exportar Patch Xml
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,idPatch:%String,arquivoXmlPatch:%String,&tabSistemas:%String,horolog:%String,tipoPatch:%Integer,sistema:%String,codConta:%String,versaoReleaseOrigem:%String,versaoReleaseRef:%String,repositorioRef:%String,revisao:%String,autor:%String,data:%String,rotinaVersao:%String,tabGrupoItens:%String,tempoTotalEdt:%String,flgTag:%Boolean,tipoDocumento:%String="",documento:%String="",versaoReleaseAfetada:%String="",tabStrVersoesPreReq:%String,observacao:%String,&tabSegmentos:%String,&tabBloqUsoAtua:%String,flgServTeste:%Boolean=0]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set flgServTeste = +$get(flgServTeste)
 
 set objFile=##class(%File).%New(arquivoXmlPatch)
 do objFile.Open("WSN")
 if ('objFile.IsOpen) quit $$$ERROR(10000,"Não foi possível abrir o arquivo '"_arquivoXmlPatch_"'!")
 
 set sc = objFile.WriteLine("<?xml version=""1.0"" encoding=""UTF-8""?>")
 set sc = objFile.WriteLine("<Patch>")
 
 // Informações
 
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"<Informacoes>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<IdPatch>"_idPatch_"</IdPatch>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<DataHora>"_$zdatetime(horolog,3)_"</DataHora>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<VersaoPatch>"_##class(Src2.Patch).ObterVersaoPatchSrc()_"</VersaoPatch>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Tipo>"_tipoPatch_"</Tipo>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Conta>"_codConta_"</Conta>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Sistema>"_sistema_"</Sistema>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<DsSistema>"_$zconvert($piece($get(tabSistemas(sistema)),"^",7),"O","UTF8")_"</DsSistema>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Tag>"_flgTag_"</Tag>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<ServidorTeste>"_flgServTeste_"</ServidorTeste>")
 if (versaoReleaseOrigem '= "") {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<VersaoOrigemRef>"_versaoReleaseOrigem_"</VersaoOrigemRef>")
 }
 if (versaoReleaseAfetada '= "") {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<VersaoAfetada>"_versaoReleaseAfetada_"</VersaoAfetada>")
 }
 if (documento '= "") {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<TipoDocumento>"_tipoDocumento_"</TipoDocumento>")
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Documento>"_documento_"</Documento>")
 }
 if ($get(tabStrVersoesPreReq) '= "") {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<VersoesPreRequisito>"_$get(tabStrVersoesPreReq)_"</VersoesPreRequisito>")
 }
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<FontesPatch>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Versao>"_versaoReleaseRef_"</Versao>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Repositorio>"_repositorioRef_"</Repositorio>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Revisao>"_revisao_"</Revisao>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<AutorRevisao>"_autor_"</AutorRevisao>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<DataHoraRevisao>"_data_"</DataHoraRevisao>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</FontesPatch>")
 
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Estatisticas>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<TempoGeracaoPatch>"_tempoTotalEdt_"</TempoGeracaoPatch>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<RotinasImportar>"_(+$get(^mtempSrc2Patch(codTerm,"rotinas",1)))_"</RotinasImportar>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<RotinasExcluir>"_(+$get(^mtempSrc2Patch(codTerm,"rotinas",2)))_"</RotinasExcluir>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<RotinasBloqueadas>"_(+$get(^mtempSrc2Patch(codTerm,"rotinas",3)))_"</RotinasBloqueadas>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<ClassesImportar>"_(+$get(^mtempSrc2Patch(codTerm,"classes",1)))_"</ClassesImportar>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<ClassesExcluir>"_(+$get(^mtempSrc2Patch(codTerm,"classes",2)))_"</ClassesExcluir>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<ClassesBloqueadas>"_(+$get(^mtempSrc2Patch(codTerm,"classes",3)))_"</ClassesBloqueadas>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<RelatoriosImportar>"_(+$get(^mtempSrc2Patch(codTerm,"relatorios","importar","arquivo")))_"</RelatoriosImportar>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<RelatoriosExcluir>"_(+$get(^mtempSrc2Patch(codTerm,"relatorios","excluir","arquivo")))_"</RelatoriosExcluir>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<RelatoriosPastaExcluir>"_(+$get(^mtempSrc2Patch(codTerm,"relatorios","excluir","pasta")))_"</RelatoriosPastaExcluir>")
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</Estatisticas>")
 
 if (rotinaVersao '= "") {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<RotinaVersao>"_rotinaVersao_"</RotinaVersao>")
 }
 
 if ($order(tabGrupoItens("")) '= "") {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<GrupoItens>")
   set grupo = ""
   for {
     set grupo = $order(tabGrupoItens(grupo))
     if (grupo = "") quit
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<GrupoItem>"_grupo_"</GrupoItem>")
   }
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</GrupoItens>")
 }
 
 if (observacao '= "") {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Observacao>")
   set sc = objFile.WriteLine("<![CDATA[")
   set sc = objFile.WriteLine($zconvert(observacao,"O","UTF8"))
   set sc = objFile.WriteLine("]]]]><![CDATA[>")
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</Observacao>")
 }
 
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"</Informacoes>")
 
 // Classes
 
 if $data(^mtempSrc2Patch(codTerm,"classes")) {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"<Classes>")
   if $data(^mtempSrc2Patch(codTerm,"classes",1)) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<ClassesImportar>")
     set classe = ""
     for {
       set classe = $order(^mtempSrc2Patch(codTerm,"classes",1,classe))
       if (classe = "") quit
       set var = $get(^mtempSrc2Patch(codTerm,"classes",1,classe))
       set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Classe arquivo="""_$piece(var,"^",3)_""" versao="""_$piece(var,"^",4)_""" revisao="""_$piece(var,"^",5)_""" limitado="""_(+$piece(var,"^",6))_""">"_classe_"</Classe>")
     }
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</ClassesImportar>")
   }
   if $data(^mtempSrc2Patch(codTerm,"classes",2)) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<ClassesExcluir>")
     set classe = ""
     for {
       set classe = $order(^mtempSrc2Patch(codTerm,"classes",2,classe))
       if (classe = "") quit
       set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Classe>"_classe_"</Classe>")
     }
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</ClassesExcluir>")
   }
   if $data(^mtempSrc2Patch(codTerm,"classes",4)) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Packages>")
     set package = ""
     for {
       set package = $order(^mtempSrc2Patch(codTerm,"classes",4,package))
       if (package = "") quit
       set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Package>"_package_"</Package>")
     }
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</Packages>")
   }
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"</Classes>")
 }
 
 // Rotinas
 
 if $data(^mtempSrc2Patch(codTerm,"rotinas")) {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"<Rotinas>")
   if $data(^mtempSrc2Patch(codTerm,"rotinas",1)) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<RotinasImportar>")
     set rotina = ""
     for {
       set rotina = $order(^mtempSrc2Patch(codTerm,"rotinas",1,rotina))
       if (rotina = "") quit
       set var = $get(^mtempSrc2Patch(codTerm,"rotinas",1,rotina))
       set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Rotina arquivo="""_$piece(var,"^",3)_""" versao="""_$piece(var,"^",4)_""" revisao="""_$piece(var,"^",5)_""" limitado="""_(+$piece(var,"^",6))_""">"_rotina_"</Rotina>")
     }
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</RotinasImportar>")
   }
   if $data(^mtempSrc2Patch(codTerm,"rotinas",2)) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<RotinasExcluir>")
     set rotina = ""
     for {
       set rotina = $order(^mtempSrc2Patch(codTerm,"rotinas",2,rotina))
       if (rotina = "") quit
       set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Rotina>"_rotina_"</Rotina>")
     }
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</RotinasExcluir>")
   }
   if $data(^mtempSrc2Patch(codTerm,"rotinas",3)) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<RotinasBloqueadas>")
     set rotina = ""
     for {
       set rotina = $order(^mtempSrc2Patch(codTerm,"rotinas",3,rotina))
       if (rotina = "") quit
       set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Rotina>"_rotina_"</Rotina>")
     }
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</RotinasBloqueadas>")
   }
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"</Rotinas>")
 }
 
 // Outros - Arquivos Versionados
 
 if ($data(^mtempSrc2Patch(codTerm,"arquivosVersionados"))) {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"<ArquivosVersionados>")
   set tipoArquivo = ""
   for {
     set tipoArquivo = $order(^mtempSrc2Patch(codTerm,"arquivosVersionados",tipoArquivo))
     if (tipoArquivo = "") quit
     set var = $get(^mtempSrc2Patch(codTerm,"arquivosVersionados",tipoArquivo))
     
     set rotinaProcedimento = $get(^mtempSrc2Patch(codTerm,"arquivosVersionados",tipoArquivo,1))
     
     set versaoArquivo = $piece(var,"^",1)
     set nomeArquivo = $piece(var,"^",2)
     set localizacao = $piece(var,"^",4)
     
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Arquivo tipo="""_tipoArquivo_""" nome="""_nomeArquivo_""" localizacao="""_localizacao_""" rotinaProcedimento="""_rotinaProcedimento_""">"_versaoArquivo_"</Arquivo>")
   }
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"</ArquivosVersionados>")
 }
 
 // Outros - Base de Inicialização
 
 if ($data(^mtempSrc2Patch(codTerm,"flags","flgBase"))) {
   set var = $get(^mtempSrc2Patch(codTerm,"flags","flgBase"))
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"<BaseInicializacao>")
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<SobreporBase>"_$piece(var,"^",1)_"</SobreporBase>")
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<StrEmpresas>"_$piece(var,"^",2)_"</StrEmpresas>")
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Globais>")
   set global = ""
   for {
     set global = $order(^mtempSrc2Patch(codTerm,"flags","flgBase",global))
     if (global = "") quit
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Global>^"_global_"</Global>")
   }
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</Globais>")
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"</BaseInicializacao>")
 }
 
 // Outros
 
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"<Outros>")
 
 if ($order(^mtempSrc2Patch(codTerm,"flags","")) '= "") {
   if ($data(^mtempSrc2Patch(codTerm,"flags","flgPaginas"))) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Paginas>1</Paginas>")
   }
   if ($data(^mtempSrc2Patch(codTerm,"flags","flgDiversos"))) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<DiversosXml>1</DiversosXml>")
   }
   if ($data(^mtempSrc2Patch(codTerm,"flags","flgProcedimentos"))) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Procedimentos>1</Procedimentos>")
   }
   if ($data(^mtempSrc2Patch(codTerm,"flags","flgSerasahttp"))) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<SerasaHttpKeystore>1</SerasaHttpKeystore>")
   }
   if ($data(^mtempSrc2Patch(codTerm,"flags","flgServerProducao"))) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<ServerProducaoKeystore>1</ServerProducaoKeystore>")
   }
 }
 
 // Outros - Menu
 
 if ($data(^mtempSrc2Patch(codTerm,"flags","flgMenu"))) {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Menu>1</Menu>")
 }
 
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"</Outros>")
 
 // Segmentos
 
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"<Segmentos>")
 
 set codSegmento = ""
 for {
   set codSegmento = $order(tabSegmentos(codSegmento))
   if (codSegmento = "") quit
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Segmento>"_codSegmento_"</Segmento>")
 }
 
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"</Segmentos>")
 
 // Relatórios
 
 set sc = ##class(Src2.PatchUtils2).ExportarPatchXmlGenerico(codTerm, .objFile, "relatorios", "Relatorios")
 
 // Bloqueia Uso dos Programas Durante a Atualização
 
 if ($data(tabBloqUsoAtua)) {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"<BloquearUsoAtualizacao>")
   set grupoRotina = ""
   for {
     set grupoRotina = $order(tabBloqUsoAtua(1,grupoRotina))
     if (grupoRotina = "") quit
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<GrupoRotina>"_grupoRotina_"</GrupoRotina>")
   }
   if ($data(tabBloqUsoAtua(2,"BloqueioTotal"))) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<BloqueioTotal>1</BloqueioTotal>")
   }
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"</BloquearUsoAtualizacao>")
 }
 
 // Release Notes
 
 if $data(^mtempSrc2Patch(codTerm,"notes")) {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"<ReleaseNotes>")
   set codSeq = ""
   for {
     set codSeq = $order(^mtempSrc2Patch(codTerm,"notes",1,codSeq))
     if (codSeq = "") quit
     set var = $get(^mtempSrc2Patch(codTerm,"notes",1,codSeq,1))
     set var2 = $get(^mtempSrc2Patch(codTerm,"notes",1,codSeq,2))
     set tipo2 = $zconvert($piece(var,"^",2),"O","UTF8")
     set sistema2 = $zconvert($piece(var,"^",5),"O","UTF8")
     set funcionalidade = $zconvert($piece(var,"^",6),"O","UTF8")
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Note versao="""_$piece(var,"^",3)_""" tarefa="""_$piece(var,"^",1)_""" tipo="""_tipo2_""" sistema="""_sistema2_""" funcionalidade="""_funcionalidade_""" menus="""_$piece(var,"^",4)_""">")
     set sc = objFile.WriteLine("<![CDATA[")
     set sc = objFile.WriteLine($zconvert(var2,"O","UTF8"))
     set sc = objFile.WriteLine("]]]]><![CDATA[>")
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</Note>")
   }
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"</ReleaseNotes>")
 }
 
 set sc = objFile.Write("</Patch>")
 
 do objFile.Close()
 set objFile = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="EnviarEmailPatch">
<Description>

Enviar Email Patch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,idPatch:%String,arquivoXmlPatch:%String,&tabSistemas:%String,horolog:%String,tipoPatch:%String,sistema:%String,codConta:%String,versaoReleaseOrigem:%String,versaoReleaseRef:%String,versaoReleaseAfetada:%String="",&tabGrupoItens:%String,nomeCliente:%String="",emailsCliente:%String="",email:%String="",tipoDocumento:%String="",documento:%String="",&tabDocumentacao:%String,codParceiro:%Integer,flgEmailCliente:%Boolean=1,observacao:%String="",&tabStrVersoesPreReq:%String="",&tabBloqUsoAtua:%String,flgServTeste:%Boolean=0]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set flgServTeste = +$get(flgServTeste)
 
 for cont = 1:1:$length(emailsCliente,",") {
   if ($piece(emailsCliente,",",cont) '= "") {
     set tabEmail($piece(emailsCliente,",",cont)) = ""
   }
 }
 
 if ('flgEmailCliente) ! (codConta = "CC") {
   kill tabEmail
 }
 
 if (email '= "") {
   set tabEmail(email) = ""
 }
 
 set (cont, email) = ""
 for {
   set email = $order(tabEmail(email))
   if (email = "") quit
   if (email [ "@consistem.com.br") ! (email [ "@customax.com.br") ! (email [ "@adapcom.com.br") {
     set tabEmailPara(1,$increment(cont)) = email
   } else {
     set tabEmailPara(2,$increment(cont)) = email
   }
 }
 
 set sc = ##class(Src2.PatchUtils).ObterTabTiposPatchs(.tabTiposPatch)
 
 set sc = ##class(Src2.PatchUtils).ObterTabTiposDocumentos(.tabTiposDoc)
 
 set empresa = "Consistem"
 set emailDe = "atualizacao@consistem.com.br"
 
 if (codParceiro = 12) {
   set empresa = "Customax"
   set emailDe = "atualizacao@customax.com.br"
 }
 
 if (codParceiro = 2) {
   set empresa = "Adapcon"
   set emailDe = "atualizacao@adapcon.com.br"
 }
 
 set titulo = "Patch de Atualização "_empresa_" :: "_$zconvert($piece($get(tabSistemas(sistema)),"^",7),"O","UTF8")
 
 set tabMsg($order(tabMsg(""),-1)+1) = "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1//EN' 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>"
 set tabMsg($order(tabMsg(""),-1)+1) = "<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'>"
 set tabMsg($order(tabMsg(""),-1)+1) = "<head>"
 set tabMsg($order(tabMsg(""),-1)+1) = "<meta http-equiv='content-type' content='text/html; charset=utf-8' />"
 set tabMsg($order(tabMsg(""),-1)+1) = "<style>"
 set tabMsg($order(tabMsg(""),-1)+1) = "body { font:90% 'Trebuchet MS',Verdana,Tahoma,Arial,sans-serif; }"
 set tabMsg($order(tabMsg(""),-1)+1) = "h1, h2, h3, h4 {  font-family: 'Trebuchet MS',Georgia,'Times New Roman',serif; }"
 set tabMsg($order(tabMsg(""),-1)+1) = "h2 {border: #000000 solid; border-width: 1px 1px 1px 1px; font-size:16px; background-color:#DEDEDE; padding:2px;}"
 set tabMsg($order(tabMsg(""),-1)+1) = "h3 {color:#1C1C1C; font-size:14px;}"
 set tabMsg($order(tabMsg(""),-1)+1) = "h4 {border: #000000 solid; border-width: 0px 0px 1px;}"
 set tabMsg($order(tabMsg(""),-1)+1) = "table {width:100%; font-family: 'Trebuchet MS',Georgia,'Times New Roman',serif;}"
 set tabMsg($order(tabMsg(""),-1)+1) = ".titulo { vertical-align:top; text-align: right; font: 14px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif;}"
 set tabMsg($order(tabMsg(""),-1)+1) = ".corpo { vertical-align:top; font: 14px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; color:#363636;}"
 set tabMsg($order(tabMsg(""),-1)+1) = ".error {border: #DD0000 solid; border-width: 2px 2px 2px 2px; font-size:14px; color:#880000; background-color:#FFE3E3; padding:2px;}"
 set tabMsg($order(tabMsg(""),-1)+1) = "</style>"
 set tabMsg($order(tabMsg(""),-1)+1) = "</head>"
 set tabMsg($order(tabMsg(""),-1)+1) = "<body>"
 set tabMsg($order(tabMsg(""),-1)+1) = "<h2>Patch de Atualização "_empresa_"</h2>"
 
 set flgQuebra = 0
 
 /// Observações
 if (observacao '= "") {
   set tabMsg($order(tabMsg(""),-1)+1) = "<div class='error'><ul>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<li><b>Observações:</b><br>"
   set tabMsg($order(tabMsg(""),-1)+1) = ##class(Src2.Utils).Translate($zconvert(observacao,"O","HTML"),$char(10),"<br>")
   set tabMsg($order(tabMsg(""),-1)+1) = "</li>"
   set tabMsg($order(tabMsg(""),-1)+1) = "</ul></div>"
   set flgQuebra = 1
 }
 
 /// Bloqueio Total
 if ($data(tabBloqUsoAtua(2,"BloqueioTotal"))) {
   if (flgQuebra) set tabMsg($order(tabMsg(""),-1)+1) = "<p/>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<div class='error'><ul>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<li><b>ATENÇÃO:</b> Durante a instalação deste patch o sistema não permitirá nenhum usuário logado no sistema.</li>"
   set tabMsg($order(tabMsg(""),-1)+1) = "</ul></div>"
   set flgQuebra = 1
 }
 
 /// Programas Bloqueados
 if ($order(tabBloqUsoAtua(1,"")) '= "") {
   if (flgQuebra) set tabMsg($order(tabMsg(""),-1)+1) = "<p/>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<div class='error'><ul>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<li><b>ATENÇÃO:</b> Programas que serão bloqueados durante a instalação deste patch:</li>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<ul>"
   set grupoRotina = ""
   for {
     set grupoRotina = $order(tabBloqUsoAtua(1,grupoRotina))
     if (grupoRotina = "") quit
     set tabMsg($order(tabMsg(""),-1)+1) = "<li>"_grupoRotina_"</li>"
   }
   set tabMsg($order(tabMsg(""),-1)+1) = "</ul></ul></div>"
   set flgQuebra = 1
 }
 
 /// Pré-Requisitos
 if ($order(tabStrVersoesPreReq("")) '= "") {
   if (flgQuebra) set tabMsg($order(tabMsg(""),-1)+1) = "<p/>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<div class='error'><ul>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<li>Pré-Requisitos:</li>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<ul>"
   set prodPreReq = ""
   for {
     set prodPreReq = $order(tabStrVersoesPreReq(prodPreReq))
     if (prodPreReq = "") quit
     set verPreReq = $piece($get(tabStrVersoesPreReq(prodPreReq)),"^",1)
     set dsProdPreReq = ##class(Src2.PatchUtils).ObterDescricaoSistema(prodPreReq)
     set tabMsg($order(tabMsg(""),-1)+1) = "<li>O produto <b>"_dsProdPreReq_"</b> deve estar no release <b>"_verPreReq_"</b> ou superior.</li>"
   }
   set tabMsg($order(tabMsg(""),-1)+1) = "</ul></ul></div>"
 } 
 
 set tabMsg($order(tabMsg(""),-1)+1) = "<ul>"
 
 set tabMsg($order(tabMsg(""),-1)+1) = "<li>Produto: "_$piece($get(tabSistemas(sistema)),"^",7)_"</li>"
 set tabMsg($order(tabMsg(""),-1)+1) = "<li>Cliente: "_nomeCliente_"</li>"
 set tabMsg($order(tabMsg(""),-1)+1) = "<li>ID Patch: "_idPatch_"</li>"
 set tabMsg($order(tabMsg(""),-1)+1) = "<li>Data/Hora Geração: "_$zdatetime(horolog,4)_"</li>"
 set tabMsg($order(tabMsg(""),-1)+1) = "<li>Tipo do Patch: "_tipoPatch_" - "_$get(tabTiposPatch(tipoPatch))_"</li>"
 set tabMsg($order(tabMsg(""),-1)+1) = "<li>Para Servidor de Testes: "_$select(flgServTeste:"Sim",1:"Não")_"</li>"
 
 if (tipoDocumento '= "") , (documento '= "") {
   set tabMsg($order(tabMsg(""),-1)+1) = "<li>"_$get(tabTiposDoc(tipoDocumento))_": "_documento_"</li>"
 }
 if ($order(tabGrupoItens("")) '= "") {
   set tabMsg($order(tabMsg(""),-1)+1) = "<li>Itens: "_##class(Src2.Utils).ConvertTabStr(.tabGrupoItens)_"</li>"
 }
 if (tipoPatch = 1) {
   set tabMsg($order(tabMsg(""),-1)+1) = "<li>Versão Origem: "_versaoReleaseOrigem_"</li>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<li>Versão Destino: "_versaoReleaseRef_"</li>"
 }
 if (tipoPatch = 2) ! (tipoPatch = 3) ! (tipoPatch = 4) ! (tipoPatch = 6) ! (tipoPatch = 7) {
   set tabMsg($order(tabMsg(""),-1)+1) = "<li>Versão: "_versaoReleaseRef_"</li>"
 }
 if (tipoPatch = 5) {
   set tabMsg($order(tabMsg(""),-1)+1) = "<li>Versão Origem: "_versaoReleaseOrigem_"</li>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<li>Versão: "_versaoReleaseAfetada_"</li>"
 }
 
 set progMenu = $select($data(^mtempSrc2Patch(codTerm,"flags","flgMenu")):"Sim",1:"Não")
 
 set tabMsg($order(tabMsg(""),-1)+1) = "<li>Atualização dos Programas do Menu: "_progMenu_"</li>"
 
 if ($data(^mtempSrc2Patch(codTerm,"flags","flgBase"))) {
   set tabMsg($order(tabMsg(""),-1)+1) = "<li>Inicialização de Base: Sim</li>"
 }
 
 if ($data(^mtempSrc2Patch(codTerm,"notes",3))) {
   set tabMsg($order(tabMsg(""),-1)+1) = "<li>Sistemas Alterados:</li>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<ul>"
   set dsSistemas = ""
   for {
     set dsSistemas = $order(^mtempSrc2Patch(codTerm,"notes",3,dsSistemas))
     if (dsSistemas = "") quit
     set tabMsg($order(tabMsg(""),-1)+1) = "<li>"_dsSistemas_"</li>"
   }
   set tabMsg($order(tabMsg(""),-1)+1) = "</ul>"
 }
 
 if ($data(^mtempSrc2Patch(codTerm,"arquivosVersionados"))) {
   set tabMsg($order(tabMsg(""),-1)+1) = "<li>Arquivos Diversos:</li>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<ul>"
   set tipoArquivo = ""
   for {
     set tipoArquivo = $order(^mtempSrc2Patch(codTerm,"arquivosVersionados",tipoArquivo))
     if (tipoArquivo = "") quit
     set var = $get(^mtempSrc2Patch(codTerm,"arquivosVersionados",tipoArquivo))
     set nomeArquivo = $piece(var,"^",2)
     set descricao = $get(^mtempSrc2Patch(codTerm,"arquivosVersionados",tipoArquivo,2))
     if (descricao = "") set descricao = nomeArquivo
     else  set descricao = descricao_" ("_nomeArquivo_")"
     set tabMsg($order(tabMsg(""),-1)+1) = "<li>"_descricao_"</li>"
   }
   set tabMsg($order(tabMsg(""),-1)+1) = "</ul>"
 }
 
 set tabMsg($order(tabMsg(""),-1)+1) = "</ul>"
 
 set tabMsg($order(tabMsg(""),-1)+1) = "<p></p>"
 
 if ($data(^mtempSrc2Patch(codTerm,"notes"))) {
   set (versao, codSeq) = ""
   for {
     set versao = $order(^mtempSrc2Patch(codTerm,"notes",2,versao))
     if (versao = "") quit
     
     set tabMsg($order(tabMsg(""),-1)+1) = "<h2>Versão "_versao_"</h2>"
     
     for tipo = "Legislação","Nova Funcionalidade","Melhoria","Defeito" {
       if ('$data(^mtempSrc2Patch(codTerm,"notes",2,versao,tipo))) continue
       
       set tabMsg($order(tabMsg(""),-1)+1) = "<h3>"_tipo_"</h3>"
       set tabMsg($order(tabMsg(""),-1)+1) = "<table>"
       
       for {
         set codSeq = $order(^mtempSrc2Patch(codTerm,"notes",2,versao,tipo,codSeq))
         if (codSeq = "") quit
         set var = $get(^mtempSrc2Patch(codTerm,"notes",1,codSeq,1))
         set var2 = $get(^mtempSrc2Patch(codTerm,"notes",1,codSeq,2))
         set texto = "<b>"_$piece(var,"^",5)
         if ($piece(var,"^",6) '= "") { set texto = texto_" ("_$piece(var,"^",6)_")" }
         set texto = texto_"</b>"
         for cont = 1:1:$length(var2,$char(13)_$char(10)) {
           set texto = texto_"<br />"_$piece(var2,$char(13)_$char(10),cont)
         }
         set tabMsg($order(tabMsg(""),-1)+1) = "<tr>"
         set tabMsg($order(tabMsg(""),-1)+1) = "<td width='9%' class='titulo'>[ #"_$piece(var,"^",1)_" ] -</td>"
         set tabMsg($order(tabMsg(""),-1)+1) = "<td width='91%' class='corpo'>"
         set tabMsg($order(tabMsg(""),-1)+1) = texto
         set tabMsg($order(tabMsg(""),-1)+1) = "</td>"
         set tabMsg($order(tabMsg(""),-1)+1) = "</tr>"
       }
       
       set tabMsg($order(tabMsg(""),-1)+1) = "</table>"
     }
   }
 }
 
 if (tipoPatch = 1) , ('$data(^mtempSrc2Patch(codTerm,"notes"))) , ('$data(tabDocumentacao)) {
   set tabDocumentacao(1) = "Esta atualização possui apenas alterações de baixo impacto que não afetam a interface/usuabilidade do sistema."
 }
 
 if ($data(tabDocumentacao)) {
   set tabMsg($order(tabMsg(""),-1)+1) = "<h2>Documentação</h2>"
   set tabMsg($order(tabMsg(""),-1)+1) = "<table>"
   set (codSeq, texto) = ""
   for {
     set codSeq = $order(tabDocumentacao(codSeq))
     if (codSeq = "") quit
     set var = $get(tabDocumentacao(codSeq))
     set texto = texto_$select(texto="":"",1:"<br />")_var
   }
   set tabMsg($order(tabMsg(""),-1)+1) = "<tr><td class='corpo'>"
   set tabMsg($order(tabMsg(""),-1)+1) = texto
   set tabMsg($order(tabMsg(""),-1)+1) = "</td></tr>"
   set tabMsg($order(tabMsg(""),-1)+1) = "</table>"
 }
 
 set tabMsg($order(tabMsg(""),-1)+1) = "<h4>&nbsp;</h4>"
 set tabMsg($order(tabMsg(""),-1)+1) = "<p class='corpo'><i>"
 
 if (codParceiro = 1) {
   set tabMsg($order(tabMsg(""),-1)+1) = "<b>Consistem Sistemas Ltda</b><br />"
   set tabMsg($order(tabMsg(""),-1)+1) = "www.consistem.com.br<br />"
   set tabMsg($order(tabMsg(""),-1)+1) = "Rua: Henrique Nagel, 135 / Bairro: Água Verde / CEP: 89254-560<br />"
   set tabMsg($order(tabMsg(""),-1)+1) = "Jaraguá do Sul – SC / Telefone: 55 47 2107-1800"
 }
 
 if (codParceiro = 12) {
   set tabMsg($order(tabMsg(""),-1)+1) = "<b>Customax Serviços Ltda</b><br />"
   set tabMsg($order(tabMsg(""),-1)+1) = "www.customax.com.br<br />"
   set tabMsg($order(tabMsg(""),-1)+1) = "Rua: Henrique Nagel, 179 / Bairro: Água Verde / CEP: 89254-560<br />"
   set tabMsg($order(tabMsg(""),-1)+1) = "Jaraguá do Sul - SC / Telefone: 55 47 3275-2250"
 }
 
 if (codParceiro = 2) {
   set tabMsg($order(tabMsg(""),-1)+1) = "<b>Adapcon Sistemas e Assessoria</b><br />"
   set tabMsg($order(tabMsg(""),-1)+1) = "www.adapcon.com.br<br />"
   set tabMsg($order(tabMsg(""),-1)+1) = "Rua: Walter Marquardt, 744, Sala 7 / Bairro: Vila Nova / CEP: 89259-700<br />"
   set tabMsg($order(tabMsg(""),-1)+1) = "Jaraguá do Sul – SC / Telefone: 55 47 3370-7625"
 }
 
 set tabMsg($order(tabMsg(""),-1)+1) = "<hr></hr>"
 set tabMsg($order(tabMsg(""),-1)+1) = "<b><center><font size=3>Mensagem gerada automaticamente! Favor não responder.</font></center></b>"
 
 set tabMsg($order(tabMsg(""),-1)+1) = "</i></p>"
 set tabMsg($order(tabMsg(""),-1)+1) = "</body>"
 set tabMsg($order(tabMsg(""),-1)+1) = "</html>"
 
 // Anexo o patch.xml
 if $data(tabEmailPara(1)) {
   kill tabEmail
   merge tabEmail = tabEmailPara(1)
   set sc = ##class(Src2.Utils2).EnviarEmail(titulo, emailDe, .tabEmail, .tabMsg, 1, arquivoXmlPatch, "noreply@consistem.com.br")
 }
 
 // Sem anexo
 if $data(tabEmailPara(2)) {
   kill tabEmail
   merge tabEmail = tabEmailPara(2)
   set sc = ##class(Src2.Utils2).EnviarEmail(titulo, emailDe, .tabEmail, .tabMsg, 1, , "noreply@consistem.com.br")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarPatchXmlGenerico">
<Description>

Exportar Patch Xml Generico
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,&objFile:%String,opcao:%String,tag:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ('$data(^mtempSrc2Patch(codTerm,opcao))) quit $$$OK
 
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"<"_tag_">")
 if ($data(^mtempSrc2Patch(codTerm,opcao,"importar"))) {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Importar>")
   set itemRepositorio = ""
   for {
     set itemRepositorio = $order(^mtempSrc2Patch(codTerm,opcao,"importar","arquivo",itemRepositorio))
     if (itemRepositorio = "") quit
     set var = $get(^mtempSrc2Patch(codTerm,opcao,"importar","arquivo",itemRepositorio))
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Arquivo>"_$piece(var,"^",1)_"</Arquivo>")
   }
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</Importar>")
 }
 if ($data(^mtempSrc2Patch(codTerm,opcao,"excluir"))) {
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"<Excluir>")
   if ($data(^mtempSrc2Patch(codTerm,opcao,"excluir","pasta"))) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Pastas>")
     set itemRepositorio = ""
     for {
       set itemRepositorio = $order(^mtempSrc2Patch(codTerm,opcao,"excluir","pasta",itemRepositorio))
       if (itemRepositorio = "") quit
       set var = $get(^mtempSrc2Patch(codTerm,opcao,"excluir","pasta",itemRepositorio))
       set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(4)_"<Arquivo>"_$piece(var,"^",1)_"</Arquivo>")
     }
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"</Pastas>")
   }
   if ($data(^mtempSrc2Patch(codTerm,opcao,"excluir","arquivo"))) {
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"<Arquivos>")
     set itemRepositorio = ""
     for {
       set itemRepositorio = $order(^mtempSrc2Patch(codTerm,opcao,"excluir","arquivo",itemRepositorio))
       if (itemRepositorio = "") quit
       set var = $get(^mtempSrc2Patch(codTerm,opcao,"excluir","arquivo",itemRepositorio))
       set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(4)_"<Arquivo>"_$piece(var,"^",1)_"</Arquivo>")
     }
     set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(3)_"</Arquivos>")
   }
   set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(2)_"</Excluir>")
 }
 set sc = objFile.WriteLine(##class(Src2.Utils2).Tab(1)_"</"_tag_">")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TrocarRotinaMenu">
<Description>

Executa um Procedimento
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotinaDe:%String="",rotinaPara:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (rotinaDe = rotinaPara) quit $$$OK
 
 set (codConta, codSistema, codOperacao, codNivel, codMenu, seqOpcao)=""
 for  {
   set codConta = $order(^%CSMENMN(codConta))
   if (codConta = "") quit
   for  {
     set codSistema = $order(^%CSMENMN(codConta,codSistema))
     if (codSistema = "") quit
     for  {
       set codOperacao = $order(^%CSMENMN(codConta,codSistema,codOperacao))
       if (codOperacao = "") quit
       for  {
         set codNivel = $order(^%CSMENMN(codConta,codSistema,codOperacao,codNivel))
         if (codNivel = "") quit
         for  {
           set codMenu = $order(^%CSMENMN(codConta,codSistema,codOperacao,codNivel,codMenu))
           if (codMenu = "") quit
           for  {
             set seqOpcao = $order(^%CSMENMN(codConta,codSistema,codOperacao,codNivel,codMenu,seqOpcao))
             if (seqOpcao = "") quit
             set csmenmn = $get(^%CSMENMN(codConta,codSistema,codOperacao,codNivel,codMenu,seqOpcao))
             if ($piece(csmenmn,"^",1) = rotinaDe) {
               set $piece(^%CSMENMN(codConta,codSistema,codOperacao,codNivel,codMenu,seqOpcao),"^",1) = rotinaPara
             }
           }
         }
       }
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExecutarProcedimentos">
<Description>

Executa os Procedimentos
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ('$data(^mtempSrc2PatchImport(codTerm,"procedimentos"))) quit $$$OK
 
 set caminhoOrigem = $piece($get(^mtempSrc2PatchImport(codTerm,"procedimentos")),"^",1)
 
 set sc = ##class(Src2.PatchUtils).ObterNamespacesProcedimento( , .tabNamespace)
 
 if ('$data(tabNamespace)) quit $$$OK
 
 set sc = ##class(Src2.UtilsXml).ObterProcedimentos(caminhoOrigem, .versao, .tabProcedimentos)
 if $$$ISERR(sc) quit sc
 
 set (idProcedimento, tipoNamespace, namespace) = ""
 for {
   set idProcedimento = $order(tabProcedimentos(idProcedimento))
   if (idProcedimento = "") quit
   
   if ($data(^%CSW1ATUCONF(5,versao,idProcedimento))) {
     continue
   }
   
   set namespaceOrigem = $znspace
   
   for {
     set tipoNamespace = $order(tabProcedimentos(idProcedimento,4,tipoNamespace))
     if (tipoNamespace = "") quit
     for {
       set namespace = $order(tabNamespace(tipoNamespace,namespace))
       if (namespace = "") quit
       
       znspace namespace
       
       set $piece(^%CSW1ATUCONF(5,versao,idProcedimento,1,namespace),"^",1) = $horolog
       set $piece(^%CSW1ATUCONF(5,versao,idProcedimento,1,namespace),"^",6) = codAtualizacao
       
       if ($data(tabProcedimentos(idProcedimento,2))) {
         set msgsc = ##class(Src2.PatchUtils2).ExecutarProcedimento(versao, idProcedimento, namespace, $get(tabProcedimentos(idProcedimento,2)))
         set $piece(^%CSW1ATUCONF(5,versao,idProcedimento,1,namespace),"^",2) = $horolog
         set $piece(^%CSW1ATUCONF(5,versao,idProcedimento,1,namespace),"^",3) = 1
         if (msgsc '= $$$OK) {
           set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 6, "Procedimento "_idProcedimento_" da versão "_versao, msgsc)
         } else {
           set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 6, "Procedimento "_idProcedimento_" da versão "_versao)
         }
         continue
       }
       if ($data(tabProcedimentos(idProcedimento,3))) {
         set var = $get(tabProcedimentos(idProcedimento,3))
         set sc = ##class(Src2.PatchUtils2).TrocarRotinaMenu($piece(var,"^",1),$piece(var,"^",2))
         set $piece(^%CSW1ATUCONF(5,versao,idProcedimento,1,namespace),"^",2) = $horolog
         set $piece(^%CSW1ATUCONF(5,versao,idProcedimento,1,namespace),"^",3) = 2
         set $piece(^%CSW1ATUCONF(5,versao,idProcedimento,1,namespace),"^",4) = $piece(var,"^",1)
         set $piece(^%CSW1ATUCONF(5,versao,idProcedimento,1,namespace),"^",5) = $piece(var,"^",2)
         set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 6, "Procedimento "_idProcedimento_" da versão "_versao)
         continue
       }
     }
   }
   znspace namespaceOrigem
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExecutarProcedimento">
<Description>

Executa um Procedimento
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>versao:%String,idProcedimento:%String,namespace:%String,procedimento:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set $ztrap = "ExecutarProcedimentoErro"
 xecute procedimento
 set $ztrap = ""
 quit $$$OK
ExecutarProcedimentoErro	;
 set $ztrap = ""
 set ^%CSW1ATUCONF(5,versao,idProcedimento,1,namespace,1) = procedimento
 set ^%CSW1ATUCONF(5,versao,idProcedimento,1,namespace,2) = $zerror
 quit $zerror
]]></Implementation>
</Method>

<Method name="ImportarBaseInicalizacao">
<Description>

Importa Base de Inicalizacao

set sc = ##class(Src2.PatchUtils2).ImportarBaseInicalizacao("XX", 1, "CC")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer,codConta:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ('$data(^mtempSrc2PatchImport(codTerm,"baseinicializacao"))) quit $$$OK
 
 set arquivoBaseIni = $piece($get(^mtempSrc2PatchImport(codTerm,"baseinicializacao")),"^",1)
 if (arquivoBaseIni = "") quit $$$OK
 
 set flgSobreporBase = +$piece($get(^mtempSrc2PatchImport(codTerm,"baseinicializacao")),"^",2)
 
 set strEmpresas = $piece($get(^mtempSrc2PatchImport(codTerm,"baseinicializacao")),"^",3)
 
 set sc = ##class(Src2.Utils).ConvertStrTab(strEmpresas, .tabEmpresas)
 
 set sc = ##class(Src2.PatchUtils).ObterNamespacesProcedimento( , .tabNamespace)
 if ('$data(tabNamespace)) quit $$$OK
 
 kill ^mtempSrc2BaseIni(codTerm)
 
 set sc = ##class(Src2.PatchUtils2).LerArquivoBaseIni(codTerm, arquivoBaseIni)
 if $$$ISERR(sc) quit sc
 
 set namespaceOrigem = $znspace
 
 set namespace = ""
 for {
   set namespace = $order(tabNamespace("sistemas",namespace))
   if (namespace = "") quit
   znspace namespace
   set sc = ##class(Src2.PatchUtils2).GerarBaseInicalizacao(codTerm, codAtualizacao, .tabEmpresas, flgSobreporBase, codConta)
 }
 
 znspace namespaceOrigem
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarBaseInicalizacao">
<Description>

Gerar Base de Inicalizacao
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,codAtualizacao:%String,&tabEmpresas:%String,flgSobreporBase:%String,codConta:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codSeqGlobal = ""
 for  {
   set codSeqGlobal = $order(^mtempSrc2BaseIni(codTerm,codSeqGlobal))
   if (codSeqGlobal = "") quit
   set var = $get(^mtempSrc2BaseIni(codTerm,codSeqGlobal))
   
   if ($piece(var,"^",1) = "") continue
   
   set global = "^"_$piece(var,"^",1)
   
   set nivelChaveEmp = $piece(var,"^",2)
   
   kill tabXecuteDados
   merge tabXecuteDados = ^mtempSrc2BaseIni(codTerm,codSeqGlobal,"2-XecuteDados")
   
   kill tabXecuteChave
   merge tabXecuteChave = ^mtempSrc2BaseIni(codTerm,codSeqGlobal,"3-XecuteChave")
   
   if (nivelChaveEmp = "") {
     set sc=##class(Src2.PatchUtils2).GerarBaseInicalizacao2(codTerm, codAtualizacao, codSeqGlobal, global, flgSobreporBase, codConta, nivelChaveEmp, , .tabXecuteChave, .tabXecuteDados, .tabGlobal)
     continue
   }
   
   set codEmpresa = ""
   for  {
     set codEmpresa = $order(tabEmpresas(codEmpresa))
     if (codEmpresa = "") quit
     set sc = ##class(Src2.PatchUtils2).GerarBaseInicalizacao2(codTerm, codAtualizacao, codSeqGlobal, global, flgSobreporBase, codConta, nivelChaveEmp, codEmpresa, .tabXecuteChave, .tabXecuteDados, .tabGlobal)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarBaseInicalizacao2">
<Description>

Gerar Base de Inicalizacao 2
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,codAtualizacao:%String,codSeqGlobal:%String,global:%String,flgSobreporBase:%String,codConta:%String,nivelChaveEmp:%String,codEmpresa:%String,&tabXecuteChave:%String,&tabXecuteDados:%String,tabGlobal:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codConta = $get(codConta)
 set nivelChaveEmp = $get(nivelChaveEmp)
 set codEmpresa = $get(codEmpresa)
 
 if (codEmpresa = "") set msg = "Geração de Base :: Global: "_global_" / Namespace: "_$znspace
 else  set msg = "Geração de Base :: Global: "_global_" / Empresa: "_codEmpresa_" / Namespace: "_$znspace
 
 // Verifica se a global existe
 set flgExiste = ""
 if (nivelChaveEmp = 1) && ($data(@(global_"("_codEmpresa_")"))) set flgExiste = 1
 if (nivelChaveEmp '= 1) && ($data(@(global))) set flgExiste = 1
 
 // Verifica se a global foi criada nesta importação
 if (flgExiste) {
   if (codEmpresa = "") && ($data(tabGlobal(global))) set flgExiste = ""
   if (codEmpresa '= "") && ($data(tabGlobal(global,codEmpresa))) set flgExiste = ""
 }
 
 // Desvia globais que ja existem - gerando log de erro
 if ('flgSobreporBase) & (flgExiste) {
   set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 12, msg, "Global já existe")
   quit $$$OK
 }
 
 // Gera log de global gerada
 if (codEmpresa = "") set tabGlobal(global) = ""
 else  set tabGlobal(global,codEmpresa) = ""
 
 set codSeq = ""
 for {
   set codSeq = $order(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"4-dados",codSeq))
   if (codSeq = "") quit
   set sc = ##class(Src2.PatchUtils2).GerarBaseInicalizacao3(codTerm, codAtualizacao, codSeqGlobal, codSeq, global, codConta, nivelChaveEmp, codEmpresa, .tabXecuteChave, .tabXecuteDados, msg)
 }
 
 set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 12, msg)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarBaseInicalizacao3">
<Description>

Gerar Base de Inicalizacao 3
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,codAtualizacao:%String,codSeqGlobal:%String,codSeq:%String,global:%String,codConta:%String,nivelChaveEmp:%String,codEmpresa:%String,&tabXecuteChave:%String,&tabXecuteDados:%String,msg:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set var1 = $get(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"4-dados",codSeq,1))
 set var2 = $get(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"4-dados",codSeq,2))
 
 try {
   set sc = ##class(Src2.PatchUtils2).ObterChave(var1, nivelChaveEmp, codEmpresa, .tabXecuteChave, .chave, .nrNiveis)
   set sc = $$ObterDados^PCATUARG002(nrNiveis, var2, .tabXecuteDados, codConta, codEmpresa, .dados)
   xecute "set "_global_chave_"="_dados
 } catch {
   set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 12, msg, "Chave: "_$get(var1)_" / Dados: "_$get(var2)_" - "_$zerror)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterChave">
<Description>

Obter Chave

set sc=##class(Src2.PatchUtils2).ObterChave("^TESTEIMP(1,5,2,""MB"",222)",1,70,.tabXecuteChave,.chave)
set sc=##class(Src2.PatchUtils2).ObterChave("^TESTEIMP(1,5,3,""MB"",222)",1,70,.tabXecuteChave,.chave)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[string:%String,nivelChaveEmp:%String="",codEmpresa:%String="",&tabXecuteChave:%String,&chave:%String,&nrNiveis:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = $$ObterTabChave^PCATUARG002(string, .tabChave, .nrNiveis)
 
 //set tabXecuteChave(1,1)="4^2=5;3=3"
 //set tabXecuteChave(1,2)="""XX""_codConta"
 
 if (nivelChaveEmp '= "") && ($data(tabChave(nivelChaveEmp))) {
   set tabChave(nivelChaveEmp) = codEmpresa
 }
 
 if $data(tabChave) {
   set codSeq = ""
   for {
     set codSeq = $order(tabXecuteChave(codSeq))
     if (codSeq = "") quit
     set var = $get(tabXecuteChave(codSeq,1))
     
     set nivel = $piece(var,"^",1)
     if (nivel = "") continue
     
     if ('$data(tabChave(nivel))) continue
     
     set flag = 1
     for cont = 1:1:$length($piece(var,"^",2),";") {
       set valida = $piece($piece(var,"^",2),";",cont)
       if (valida = "") continue
       if ($get(tabChave($piece(valida,"=",1))) = $piece(valida,"=",2)) continue
       set flag = 0
     }
     
     if ('flag) continue
     
     set tabChave(nivel) = $get(tabXecuteChave(codSeq,2))
     set tabChave(nivel,1) = ""
   }
 }
 
 set (chave, nivel)=""
 for {
   set nivel = $order(tabChave(nivel))
   if (nivel = "") quit
   set valor = $get(tabChave(nivel))
   if ( (valor'?.N) ! (valor'=(+valor)) ) && ('$data(tabChave(nivel,1))) {
     set valor = """"_valor_""""
   }
   set chave = chave_$select(chave="":"",1:",")_valor
 }
 
 if (chave '= "") {
   set chave = "("_chave_")"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterReleaseNotes">
<Description>

Obter Release Notes do Redmine
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,codConta:%String="",idProdutoRedmine:%Integer,&tabVersoes:%String,flgEnviaTudo:%Boolean=0]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set strVersoes = ##class(Src2.Utils).ConvertTabStr(.tabVersoes,,";")
 
 if (codConta '= "") {
   set sc = $$GetSistemasCliente^CCGERRG007(codConta, .tabSiglasConta)
 }
 
 set sc = $$GetReleaseNotesVersoes^CCGERRG008(codTerm, idProdutoRedmine, strVersoes)
 if $$$ISERR(sc) quit sc
 
 set sql = "select parametro1, parametro2, parametro3, parametro4, parametro5, parametro6, parametro7, parametro8, parametro9 from CRedMineAcesso"
 set sql = sql_" where job="""_codTerm_""""
 
 set rs = ##class(%ResultSet).%New("%DynamicQuery:SQL")
 
 set sc = rs.Prepare(sql)
 if $$$ISERR(sc) quit sc
 
 set sc = rs.Execute()
 if $$$ISERR(sc) quit sc
 
 while rs.Next() {
   set versao = rs.GetData(1)
   set menus = rs.GetData(2)
   set tipo = rs.GetData(3)
   set tarefa = rs.GetData(4)
   set titulo = rs.GetData(5)
   set documentacao = rs.GetData(6)
   set sistema = rs.GetData(7)
   set funcionalidade = rs.GetData(8)
   set siglas = rs.GetData(9)
   
   if (sistema [ "PROD - ") { set sistema = $piece(sistema,"PROD - ",2) }
   
   if (funcionalidade = "null") { set funcionalidade = "" }
   set funcionalidade = $piece(funcionalidade," (",1)
   
   // Tratamento para valor NULL
   if ($ascii($extract(documentacao,1)) = 0) continue
   
   if ($ascii($extract(menus,1)) = 0) set menus = ""
   if ($ascii($extract(siglas,1)) = 0) set siglas = ""
   
   if (codConta '= "") , (siglas '= "") , ('flgEnviaTudo) {
     set sc = ##class(Src2.PatchUtils2).ValidarSelecaoReleaseNote(.tabSiglasConta, siglas)
     if $$$ISERR(sc) continue
   }
   
   set codSeq = $order(^mtempSrc2Patch(codTerm,"notes",1,""),-1) + 1
   
   set ^mtempSrc2Patch(codTerm,"notes",1,codSeq,1) = tarefa_"^"_tipo_"^"_versao_"^"_menus_"^"_sistema_"^"_funcionalidade_"^"_titulo_"^"_siglas
   set ^mtempSrc2Patch(codTerm,"notes",1,codSeq,2) = documentacao
   set ^mtempSrc2Patch(codTerm,"notes",2,versao,tipo,codSeq) = ""
   if (sistema '= "") {
     set ^mtempSrc2Patch(codTerm,"notes",3,sistema) = ""
     if (funcionalidade '= "") {
       set ^mtempSrc2Patch(codTerm,"notes",3,sistema,funcionalidade) = ""
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarSelecaoReleaseNote">
<Description>

Validar Selecao Release Note

set sc = ##class(Src2.PatchUtils2).ValidarSelecaoReleaseNote(.tabSiglasConta,"PCC/PDV/FGT")
set sc = ##class(Src2.PatchUtils2).ValidarSelecaoReleaseNote(.tabSiglasConta,"PCC2/PDV2/FGT2")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabSiglasConta:%String,siglasRelease:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ConvertStrTab(siglasRelease, .tabSiglasRelease, "/")
 
 set (codSigla, flgSel) = ""
 for {
   set codSigla = $order(tabSiglasRelease(codSigla))
   if (codSigla = "") quit
   if $data(tabSiglasConta(codSigla)) {
     set flgSel = 1
     quit
   }
 }
 
 if ('flgSel) quit $$$ERROR(10000,"Release notes não selecionado!")

 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDocumentacaoDocumento">
<Description>

Obter Documentação do Documento

set sc = ##class(Src2.PatchUtils2).ObterDocumentacaoDocumento("ej", "CC", 1, 249221, .tabDocumentacao, .codParceiro)
set sc = ##class(Src2.PatchUtils2).ObterDocumentacaoDocumento("ej", "CC", 4, 11184, .tabDocumentacao, .codParceiro)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,codConta:%String,tipoDocumento:%String="",documento:%String="",&tabDocumentacao:%String,&codParceiro:%Integer]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codParceiro = 1
 kill tabDocumentacao
 
 if (tipoDocumento = "") ! (documento = "") quit $$$OK
 
 set sc = ##class(Src2.PatchUtils).ObterTabTiposDocumentos(.tabTiposDoc)
 
 if (tipoDocumento = 1) {
   set sc = $$ObterDadosBaixaCham^CCGERRG011(documento, codConta, .textoBaixa, .enviaCliente, .codParceiro)
   
   if (enviaCliente) {
     set tabDocumentacao(1) = "Chamado: "_documento
     set tabDocumentacao(2) = "Documentação: "_textoBaixa
   }
 }
 
 if (tipoDocumento = 4) {
   set sc = ##class(Src2.PatchUtils2).ObterDocumentacaoTicket(codTerm, documento, .tipo, .documentacao, .sistema, .funcionalidade)
   
   if (funcionalidade '= "") {
     set sistema = sistema_" - "_funcionalidade
   }
   
   set tabDocumentacao(1) = "Tarefa: #"_documento
   set tabDocumentacao(2) = "Tipo: "_tipo
   set tabDocumentacao(3) = "Sistema: "_sistema
   set tabDocumentacao(4) = "Documentação: "_documentacao
 }
 
 if ('$data(tabDocumentacao)) quit $$$ERROR(10000,"Não há documentação para o "_$get(tabTiposDoc(tipoDocumento))_" "_documento)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDocumentacaoTicket">
<Description>

Obter Documentação do Ticket

set sc = ##class(Src2.PatchUtils2).ObterDocumentacaoTicket("ej", 11184, .tipo, .documentacao, .sistema, .funcionalidade)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,ticketRedmine:%String,&tipo:%String,&documentacao:%String,&sistema:%String,&funcionalidade:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (tipo, documentacao, sistema, funcionalidade) = ""
 
 set sc = $$GetDocumentacaoTicketRedmine^CCGERRG008(codTerm, ticketRedmine)
 if $$$ISERR(sc) quit sc
 
 set sql = "select parametro1, parametro2, parametro3, parametro4, parametro5, parametro6 from CRedMineAcesso"
 set sql = sql_" where job="""_codTerm_""""
 
 set rs = ##class(%ResultSet).%New("%DynamicQuery:SQL")
 
 set sc = rs.Prepare(sql)
 if $$$ISERR(sc) quit sc
 
 set sc = rs.Execute()
 if $$$ISERR(sc) quit sc
 
 while rs.Next() {
   set tipo = rs.GetData(1)
   set documentacao = rs.GetData(4)
   set sistema = rs.GetData(5)
   set funcionalidade = rs.GetData(6)
   
   // Tratamento para valor NULL
   if ($ascii($extract(documentacao,1)) = 0) continue
   
   if (funcionalidade = "null") { set funcionalidade = "" }
   set funcionalidade = $piece(funcionalidade," (",1)
   
   if (sistema [ "PROD - ") { set sistema = $piece(sistema,"PROD - ",2) }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarPermissaoGeracaoPatch">
<Description>

Validar Permissão Geração do Patch
  Códigos das Equipes no Gercon
    1  - Gerência
    8  - Suporte
    9  - Infraestrutura
    27 - Desenvolvimento
    28 - Manutenção
    29 - Customização
    30 - Projetos
    31 - Produto
    32 - Testes

set sc = ##class(Src2.PatchUtils2).ValidarPermissaoGeracaoPatch(3, "csw", 32)
set sc = ##class(Src2.PatchUtils2).ValidarPermissaoGeracaoPatch(3, "csw", 27)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tipoPatch:%String,sistema:%String,codConta:%String,codEquipe:%String,&tabSistemas:%String,email:%String="",flgAtuBloq:%String="",force:%Boolean=0,flgBase:%Boolean]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set tabAdmin("ederson@consistem.com.br") = ""
 set tabAdmin("leandro@consistem.com.br") = ""
 set tabAdmin("coelho@consistem.com.br") = ""
 set tabAdmin("falcone@consistem.com.br") = ""
 
 set tabBaseIni("jackson.souza@consistem.com.br") = ""
 set tabBaseIni("pablo.kerber@consistem.com.br") = ""
 set tabBaseIni("gilberto.sohn@consistem.com.br") = ""
 set tabBaseIni("katiani@consistem.com.br") = ""
 set tabBaseIni("vagner.rodrigues@consistem.com.br") = ""
 
 set tabLibManut("jackson.souza@consistem.com.br") = ""
 set tabLibManut("pablo.kerber@consistem.com.br") = ""
 set tabLibManut("marcos.souza@consistem.com.br") = ""
 set tabLibManut("vagner.rodrigues@consistem.com.br") = ""
 set tabLibManut("daniel@consistem.com.br") = ""
 set tabLibManut("camilo@consistem.com.br") = ""
 
 if ((email '= "") && ($data(tabAdmin(email))) && (force)) {
   quit $$$OK
 }
 
 if (flgAtuBloq = 1) {
   quit $$$ERROR(10000,"Atualização de todos os sistemas bloqueada temporariamente! Favor tentar mais tarde.")
 }
 
 set var = $get(tabSistemas(sistema))
 
 set bloqueada = $piece(var,"^",2)
 set bloqSnapshot = $piece(var,"^",8)
 
 if (bloqueada) {
   quit $$$ERROR(10000,"Atualização do sistema "_sistema_" bloqueada temporariamente! Favor tentar mais tarde.")
 }
 
 if ((bloqSnapshot) & (tipoPatch = 5)) {
   quit $$$ERROR(10000,"Geração de patch do tipo Snapshot bloqueada temporariamente para o sistema "_sistema_"! Favor tentar mais tarde.")
 }
 
 if ((flgBase) && (email ="")) {
   quit $$$ERROR(10000,"Geração de patch com base de inicialização liberada somente para usuários autorizados!")
 }
 
 if ((flgBase) & (('$data(tabAdmin(email))) & ('$data(tabBaseIni(email))))) {
   quit $$$ERROR(10000,"Geração de patch com base de inicialização liberada somente para usuários autorizados!")
 }
 
 if (codEquipe = "") quit $$$OK
 
 if (tipoPatch = 6) {
   if ((codEquipe '= 9) & ('$data(tabAdmin(email)))) {
     quit $$$ERROR(10000,"Favor solicitar a geração deste patch para a equipe de infraestrutura!")
   }
 }
 
 if ((email '= "") & (($data(tabAdmin(email))) ! ($data(tabLibManut(email))))) {
   set codEquipe = 28
 }
 
 if ((sistema = "csw") ! (sistema = "cswutil")) {
   if ((tipoPatch = 3) ! (tipoPatch = 4) ! (tipoPatch = 7)) {
     if ((codEquipe '= 1) & (codEquipe '= 27) & (codEquipe '= 28)& (codEquipe '= 31) & (codEquipe '= 32)) {
       quit $$$ERROR(10000,"Favor solicitar a geração deste patch para a equipe de manutenção!")
     }
   }
   if (tipoPatch = 5) {
     if ((codEquipe '= 1) & (codEquipe '= 27) & (codEquipe '= 28)& (codEquipe '= 31) & (codEquipe '= 32) & (codEquipe '= 8)) {
       quit $$$ERROR(10000,"Favor solicitar a geração deste patch para a equipe de manutenção!")
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarBloqueioCredito">
<Description>

Validar Bloqueio de Credito

set sc = ##class(Src2.PatchUtils2).ValidarBloqueioCredito("CO")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codConta:%String,force:%Boolean=0</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if force quit 1
 quit $$VerificaBloqueadoCredito^CCGER020RG(codConta)
]]></Implementation>
</Method>

<Method name="ValidarAtualizacaoBloqueada">
<Description>

Validar a Atualizacao Bloqueada

set sc = ##class(Src2.PatchUtils2).ValidarAtualizacaoBloqueada("CO")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codConta:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = $$VerifGerRemessa^CCGERC630RG(codConta)
 if $$$ISERR(sc) quit $$$ERROR(10000,"Atualização da conta "_codConta_" bloqueda temporariamente! Favor tentar mais tarde.")
 quit $$$OK
]]></Implementation>
</Method>

<Method name="EliminarVersoesLog">
<Description>

Eliminar Versoes Log
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,sistema:%String,releaseOrigem:%String,releaseDestino:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils2).ObterVersao(releaseOrigem, , , , , , .identificadorOrigem)
 set sc = ##class(Src2.Utils2).ObterVersao(releaseDestino, .versaoDestino, , , , , .identificadorDestino)
 
 if (identificadorDestino < identificadorOrigem) {
   set sc = ##class(Src2.PatchUtils2).EliminarVersoesLog(codTerm, sistema, releaseDestino, releaseOrigem)
   quit $$$OK
 }
 
 kill ^mtempSrc2PatchVersoesLog(codTerm)
 
 set item = ""
 for fixa = 1,2,3 { 
   for {
     set item = $order(^%CSW1ATUCONF(6,sistema,fixa,item))
     if (item = "") quit
     set versaoLog = $piece($get(^%CSW1ATUCONF(6,sistema,fixa,item)),"^",1)
     set ^mtempSrc2PatchVersoesLog(codTerm,versaoLog,fixa,item) = ""
   }
 }
 
 set (versaoLog, item) = ""
 for {
   set versaoLog = $order(^mtempSrc2PatchVersoesLog(codTerm,versaoLog))
   if (versaoLog = "") quit
   
   set sc = ##class(Src2.Utils2).ObterVersao(versaoLog, .versao, , , , , .identificadorLog)
   
   if (versaoDestino = versao) {
     if (identificadorLog > identificadorDestino) continue
     if (identificadorLog < identificadorOrigem) continue
   }
   
   for fixa = 1,2,3 {
     for {
       set item = $order(^mtempSrc2PatchVersoesLog(codTerm,versaoLog,fixa,item))
       if (item = "") quit
       kill ^%CSW1ATUCONF(6,sistema,fixa,item)
     }
   }
 }
 
 kill ^mtempSrc2PatchVersoesLog(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarAtualizacaoItem">
<Description>

Validar Atualização do Item
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codAtualizacao:%String,tipoPatch:%String,sistema:%String,tipoItem:%String,item:%String,versao:%String,revisao:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (tipoPatch = 2) ! (tipoPatch = 3) quit $$$OK
 
 if '$data(^%CSW1ATUCONF(6,sistema,tipoItem,item)) quit $$$OK
 
 set var = $get(^%CSW1ATUCONF(6,sistema,tipoItem,item))
 
 set versaoLog = $piece(var,"^",1)
 set revisaoLog = $piece(var,"^",2)
 
 set sc = ##class(Src2.Utils2).ObterVersao(versao, , , , , , .identificador)
 
 set sc = ##class(Src2.Utils2).ObterVersao(versaoLog, , , , , , .identificadorLog)
 
 if (identificador > identificadorLog) quit $$$OK
 
 set dsTipo = ""
 if (tipoItem = 1) set dsTipo = "Rotina "_item_" atualizada"
 if (tipoItem = 2) set dsTipo = "Classe "_item_" atualizada"
 if (tipoItem = 3) set dsTipo = "Menu do Sistema "_##class(Src2.PatchUtils).ObterDescricaoSistema(sistema)_" atualizado"
 
 if (identificador < identificadorLog) quit dsTipo_" por versão mais recente! (Release: "_versaoLog_")"
 
 if (revisao < revisaoLog) quit dsTipo_" por versão mais recente! (Release: "_versaoLog_" Revisão: "_revisaoLog_")"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="RegistrarAtualizacaoOutraVersao">
<Description>

Gerar Log de Atualizacao do Item
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codAtualizacao:%String,tipoPatch:%String,sistema:%String,tipoItem:%String,item:%String,versao:%String,revisao:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils2).ValidarAtualizacaoItem(codAtualizacao, tipoPatch, sistema, tipoItem, item, versao, revisao)
 if (sc '= $$$OK) quit sc
 
 kill ^%CSW1ATUCONF(6,sistema,tipoItem,item)
 
 if (tipoPatch = 1) ! (tipoPatch = 2) ! (tipoPatch = 6) quit $$$OK
 
 set ^%CSW1ATUCONF(6,sistema,tipoItem,item) = versao_"^"_revisao_"^"_codAtualizacao_"^"_tipoPatch_"^"_$horolog
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarVersaoBloqueada">
<Description>

Validar Versao Bloqueada
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,&tabSistemas:%String,&tabVersoes:%String,force:%Boolean=0]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (versao, versaoBloq) = ""
 for {
   set versao = $order(tabVersoes(versao))
   if (versao = "") quit
   if $data(tabSistemas(sistema,1,versao)) {
     set versaoBloq = versao
     quit
   }
 }
 
 if ('force) & (versaoBloq '= "") {
   set dsSistema = $piece($get(tabSistemas(sistema)),"^",7)
   quit $$$ERROR(10000,"A atualização para a próxima versão do sistema '"_dsSistema_"' precisa de acompanhamento da Consistem! Favor entrar em contato.")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterVersoesPreRequisitos">
<Description>

Obter Versoes Pre-Requisitos
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,&tabSistemas:%String,&tabVersoes:%String,&tabStrVersoesPreReq:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabStrVersoesPreReq
 
 set (versao, versaoBloq, tabStrVersoesPreReq) = ""
 for {
   set versao = $order(tabVersoes(versao))
   if (versao = "") quit
   if $data(tabSistemas(sistema,2,versao)) {
     merge tabTemp = tabSistemas(sistema,2,versao)
   }
 }
 
 set (sistema2, versao) = ""
 for {
   set sistema2 = $order(tabTemp(sistema2))
   if (sistema2 = "") quit
   set versaoSel = ""
   for {
     set versao = $order(tabTemp(sistema2,versao))
     if (versao = "") quit
     if (##class(Src2.Utils2).CompararVersao(versao, ">", versaoSel)) {
       set versaoSel = versao
     }
   }
   set tabStrVersoesPreReq = tabStrVersoesPreReq_$select(tabStrVersoesPreReq="":"",1:";")_sistema2_","_versaoSel
   set tabStrVersoesPreReq(sistema2) = versaoSel
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarPreRequisitosImportacao">
<Description>

Validar Versões Pre-Requisitos na Importação
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>versoesPreRequisito:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (versoesPreRequisito = "") quit $$$OK
 
 set msgErro = ""
 
 for cont = 1:1:$length(versoesPreRequisito,";") {
   set var = $piece(versoesPreRequisito,";",cont)
   
   set sistema = $piece(var,",",1)
   set versao = $piece(var,",",2)
   
   if ((sistema = "") ! (versao = "")) continue
   
   set dsSistema = ##class(Src2.PatchUtils).ObterDescricaoSistema(sistema)
   
   set versaoAtual = $piece($get(^%CSW1ATUCONF(3,sistema)),"^",1)
   
   if (versaoAtual = "") {
     set msgErro = "O produto '"_dsSistema_"' na versão "_versao_" (ou superior) é pré-requisito para esta atualização!"
     quit
   }
   
   if (##class(Src2.Utils2).CompararVersao(versaoAtual, "<", versao)) {
     set msgErro = "O produto '"_dsSistema_"' na versão "_versao_" (ou superior) é pré-requisito para esta atualização!"
     quit
   }
 }
 
 if (msgErro '= "") quit $$$ERROR(10000,msgErro)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarIndexHtml">
<Description>

Atualizar index.html
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sistema:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils2).ValidarVersaoSistema("cswutil", ">", "6.3.12", .flgRet)
 if ('flgRet) quit $$$OK
 
 // A partir da versão 6.4.9 foi alterado o formato do arquivo de versão.
 set tipoArq = 1
 set sc = ##class(Src2.Utils2).ValidarVersaoSistema("cswutil", ">", "6.4.8", .flgRet)
 if (flgRet) set tipoArq = 2
 set sc = ##class(Src2.Utils2).ValidarVersaoSistema("cswutil", ">", "6.5.1b0", .flgRet)
 if (flgRet) set tipoArq = 3
 
 set sc = ##class(Src2.PatchUtils).ObterAplicacoesCsp(sistema, .tabAplicacoes)
 if $$$ISERR(sc) quit sc
 
 set namespace = ""
 for {
   set namespace = $order(^%CSW1ATUCONF(3,sistema,1,namespace))
   if (namespace = "") quit
   
   set sc = ##class(Src2.PatchUtils).ValidarSelecaoNamespace(sistema,namespace,5)
   if $$$ISERR(sc) continue
   
   set caminhoAplicWeb = $piece($get(tabAplicacoes(namespace)),"^",1)
   if (caminhoAplicWeb = "") continue
   
   if ($data(^%CSW1ATUCONF(3,"gercon"))) {
     if (tipoArq = 1) set sc = ##class(Src2.PatchUtils2).GerarVersaoHtmlGercon(caminhoAplicWeb_"versao.html")
     if (tipoArq = 2) set sc = ##class(Src2.PatchUtils2).GerarVersaoTxtGercon64(caminhoAplicWeb_"versao.txt")
     if (tipoArq = 3) set sc = ##class(Src2.PatchUtils2).GerarVersaoTxtGercon65(caminhoAplicWeb_"versao.txt")
     continue
   }
   
   if ($data(^%CSW1ATUCONF(3,"csw"))) {
     if (tipoArq = 1) set sc = ##class(Src2.PatchUtils2).GerarVersaoHtmlCsw(caminhoAplicWeb_"versao.html")
     if (tipoArq = 2) set sc = ##class(Src2.PatchUtils2).GerarVersaoTxtCsw64(caminhoAplicWeb_"versao.txt")
     if (tipoArq = 3) set sc = ##class(Src2.PatchUtils2).GerarVersaoTxtCsw65(caminhoAplicWeb_"versao.txt")
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterVlrEscalonado">
<Description>

Retorna o valor escalonado, do primeiro para o ultimo
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>valor1:%String="",valor2:%String="",valor3:%String="",valor4:%String="",valor5:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if valor1'="" quit valor1
 if valor2'="" quit valor2
 if valor3'="" quit valor3
 if valor4'="" quit valor4
 if valor5'="" quit valor5
 quit ""
]]></Implementation>
</Method>

<Method name="GerarVersaoTxtCsw">
<Description>

Gerar versao.txt (Método Exclusivo para as Classes do Controle de Fontes)

set sc = ##class(Src2.PatchUtils2).GerarVersaoTxtCsw("6.4", "C:\workspacecsw\temp\versao.txt")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>versao:%String,arquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set flgRet = ##class(Src2.Utils2).CompararVersao(versao, ">", "6.4.999")
 
 if (flgRet) {
   set sc = ##class(Src2.PatchUtils2).GerarVersaoTxtCsw65(arquivo)
 } else {
   set sc = ##class(Src2.PatchUtils2).GerarVersaoTxtCsw64(arquivo)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarVersaoTxtCsw64">
<Description>

Gerar versao.txt - 6.4

set sc = ##class(Src2.PatchUtils2).GerarVersaoTxtCsw64("C:\workspacecsw\temp\versao.txt")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set stream = ##class(%FileBinaryStream).%New()
 set stream.Filename = arquivo
 do stream.WriteLine("<h2>Consistem Sistemas</h2>")
 do stream.WriteLine($zconvert("<p>Versão CSW: "_$$ObterVersaoRelease^CCCSWzzz()_"</p>","O","UTF8"))
 do stream.WriteLine($zconvert("<p>Versão Componentes: "_$$ObterVersaoRelease^%CSzzz()_"</p>","O","UTF8"))
 do stream.Flush()
 do stream.SaveStream()
 do stream.%Close()
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarVersaoTxtCsw65">
<Description>

Gerar versao.txt - 6.5

set sc = ##class(Src2.PatchUtils2).GerarVersaoTxtCsw65("C:\workspacecsw\temp\versao.txt")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set stream = ##class(%FileBinaryStream).%New()
 set stream.Filename = arquivo
 do stream.Write($zconvert("Versão CSW: "_$$ObterVersaoRelease^CCCSWzzz()_" | ","O","UTF8"))
 do stream.Write($zconvert("Versão Componentes: "_$$ObterVersaoRelease^%CSzzz(),"O","UTF8"))
 do stream.Flush()
 do stream.SaveStream()
 do stream.%Close()
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarVersaoTxtGercon64">
<Description>

Gerar versao.txt - 6.4

set sc = ##class(Src2.PatchUtils2).GerarVersaoTxtGercon64("C:\workspacecsw\temp\versao.txt")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set stream = ##class(%FileBinaryStream).%New()
 set stream.Filename = arquivo
 do stream.WriteLine("<h2>Consistem Sistemas</h2>")
 do stream.WriteLine($zconvert("<p>Versão CSW: "_$$ObterVersaoRelease^CCCSWzzz()_"</p>","O","UTF8"))
 do stream.WriteLine($zconvert("<p>Versão Gercon: "_$$ObterVersaoRelease^CCGERzzz()_"</p>","O","UTF8"))
 do stream.WriteLine($zconvert("<p>Versão Componentes: "_$$ObterVersaoRelease^%CSzzz()_"</p>","O","UTF8"))
 do stream.Flush()
 do stream.SaveStream()
 do stream.%Close()
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarVersaoTxtGercon65">
<Description>

Gerar versao.txt - 6.5

set sc = ##class(Src2.PatchUtils2).GerarVersaoTxtGercon65("C:\workspacecsw\temp\versao.txt")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set stream = ##class(%FileBinaryStream).%New()
 set stream.Filename = arquivo
 do stream.Write("Versão CSW: "_$$ObterVersaoRelease^CCCSWzzz()_" | ")
 do stream.Write($zconvert("Versão Gercon: "_$$ObterVersaoRelease^CCGERzzz()_" | ","O","UTF8"))
 do stream.Write($zconvert("Versão Componentes: "_$$ObterVersaoRelease^%CSzzz(),"O","UTF8"))
 do stream.Flush()
 do stream.SaveStream()
 do stream.%Close()
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarVersaoHtmlCsw">
<Description>

Gerar versao.html

set sc = ##class(Src2.PatchUtils2).GerarVersaoHtmlCsw("C:\workspacecsw\temp\versao.html")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 open arquivo:("NRWAL":/IOTABLE="UTF8"):5
 
 use arquivo
 
 &html<
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <link rel="stylesheet" type="text/css" href="objetos/extjs/resources/css/ext-all.css" />
 <link rel="stylesheet" type="text/css" href="objetos/extjs/resources/css/common.css" />
 <link rel="stylesheet" type="text/css" href="objetos/extjs/resources/css/ModalDialog.css" />
 <link rel="stylesheet" type="text/css" href="objetos/extjs/resources/css/website.css" />
 <style type="text/css">
     body {
         width:100%;
         margin:0 auto;
         clear:
         both;
         font-size: 13px;
         color: #666;
         padding-top: 17px;
         text-align:center;
         background:#fff;
         font-family:verdana,Tahoma, Geneva, sans-serif;
     }
 </style>
 <body>
     <p>Versão CSW: #($$ObterVersaoRelease^CCCSWzzz())#</p>
     <p>Versão Componentes: #($$ObterVersaoRelease^%CSzzz())#</p>
 </body>
 >
 
 close arquivo
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarVersaoHtmlGercon">
<Description>

Gerar versao.html

set sc = ##class(Src2.PatchUtils2).GerarVersaoHtmlGercon("C:\workspacecsw\temp\versao.html")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 open arquivo:("NRWAL":/IOTABLE="UTF8"):5
 
 use arquivo
 
 &html<
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <link rel="stylesheet" type="text/css" href="objetos/extjs/resources/css/ext-all.css" />
 <link rel="stylesheet" type="text/css" href="objetos/extjs/resources/css/common.css" />
 <link rel="stylesheet" type="text/css" href="objetos/extjs/resources/css/ModalDialog.css" />
 <link rel="stylesheet" type="text/css" href="objetos/extjs/resources/css/website.css" />
 <style type="text/css">
     body {
         width:100%;
         margin:0 auto;
         clear:
         both;
         font-size: 13px;
         color: #666;
         padding-top: 17px;
         text-align:center;
         background:#fff;
         font-family:verdana,Tahoma, Geneva, sans-serif;
     }
 </style>
 <body>
     <p>Versão CSW: #($$ObterVersaoRelease^CCCSWzzz())#</p>
     <p>Versão Gercon: #($$ObterVersaoRelease^CCGERzzz())#</p>
     <p>Versão Componentes: #($$ObterVersaoRelease^%CSzzz())#</p>
 </body>
 >
 
 close arquivo
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterEnderecoNexus">
<Description>

Obtem o Endereco do Nexus

set sc = ##class(Src2.PatchUtils2).ObterEnderecoNexus(.server, .port)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&server:%String="",&port:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set server = "10.0.0.219"
 set port = "8081"
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarServicoNexus">
<Description>

Validar o Servico Nexus

set sc = ##class(Src2.PatchUtils2).ValidarServicoNexus()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils2).ObterEnderecoNexus(.server, .port)
 
 set obj = ##class(%Net.HttpRequest).%New()
 set obj.Server = server
 set obj.Port = port
 set obj.Timeout = 10
 
 do obj.Get("/nexus/index.html#welcome")
 if (obj.HttpResponse.StatusCode '= 200) quit $$$ERROR(10000,"Não foi possível conectar ao Nexus! Endereço: http://"_server_":"_port_"/nexus/index.html#welcome")
 
 set obj=""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarArquivoVersionado">
<Description>

Validar Arquivo Versionado
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sistema:%String,tipoArquivo:%String,versao:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConfig(, .caminhoWorkspace)
 quit:sc'=1 sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set arquivo = caminhoWorkspace_barra_"configgeral"_barra_"atualizador"_barra_sistema_"_"_$translate(versao,".","-")_".xml"
 
 if ('##class(%File).Exists(arquivo)) quit $$$ERROR(10000,"Tipo de arquivo não selecionado para o release!")
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivo,.reader)
 
 set (path, flag) = ""
 
 while (reader.Read()) {
   if (reader.Path '= "") {
     set path = reader.Path
   }
   if (path = "/Release/ArquivosVersionados/ArquivoVersionado") & (reader.NodeType="chars") {
     if (reader.ValueGet() = tipoArquivo) {
       set flag = 1
       quit
     }
   }
 }
 set reader = ""
 
 if ('flag) quit $$$ERROR(10000,"Tipo de arquivo não selecionado para o release!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarArquivosVersionados">
<Description>

Exportar Arquivos Versionados
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,caminhoPatch:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set tipoArquivo = ""
 for {
   set tipoArquivo = $order(^mtempSrc2Patch(codTerm,"arquivosVersionados",tipoArquivo))
   if (tipoArquivo = "") quit
   set var = $get(^mtempSrc2Patch(codTerm,"arquivosVersionados",tipoArquivo))
   
   set nomeArquivo = $piece(var,"^",2)
   set enderecoDownload = $piece(var,"^",3)
   
   set sc = ##class(Src2.PatchUtils2).DownloadArquivoVersionado(caminhoPatch, nomeArquivo, enderecoDownload)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="DownloadArquivoVersionado">
<Description>

Download do Arquivo Versionado
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminhoPatch:%String,nomeArquivo:%String,enderecoDownload:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils2).ObterEnderecoNexus(.server, .port)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set obj = ##class(%Net.HttpRequest).%New()
 set obj.Server = server
 set obj.Port = port
 set obj.Timeout = 10
 
 do obj.Get(enderecoDownload)
 if (obj.HttpResponse.StatusCode '= 200) quit $$$ERROR(10000,"Não foi possível baixar o arquivo "_enderecoDownload_"! Erro Http: "_obj.HttpResponse.StatusLine)
 
 set streamZip = ##class(%FileBinaryStream).%New()
 set streamZip.Filename = caminhoPatch_barra_"outros"_barra_nomeArquivo
 do streamZip.CopyFrom(obj.HttpResponse.Data)
 do streamZip.Flush()
 do streamZip.SaveStream()
 do streamZip.%Close()
 
 set (obj,streamZip)=""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterArquivosVersionadosEnviar">
<Description>

Obter Arquivos Versionados a Enviar
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,sistema:%String,tipoPatch:%String,codConta:%String,versaoReleaseOrigem:%String,versaoReleaseRef:%String,versaoReleaseAfetada:%String,flgRetorno:%Boolean=0,&tabTags:%String,&tabVersoes:%String,flgEnviaTudo:%Boolean=0,&tabSiglas:%String,&tabArqVersInf:%String,obsArqVers:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set obsArqVers = ""
 
 set sc = ##class(Src2.PatchUtils).ObterArquivosVersionadosPatch(sistema, tipoPatch, codConta, .tabArqVers, flgEnviaTudo, .tabSiglas)
 
 set tipoArquivo = ""
 for {
   set tipoArquivo = $order(tabArqVers(tipoArquivo))
   if (tipoArquivo = "") quit
   
   set nomeArquivo = $get(tabArqVers(tipoArquivo,"nome"))
   set localizacao = $get(tabArqVers(tipoArquivo,"localizacao"))
   set rotinaProcedimento = $get(tabArqVers(tipoArquivo,"rotinaProcedimento"))
   set descricao = $get(tabArqVers(tipoArquivo,"descricao"))
   set observacao = $get(tabArqVers(tipoArquivo,"observacao"))
   
   if (nomeArquivo = "") continue
   
   if ((tipoPatch = 2) ! (tipoPatch = 3) ! (tipoPatch = 4)) {
     if ('$data(tabArqVersInf(nomeArquivo))) continue
   }
   
   set versaoArquivo = ""
   
   if (tipoPatch = 1) ! (tipoPatch = 5) {
     set sc = ##class(Src2.PatchUtils2).ObterArquivoVersionadoTabVersao(sistema, tipoArquivo, versaoReleaseOrigem, versaoReleaseRef, flgRetorno, .tabTags, .tabVersoes, .versaoArquivo)
     if $$$ISERR(sc) quit
   }
   
   if (tipoPatch = 2) ! (tipoPatch = 3) ! (tipoPatch = 6) {
     set sc = ##class(Src2.PatchUtils2).ObterArquivoVersionadoReferencia(sistema, tipoArquivo, versaoReleaseRef, .tabTags, .versaoArquivo)
     if $$$ISERR(sc) quit
   }
   
   if (tipoPatch = 4) {
     set sc = ##class(Src2.PatchUtils2).ObterArquivoVersionadoReferencia(sistema, tipoArquivo, versaoReleaseAfetada, .tabTags, .versaoArquivo)
     if $$$ISERR(sc) quit
   }
   
   if (versaoArquivo = "") continue
   
   set sc = ##class(Src2.Utils).ObterEnderecoArquivo(tipoArquivo, .tabArqVers, versaoArquivo, .endereco)
   if $$$ISERR(sc) continue
   
   if (endereco = "") continue
   
   set ^mtempSrc2Patch(codTerm,"arquivosVersionados",tipoArquivo) = versaoArquivo_"^"_nomeArquivo_"^"_endereco_"^"_localizacao
   set ^mtempSrc2Patch(codTerm,"arquivosVersionados",tipoArquivo,1) = rotinaProcedimento
   set ^mtempSrc2Patch(codTerm,"arquivosVersionados",tipoArquivo,2) = descricao
   set ^mtempSrc2Patch(codTerm,"arquivosVersionados",tipoArquivo,3) = observacao
   set ^mtempSrc2Patch(codTerm,"dados") = ""
   
   if (observacao '= "") {
     if (obsArqVers = "") set obsArqVers = observacao
     else  set obsArqVers = obsArqVers_$char(10)_observacao
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterArquivoVersionadoTabVersao">
<Description>

Obter Arquivo Versionado de uma Tabela de Versoes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,tipoArquivo:%String,versaoReleaseOrigem:%String,versaoReleaseRef:%String,flgRetorno:%Boolean=0,&tabTags:%String,&tabVersoes:%String,&versaoArquivo:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set versaoArquivo = ""
 
 // Atualização: 6.3.7 para 6.3.12
 // consistem_geral.jar: 6.3.8 / 6.3.9 / 6.3.11 / 6.3.13
 // Enviar: 6.3.11
 
 if ('flgRetorno) {
   set sc = ##class(Src2.PatchUtils).ObterVersoesOrdenadas(.tabVersoes, .tabVersoesOrdem)
   set codSeq = ""
   for {
     set codSeq = $order(tabVersoesOrdem(codSeq),-1)
     if (codSeq = "") quit
     set versao = $piece($get(tabVersoesOrdem(codSeq)),"^",1)
     set sc = ##class(Src2.PatchUtils2).ValidarArquivoVersionado(sistema, tipoArquivo, versao)
     if (sc '= 1) continue
     set versaoArquivo = versao
     quit
   }
 }
 
 // Atualização: 6.3.12 para 6.3.6
 // consistem_geral.jar: 6.3.3 / 6.3.5 / 6.3.8 / 6.3.9 / 6.3.11
 // Enviar: 6.3.5
 
 if (flgRetorno) {
   set sc = ##class(Src2.PatchUtils).ObterVersoesIntervalo(.tabTags, versaoReleaseRef, versaoReleaseOrigem, , .tabVersoesOrdem)
   set codSeq = ""
   for {
     set codSeq = $order(tabVersoesOrdem(codSeq),-1)
     if (codSeq = "") quit
     set versao = $piece($get(tabVersoesOrdem(codSeq)),"^",1)
     set sc = ##class(Src2.PatchUtils2).ValidarArquivoVersionado(sistema, tipoArquivo, versao)
     if (sc '= 1) continue
     set sc = ##class(Src2.PatchUtils2).ObterArquivoVersionadoReferencia(sistema, tipoArquivo, versaoReleaseRef, .tabTags, .versaoArquivo)
     quit
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterArquivoVersionadoReferencia">
<Description>

Obter Arquivo Versionado de Referencia
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,tipoArquivo:%String,versaoReleaseRef:%String,&tabTags:%String,&versaoArquivo:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set versaoArquivo = ""
 
 if (versaoReleaseRef = "") quit $$$OK
 
 set sc = ##class(Src2.PatchUtils).ObterVersoesOrdenadas(.tabTags, , , , .versaoReleasePrimeira)
 
 set sc = ##class(Src2.PatchUtils).ObterVersoesIntervalo(.tabTags, versaoReleaseRef, versaoReleasePrimeira, .tabVersoes)
 
 set tabVersoes(versaoReleaseRef) = ""
 
 set sc = ##class(Src2.PatchUtils).ObterVersoesOrdenadas(.tabVersoes, .tabVersoesOrdem)
 
 set codSeq = ""
 for {
   set codSeq = $order(tabVersoesOrdem(codSeq),-1)
   if (codSeq = "") quit
   set versao = $piece($get(tabVersoesOrdem(codSeq)),"^",1)
   set sc = ##class(Src2.PatchUtils2).ValidarArquivoVersionado(sistema, tipoArquivo, versao)
   if (sc '= 1) continue
   set versaoArquivo = versao
   quit
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterArquivoVersionadoUltimo">
<Description>

Obter Arquivo Versionado de Ultimo
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,tipoArquivo:%String,&tabTags:%String,&versaoArquivo:%String,flgBeta:%Boolean=1]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set versaoArquivo = ""
 
 set sc = ##class(Src2.PatchUtils).ObterVersoesOrdenadas(.tabTags, .tabVersoesOrdem, , , , flgBeta)
 
 set codSeq = ""
 for {
   set codSeq = $order(tabVersoesOrdem(codSeq),-1)
   if (codSeq = "") quit
   set versao = $piece($get(tabVersoesOrdem(codSeq)),"^",1)
   
   set sc = ##class(Src2.PatchUtils2).ValidarArquivoVersionado(sistema, tipoArquivo, versao)
   if (sc '= 1) continue
   
   set versaoArquivo = versao
   quit
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarNamespaces">
<Description>

Validar Namespaces
</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils).ObterNamespacesAtualizacao(.tabNamespace)
 
 set namespace = ""
 for {
   set namespace = $order(tabNamespace(namespace))
   if (namespace = "") quit
   set sc = ##class(Src2.PatchUtils2).ValidarNamespace(namespace)
   if (sc '= 1) set tabNamespaceErro(namespace) = ""
 }
 
 if ($data(tabNamespaceErro)) quit $$$ERROR(10000,"Não foi possível conectar-se aos namespaces: "_##class(Src2.Utils).ConvertTabStr(.tabNamespaceErro))
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarNamespace">
<Description>

Validar Namespace
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>namespace:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set namespaceOrigem = $znspace
 set $ztrap = "ValidarNamespaceErro"
 znspace namespace
 set flgErro = 0
 if ($znspace '= namespace) set flgErro = 1
 //=====================================================================================
 // Definido junto a Qualix o padrão abaixo para a situação dos namespaces
 //    if '$data(^CSWNAMESPACE)  = Namespace Montado
 //    set ^CSWNAMESPACE=1       = Namespace Montado
 //    set ^CSWNAMESPACE=0       = Namespace Desmontado - Não vamos permitir atualizar
 if ($data(^CSWNAMESPACE)) , ($piece($get(^CSWNAMESPACE),"^",1) = 0) set flgErro = 2
 //=====================================================================================
 znspace namespaceOrigem
 set $ztrap=""
 if (flgErro=1) quit "Não foi possível conectar-se ao namespace "_namespace_"!"
 if (flgErro=2) quit "O namespace "_namespace_" encontra-se desmontado!"
 quit $$$OK
ValidarNamespaceErro	;
 znspace namespaceOrigem
 set $ztrap=""
 quit "Não foi possível conectar-se ao namespace "_namespace_"!"
]]></Implementation>
</Method>

<Method name="ObterRemessasServer">
<Description>

Retorna os Patchs do Server (Consistem)

set sc = ##class(Src2.PatchUtils2).ObterRemessasServer("CS", .tabelaPatchs)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codConta:%String,&tabelaPatchs:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabelaPatchs
 
 set $zerror = ""
 set $ztrap = "ObterRemessasClientError"
 
 set objServico = ##Class(Src2.Web.Cliente.PatchSoap).%New()
 if (objServico = "") {
   set $ztrap = ""
   quit $$$ERROR(10000,"Não foi possível conectar no WebService da Consistem!")
 }
 
 set strPatch = objServico.ListarRemessasServidor(codConta)
 
 for i = 1:1:$length(strPatch,";") {
   set idPatch = $piece(strPatch,";",i)
   if (idPatch = "") quit
   set tabelaPatchs(idPatch) = objServico.ObterDadosPatch(codConta,idPatch)
 }
 
 set objServico = ""
 
 set $ztrap = ""
 
 quit $$$OK
 
ObterRemessasClientError	;
 set $ztrap=""
 if ($zerror [ "<ZSOAP>") quit $$$ERROR(10000,"Não foi possível conectar ao WebService da Consistem! Tente novamente mais tarde.")
 else  quit $$$ERROR($$$CacheError,$zerror)
]]></Implementation>
</Method>

<Method name="ObterPatchsAtualizacaoCompleta">
<Description>

Retorna os Patchs para Atualização Completa
OBS: Este método deve substituir uma regra na rotina CCUTI800RG

set sc = ##class(Src2.PatchUtils2).ObterPatchsAtualizacaoCompleta(.patchCswUtil, .patchCsw)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&patchCswUtil:%String,&patchCsw:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (patchCsw , patchCswUtil) = ""
 
 set sc = ##class(Src2.PatchUtils2).ObterRemessasClient(.tabelaPatchs)
 if (sc '= 1) quit sc
 
 set idPatch = ""
 for {
   set idPatch = $order(tabelaPatchs(idPatch))
   if (idPatch = "") quit
   set dadosPatch = $get(tabelaPatchs(idPatch))
   
   if ($piece(dadosPatch,"^",9) '= 6) continue
   
   if ($piece(dadosPatch,"^",8) = "cswutil") {
     set patchCswUtil = idPatch
   }
   
   if ($piece(dadosPatch,"^",8) = "csw") {
     set patchCsw = idPatch
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterRemessasClient">
<Description>

Retorna os Patchs do Client (Clientes)
OBS: Este método deve substituir uma regra na rotina CCUTI800RG

set sc = ##class(Src2.PatchUtils2).ObterRemessasClient(.tabelaPatchs)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabelaPatchs:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set caminhoPatch = $piece($get(^%CSW1ATUCONF(2)),"^",1)
 
 set rs = ##class(%ResultSet).%New("%File:FileSet") 
 do rs.Execute(caminhoPatch,"*.xml")
 while (rs.Next()) {
   set caminhoPatchXml = caminhoPatch_barra_rs.Get("ItemName")
   set idPatch = $piece(rs.Get("ItemName"),".xml",1)
   
   set sc=##class(Src2.Patch).ObterDadosPatch(caminhoPatchXml, .tabPatchs)
   if (sc '= 1) continue
   
   set $piece(dadosPatch,"^",1)=$get(tabPatchs("dsSistema"))
   set $piece(dadosPatch,"^",2)=$get(tabPatchs("dsTipo"))
   set $piece(dadosPatch,"^",3)=$get(tabPatchs("versaoOrigemRef"))
   set $piece(dadosPatch,"^",4)=$get(tabPatchs("versaoFontesPatch"))
   set $piece(dadosPatch,"^",5)=2
   set $piece(dadosPatch,"^",6)=$get(tabPatchs("dsDocumento"))
   set $piece(dadosPatch,"^",7)=$get(tabPatchs("observacao"))
   set $piece(dadosPatch,"^",8)=$get(tabPatchs("sistema"))
   set $piece(dadosPatch,"^",9)=$get(tabPatchs("tipo"))
   
   set tabelaPatchs(idPatch)=dadosPatch
 }
 do rs.%Close()
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarExportacaoMenuPatch">
<Description>

Validar Exportação do Menu Patch

set sc = ##class(Src2.Patch).ValidarExportacaoMenuPatch("C:\workspacecsw\temp\PATCH-TESTE" ,"http://192.168.15.10:18080/svn/csw/branches/6.4", , "EI")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminhoPatch:%String,repositorio:%String,revisao:%String="head",codConta:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 kill ^mtempSrc2Patch(codTerm,"menus")
 
 if ('$data(^mtempSrc2Patch(codTerm,"flags","flgMenu"))) quit $$$OK
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sc = ##class(Src2.PatchUtils2).ObterArquivosMenu(repositorio, revisao, codConta, username, password)
 if $$$ISERR(sc) quit sc
 
 set pastaTemp = caminhoPatch_barra_"temp_menus"
 
 set sc = ##class(Src2.Utils2).CriarPasta(pastaTemp)
 
 set msgsc = $$$OK
 
 set arquivoMenu = ""
 for {
   set arquivoMenu = $order(^mtempSrc2Patch(codTerm,"flags","flgMenu",arquivoMenu))
   if (arquivoMenu = "") quit
   set var = $get(^mtempSrc2Patch(codTerm,"flags","flgMenu",arquivoMenu))
   
   set tipo = $piece(var,"^",1)
   set urlArquivo = $piece(var,"^",2)
   set arquivo = pastaTemp_barra_arquivoMenu
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "export --force --quiet """_urlArquivo_""" """_arquivo_"""", , , autenticacao)
   if (msgsc '= $$$OK) quit
   
   set tabArquivosMenus(tipo,arquivo) = ""
   
   set arquivoXML = ##class(%XML.Reader).%New()
   
   set sc = arquivoXML.OpenFile(arquivo)
   set arquivoXML = ""
   if $$$ISERR(sc) {
     set msgsc = "Arquivo de menu '"_arquivoMenu_"' com erro de estrutura! '"_##class(Src2.Utils).ObterMensagemStatusCode(sc)_"'"
     quit
   }
 }
 
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 merge ^mtempSrc2Patch(codTerm,"menus") = tabArquivosMenus
 
 set ^mtempSrc2Patch(codTerm,"dados") = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarMenuPatch">
<Description>

Exportar Menu Patch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[caminhoPatch:%String,codConta:%String,sistema:%String,tipoProdCsw:%String,&tabSegmentos:%String,&tabProgramasMenu:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 if ('$data(^mtempSrc2Patch(codTerm,"menus"))) quit $$$OK
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set arquivoMenuGerado = caminhoPatch_barra_"outros"_barra_"menu.xml"
 
 merge tabArquivosMenus = ^mtempSrc2Patch(codTerm,"menus")
 
 set finalidade = 1
 set flgAllSegmentos = 0
 
 if (codConta = "CC") ! (codConta = "GE") {
   set finalidade = 0
   set flgAllSegmentos = 1
 }
 
 set sc = ##class(Src2.Menu.Geral).ExportarMenu(.tabArquivosMenus, arquivoMenuGerado, tipoProdCsw, .tabSegmentos, .tabProgramasMenu, sistema, flgAllSegmentos, finalidade)
 if $$$ISERR(sc) quit sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterArquivosMenu">
<Description>

Obter Arquivos de Menu

set sc = ##class(Src2.PatchUtils).ObterArquivosMenu("http://192.168.15.10:18080/svn/csw/trunk", , "IC")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>repositorio:%String,revisao:%String="",codConta:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 if (revisao = "") set revisao = "head"
 
 set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set flgMenuBase = 0
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list "_repositorio_" --revision "_revisao, , , autenticacao, arquivoTemp)
 
 set file = ##class(%File).%New(arquivoTemp)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   if (linhaFile [ "menubase/") set flgMenuBase = 1
 }
 
 do file.Close()
 set file=""
 
 if (flgMenuBase) {
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list "_repositorio_"/menubase --revision "_revisao, , , autenticacao, arquivoTemp)
   
   set file = ##class(%File).%New(arquivoTemp)
   do file.Open("R")
   for {
     set tam = 32000
     set linhaFile = file.Read(.tam)
     if (tam = -1) quit
     if (linhaFile '[ "cswmenu2_") continue
     set ^mtempSrc2Patch(codTerm,"flags","flgMenu",linhaFile) = 1_"^"_repositorio_"/menubase/"_linhaFile_"@"_revisao
   }
   do file.Close()
   set file=""
 }
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list http://192.168.15.10:18080/svn/menucliente", , , autenticacao, arquivoTemp)
 
 set file = ##class(%File).%New(arquivoTemp)
 do file.Open("R")
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   if (linhaFile '[ ($zconvert(codConta,"l")_"_cswmenu2_")) continue
   set ^mtempSrc2Patch(codTerm,"flags","flgMenu",linhaFile) = 2_"^http://192.168.15.10:18080/svn/menucliente/"_linhaFile_"@head"
 }
 do file.Close()
 set file=""
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterGlobaisBaseInic">
<Description>

Obter Globais de Base de Inicialização

set sc = ##class(Src2.PatchUtils2).ObterGlobaisBaseInic("csw", "AE", "6.4", .tabGlobais)
set sc = ##class(Src2.PatchUtils2).ObterGlobaisBaseInic("csw", , "6.4", .tabGlobais)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,codConta:%String="",versao:%String="",&tabGlobais:%String,username:%String="",password:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabGlobais
 
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2, , .pastaTemp)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set msgsc = ##class(Src2.UtilsXml).ObterAtualizacaoXML(.tabSistemas)
 
 set var = $get(tabSistemas(sistema))
 
 set repositorio = $piece(var,"^",1)
 
 if (codConta '= "") {
   set sc = $$GetSistemasCliente^CCGERRG007(codConta, .tabSiglas)
   set sc = ##class(Src2.PatchUtils).ObterDadosCliente(codConta, , .tabSegmentos)
 }
 
 kill ^mtempSrc2BaseIni(codTerm)
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set repositorio2 = ##class(Src2.PatchUtils).ObterBranchTrunk(repositorio, versao)
 
 set sc = ##class(Src2.PatchUtils2).ObterArquivosBaseIni(repositorio2, , username, password)
 if $$$ISERR(sc) quit sc
 
 set pastaTemp = pastaTemp_barra_"temp_bases"
 
 set sc = ##class(Src2.Utils2).CriarPasta(pastaTemp)
 
 set msgsc = $$$OK
 
 set arquivoBase = ""
 for {
   set arquivoBase = $order(^mtempSrc2Patch(codTerm,"arquivosbaseini",arquivoBase))
   if (arquivoBase = "") quit
   set var = $get(^mtempSrc2Patch(codTerm,"arquivosbaseini",arquivoBase))
   
   set urlArquivo = $piece(var,"^",1)
   set arquivo = pastaTemp_barra_arquivoBase
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "export --force --quiet """_urlArquivo_""" """_arquivo_"""", , , autenticacao)
   if (msgsc '= $$$OK) quit
   
   set tabArquivosBases(arquivo) = ""
   
   set arquivoXML = ##class(%XML.Reader).%New()
   
   set sc = arquivoXML.OpenFile(arquivo)
   set arquivoXML = ""
   if $$$ISERR(sc) {
     set msgsc = "Arquivo de base '"_arquivoBase_"' com erro de estrutura! '"_##class(Src2.Utils).ObterMensagemStatusCode(sc)_"'"
     quit
   }
 }
 
 kill ^mtempSrc2Patch(codTerm)
 
 if (msgsc '= $$$OK) {
   set sc2 = ##class(%File).RemoveDirectoryTree(pastaTemp) 
   quit $$$ERROR(10000,msgsc)
 }
 
 set sc = $$$OK
 
 set arquivoBase = ""
 for {
   set arquivoBase = $order(tabArquivosBases(arquivoBase))
   if (arquivoBase = "") quit
   set sc = ##class(Src2.PatchUtils2).LerArquivoBaseIni(codTerm, arquivoBase)
   if $$$ISERR(sc) quit
 }
 
 set sc2 = ##class(%File).RemoveDirectoryTree(pastaTemp)
 
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.PatchUtils2).FiltrarBaseIni(codTerm, codConta, .tabSiglas, .tabSegmentos)
 if $$$ISERR(sc) {
   kill ^mtempSrc2Patch(codTerm)
   kill ^mtempSrc2BaseIni(codTerm)
   quit sc
 }
 
 set global = ""
 for {
   set global = $order(^mtempSrc2Patch(codTerm,"flags","flgBase",global))
   if (global = "") quit
   set descricao = $piece($get(^mtempSrc2Patch(codTerm,"flags","flgBase",global)),"^",1)
   set tabGlobais(global) = descricao
 }
 
 kill ^mtempSrc2Patch(codTerm)
 kill ^mtempSrc2BaseIni(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarExportacaoBaseIniPatch">
<Description>

Validar Exportação de Bases para o Patch

set sc = ##class(Src2.PatchUtils2).ValidarExportacaoBaseIniPatch("C:\workspacecsw\temp\PATCH-TESTE" ,"http://192.168.15.10:18080/svn/csw/branches/6.4", , "AE")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[caminhoPatch:%String,repositorio:%String,revisao:%String="head",codConta:%String,&tabSiglas:%String,&tabSegmentos:%String,flgSobreporBase:%Boolean=0,strEmpBasesIni:%String="",strGlobaisBasesIni:%String="",username:%String="",password:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 kill ^mtempSrc2BaseIni(codTerm)
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sc = ##class(Src2.PatchUtils2).ObterArquivosBaseIni(repositorio, revisao, username, password)
 if $$$ISERR(sc) quit sc
 
 set pastaTemp = caminhoPatch_barra_"temp_bases"
 
 set sc = ##class(Src2.Utils2).CriarPasta(pastaTemp)
 
 set msgsc = $$$OK
 
 set arquivoBase = ""
 for {
   set arquivoBase = $order(^mtempSrc2Patch(codTerm,"arquivosbaseini",arquivoBase))
   if (arquivoBase = "") quit
   set var = $get(^mtempSrc2Patch(codTerm,"arquivosbaseini",arquivoBase))
   
   set urlArquivo = $piece(var,"^",1)
   set arquivo = pastaTemp_barra_arquivoBase
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "export --force --quiet """_urlArquivo_""" """_arquivo_"""", , , autenticacao)
   if (msgsc '= $$$OK) quit
   
   set tabArquivosBases(arquivo) = ""
   
   set arquivoXML = ##class(%XML.Reader).%New()
   
   set sc = arquivoXML.OpenFile(arquivo)
   set arquivoXML = ""
   if $$$ISERR(sc) {
     set msgsc = "Arquivo de base '"_arquivoBase_"' com erro de estrutura! '"_##class(Src2.Utils).ObterMensagemStatusCode(sc)_"'"
     quit
   }
 }
 
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set sc = $$$OK
 
 set arquivoBase = ""
 for {
   set arquivoBase = $order(tabArquivosBases(arquivoBase))
   if (arquivoBase = "") quit
   set sc = ##class(Src2.PatchUtils2).LerArquivoBaseIni(codTerm, arquivoBase)
   if $$$ISERR(sc) quit
 }
 
 if $$$ISERR(sc) quit sc
 
 set sc = ##class(Src2.PatchUtils2).FiltrarBaseIni(codTerm, codConta, .tabSiglas, .tabSegmentos, strGlobaisBasesIni)
 if $$$ISERR(sc) quit sc
 
 if ($order(^mtempSrc2BaseIni(codTerm,"")) '= "") {
   set ^mtempSrc2Patch(codTerm,"flags","flgBase") = flgSobreporBase_"^"_strEmpBasesIni
   set ^mtempSrc2Patch(codTerm,"dados") = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterArquivosBaseIni">
<Description>

Obter Arquivos de Base

set sc = ##class(Src2.PatchUtils2).ObterArquivosBaseIni("http://192.168.15.10:18080/svn/csw/branches/6.4")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>repositorio:%String,revisao:%String="",username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 if (revisao = "") set revisao = "head"
 
 set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set flgMenuBase = 0
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list "_repositorio_" --revision "_revisao, , , autenticacao, arquivoTemp)
 
 set file = ##class(%File).%New(arquivoTemp)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   if (linhaFile [ "menubase/") set flgMenuBase = 1
 }
 
 do file.Close()
 set file=""
 
 if (flgMenuBase) {
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list "_repositorio_"/menubase --revision "_revisao, , , autenticacao, arquivoTemp)
   
   set file = ##class(%File).%New(arquivoTemp)
   do file.Open("R")
   for {
     set tam = 32000
     set linhaFile = file.Read(.tam)
     if (tam = -1) quit
     if (linhaFile '[ "cswbase_") continue
     set ^mtempSrc2Patch(codTerm,"arquivosbaseini",linhaFile) = repositorio_"/menubase/"_linhaFile_"@"_revisao
   }
   do file.Close()
   set file=""
 }
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="LerArquivoBaseIni">
<Description>

Ler Arquivo de Base de Inicialização

KILL ^mtempSrc2BaseIni set sc = ##class(Src2.PatchUtils2).LerArquivoBaseIni("XX", "C:\workspacecsw\temp\PATCH-TESTE\temp_bases\cswbase_geral_cidades.xml")
KILL ^mtempSrc2BaseIni set sc = ##class(Src2.PatchUtils2).LerArquivoBaseIni("XX", "C:\workspacecsw\temp\PATCH-TESTE\temp_bases\cswbase_financeiro.xml")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,arquivoBase:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set stream = ##class(%FileBinaryStream).%New()
 set stream.Filename = arquivoBase
 
 set sc = ##class(%XML.TextReader).ParseStream(stream, .reader)
 if $$$ISERR(sc) quit sc
 
 set (path, codSeqGlobal, msgErro, codSeqParteGlobal) = ""
 for {
   if ('reader.Read()) quit
   
   if (reader.Path '= "") set path = reader.Path
   
   if (path '[ "/CSW/Globais/Global") continue
   
   if (path = "/CSW/Globais/Global") & (reader.NodeType = "element") {
     set (global, chEmp, codSegmento, codSeqParteGlobal) = ""
     if reader.MoveToAttributeName("nome") set global = reader.Value
     if reader.MoveToAttributeName("descricao") set descricao = reader.Value
     if reader.MoveToAttributeName("chaveEmpresa") set chEmp = reader.Value
     if reader.MoveToAttributeName("segmento") set codSegmento = reader.Value
     if (global = "") {
       set msgErro = "Base de inicialização | Global não informada | "_arquivoBase_" | "_path
     }
     set codSeqGlobal = $order(^mtempSrc2BaseIni(codTerm,""),-1)+1
     set ^mtempSrc2BaseIni(codTerm,codSeqGlobal) = $translate(global,"^","")_"^"_chEmp_"^"_codSegmento_"^"_descricao
   }
   
   if (path = "/CSW/Globais/Global/Siglas/SiglaGercon") & (reader.NodeType = "chars") {
     set sigla = reader.Value
     set ^mtempSrc2BaseIni(codTerm,codSeqGlobal,"1-siglas",sigla) = ""
   }
   
   if (path = "/CSW/Globais/Global/Xecutes/XecuteDados") & (reader.NodeType = "element") {
     set nivel = ""
     if reader.MoveToAttributeName("nivel") set nivel = reader.Value
   }
   
   if (path = "/CSW/Globais/Global/Xecutes/XecuteDados") & (reader.NodeType = "chars") {
     set comando = reader.Value
     set codSeq = $order(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"2-XecuteDados",""),-1)+1
     set ^mtempSrc2BaseIni(codTerm,codSeqGlobal,"2-XecuteDados",codSeq,1) = nivel
     set ^mtempSrc2BaseIni(codTerm,codSeqGlobal,"2-XecuteDados",codSeq,2) = comando
   }
   
   if (path = "/CSW/Globais/Global/Xecutes/XecuteChave") & (reader.NodeType = "element") {
     set (nivel,chave) = ""
     if reader.MoveToAttributeName("nivel") set nivel = reader.Value
     if reader.MoveToAttributeName("chave") set chave = reader.Value
   }
   
   if (path = "/CSW/Globais/Global/Xecutes/XecuteChave") & (reader.NodeType = "chars") {
     set comando = reader.Value
     set codSeq = $order(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"3-XecuteChave",""),-1)+1
     set ^mtempSrc2BaseIni(codTerm,codSeqGlobal,"3-XecuteChave",codSeq,1) = nivel_"^"_chave
     set ^mtempSrc2BaseIni(codTerm,codSeqGlobal,"3-XecuteChave",codSeq,2) = comando
   }
   
   if (path = "/CSW/Globais/Global/Dados") & (reader.NodeType = "chars") {
     set dados = reader.Value
     set ^mtempSrc2BaseIni(codTerm,codSeqGlobal,"temp",$increment(codSeqParteGlobal)) = dados
   }
   
   if (path = "/CSW/Globais/Global/Dados") & (reader.NodeType = "endelement")  {
     set (codSeq, flag) = 1
     set (codSeq2, dados) = ""
     for {
       set codSeq2 = $order(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"temp",codSeq2))
       if (codSeq2 = "") quit
       set var = $get(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"temp",codSeq2))
       for cont = 1:1:$length(var) {
         if $extract(var,cont) = $char(10) {
           set sc = ##class(Src2.PatchUtils2).LerArquivoBaseIni2(codTerm, codSeqGlobal, .codSeq, .flag, .dados)
           continue
         }
         set dados = dados_$extract(var,cont)
       }
     }
     set sc = ##class(Src2.PatchUtils2).LerArquivoBaseIni2(codTerm, codSeqGlobal, .codSeq, .flag, .dados)
     kill ^mtempSrc2BaseIni(codTerm,codSeqGlobal,"temp")
   }
 }
 
 set reader = ""
 
 if (msgErro '= "") quit $$$ERROR(10000,msgErro)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="LerArquivoBaseIni2">
<Description>

Filtrar Base de Inicialização 2
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,codSeqGlobal:%Integer,&codSeq:%Integer,&flag:%String,&dados:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set ^mtempSrc2BaseIni(codTerm,codSeqGlobal,"4-dados",codSeq,flag) = dados
 
 if (flag = 1) { set flag = 2 }
 else  {
   set flag = 1
   set codSeq = codSeq + 1
 }
       
 set dados = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="FiltrarBaseIni">
<Description>

Filtrar Base de Inicialização
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,codConta:%String="",&tabSiglas:%String,&tabSegmentos:%String,strGlobaisBasesIni:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ConvertStrTab($translate(strGlobaisBasesIni,"^",""), .tabGlobaisBasesIni)
 
 set (codSeqGlobal, sigla) = ""
 for {
   set codSeqGlobal = $order(^mtempSrc2BaseIni(codTerm,codSeqGlobal))
   if (codSeqGlobal = "") quit
   
   set global = $piece($get(^mtempSrc2BaseIni(codTerm,codSeqGlobal)),"^",1)
   set codSegmento = $piece($get(^mtempSrc2BaseIni(codTerm,codSeqGlobal)),"^",3)
   set descricao = $piece($get(^mtempSrc2BaseIni(codTerm,codSeqGlobal)),"^",4)
   
   if (global = "") {
     kill ^mtempSrc2BaseIni(codTerm,codSeqGlobal)
     continue
   }
   
   if $data(tabGlobaisBasesIni) && ('$data(tabGlobaisBasesIni(global))) {
     kill ^mtempSrc2BaseIni(codTerm,codSeqGlobal)
     continue
   }
   
   if (codConta '= "") && (codConta '= "CC") && (codConta '= "GE") {
     if (codSegmento '= "") && ('$data(tabSegmentos(codSegmento))) {
       kill ^mtempSrc2BaseIni(codTerm,codSeqGlobal)
       continue
     }
     set (sigla, flgSel) = ""
     for {
       set sigla = $order(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"1-siglas",sigla))
       if (sigla = "") quit
       if $data(tabSiglas(sigla)) {
         set flgSel = 1
         quit
       }
     }
     if ('flgSel)  {
       kill ^mtempSrc2BaseIni(codTerm,codSeqGlobal)
       continue
     }
   }
   
   set ^mtempSrc2Patch(codTerm,"flags","flgBase",global) = descricao
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarBaseIniPatch">
<Description>

Exportar Base de Inicialização para o Patch

set sc = ##class(Src2.PatchUtils2).ExportarBaseIniPatch("6788", "C:\workspacecsw\temp\PATCH-TESTE")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,caminhoPatch:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ($order(^mtempSrc2BaseIni(codTerm,"")) = "") quit $$$OK
 
 set aspas = """"
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set objFile = ##class(%File).%New(caminhoPatch_barra_"outros"_barra_"base_inicializacao.xml")
 
 do objFile.Open("WN:/IOTABLE=""UTF8""")
 if ('objFile.IsOpen) quit $$$ERROR(10000,"Não foi possível abrir o arquivo '"_arquivoBaseInicializacao_"'!")
 
 set sc = objFile.WriteLine("<?xml version=""1.0"" encoding=""UTF-8""?>")
 
 set sc = objFile.WriteLine("<CSW>")
 set sc = objFile.WriteLine("<Globais>")
 
 set codSeqGlobal = ""
 for  {
   set codSeqGlobal = $order(^mtempSrc2BaseIni(codTerm,codSeqGlobal))
   if (codSeqGlobal = "") quit
   set var = $get(^mtempSrc2BaseIni(codTerm,codSeqGlobal))
   
   set sc = objFile.WriteLine(##class(Src2.Utils).Tab(1)_"<Global nome="_aspas_"^"_$piece(var,"^",1)_aspas_" descricao="_aspas_$piece(var,"^",4)_aspas_" chaveEmpresa="_aspas_$piece(var,"^",2)_aspas_">")
   
   if ($data(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"2-XecuteDados"))) ! ($data(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"3-XecuteChave"))) {
     set sc = objFile.WriteLine(##class(Src2.Utils).Tab(2)_"<Xecutes>")
     set codSeq = ""
     for  {
       set codSeq = $order(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"2-XecuteDados",codSeq))
       if (codSeq = "") quit
       set var = $get(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"2-XecuteDados",codSeq,1))
       set var2 = $get(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"2-XecuteDados",codSeq,2))
       set sc = objFile.WriteLine(##class(Src2.Utils).Tab(3)_"<XecuteDados nivel="_aspas_$piece(var,"^",1)_aspas_">"_var2_"</XecuteDados>")
     }
     set codSeq = ""
     for  {
       set codSeq = $order(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"3-XecuteChave",codSeq))
       if (codSeq = "") quit
       set var = $get(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"3-XecuteChave",codSeq,1))
       set var2 = $get(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"3-XecuteChave",codSeq,2))
       set sc = objFile.WriteLine(##class(Src2.Utils).Tab(3)_"<XecuteChave nivel="_aspas_$piece(var,"^",1)_aspas_" chave="_aspas_$piece(var,"^",2)_aspas_">"_var2_"</XecuteChave>")
     }
     set sc = objFile.WriteLine(##class(Src2.Utils).Tab(2)_"</Xecutes>")
   }
   
   set sc = objFile.WriteLine(##class(Src2.Utils).Tab(2)_"<Dados>")
   set sc = objFile.WriteLine("<![CDATA[")
   
   set codSeq = ""
   for  {
     set codSeq = $order(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"4-dados",codSeq))
     if (codSeq = "") quit
     set sc = objFile.WriteLine($get(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"4-dados",codSeq,1)))
     set sc = objFile.WriteLine($get(^mtempSrc2BaseIni(codTerm,codSeqGlobal,"4-dados",codSeq,2)))
   }
   
   set sc = objFile.WriteLine("]]]]><![CDATA[>")
   set sc = objFile.WriteLine(##class(Src2.Utils).Tab(2)_"</Dados>")
   
   set sc = objFile.WriteLine(##class(Src2.Utils).Tab(1)_"</Global>")
 }
 
 set sc = objFile.WriteLine("</Globais>")
 set sc = objFile.Write("</CSW>")
 
 do objFile.Close()
 set objFile = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosReleaseSistema">
<Description>

Obter Dados do Release do Sistema
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,&tabVersoes:%String,&tabGrupoItensAdic:%String,&tabBloqUsoAtua:%String,&obsRelease:%String,&tabGlobais:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabGrupoItensAdic, tabBloqUsoAtua, tabGlobais, tabObservacoes
 
 set obsRelease = ""
 
 set sc = ##class(Src2.Utils).ObterConfig(, .caminhoWorkspace)
 quit:sc'=1 sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set versao = ""
 for {
   set versao = $order(tabVersoes(versao))
   if (versao = "") quit
   
   set arquivo = caminhoWorkspace_barra_"configgeral"_barra_"atualizador"_barra_sistema_"_"_$translate(versao,".","-")_".xml"
   
   if ('##class(%File).Exists(arquivo)) continue
   
   set sc = ##class(%XML.TextReader).ParseFile(arquivo,.reader)
   
   set path = ""
   
   while (reader.Read()) {
     if (reader.Path '= "") {
       set path = reader.Path
     }
     if (path = "/Release/ItensEnviar/GrupoRotina") & (reader.NodeType="chars") {
       set grupoRotina = reader.ValueGet()
       if (grupoRotina '= "") {
         set tabGrupoItensAdic(grupoRotina) = ""
       }
     }
     if (path = "/Release/ItensEnviar/GrupoClasse") & (reader.NodeType="chars") {
       set grupoClasse = reader.ValueGet()
       if (grupoClasse '= "") {
         set tabGrupoItensAdic(grupoClasse) = ""
       }
     }
     if (path = "/Release/ItensEnviar/Global") & (reader.NodeType="chars") {
       set grupoClasse = reader.ValueGet()
       if (grupoClasse '= "") {
         set tabGlobais(grupoClasse) = ""
       }
     }
     if (path = "/Release/BloquearUsoAtualizacao/GrupoRotina") & (reader.NodeType="chars") {
       set grupoRotina = reader.ValueGet()
       if (grupoRotina '= "") {
         set tabBloqUsoAtua(1,grupoRotina) = ""
       }
     }
     if (path = "/Release/BloquearUsoAtualizacao/BloqueioTotal") & (reader.NodeType="chars") {
       set grupoRotina = reader.ValueGet()
       if (grupoRotina '= "") {
         set tabBloqUsoAtua(2,"BloqueioTotal") = ""
       }
     }
     if (path = "/Release/Observacao") & (reader.NodeType="chars") {
       set observacao = reader.ValueGet()
       if (observacao '= "") {
         set tabObservacoes(observacao) = ""
       }
     }
   }
   set reader = ""
 }
 
 if $data(tabObservacoes) {
   set obsRelease = ##class(Src2.Utils).ConvertTabStr(.tabObservacoes,,$char(10))
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterJobBloqAtu">
<Description>

Obter Job para Atualização

ATENÇÃO: NÃO UTILIZAR PARA OUTRAS LÓGICAS

write ##class(Src2.PatchUtils2).ObterJobBloqAtu()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codTerm = ""
 
 try {
   set codTerm = $$Job^%CSINTEGRA()
 } catch {
   try {
   // Descontinuado
   set codTerm = $$Job^CCUTIINTEGRA()
   } catch {
     set codTerm = $job
   }
 }
 
 quit codTerm
]]></Implementation>
</Method>

<Method name="ValidarBloqueioAtualizacao">
<Description>

Validar Bloqueio Atualizacao

set sc = ##class(Src2.PatchUtils2).ValidarBloqueioAtualizacao(1,1,.tabGruposRotBloquear)
set sc = ##class(Src2.PatchUtils2).ValidarBloqueioAtualizacao(1,1,.tabGruposRotBloquear)
set sc = ##class(Src2.PatchUtils2).ValidarBloqueioAtualizacao(1,0,.tabGruposRotBloquear)
set sc = ##class(Src2.PatchUtils2).ValidarBloqueioAtualizacao(1,0,.tabGruposRotBloquear)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tipoPatch:%String,bloqueioTotal:%String=0,&tabGruposRotBloquear:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if $data(^mtempSrc2ForcarAtualizacao) quit $$$OK
 
 set sc = ##class(Src2.Utils2).ValidarVersaoSistema("cswutil", ">", "6.4", .flgRet)
 if ('flgRet) quit $$$OK
 
 if (tipoPatch = 6) quit $$$OK
 
 set codTerm = ##class(Src2.PatchUtils2).ObterJobBloqAtu()

 if (bloqueioTotal) {
   // Caracter
   set sc=$$RetornaUsuariosLogadosCaracter^%CSW1LICENCA(.tabUsuariosCar)
   set (codSeq, flgErro) = ""
   for {
     set codSeq = $order(tabUsuariosCar(codSeq))
     if (codSeq = "") quit
     set var = $get(tabUsuariosCar(codSeq))
     if ($piece(var,"^",4) = codTerm) continue
     set flgErro = 1
     quit
   }
   if flgErro quit $$$ERROR(10000,"Para esta atualização nenhum usuário deve estar logado no sistema!")
   
   // CSW
   set sc=$$RetornaUsuariosLogadosCSW^%CSW1LICENCA(.tabUsuariosCSW)
   set (codSeq, flgErro) = ""
   for {
     set codSeq = $order(tabUsuariosCSW(codSeq))
     if (codSeq = "") quit
     set var = $get(tabUsuariosCSW(codSeq))
     if ($piece(var,"^",4) = codTerm) continue
     set flgErro = 1
     quit
   }
   if flgErro quit $$$ERROR(10000,"Para esta atualização nenhum usuário deve estar logado no sistema!")
   
   quit $$$OK
 }
 
 if ('$data(tabGruposRotBloquear)) quit $$$OK
 
 set (rotina, codTerm2, seqEmpilhamento, flgErro) = ""
 for {
   set rotina = $order(^mtempCSWLOGUSOROT(rotina))
   if (rotina = "") quit
   set sc = ##class(Src2.Item).ValidarSelecaoGrupoItens(.tabGruposRotBloquear, rotina_".mac")
   if (sc = $$$OK) {
     for {
       set codTerm2 = $order(^mtempCSWLOGUSOROT(rotina,codTerm2))
       if (codTerm2 = "") quit
       if (codTerm2 = codTerm) continue
       set flgErro = 1
       quit
     }
   }
   if (flgErro) quit
 }
 
 if (flgErro) {
   set strProgramas = ##class(Src2.Utils).ConvertTabStr(.tabGruposRotBloquear)
   set strProgramas = ##class(Src2.Utils).Translate(strProgramas, ".mac", "")
   quit $$$ERROR(10000,"Os programas ("_strProgramas_") não podem estar em uso durante a instalação deste patch!")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="EfetivarBloqueiosAtualizacao">
<Description>

Efetivar Bloqueios da Atualizacao

Como funciona o bloqueio
  
  1. O bloqueio por rotina - Não permite que ninguem acesse as rotinas bloqueadas
  
  2. O bloqueio geral
  2.1. No momento da atualização, ninguem (Exceto quem esta atualizando) pode estar logado no sistema
  2.2. Bloqueio o acesso ao menu
  2.2. O acesso ao menu, permanece liberado para usuários administradores
  2.3. Mas estes usuários administradores, não vão conseguir acessar nenhum programa, com execessão do atualizador
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tipoPatch:%String,bloqueioTotal:%String=0,&tabGruposRotBloquear:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils2).ValidarVersaoSistema("cswutil", ">", "6.4", .flgRet)
 if ('flgRet) quit $$$OK
 
 if (tipoPatch = 6) quit $$$OK
 
 set codTerm = ##class(Src2.PatchUtils2).ObterJobBloqAtu()
 
 set sc = ##class(Src2.PatchUtils2).ExcluirBloqueiosAtualizacao()
 
 set sc = ##class(Src2.PatchUtils2).ValidarBloqueioAtualizacao(tipoPatch, bloqueioTotal, .tabGruposRotBloquear)
 quit:sc'=1 sc
 
 if (bloqueioTotal) {
   set ^mtempSrc2AtualizBloqueios(1) = $piece($get(^%CSMENCF),"^",23)
   set $piece(^%CSMENCF,"^",23) = 1
 } else {
   merge ^mtempSrc2AtualizBloqueios(2) = tabGruposRotBloquear
 }
 
 hang 3
 
 set sc = ##class(Src2.PatchUtils2).ValidarBloqueioAtualizacao(tipoPatch, bloqueioTotal, .tabGruposRotBloquear)
 if (sc '= 1) {
   set sc = ##class(Src2.PatchUtils2).ExcluirBloqueiosAtualizacao()
   quit sc
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirBloqueiosAtualizacao">
<Description>

Excluir Bloqueios da Atualizacao
</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if $data(^mtempSrc2AtualizBloqueios(1)) {
   set $piece(^%CSMENCF,"^",23) = $piece($get(^mtempSrc2AtualizBloqueios(1)),"^",1)
 }
 
 kill ^mtempSrc2AtualizBloqueios
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AjustarItensLimitados">
<Description>

Ajustar Itens Limitados
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,tipoPatch:%Integer,versao:%String,codConta:%String,repositorio:%String,versaoReleaseRef:%String,&tabItensLimitados:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (tipoPatch = 7) quit $$$OK
 
 set sc = ##class(Src2.PatchUtils2).ObterGrupoItensLimitados(versao, codConta, .tabItensLimitados, .tabGrupoRotinas, .tabGrupoClasses)
 if $$$ISERR(sc) quit $$$OK
 
 set flgValidarVersao = 0
 if (tipoPatch = 1) ! (tipoPatch = 2) ! (tipoPatch = 3) ! (tipoPatch = 6) {
   set flgValidarVersao = 1
 }
 
 if $data(tabGrupoRotinas) {
   set rotina = ""
   for {
     set rotina = $order(^mtempSrc2Patch(codTerm,"rotinas",1,rotina))
     if (rotina = "") quit
     set var = $get(^mtempSrc2Patch(codTerm,"rotinas",1,rotina))
     
     set sc = ##class(Src2.Item).ValidarSelecaoGrupoItens(.tabGrupoRotinas, rotina_".mac", .grupoSelecionado)
     if (sc '= $$$OK) ! (grupoSelecionado = "") continue
     
     set release = $piece($get(tabGrupoRotinas(grupoSelecionado)),"^",1)
     
     if (flgValidarVersao) & (##class(Src2.Utils2).CompararVersao(versaoReleaseRef, "<", release)) continue
     
     set endereco = ##class(Src2.PatchUtils).ObterTag(repositorio, release)
     set endereco = endereco_"/rotinas/"_$piece(var,"^",3)_"@head"
     
     set $piece(^mtempSrc2Patch(codTerm,"rotinas",1,rotina),"^",1) = endereco
     set $piece(^mtempSrc2Patch(codTerm,"rotinas",1,rotina),"^",4) = release
     set $piece(^mtempSrc2Patch(codTerm,"rotinas",1,rotina),"^",5) = "head"
     set $piece(^mtempSrc2Patch(codTerm,"rotinas",1,rotina),"^",6) = 1
   }
 }
 
 if $data(tabGrupoClasses) {
   set classe = ""
   for {
     set classe = $order(^mtempSrc2Patch(codTerm,"classes",1,classe))
     if (classe = "") quit
     set var = $get(^mtempSrc2Patch(codTerm,"classes",1,classe))
     
     set sc = ##class(Src2.Item).ValidarSelecaoGrupoItens(.tabGrupoClasses, classe_".cls", .grupoSelecionado)
     if (sc '= $$$OK) ! (grupoSelecionado = "") continue
     
     set release = $piece($get(tabGrupoClasses(grupoSelecionado)),"^",1)
     
     if (flgValidarVersao) & (##class(Src2.Utils2).CompararVersao(versaoReleaseRef, "<", release)) continue
     
     set endereco = ##class(Src2.PatchUtils).ObterTag(repositorio, release)
     set endereco = endereco_"/classes/"_$piece(var,"^",3)_"@head"
     
     set $piece(^mtempSrc2Patch(codTerm,"classes",1,classe),"^",1) = endereco
     set $piece(^mtempSrc2Patch(codTerm,"classes",1,classe),"^",4) = release
     set $piece(^mtempSrc2Patch(codTerm,"classes",1,classe),"^",5) = "head"
     set $piece(^mtempSrc2Patch(codTerm,"classes",1,classe),"^",6) = 1
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterGrupoItensLimitados">
<Description>

Obter Grupos Itens Limitados
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[versao:%String,codConta:%String,&tabItensLimitados:%String,&tabGrupoRotinas:%String,&tabGrupoClasses:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabGrupoRotinas, tabGrupoClasses
 
 if ('$data(tabItensLimitados(versao))) quit $$$ERROR(10000,"Não existem limitações de versão configuradas!")
 
 set grupoRotina = ""
 for {
   set grupoRotina = $order(tabItensLimitados(versao,1,grupoRotina))
   if (grupoRotina = "") quit
   if ($data(tabItensLimitados(versao,1,grupoRotina,1,codConta))) continue
   set tabGrupoRotinas(grupoRotina) = $piece($get(tabItensLimitados(versao,1,grupoRotina)),"^",1)
 }
 
 set grupoClasse = ""
 for {
   set grupoClasse = $order(tabItensLimitados(versao,2,grupoClasse))
   if (grupoClasse = "") quit
   if ($data(tabItensLimitados(versao,2,grupoClasse,1,codConta))) continue
   set tabGrupoClasses(grupoClasse) = $piece($get(tabItensLimitados(versao,2,grupoClasse)),"^",1)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarInstalacaoServicoConsistem">
<Description>
 
Validar Instalacao do Serviço Consistem

set sc = ##class(Src2.PatchImport2).ValidarInstalacaoServicoConsistem()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>senhaSystem:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 // Senha do _system do Caché
 
 if (senhaSystem = "") {
   quit $$$ERROR(10000,"Senha do _SYSTEM do Caché não informada!")
 }
 
 set sc = $SYSTEM.Security.Login("_SYSTEM", senhaSystem)
 if (sc '= 1) {
   quit $$$ERROR(10000,"Senha do _SYSTEM do Caché inválida!")
 }
 
 // Valida Usuário Root no Linux
 
 set msgsc = ##class(Src2.Utils2).ValidarUsuarioRoot()
 if (msgsc '= 1) {
   quit $$$ERROR(10000,msgsc)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarServicoConsistem">
<Description>

Atualizar Serviço Consistem
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,codAtualizacao:%Integer,codConta:%String,flgLinhaCmd=0,senhaSystem:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if '$data(^mtempSrc2PatchImport(codTerm,"consistem_server")) quit $$$OK
 
 set var = $get(^mtempSrc2PatchImport(codTerm,"consistem_server"))
 
 set caminho = $piece(var,"^",1)
 set arquivoRpm = $piece(var,"^",2)
 set versao = $piece(var,"^",3)
 set caminhoTemp = $piece(var,"^",4)
 set consistemHome = $piece(var,"^",5)
 set arquivoLog = $piece(var,"^",6)
 set nomeArquivo = $piece(var,"^",7)
 
 set arquivoInstall = caminho_"/install.sh"
 
 set sc = ##class(Src2.PatchUtils2).GerarArquivoInstalacaoLinux(arquivoInstall, arquivoRpm, codConta, caminhoTemp, consistemHome, senhaSystem)
 
 set sc = $zf(-1,arquivoInstall_" > "_arquivoLog_" 2>&1")
 
 set sc = ##class(Src2.Utils2).ConverteArquivoTabela(arquivoLog, .tabDetalhes)
 
 if (flgLinhaCmd) {
   set codSeq = ""
   for  {
     set codSeq = $order(tabDetalhes(codSeq)) 
     if (codSeq = "") quit
     write !,$get(tabDetalhes(codSeq)) 
   }
 }
 
 // Verifica se o wildfly esta no ar
 set sc = 0, tentativas = 0
 while (sc '= 1) && (+$get(tentativas) < 10) {
   set tentativas = $increment(tentativas)
   if (flgLinhaCmd) write !,"Conectando no Serviço Consistem... "_tentativas
   set sc = ##class(Src2.WildFly).ControllTest()
 }
 if (sc = 1) {
   if (flgLinhaCmd) write !!,##class(Src2.Utils).ObterBarra("Criando DataSources")
   for {
     set namespace = $order(^%CSW1ATUCONF(4,$get(namespace)))
     if (namespace="") quit
     set flagconf=$piece($get(^%CSW1ATUCONF(4,namespace)),"^",1)
     
     if (flagconf = "%sys") continue
     if (flagconf = "sem_procedimento") continue
     if (flagconf = "sistemas") continue
     
     set sc = ##class(Src2.WildFly).RemoveDS($zconvert(namespace_"ds","U"),arquivoLog)
     set sc = ##class(Src2.WildFly).CreateDS($zconvert(namespace_"ds","U"),namespace,"","","",arquivoLog)
     
     set sc = ##class(Src2.Utils2).ConverteArquivoTabela(arquivoLog, .tabDetalhes)
     
     if (flgLinhaCmd) {
       set codSeq = ""
       for  {
         set codSeq = $order(tabDetalhes(codSeq))
         if (codSeq = "") quit
         write !,$get(tabDetalhes(codSeq))
       }
     }
   }
 } else {
   if (flgLinhaCmd) write !,"Erro ao conectar no Serviço Consistem!"
 }
 
 if (sc = 0) {
   set sc = ##class(Src2.PatchUtils).GerarLogOK(codAtualizacao, 8, "Instação do arquivo consistem_server.rpm (versão: "_versao_")", .tabDetalhes)
 } else {
   set sc = ##class(Src2.PatchUtils).GerarLogErro(codAtualizacao, 8, "Instação do arquivo consistem_server.rpm (versão: "_versao_")", .tabDetalhes)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarArquivoInstalacaoLinux">
<Description>

Gera o Arquivo de Instalação para Linux

set sc=##class(Src2.PatchUtils2).GerarArquivoInstalacaoLinux("/usr/tmp/install.sh", "/usr/tmp/consistem_server.rpm", "CC","/usr/tmp", "/consistem", "ccscache")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivoInstall:%String,arquivoRpm:%String,codConta:%String,caminhoTemp:%String,consistemHome:%String,senhaSystem:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (##class(Src2.Utils).ObterSistOper() '= "linux") quit $$$OK

 set sc = ##class(Src2.PatchUtils).ObterConfigServerProducao(.arqServerProducao, consistemHome, .pastaServerProducao)

 set sc = ##class(Src2.PatchUtils).ObterConfigSerasaHttp(.arqSerasaHttp, consistemHome, .pastaSerasaHttp)

 set pastaComponentes = ##class(Src2.Utils2).ObterPastaComponentes()

 set objFile = ##class(%File).%New(arquivoInstall)

 do objFile.Open("WN:/IOTABLE=""UTF8""")
 if ('objFile.IsOpen) {
   quit $$$ERROR(10000,"Não foi possível criar o arquivo de instalação!")
 }

 set sc = objFile.WriteLine("#!/bin/bash")

 set sc = objFile.WriteLine("fail() {")
 set sc = objFile.WriteLine("    echo ""ERROR: $1""")
 set sc = objFile.WriteLine("    exit 1")
 set sc = objFile.WriteLine("}")

 set sc = objFile.WriteLine("if [[ $EUID -ne 0 ]]; then")
 set sc = objFile.WriteLine("    echo ""This script must be run as root"" 1>&2")
 set sc = objFile.WriteLine("    exit 1")
 set sc = objFile.WriteLine("fi")

 set sc = objFile.WriteLine("stopProcess(){")
 set sc = objFile.WriteLine("    cont=0")
 set sc = objFile.WriteLine("    pid=$(ps aux | grep consistem/webservice | awk 'NR==1{print $2}' )")
 set sc = objFile.WriteLine("    service consistem stop  > /dev/null 2>&1")
 set sc = objFile.WriteLine("    while [ -f /proc/$pid/exe ]; do")
 set sc = objFile.WriteLine("        cont=$((cont+1))")
 set sc = objFile.WriteLine("        if [ $cont -gt 30 ]; then")
 set sc = objFile.WriteLine("        	 /opt/jboss/httpd/sbin/apachectl stop > /dev/null 2>&1")
 set sc = objFile.WriteLine("            kill -9 $pid  > /dev/null 2>&1")
 set sc = objFile.WriteLine("        fi")
 set sc = objFile.WriteLine("        sleep 1; ")
 set sc = objFile.WriteLine("    done")
 set sc = objFile.WriteLine("}")

 set sc = objFile.WriteLine("installRpm(){")
 set sc = objFile.WriteLine("    rpm -e --allmatches consistem_server  > /dev/null 2>&1")
 set sc = objFile.WriteLine("    rpm -ivh --nodeps --replacepkgs --replacefiles $arquivo_rpm")
 set sc = objFile.WriteLine("}")

 set sc = objFile.WriteLine("removerConsistem(){")
 set sc = objFile.WriteLine("    rm -rf $CONSISTEM_HOME  > /dev/null 2>&1")
 set sc = objFile.WriteLine("    rm -rf /opt/jboss/httpd  > /dev/null 2>&1")
 set sc = objFile.WriteLine("    mkdir $CONSISTEM_HOME")
 set sc = objFile.WriteLine("    chmod 775 $CONSISTEM_HOME")
 set sc = objFile.WriteLine("}")
 
 set tipoInstanciaSug = $piece($get(^%CSW1ATUCONF(2)),"^",7)
 if (tipoInstanciaSug = "") set tipoInstanciaSug = 1
 
 set sc = objFile.WriteLine("configure(){")
 set sc = objFile.WriteLine("    cls=org.picketbox.datasource.security.SecureIdentityLoginModule")
 set sc = objFile.WriteLine("    JAVA_HOME=$CONSISTEM_HOME/java")
 set sc = objFile.WriteLine("    PICKET_HOME=$CONSISTEM_HOME/webservice/modules/system/layers/base/org/picketbox/main")
 set sc = objFile.WriteLine("    password=`$JAVA_HOME/bin/java -cp $PICKET_HOME/picketbox-4.0.21.Final.jar:$CLASSPATH $cls $senha|awk -F"": "" '{print $2}'`")
 set sc = objFile.WriteLine("    echo ""export CONSISTEM_NAMESPACE=$namespace"" >> /etc/profile.d/consistem_profile.sh")
 set sc = objFile.WriteLine("    echo ""export CONSISTEM_PASSWORD=$password"" >> /etc/profile.d/consistem_profile.sh")
 
 if (tipoInstanciaSug = 1) {
   set sc = objFile.WriteLine("    echo ""export CONSISTEM_SERVER02=false"" >> /etc/profile.d/consistem_profile.sh")
   set sc = objFile.WriteLine("    echo ""export CONSISTEM_SERVER03=false"" >> /etc/profile.d/consistem_profile.sh")
   set sc = objFile.WriteLine("    echo ""export CONSISTEM_SERVER04=false"" >> /etc/profile.d/consistem_profile.sh")
 }
 
 if (tipoInstanciaSug = 2) {
   set sc = objFile.WriteLine("    echo ""export CONSISTEM_SERVER02=true"" >> /etc/profile.d/consistem_profile.sh")
   set sc = objFile.WriteLine("    echo ""export CONSISTEM_SERVER03=false"" >> /etc/profile.d/consistem_profile.sh")
   set sc = objFile.WriteLine("    echo ""export CONSISTEM_SERVER04=false"" >> /etc/profile.d/consistem_profile.sh")
 }
 
 if (tipoInstanciaSug = 3) {
   set sc = objFile.WriteLine("    echo ""export CONSISTEM_SERVER02=true"" >> /etc/profile.d/consistem_profile.sh")
   set sc = objFile.WriteLine("    echo ""export CONSISTEM_SERVER03=true"" >> /etc/profile.d/consistem_profile.sh")
   set sc = objFile.WriteLine("    echo ""export CONSISTEM_SERVER04=true"" >> /etc/profile.d/consistem_profile.sh")
 }
 
 set sc = objFile.WriteLine("    source /etc/profile")
 set sc = objFile.WriteLine("    chmod -R 775 $CONSISTEM_HOME/atualizacao $CONSISTEM_HOME/cswapp $CONSISTEM_HOME/lib")
 set sc = objFile.WriteLine("    chown -R cacheusr:cacheusr $CONSISTEM_HOME")
 set sc = objFile.WriteLine("}")

 set sc = objFile.WriteLine("backup(){")
 set sc = objFile.WriteLine("    f0=$CONSISTEM_HOME/lib/"_pastaComponentes_"/consistem_geral_interno.jar")
 set sc = objFile.WriteLine("    f1=$CONSISTEM_HOME/lib/"_pastaComponentes_"/consistem_geral.jar")
 set sc = objFile.WriteLine("    f2="_arqServerProducao)
 set sc = objFile.WriteLine("    f3="_arqSerasaHttp)
 set sc = objFile.WriteLine("    f4=$CONSISTEM_HOME/lib/relatorios")
 set sc = objFile.WriteLine("    f5=$CONSISTEM_HOME/cswapp")
 set sc = objFile.WriteLine("    rm -rf $CONSISTEM_HOME/cswapp/consistem_webapp.war")
 set sc = objFile.WriteLine("    mkdir -p $folderbackp")
 set sc = objFile.WriteLine("    [ -f ""$f0"" ] && cp $f0 $folderbackp/.")
 set sc = objFile.WriteLine("    [ -f ""$f1"" ] && cp $f1 $folderbackp/.")
 set sc = objFile.WriteLine("    [ -f ""$f2"" ] && cp $f2 $folderbackp/.")
 set sc = objFile.WriteLine("    [ -f ""$f3"" ] && cp $f3 $folderbackp/.")
 set sc = objFile.WriteLine("    [ -d ""$f4"" ] && cp -rf $f4 $folderbackp/relatorios")
 set sc = objFile.WriteLine("    [ -d ""$f5"" ] && cp -rf $f5 $folderbackp/cswapp")
 set sc = objFile.WriteLine("}")

 set sc = objFile.WriteLine("restore(){")
 set sc = objFile.WriteLine("    f0=$folderbackp/consistem_geral_interno.jar")
 set sc = objFile.WriteLine("    f1=$folderbackp/consistem_geral.jar")
 set sc = objFile.WriteLine("    f2=$folderbackp/server_producao.keystore")
 set sc = objFile.WriteLine("    f3=$folderbackp/serasahttp.keystore")
 set sc = objFile.WriteLine("    f4=$folderbackp/relatorios")
 set sc = objFile.WriteLine("    f5=$folderbackp/cswapp")
 set sc = objFile.WriteLine("    [ -f ""$f0"" ] && cp $f0 $CONSISTEM_HOME/lib/componentes/.")
 set sc = objFile.WriteLine("    [ -f ""$f1"" ] && cp $f1 $CONSISTEM_HOME/lib/componentes/.")
 set sc = objFile.WriteLine("    mkdir -p $CONSISTEM_HOME/lib/keystores")
 set sc = objFile.WriteLine("    [ -f ""$f2"" ] && cp $f2 $CONSISTEM_HOME/lib/keystores/.")
 set sc = objFile.WriteLine("    [ -f ""$f3"" ] && cp $f3 $CONSISTEM_HOME/lib/keystores/.")
 set sc = objFile.WriteLine("    mkdir -p $CONSISTEM_HOME/lib/relatorios")
 set sc = objFile.WriteLine("    [ -d ""$f4"" ] && cp -rf $f4 $CONSISTEM_HOME/lib/.")
 set sc = objFile.WriteLine("    [ -d ""$f5"" ] && cp -rf $f5/* $CONSISTEM_HOME/cswapp/.")
 set sc = objFile.WriteLine("}")

 set sc = objFile.WriteLine("folderbackp="_caminhoTemp)
 set sc = objFile.WriteLine("backup")
 set sc = objFile.WriteLine("namespace="_$znspace)
 set sc = objFile.WriteLine("senha="_senhaSystem)
 set sc = objFile.WriteLine("arquivo_rpm="_arquivoRpm)
 set sc = objFile.WriteLine("stopProcess")
 set sc = objFile.WriteLine("removerConsistem")
 set sc = objFile.WriteLine("installRpm")
 set sc = objFile.WriteLine("restore")
 set sc = objFile.WriteLine("configure")
 set sc = objFile.WriteLine("service consistem start")

 do objFile.Close()
 set objFile = ""

 do $zf(-1,"chmod 775 "_arquivoInstall)

 quit $$$OK
]]></Implementation>
</Method>

<Method name="VerificarHostnameLinux">
<Description>

Validar configuraçõs de hostname no linux

set sc = ##class(Src2.PatchUtils2).VerificarHostnameLinux()</Description>
<ClassMethod>1</ClassMethod>
<Implementation><![CDATA[
    set command = "ping localhost -c 1 > /dev/null 2>&1"
    set sc = $zf(-1,command)
    quit:sc'=0 $$$ERROR(1000,"Não foi possível conectar via localhost")
    set command = "ping `hostname` -c 1 > /dev/null 2>&1"
    set sc = $zf(-1,command)
    quit:sc'=0 $$$ERROR(1000,"Não foi possível conectar via hostname do servidor")
    quit $$$OK
]]></Implementation>
</Method>

<Method name="EliminarLogsAtualizacao">
<Description>

Elimina o Log das Atualizações Anteriores aos Últimos 6 Meses

set sc = ##class(Src2.PatchUtils2).EliminarLogsAtualizacao()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>dias:%String=180</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codAtualizacao = $piece($get(^%CSW1ATULOG(1)),"^",1)
 for {
   set codAtualizacao = $order(^%CSW1ATULOG(1,codAtualizacao))
   if (codAtualizacao = "") quit
   set csw1atulog = $get(^%CSW1ATULOG(1,codAtualizacao))
   
   if ($piece(csw1atulog,"^",2) = "") continue
   
   set data = +$piece(csw1atulog,"^",2)
   
   if (data > ($horolog - dias)) continue
   
   set fixa = ""
   for {
     set fixa = $order(^%CSW1ATULOG(1,codAtualizacao,fixa))
     if (fixa = "") quit
     kill ^%CSW1ATULOG(1,codAtualizacao,fixa)
   }
   
   set $piece(^%CSW1ATULOG(1),"^",1) = codAtualizacao
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="EliminarBackupsAtualizacao">
<Description>

Elimina os Backups das Atualizações Anteriores aos Últimos 3 Meses

set sc = ##class(Src2.PatchUtils2).EliminarBackupsAtualizacao()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>dias:%String=90</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set caminhoBackup = ##class(Src2.Utils).AcertarCaminhoArquivo($piece($get(^%CSW1ATUCONF(2)),"^",3))
 
 set rs = ##class(%ResultSet).%New("%File:FileSet")
 do rs.Execute(caminhoBackup, "PATCH-*")
 while (rs.Next()) {
   set patch = rs.Get("ItemName")
   
   try {
     set data = $zdateh($piece(patch,"-",3,5),3)
   } catch {
     continue
   }
   
   if (data > ($horolog - dias)) continue
   
   set sc = ##class(%File).RemoveDirectoryTree(caminhoBackup_barra_patch)
 }
 do rs.%Close()
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Programa">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%Persistent</Super>
<TimeCreated>62990,63329.588309</TimeCreated>

<Method name="CarregarMenusSistemaTask">
<Description>

Carregar Menus Sistemas - Task

set sc = ##class(Src2.Programa).CarregarMenusSistemaTask()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Programa).CarregarMenusSistema("http://192.168.15.10:18080/svn/csw")
 set sc = ##class(Src2.Programa).CarregarMenusSistema("http://192.168.15.10:18080/svn/gercon")
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CarregarMenusSistema">
<Description>

Carregar Menus Sistemas
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>urlRepositorioInf:%Status,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (sc '= 1) quit $$$ERROR(10000,sc)
 
 set sc = ##class(Src2.Utils).UpdateConfigGeralWorkspace(.nrRevisao)
 if (sc '= 1) quit $$$ERROR(10000,sc)
 
 set sc = ##class(Src2.UtilsXml).ObterProjetosXML(.tabProjetos)
 if (sc '= 1) quit $$$ERROR(10000,sc)
 
 set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set sistemaSel = ""
 
 set projeto = ""
 kill ^mtempSrc2DadosProgramas(codTerm)
 
 for {
   set projeto = $order(tabProjetos(projeto))
   if (projeto = "") quit
   set varProjetos = $get(tabProjetos(projeto))
   
   set sistema = $piece(varProjetos,"^",1)
   
   if (sistema '= "csw") & (sistema '= "gercon") continue
   
   if ($piece(varProjetos,"^",5) = "") continue
   
   set urlRepositorio = $piece(varProjetos,"^",2)
   set versao = $piece(varProjetos,"^",8)
   set situacao = +$piece(varProjetos,"^",12)
   
   if (situacao '= 1) continue
   
   if (urlRepositorio '[ (urlRepositorioInf_"/")) continue
   
   // Por momento para o CSW o menu da 6.4 vale para a versão 6.3
   if (sistema = "csw") & (versao = "6.3") continue
   
   set sistemaSel = sistema
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list "_urlRepositorio_"/menubase", , , autenticacao, arquivoTemp)
   if (msgsc '= $$$OK) continue
   
   set file = ##class(%File).%New(arquivoTemp)
   do file.Open("R")
   
   for {
     set tam = 32000
     set linhaFile = file.Read(.tam)
     if (tam = -1) quit
     
     if (linhaFile '[ "cswmenu2_") continue
     
     set arquivoMenu = urlRepositorio_"/menubase/"_linhaFile
     
     set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "cat "_arquivoMenu, , , autenticacao, arquivoTemp2)
     if (msgsc '= $$$OK) continue
     
     set arquivoXML = ##class(%XML.Reader).%New()
     
     do arquivoXML.OpenFile(arquivoTemp2)
     do arquivoXML.Correlate("csw", "Src2.Menu.Geral")
     do arquivoXML.Next(.objGeral, .sc)
     if (sc '= 1) ! (objGeral = "") continue
     
     for {
       set objSistema = objGeral.sistemas.GetNext(.keySistema)
       if (objSistema = "") quit
       for {
         set objGrupo = objSistema.grupos.GetNext(.keyGrupo)
         if (objGrupo = "") quit
         for {
           set objPrograma = objGrupo.programas.GetNext(.keyPrograma)
           if (objPrograma = "")  quit
           
           set flgTeste = +$select(objPrograma.teste'="":objPrograma.teste,objGrupo.teste'="":objGrupo.teste,1:objSistema.teste)
           
           set flgDoc = +$select(objPrograma.doc'="":objPrograma.doc,objGrupo.doc'="":objGrupo.doc,1:objSistema.doc)
           
           set codPrograma = $piece(objPrograma.codigo,"(")
           
           set ^mtempSrc2DadosProgramas(codTerm, versao, 1, sistema, 1, codPrograma) = ""
           set ^mtempSrc2DadosProgramas(codTerm, versao, 2, codPrograma, 1, sistema) = flgTeste_"^"_flgDoc
         }
       }
     }    
   }
   
   do file.Close()
   set file = ""
   
   set sc = ##class(%File).Delete(arquivoTemp)
   set sc = ##class(%File).Delete(arquivoTemp2)
 }
 
 if (sistemaSel = "") quit $$$OK
 
 // Por momento para o CSW o menu da 6.4 vale para a versão 6.3
 if (sistemaSel = "csw") {
   merge ^mtempSrc2DadosProgramas(codTerm, "6.3") = ^mtempSrc2DadosProgramas(codTerm, "6.4")
   kill ^Src2DadosProgramas("6.1")
   kill ^Src2DadosProgramas("6.2")
 }
 
 merge ^Src2DadosProgramas = ^mtempSrc2DadosProgramas(codTerm)
 
 set (versao, codPrograma) = ""
 for {
   set versao = $order(^Src2DadosProgramas(versao))
   if (versao = "") quit
   for {
     set codPrograma = $order(^Src2DadosProgramas(versao, 1, sistemaSel, 1, codPrograma))
     if (codPrograma = "") quit
     if '$data(^mtempSrc2DadosProgramas(codTerm, versao, 1, sistemaSel, 1, codPrograma)) {
       kill ^Src2DadosProgramas(versao, 1, sistemaSel, 1, codPrograma)
       kill ^Src2DadosProgramas(versao, 2, codPrograma, 1, sistemaSel)
     }
   }
 }
 
 kill ^mtempSrc2DadosProgramas(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.ProgramaProgSis">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<StorageStrategy>Src2DadosProgramasStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62991,29376.121664</TimeCreated>

<Parameter name="AUTOR">
<Default>Jéssy Junior Gomes Lucas</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn Programa</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Programas Menu</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="codVersao">
<Description>
Versão</Description>
<Type>%Integer</Type>
<Required>1</Required>
</Property>

<Property name="codPrograma">
<Description>
Programa</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="codSistema">
<Description>
Sistema</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="flgTeste">
<Description>
Programa com Cobertura pela Equipe de Testes</Description>
<Type>%Integer</Type>
<Required>1</Required>
</Property>

<Property name="flgDoc">
<Description>
Programa com Documentação</Description>
<Type>%Integer</Type>
<Required>1</Required>
</Property>

<Storage name="Src2DadosProgramasStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.ProgramaProgSisS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2DadosProgramasMap">
<Type>data</Type>
<Global>^Src2DadosProgramas</Global>
<Subscript name="1">
<Expression>{codVersao}</Expression>
</Subscript>
<Subscript name="2">
<Expression>2</Expression>
</Subscript>
<Subscript name="3">
<Expression>{codPrograma}</Expression>
</Subscript>
<Subscript name="4">
<Expression>1</Expression>
</Subscript>
<Subscript name="5">
<Expression>{codSistema}</Expression>
</Subscript>
<Data name="flgDoc">
<Delimiter>"^"</Delimiter>
<Piece>2</Piece>
</Data>
<Data name="flgTeste">
<Delimiter>"^"</Delimiter>
<Piece>1</Piece>
</Data>
</SQLMap>
</Storage>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>codVersao,codSistema,codPrograma</Properties>
</Index>
</Class>


<Class name="Src2.ProgramaSisProg">
<ClassType>persistent</ClassType>
<Owner>_SYSTEM</Owner>
<ProcedureBlock>1</ProcedureBlock>
<StorageStrategy>Src2DadosProgramasNewStorage</StorageStrategy>
<Super>%Persistent</Super>
<TimeCreated>62991,29307.284241</TimeCreated>

<Parameter name="AUTOR">
<Default>Jéssy Junior Gomes Lucas</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Svn Programa</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Programas Menu</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Property name="codVersao">
<Description>
Versão</Description>
<Type>%Integer</Type>
<Required>1</Required>
</Property>

<Property name="codSistema">
<Description>
Sistema</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Property name="codPrograma">
<Description>
Programa</Description>
<Type>%String</Type>
<Required>1</Required>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Index name="RowId">
<IdKey>1</IdKey>
<PrimaryKey>1</PrimaryKey>
<Properties>codVersao,codSistema,codPrograma</Properties>
</Index>

<Storage name="Src2DadosProgramasNewStorage">
<Type>%CacheSQLStorage</Type>
<StreamLocation>^Src2.ProgramaSisProgS</StreamLocation>
<ExtentSize>100000</ExtentSize>
<SQLMap name="Src2DadosProgramasMap">
<Type>data</Type>
<Global>^Src2DadosProgramas</Global>
<Subscript name="1">
<Expression>{codVersao}</Expression>
</Subscript>
<Subscript name="2">
<Expression>1</Expression>
</Subscript>
<Subscript name="3">
<Expression>{codSistema}</Expression>
</Subscript>
<Subscript name="4">
<Expression>1</Expression>
</Subscript>
<Subscript name="5">
<Expression>{codPrograma}</Expression>
</Subscript>
</SQLMap>
</Storage>
</Class>


<Class name="Src2.Rotina">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>62402,71836.774312</TimeCreated>

<Method name="ObterRotinasSistema">
<Description>

Obter Rotinas do Sistema

set sc = ##class(Src2.Rotina).ObterRotinasSistema("csw", .tabItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,&tabItens:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.UtilsXml).ObterSistemasXML(.tabSistemas)
 
 set expressao = ""
 for {
   set expressao = $order(tabSistemas(sistema,1,expressao))
   if (expressao = "") quit
   
   set sc = ##class(Src2.Rotina).ValidarRotina(expressao_"*.mac", .expressaoEdt, .qtdItens, .tabItens2)
   
   merge tabItens = tabItens2
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarRotina">
<Description>

Validar Rotina

set sc = ##class(Src2.Rotina).ValidarRotina("CCEVB9*.mac", .expressaoEdt, .qtdItens, .tabItens)
set sc = ##class(Src2.Rotina).ValidarRotina("CCEVA300.mac", .expressaoEdt, .qtdItens, .tabItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[expressao:%String,&expressaoEdt:%String,&qtdItens:%Integer,&tabItens:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set expressaoEdt = expressao
 set qtdItens = 0
 kill tabItens
 
 set rs=##class(%ResultSet).%New("%Library.Routine:RoutineList")
 do rs.Execute(expressao)
 while rs.Next() {
   set rotina = rs.Get("Name")
   set tabItens(rotina) = ""
   set qtdItens = qtdItens + 1
 }
 do rs.Close()
 set rs=""
 
 if (qtdItens = 0) quit "Nenhuma rotina encontrada para a expressão '"_expressaoEdt_"'!"
 
 if ($length(expressao,".") = 1) set expressaoEdt = expressaoEdt_".MAC"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterRotinasProjeto">
<Description>

Obter Rotinas do Projeto

set sc = ##class(Src2.Rotina).ObterRotinasProjeto("csw.rotinas", .expressaoEdt, .qtdItens, .tabItens)
set sc = ##class(Src2.Rotina).ObterRotinasProjeto("cswutil.rotinas", .expressaoEdt, .qtdItens, .tabItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[expressao:%String,&expressaoEdt:%String,&qtdItens:%Integer,&tabItens:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set expressaoEdt = expressao
 set qtdItens = 0
 kill tabItens
 
 set sc = ##class(Src2.UtilsXml).ObterSistemasXML(.tabSistemas)
 quit:sc'=1 sc
 
 set projeto = $piece(expressao,".",1)
 
 set grupoRotinas = ""
 for {
   set grupoRotinas = $order(tabSistemas(projeto,1,grupoRotinas))
   if (grupoRotinas = "") quit
   for cont = ($length(grupoRotinas)-1) : -1 : 2 {
     if $data(tabSistemas(projeto,1,$extract(grupoRotinas,1,cont))) {
       kill tabSistemas(projeto,1,grupoRotinas)
       quit
     }
   }
 }
 
 set grupoRotinas = ""
 for {
   set grupoRotinas = $order(tabSistemas(projeto,1,grupoRotinas))
   if (grupoRotinas = "") quit
   
   set sc = ##class(Src2.Rotina).ValidarRotina(grupoRotinas_"*.mac", .grupoRotinasEdt, .qtdItens, .tabItens2)
   
   set tabItensSel(grupoRotinasEdt) = qtdItens
   
   merge tabItens = tabItens2
 }
 
 set sc = ##class(Src2.Item).AgruparItens(.tabItensSel,.qtdItens)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarRotinaArquivo">
<Description>

Exporta uma rotina para um arquivo texto com a extensão .mac
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,arquivoRotina:%String,flgSubversion:%Boolean=1,username:%String="",password:%String="",flgLog:%Boolean=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig( , , .caminhoSvn)
 quit:msgsc'=1 msgsc
 
 set (permissao, adicionar) = 0
 
 if (flgSubversion) {
   if (##class(Src2.Utils).ObterSistOper() = "linux") { set permissao = 1 }
   if ('##class(%File).Exists(arquivoRotina)) set adicionar = 1
 }
 
 set pastaArquivo = ##class(Src2.Utils).ObterCaminhoArquivo(arquivoRotina)
 
 if ('##class(%File).DirectoryExists(pastaArquivo)) {
   do ##class(%File).CreateDirectory(pastaArquivo)
   if (flgSubversion) {
     set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "add "_pastaArquivo, username, password)
     if (permissao) { do $zf(-1,"chmod -R 777 "_pastaArquivo) }
   }
 }
 
 if ('##class(%File).DirectoryExists(pastaArquivo)) {
   if (flgLog) {
     set sc = ##class(Src2.Utils).GeraLog(2, "Exportação de Rotina | "_rotina_" => "_arquivoRotina_" | Não foi possível criar o diretório "_pastaArquivo)
   }
   quit "Não foi possível criar o diretório "_pastaArquivo_"!"
 }
 
 set objFile = ##class(%File).%New(arquivoRotina)
 
 do objFile.Open("WN:/IOTABLE=""UTF8""")
 if ('objFile.IsOpen) {
   set objFile = ""
   if (flgLog) {
     set sc = ##class(Src2.Utils).GeraLog(2, "Exportação de Rotina | "_rotina_" => "_arquivoRotina_" | Não foi possível abrir o arquivo")
   }
   quit "Não foi possível abrir o arquivo "_arquivoRotina_" para exportar a rotina "_rotina_"!"
 }
 
 set nrLinhas = $get(^rMAC(rotina,0,0))
 
 set sc = $$$OK
 for lin = 1:1:nrLinhas {
   set sc = objFile.Write($get(^rMAC(rotina,0,lin))_$char(10))
   if (sc '= 1) quit
 }
 
 do objFile.Close()
 set objFile = ""
 
 if (flgSubversion) {
   if (adicionar) {
     set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "add "_arquivoRotina, username, password)
     if (permissao) { do $zf(-1,"chmod -R 777 "_pastaArquivo) }
   }
   if (permissao) { do $zf(-1,"chmod 777 "_arquivoRotina) }
 }
 
 if (sc '= $$$OK) {
   if (flgLog) {
     set sc = ##class(Src2.Utils).GeraLog(2, "Exportação de Rotina | "_rotina_" => "_arquivoRotina_" | Erro ao gravar o arquivo") 
   }
   quit "Erro ao exportar a rotina "_rotina_" para o arquivo "_arquivoRotina_"!"
 }
 
 if (flgLog) {
   set sc = ##class(Src2.Utils).GeraLog(1, "Exportação de Rotina | "_rotina_" => "_arquivoRotina)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarRotinaArquivo">
<Description>

Cria uma Rotina a Partir de um Arquivo
  strOpcoes = csp       - Gera página CSP
              todo      - Validar TODOs nas rotinas
              workspace - Atualizar Workspace
  
  tabErros = Em fixas conforme lista abaixo
             1 - Outros erros
             2 - Erro de compilação da rotina
             3 - Erro na geração da página csp
             4 - TODOs pendentes de implementação
  
  tabOK = 1 - Importou
          2 - Compilou
          3 - Gerou CSP
          4 - Sem TODOs
  
set sc = ##class(Src2.Rotina).GerarRotinaArquivo("C:\workspacecsw\projetos\6.1\csw61\rotinas\CCCCA\CCCCA000.mac", "CCCCA000", "csp;todo;workspace", .tabErros, .tabOK)
set sc = ##class(Src2.Rotina).GerarRotinaArquivo("C:\workspacecsw\temp\rotina2.mac", "CCEVA300", "csp;todo;workspace", .tabErros, .tabOK)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[arquivoRotina:%String="",rotina:%String,strOpcoes:%String="",&tabErros:%Boolean=0,&tabOK:%Integer=0,&tabRotina:%Integer,flgSubversion:%Boolean=0,username:%String="",password:%String="",flgLog:%Boolean=0]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabErros, tabOK
 
 set sc = ##class(Src2.Utils).ConvertStrTab(strOpcoes, .tabOpcoes)
 
 if (arquivoRotina '= "") {
   set msgsc = ##class(Src2.Rotina).ObterTabRotinaArquivo(rotina, arquivoRotina, .tabRotina)
   if ('msgsc) {
     if (flgLog) { set sc = ##class(Src2.Utils).GeraLog(2, "Importação de Rotina | "_arquivoRotina_" => "_rotina_" | "_msgsc) }
     quit msgsc
   }
 }
 
 if ('$data(tabRotina)) {
   if (flgLog) { set sc = ##class(Src2.Utils).GeraLog(2, "Importação de Rotina | "_arquivoRotina_" => "_rotina_" | Dados para geração da rotina "_rotina_" não encontrados") }
   quit "Dados para geração da rotina "_rotina_" não encontrados"
 }
 
 set objRotina = ##class(%Routine).%New(rotina_".MAC")
 
 set nrLinhas = $order(tabRotina(""),-1)
 
 for linha = 1:1:(nrLinhas-1) {
   do objRotina.WriteLine($get(tabRotina(linha)))
 }
 do objRotina.Write($get(tabRotina(nrLinhas)))
 
 do objRotina.Save()
 
 set tabOK(1) = ""
 
 // Compila a rotina
 set sc = objRotina.Compile("k-d")
 
 set msgError = $$$OK
 
 set objRotina = ""
 
 if (sc '= 1) {
   set sc = ##class(Src2.Utils).ObterTabErrosCompilacaoRotina(sc, .tabErros2)
   set msgError = "Erro ao compilar a rotina "_rotina
   merge tabErros(2) = tabErros2
 } else {
   set tabOK(2) = ""
 }
 
 // Gera a página CSP da rotina
 
 if ('$data(tabErros)) & ($data(tabOpcoes("csp"))) {
   set msgsc = ##class(Src2.Rotina).GerarPaginaCSP(rotina, .tabErros2)
   if (msgsc '= 1) {
     set msgError = msgsc
     merge tabErros(3) = tabErros2
   } else {
     set tabOK(3) = ""
   }
 }
 
 // Verificar TODOs não implementados
 if ($data(tabOpcoes("todo"))) {
   set msgsc = ##class(Src2.SourceCheck).ObterTODOs(rotina, .tabErros2)
   if (msgsc '= 1) {
     merge tabErros(4) = tabErros2
     if (msgError = "") {
       set msgError = msgsc
     }
   } else {
     set tabOK(4) = ""
   }
 }
 
 if ($data(tabOpcoes("workspace"))) {
   set msgsc = ##class(Src2.Item).ExportarItemArquivo(rotina_".mac", flgSubversion, username, password)
   if (msgsc '= 1) {
     if (msgError = "") {
       set msgError = msgsc
     }
   } else {
     set tabOK(5) = ""
   }
 }
 
 if (msgError '= $$$OK) {
   if (flgLog) { set sc = ##class(Src2.Utils).GeraLog(2, "Importação de Rotina | "_arquivoRotina_" => "_rotina_" | "_msgError) }
   quit msgError
 }
 
 if (flgLog) { set sc = ##class(Src2.Utils).GeraLog(1, "Importação de Rotina | "_arquivoRotina_" => "_rotina) }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabRotinaArquivo">
<Description>

Obtem uma Tabela com o Fonte de uma Rotina a Partir de um Arquivo

set sc = ##class(Src2.Rotina).ObterTabRotinaArquivo("C:\workspacecsw\temp\rotina.txt", .tabRotina)
set sc = ##class(Src2.Rotina).ObterTabRotinaArquivo("C:\workspacecsw\temp\rotina2.mac", .tabRotina)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[rotina:%String,arquivoRotina:%String,&tabRotina:%Integer]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabRotina
 
 if ('##class(%File).Exists(arquivoRotina)) {
   quit "Arquivo '"_arquivoRotina_"' para importação da rotina "_rotina_" não encontrado"
 }
 
 set file = ##class(%File).%New(arquivoRotina)
 do file.Open("R")
 
 set nrLinhas = 0
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   set nrLinhas = nrLinhas + 1
   set tabRotina(nrLinhas) = ##class(Src2.Utils).ConverterStringUTF8(linhaFile)
 }
 
 do file.Close()
 set file = ""
 
 if ('$data(tabRotina)) quit "Arquivo '"_arquivoRotina_"' para importação da rotina "_rotina_" sem dados"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarPaginaCSP">
<Description>

Gerar a Pagina CSP de uma Rotina
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[rotina:%String,&tabErrosCsp:%String,displayLog:%Boolean=0,flgValidarRetErro:%Boolean=1]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabErrosCsp
 set flgErroCSP = ""
 
 set InternalName = rotina_".mac"
 
 // Retirado porque nos clientes não tem esta rotina
 //if ('$data(^rMAC("%CSW1"))) quit $$$OK
 
 if (flgValidarRetErro) {
   set sc = $$GerarCSP^%CSW1(InternalName,displayLog,,.tabErrosCsp,,,,,.flgErroCSP)
 } else {
   set sc = $$GerarCSP^%CSW1(InternalName,displayLog,,.tabErrosCsp)
 }
 
 zkill ^%CSW1CSPGEN(InternalName)
 if $$$ISOK(sc) set ^%CSW1CSPGEN($piece(InternalName,".",1))=""
 
 if (flgErroCSP) quit "Erro ao gerar a página csp da rotina "_rotina
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirRotina">
<Description>

Exclui uma Rotina
flag = 0 - Mata (MAC / INT / OBJ) - Opção Padrão
       1 - Mata (MAC)
       2 - Mata (MAC / INT)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[rotina:%String,&tabErros:%String,flgLog:%Boolean=0,flag:%String=0]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabErros
 
 set sc = ##class(%Library.Routine).Delete(rotina_".MAC", flag)
 if (sc '= 1) {
   if (flgLog) { set sc = ##class(Src2.Utils).GeraLog(2, "Exclusão de Rotina | "_rotina) }
   quit "Erro ao excluir a rotina "_rotina
 }
 
 if (flgLog) { set sc = ##class(Src2.Utils).GeraLog(1, "Exclusão de Rotina | "_rotina) }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CompararRotinaArquivo">
<Description>

Compara uma Rotina com um Arquivo
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[rotina:%String,arquivoRotina:%String,&linDifNr:%String,&linDifItem:%String,&linDifArq:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (linDifNr, linDifItem, linDifArq) = ""
 
 set flgErro=0
 
 set file = ##class(%File).%New(arquivoRotina)
 
 do file.Open("R")
 
 for lin = 1:1:$get(^rMAC(rotina,0,0)) {
   set linhaFile = file.Read(32000)
   if ($get(^rMAC(rotina,0,lin)) '= ##class(Src2.Utils).ConverterStringUTF8(linhaFile)) {
     set linDifNr = lin
     set linDifItem = $get(^rMAC(rotina,0,lin))
     set linDifArq = ##class(Src2.Utils).ConverterStringUTF8(linhaFile)
     set flgErro=1
     quit
   }
 }
 
 if ('flgErro) {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam '= -1) {
     set linDifNr = lin
     set linDifArq = ##class(Src2.Utils).ConverterStringUTF8(linhaFile)
     set flgErro=1
   }
 }
 
 do file.Close()
 
 set file=""
 
 if (flgErro) quit "Rotina "_rotina_" desatualizada no controle de versão!"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosRotina">
<Description>

Obter Dados Rotina

set sc = ##class(Src2.Rotina).ObterDadosRotina("CCEVA621", .rotPastaCopiaTrabalho, .rotinaCopiaTrabalho, .rotPastaRepositorio, .rotinaRepositorio, .descricao, .extensao, .InternalName, .pasta, .projeto, .versaoRelacionada)
set sc = ##class(Src2.Rotina).ObterDadosRotina("%CSMEN045", .rotPastaCopiaTrabalho, .rotinaCopiaTrabalho, .rotPastaRepositorio, .rotinaRepositorio, .descricao, .extensao, .InternalName, .pasta, .projeto, .versaoRelacionada)
set sc = ##class(Src2.Rotina).ObterDadosRotina("GCCOTCP020", .rotPastaCopiaTrabalho, .rotinaCopiaTrabalho, .rotPastaRepositorio, .rotinaRepositorio, .descricao, .extensao, .InternalName, .pasta, .projeto, .versaoRelacionada)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[rotina:%String,&rotPastaCopiaTrabalho:%String,&rotinaCopiaTrabalho:%String,&rotPastaRepositorio:%String,&rotinaRepositorio:%String,&descricao:%String,&extensao:%String,&InternalName:%String,&pasta:%String,&projeto:%String,&versaoRelacionada:%String,&sistema:%String,&arquivo:%String,&rotinaId:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (rotPastaCopiaTrabalho, rotinaCopiaTrabalho, rotPastaRepositorio, rotinaRepositorio, descricao, extensao, InternalName, pasta, projeto, versaoRelacionada, sistema, arquivo, rotinaId) = ""
 
 set sc = ##class(Src2.Rotina).ObterInfoRotina(rotina, .rotinaId, .pasta, .InternalName, .descricao, .sigla, .situacao, .projeto, .extensao, .versaoRelacionada, .arquivo)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Rotina).ObterInfoRotinaId2(rotinaId, urlRepositorio, caminhoCopiaTrabalho, .rotPastaCopiaTrabalho, .rotinaCopiaTrabalho, .rotPastaRepositorio, .rotinaRepositorio)
 quit:sc'=1 sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfoRotina">
<Description>

Obtem Informações de uma Rotina

Entrada
  rotina       = "CCEVA662"
Saidas
  rotinaId     = "CCEVA\CCEVA662.mac" ou "CCEVA/CCEVA662.mac"
  pasta        = "CCEVA"
  InternalName = "CCEVA662.mac"

set sc = ##class(Src2.Rotina).ObterInfoRotina("CCEVA662", .rotinaId, .pasta, .InternalName, .descricao, .sigla, .situacao, .projeto, .extensao, .versaoRelacionada)
set sc = ##class(Src2.Rotina).ObterInfoRotina("%CSMEN100", .rotinaId, .pasta, .InternalName, .descricao, .sigla, .situacao, .projeto, .extensao, .versaoRelacionada)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[rotina:%String,&rotinaId:%String,&pasta:%String,&InternalName:%String,&descricao:%String,&sigla:%String,&situacao:%String,&projeto:%String,&extensao:%String="mac",&versaoRelacionada:%String,&arquivo:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (rotinaId, pasta, InternalName, descricao, sigla, situacao, projeto, versaoRelacionada, arquivo)= ""
 
 set extensao = "mac"
 
 for cont = $length(rotina):-1:1 {
   if $data(^Src2Config("rotina",$extract(rotina,1,cont))) {
     set pasta = $extract(rotina,1,cont)
     set var = $get(^Src2Config("rotina",pasta))
     set projeto = $piece(var,"^",1)
     set situacao = $piece(var,"^",2)
     set sigla = $piece(var,"^",3)
     set descricao = $piece(var,"^",4)
     set versaoRelacionada = $piece(var,"^",5)
     quit
   }
 }
 
 if (pasta = "") quit "Rotina "_rotina_" sem pasta definida!"
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set pasta = $translate(pasta,"%","_")
 set arquivo = $translate(rotina,"%","_")_".mac"
 set rotinaId = pasta_barra_arquivo
 set InternalName = rotina_".mac"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfoRotinaId">
<Description>

Obtem Informações de um rotinaId

Entrada
  rotinaId     = "CCEVA\CCEVA662.mac" ou "CCEVA/CCEVA662.mac"
Saidas
  rotina       = "CCEVA662"
  pasta        = "CCEVA"
  InternalName = "CCEVA662.MAC"

set sc = ##class(Src2.Rotina).ObterInfoRotinaId("CCEVA\CCEVA662.mac", .rotina, .pasta, .InternalName, .sys, .package)
set sc = ##class(Src2.Rotina).ObterInfoRotinaId("_CSMEN\_CSMEN100.mac", .rotina, .pasta, .InternalName, .sys, .package)
set sc = ##class(Src2.Rotina).ObterInfoRotinaId("_CS/_CSMEN000.mac", .rotina, .pasta, .InternalName, .sys, .package)
set sc = ##class(Src2.Rotina).ObterInfoRotinaId("CCPME660.mac", .rotina, .pasta, .InternalName, .sys, .package)
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[rotinaId:%String,&rotina:%String,&pasta:%String,&InternalName:%String,&sys:%Boolean=0,&package:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set rotinaId = $translate(rotinaId,"/","\")
 set pasta = $piece(rotinaId,"\",1)
 set package = $translate(pasta,"_","%")
 set rotina = $translate($piece($piece(rotinaId,"\",2),"."),"_","%")
 if ($extract(rotina,1)) = "%" set sys = 1
 set InternalName = rotina_".mac"
 
 if (rotina = "") ! (pasta = "") {
   set (pasta, rotina, InternalName, package) = ""
   quit "Rotina "_rotinaId_" sem pasta definida!"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfoRotinaId2">
<Description>

Obtem Informações de um rotinaId 2

set sc = ##class(Src2.Rotina).ObterInfoRotinaId2("CCEVA\CCEVA662.mac", "http://192.168.15.10:18080/svn/cswutil/branches/6.2", "C:\workspacecsw\projetos\6.2\csw62", .rotPastaCopiaTrabalho, .rotinaCopiaTrabalho, .rotPastaRepositorio, .rotinaRepositorio)
set sc = ##class(Src2.Rotina).ObterInfoRotinaId2("_CSMEN\_CSMEN100.mac", "http://192.168.15.10:18080/svn/cswutil/branches/6.2", "C:\workspacecsw\projetos\6.2\csw62", .rotPastaCopiaTrabalho, .rotinaCopiaTrabalho, .rotPastaRepositorio, .rotinaRepositorio)
set sc = ##class(Src2.Rotina).ObterInfoRotinaId2("_CS/_CSMEN000.mac", "http://192.168.15.10:18080/svn/cswutil/branches/6.2", "C:\workspacecsw\projetos\6.2\csw62", .rotPastaCopiaTrabalho, .rotinaCopiaTrabalho, .rotPastaRepositorio, .rotinaRepositorio)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[rotinaId:%String,urlRepositorio:%String="",caminhoCopiaTrabalho:%String="",&rotPastaCopiaTrabalho:%String,&rotinaCopiaTrabalho:%String,&rotPastaRepositorio:%String,&rotinaRepositorio:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (rotPastaCopiaTrabalho, rotinaCopiaTrabalho, rotPastaRepositorio, rotinaRepositorio) = ""
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sc = ##class(Src2.Rotina).ObterInfoRotinaId(rotinaId, , .pasta)
 quit:sc'=1 sc
 
  if (urlRepositorio '= "") {
   set rotPastaRepositorio = urlRepositorio_"/rotinas/"_pasta
   set rotinaRepositorio = urlRepositorio_"/rotinas/"_$translate(rotinaId,"\","/")
 }
 
 if (caminhoCopiaTrabalho '= "") {
   set rotPastaCopiaTrabalho = caminhoCopiaTrabalho_barra_"rotinas"_barra_pasta
   set rotinaCopiaTrabalho = caminhoCopiaTrabalho_barra_"rotinas"_barra_$translate(rotinaId,"\/",barra_barra)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarRotinas">
<Description>

Importa Rotinas a Partir de Arquivos
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,strOpcoes:%String="",flgLog:%Boolean=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set rotinaId = ""
 for {
   set rotinaId = $order(^mtempInfoArquivo(codTerm,"rotinas",rotinaId))
   if (rotinaId = "") quit
   set var = $get(^mtempInfoArquivo(codTerm,"rotinas",rotinaId))
   
   set operacao = $piece(var,"^",1)
   set pathRotina = $piece(var,"^",2)
   set status = $piece(var,"^",3)
   
   if (status '= "") { set status = "["_status_"] " }
   
   set msgsc = ##class(Src2.Rotina).ObterInfoRotinaId(rotinaId, .rotina)
   if (msgsc '= $$$OK) continue
   
   if (operacao = 1) {
     set msgsc = ##class(Src2.Rotina).GerarRotinaArquivo(pathRotina, rotina, strOpcoes, , , , , , , flgLog)
     write !,"Rotina Importada: "_status_rotina_" "_$select(msgsc=$$$OK:"[OK]",1:"[ERRO]")
   }
   
   if (operacao = 2) {
     set msgsc = ##class(Src2.Rotina).ExcluirRotina(rotina, , flgLog)
     write !,"Rotina Excluida: "_status_rotina_" "_$select(msgsc=$$$OK:"[OK]",1:"[ERRO]")
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CompararRotinasWorkspaceCache">
<Description>

Compara/Acerta as Rotinas do Workspace para o Cache
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,flgAcertar:%Boolean=0,strOpcoes:%String="",flgLog:%Boolean=0,grupoItensSel:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set rotinaId = ""
 for {
   set rotinaId = $order(^mtempInfoArquivo(codTerm,"rotinas",rotinaId))
   if (rotinaId = "") quit
   set var = $get(^mtempInfoArquivo(codTerm,"rotinas",rotinaId))
   
   set operacao = $piece(var,"^",1)
   set pathRotina = $piece(var,"^",2)
   
   set msgsc = ##class(Src2.Rotina).ObterInfoRotinaId(rotinaId, .rotina, , .InternalName)
   if (msgsc '= $$$OK) continue
   
   if (grupoItensSel '= "") , ('##class(Src2.Item).ValidarSelecaoItem(grupoItensSel, InternalName)) continue
   
   set msgsc = ##class(Src2.Item).CompararItemArquivo(InternalName, .linDifNr, .linDifItem, .linDifArq)
   if (msgsc = $$$OK) continue
   
   write !,InternalName_" (Linha: "_$get(linDifNr)_")"
   
   if (flgAcertar) {
     if (operacao = 1) {
       set msgsc = ##class(Src2.Rotina).GerarRotinaArquivo(pathRotina, rotina, strOpcoes, , , , , , , flgLog)
       write "  Importada: "_rotina_" "_$select(msgsc=$$$OK:"[OK]",1:"[ERRO]")
     }
     if (operacao = 2) {
       set msgsc = ##class(Src2.Rotina).ExcluirRotina(rotina, , flgLog)
       write "  Excluida: "_rotina_" "_$select(msgsc=$$$OK:"[OK]",1:"[ERRO]")
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarRotinaControleFonte">
<Description>

Verifica se Uma Rotina Tem Controle de Fonte

write ##class(Src2.Rotina).ValidarRotinaControleFonte("CCTCR075")
write ##class(Src2.Rotina).ValidarRotinaControleFonte("CCTCR075")
write ##class(Src2.Rotina).ValidarRotinaControleFonte("XXTCR075")
write ##class(Src2.Rotina).ValidarRotinaControleFonte("CCTCzzz")
write ##class(Src2.Rotina).ValidarRotinaControleFonte("zz")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
 if (rotina = "") quit 0
 
 set flgSourceControl = 0
 
 set tam = $length(rotina)
 
 if ($extract(rotina,tam-2,tam) = "zzz") quit 0
 
 if (rotina [ ".") quit 0
 
 for cont = tam:-1:1 {
   if $data(^Src2Config("rotina2",$extract(rotina,1,cont))) {
     set flgSourceControl = 1
     quit
   }
 }
 
 quit flgSourceControl
]]></Implementation>
</Method>

<Method name="VerRotina">
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ('$data(^rMAC(rotina))) quit "Rotina "_rotina_" não encontrada!"
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarRotinaAtiva">
<Description>

Valida se a Rotina está Ativa
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Rotina).VerRotina(rotina)
 if (sc'=$$$OK) quit sc
 
 if ($get(^rMAC(rotina,0,1)) [ "<INATIVA>") quit "Rotina "_rotina_" inativa!"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarRotinaManutBase">
<Description>

Valida se a Rotina é de Manutenção de Base

set sc = ##class(Src2.Rotina).ValidarRotinaManutBase("CCTCPRG001")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 for cont = 1:1:$length(rotina) {
   if ($extract(rotina,cont)?.N) quit
 }
 
 set grupo = $extract(rotina,1,cont-1)
 
 set tam = $length(grupo)
 
 set exp = $extract(grupo,tam-1,tam)
 
 if (exp = "QG") ! (exp = "MB") quit $$$OK
 
 if (grupo'="CCTRB") & (exp = "RB") quit $$$OK
 
 quit $$$ERROR(10000,"Rotina "_rotina_" não é de manutenção de base!")
]]></Implementation>
</Method>

<Method name="PesquisarRotinas">
<Description>

Faz Pesquisa de Expressões em Rotinas

rotinas        = String ou tabela de rotinas
expressoes     = String ou tabela de expressões
arquivo        = Arquivo de saída
caseSensitive  = Compara Maiusculo/Minusculo
                 0 - Não (Padrão)
                 1 - Sim
linhaComentada = Linha comentada
                 0 - Desconsidera (Padrão)
                 1 - Considera
rotinaManut    = Rotina de Manutenção (QG/MB/RB)
                 0 - Desconsidera (Padrão)
                 1 - Considera
rotinaInativa  = Rotina Inativa
                 0 - Desconsidera (Padrão)
                 1 - Considera

set sc = ##class(Src2.Rotina).PesquisarRotinas(rotinas As %String, expressoes As %String, arquivo As %String, caseSensitive As %Boolean, linhaComentada As %Boolean, rotinaManut As %Boolean)

set sc = ##class(Src2.Rotina).PesquisarRotinas("CCTCP7*;CCTCR075*","CODENG;CODTAG","/usr/tmp/ederson/teste.txt")

set sc = ##class(Src2.Rotina).PesquisarRotinas("CCTCP*","Reestrutura base para roteiros padroes?","/usr/tmp/ederson/teste.txt", 1, 1, 1)

set tabRot("CCTCR*")="",tabRot("CCCGI*")=""
set tabExp("CODPRO")="",tabExp("CODITE")=""
set sc = ##class(Src2.Rotina).PesquisarRotinas(.tabRot,.tabExp,"/usr/tmp/ederson/teste.txt")

set tabExp("CCTCP024RG","CODPRO")=""
set tabExp("ExcluirControleSaidaIrregular")=""
set sc = ##class(Src2.Rotina).PesquisarRotinas("CCTCP020",.tabExp,"/usr/tmp/ederson/teste.txt")
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotinas:%String="",expressoes:%String="",arquivo:%String,caseSensitive:%Boolean=0,linhaComentada:%Boolean=0,rotinaManut:%Boolean=0,rotinaInativa:%Boolean=0,semExpressoes:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ConvertStrTab(expressoes, .tabGrupoExpress)
 set sc = ##class(Src2.Utils).ConvertStrTab(semExpressoes, .tabSemGrupoExpress)
 
 merge tabGrupoExpress = expressoes
 merge tabGrupoSemExpress = semExpressoes
 
 if caseSensitive {
   merge tabExpres = tabGrupoExpress
   merge tabSemExpres = tabSemGrupoExpress
 }
 else  {
   set expressao = ""
   for  {
     set expressao = $order(tabGrupoExpress(expressao))
     if (expressao = "") quit
     set tabExpres($zconvert(expressao,"U")) = ""
     
     set expressao2 = ""
     for  {
       set expressao2 = $order(tabGrupoExpress(expressao,expressao2))
       if (expressao2 = "") quit
       set tabExpres($zconvert(expressao,"U"),$zconvert(expressao2,"U")) = ""
     }
   }
   set expressao = ""
   for  {
     set expressao = $order(tabSemGrupoExpress(expressao))
     if (expressao = "") quit
     set tabSemExpres($zconvert(expressao,"U")) = ""
     
     set expressao2 = ""
     for  {
       set expressao2 = $order(tabSemGrupoExpress(expressao,expressao2))
       if (expressao2 = "") quit
       set tabSemExpres($zconvert(expressao,"U"),$zconvert(expressao2,"U")) = ""
     }
   }
 }
 
 set sc = ##class(Src2.Utils).ConvertStrTab(rotinas, .tabGrupoRotinas)
 
 merge tabGrupoRotinas = rotinas
 
 set objFile = ##class(%File).%New(arquivo)
 
 do objFile.Open("WN:/IOTABLE=""UTF8""")
 if ('objFile.IsOpen) {
   set objFile = ""
   quit $$$ERROR(10000,"Erro ao criar o arquivo "_arquivoLog_"!")
 }
 
 set grupoRotina = ""
 for {
   set grupoRotina = $order(tabGrupoRotinas(grupoRotina))
   if (grupoRotina = "") quit
   
   set rs=##class(%ResultSet).%New("%Library.Routine:RoutineList")
   do rs.Execute(grupoRotina)
   while rs.Next() {
     set rotina = $piece(rs.Get("Name"),".",1)
     
     if ('rotinaManut) {
       set sc = ##class(Src2.Rotina).ValidarRotinaManutBase(rotina)
       if $$$ISOK(sc) continue
     }
     
     if ('rotinaInativa) {
       set sc = ##class(Src2.Rotina).ValidarRotinaAtiva(rotina)
       if (sc'=$$$OK) continue
     }
     
     if ($data(tabSemExpres)) {
       set flagRot=1
       for lin = 1:1:$get(^rMAC(rotina,0,0)) {
         set var = $get(^rMAC(rotina,0,lin))
         if ('caseSensitive) set var = $zconvert(var,"U")
         set flag = 0
         set expressao = ""
         for  {
           set expressao = $order(tabSemExpres(expressao))
           if (expressao = "") quit
           if (var [ expressao) {
             set flag = 1
             if ($order(tabSemExpres(expressao,"")) '= "") {
               set expressao2 = ""
               for  {
                 set expressao2 = $order(tabSemExpres(expressao,expressao2))
                 if (expressao2 = "") quit
                 if (var '[ expressao2) set flag=0 quit
               }
             }
             if flag quit
           }
         }
         if (flag) & ('linhaComentada) {
           if ($translate($piece(var,";",1),$char(9)_" .","") = "") set flag = 1
           if ($translate($piece(var,"//",1),$char(9)_" .","") = "") set flag = 1
         }
         if flag set flagRot=0 quit
       }
       if flagRot=0 continue
     }
     
     set flagRot=""
     for lin = 1:1:$get(^rMAC(rotina,0,0)) {
       set var = $get(^rMAC(rotina,0,lin))
       
       if ('caseSensitive) set var = $zconvert(var,"U")
       
       set flag = 0
       
       set expressao = ""
       for  {
         set expressao = $order(tabExpres(expressao))
         if (expressao = "") quit
         if (var [ expressao) {
           set flag = 1
           if ($order(tabExpres(expressao,"")) '= "") {
             set expressao2 = ""
             for  {
               set expressao2 = $order(tabExpres(expressao,expressao2))
               if (expressao2 = "") quit
               if (var '[ expressao2) set flag=0 quit
             }
           }
           if flag quit
         }
       }
       
       if (flag) & ('linhaComentada) {
         if ($translate($piece(var,";",1),$char(9)_" .","") = "") set flag = 0
         if ($translate($piece(var,"//",1),$char(9)_" .","") = "") set flag = 0
       }
       
       if (flag) { 
         if (flagRot) {
           set string = $justify("",19)
           set string = string_##class(Src2.Utils).Just(lin, 4)
           set string = string_" "_$get(^rMAC(rotina,0,lin))
         } else  {
           set string = "[ ] "
           set string = string_##class(Src2.Utils).Just(rotina, 13)
           set string = string_" "_##class(Src2.Utils).Just(lin, 4)
           set string = string_" "_$get(^rMAC(rotina,0,lin))
           set flagRot = 1
         }
         set sc = objFile.WriteLine(string)
       }
     }
   }
   
   do rs.Close()
   set rs=""
 }
 
 do objFile.Close()
 set objFile = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInforRotina">
<Description>
set sc = ##class(Src2.Rotina).ObterInforRotina("CCTCP020", .tipoRotCsp, .chamada, .intAux, .flgRegra)
set sc = ##class(Src2.Rotina).ObterInforRotina("CCTCP601", .tipoRotCsp, .chamada, .intAux, .flgRegra)
set sc = ##class(Src2.Rotina).ObterInforRotina("CCTCPRG001", .tipoRotCsp, .chamada, .intAux, .flgRegra)
set sc = ##class(Src2.Rotina).ObterInforRotina("CCUTIRG004A", .tipoRotCsp, .chamada, .intAux, .flgRegra)
set sc = ##class(Src2.Rotina).ObterInforRotina("CCTDTE005TAB4RG", .tipoRotCsp, .chamada, .intAux, .flgRegra)
set sc = ##class(Src2.Rotina).ObterInforRotina("CCGGB299", .tipoRotCsp, .chamada, .intAux, .flgRegra)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,tipoRotCsp:%String,chamada:%String,intAux:%String,flgRegra:%Boolean</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (tipoRotCsp, chamada, intAux, flgRegra) = ""
 
 if '$data(^rMAC(rotina,0,0)) quit "Rotina "_rotina_" não encontrada!"
 
 for lin = $get(^rMAC(rotina,0,0)):-1:1 {
   set linha = $get(^rMAC(rotina,0,lin))
   
   if (tipoRotCsp = "") , (linha [ "csw:csp:") {
     set tipoRotCsp = $translate($piece(linha,"csw:csp:",2)," ","")
   }
   
   if (chamada = "") {
     set var = $piece(linha,$char(9),2)
     
     if (var [ ("Ex^%CSW1UTI(""^"_rotina_""",")) set chamada = "Ex"
     if (var [ ("Ex^%CSW1UTI("""_rotina_""",")) set chamada = "Ex"
     if (var [ ("Show^%CSW1UTI(""^"_rotina_""",")) set chamada = "Show"
     if (var [ ("Show^%CSW1UTI("""_rotina_""",")) set chamada = "Show"
   }
   
   if ('intAux) , (var [ "csw:interfaceAuxiliar") set intAux = 1
   
   if (chamada '= "") , (tipoRotCsp '= "") quit
 }
 
 if (chamada = "") , ((tipoRotCsp = "naogerar")!(tipoRotCsp = "naoconverter")) {
   if (rotina [ "RG") {
     set varrotina="RG"_$piece(rotina,"RG",$length(rotina,"RG"))
     set var = ""
     for cont = 1:1:$length(varrotina) {
       if ($extract(varrotina,cont) ?.N) quit
       set var = var_$extract(varrotina,cont)
     }
     if ($extract(var,$length(var)-1,$length(var)) = "RG") { set flgRegra = 1 }
   }
 }
 
 if ($get(^rMAC(rotina,0,1)) [ "<REGRA>") set flgRegra = 1
 if ($get(^rMAC(rotina,0,1)) [ "<NAOREGRA>") set flgRegra = 0
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInforRotina2">
<Description>
set sc = ##class(Src2.Rotina).ObterInforRotina2("CCTCP020", .tipoRotCsp)
set sc = ##class(Src2.Rotina).ObterInforRotina2("CCTCP601", .tipoRotCsp)
set sc = ##class(Src2.Rotina).ObterInforRotina2("CCTCPRG001", .tipoRotCsp)
set sc = ##class(Src2.Rotina).ObterInforRotina2("CCUTIRG004A", .tipoRotCsp)
set sc = ##class(Src2.Rotina).ObterInforRotina2("CCTDTE005TAB4RG", .tipoRotCsp)
set sc = ##class(Src2.Rotina).ObterInforRotina2("CCGGB299", .tipoRotCsp)
set sc = ##class(Src2.Rotina).ObterInforRotina2("CCTCORB98", .tipoRotCsp)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,tipoRotCsp:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set tipoRotCsp = ""
 
 if '$data(^rMAC(rotina,0,0)) quit "Rotina "_rotina_" não encontrada!"
 
 for lin = $get(^rMAC(rotina,0,0)):-1:($get(^rMAC(rotina,0,0))-10) {
   set linha = $get(^rMAC(rotina,0,lin))
   if (linha [ "csw:csp:") {
     set tipoRotCsp = $translate($piece(linha,"csw:csp:",2)," ","")
     quit
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarRotinaLiberadaPatch">
<Description>

Validar Rotina Liberada para Geração de Patch

write ##class(Src2.Rotina).ValidarRotinaLiberadaPatch("CCTCP020")
write ##class(Src2.Rotina).ValidarRotinaLiberadaPatch("CCTCP020RG")
write ##class(Src2.Rotina).ValidarRotinaLiberadaPatch("CCTCP601")
write ##class(Src2.Rotina).ValidarRotinaLiberadaPatch("CCTCPRG001")
write ##class(Src2.Rotina).ValidarRotinaLiberadaPatch("CCUTIRG004A")
write ##class(Src2.Rotina).ValidarRotinaLiberadaPatch("CCTDTE005TAB4RG")
write ##class(Src2.Rotina).ValidarRotinaLiberadaPatch("CCGGB299")
write ##class(Src2.Rotina).ValidarRotinaLiberadaPatch("CCCGI930")
write ##class(Src2.Rotina).ValidarRotinaLiberadaPatch("CCCGI960A")
write ##class(Src2.Rotina).ValidarRotinaLiberadaPatch("CCGGB298A")
write ##class(Src2.Rotina).ValidarRotinaLiberadaPatch("CCGGB299A2")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
 set flgLib = 0
 
 if ($extract(rotina,1,4) = "CCVA") quit $$$ERROR(10000,"Rotina "_rotina_" bloqueada!")
 
 set (contNum, contAlf) = 1
 for cont = 1:1:$length(rotina) {
   // Numerico
   if ($extract(rotina,cont) ?.N) {
     if $data(tabAlf(contAlf)) {
       set contAlf = $increment(contAlf)
     }
     set tabNum(contNum) = $get(tabNum(contNum))_$extract(rotina,cont)
     continue
   }
   // Alfanumerico
   if $data(tabNum(contNum)) {
     set contNum = $increment(contNum)
   }
   set tabAlf(contAlf) = $get(tabAlf(contAlf))_$extract(rotina,cont)
 }
 
 // Validar Rotina 289/299 - 900/999
 set codSeq = ""
 for  {
   set codSeq = $order(tabNum(codSeq))
   if (codSeq = "") quit
   set var = $get(tabNum(codSeq))
   if (var > 289) & (var < 300) set flgLib = 1
   if (var > 899) & (var < 1000) set flgLib = 1
 }
 
 if (flgLib) quit $$$OK
 
 // Validar Rotina Regra
 set codSeq = ""
 for  {
   set codSeq = $order(tabAlf(codSeq))
   if (codSeq = "") quit
   set var = $get(tabAlf(codSeq))
   if ($extract(var,$length(var)-1,$length(var)) = "RG") set flgLib = 2
 }
 
 if (flgLib) quit $$$OK
 
 quit $$$ERROR(10000,"Rotina "_rotina_" bloqueada!")
]]></Implementation>
</Method>
</Class>


<Class name="Src2.ServidorLinux">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="AtualizarMenuConfig">
<Description>

Atualiza o Menu CSW/Configurações em um Namespace de Base

set sc = ##class(Src2.ServidorLinux).AtualizarMenuConfig("DESENVAK64")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>namespace:%String="",conta:%String="",flgDataSource:%Boolean=1</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Atualizar Menu/Configurações do CSW")
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoDiff)
 quit:sc'=1 sc
 
 if (##class(Src2.Utils).ObterSistOper() '= "linux") {
   write !,"Source Control: Recurso disponivel somente para linux"
   quit $$$OK
 }
 
 if (conta = "") {
   set sc = ##class(Src2.Utils).ValidarNamespaceBaseDados(namespace, , .conta)
   if (sc '= $$$OK) {
     write !,"Source Control: "_sc
     write !,##class(Src2.Utils).ObterBarra()
     quit sc
   }
 }
 
 write !,"Gerando da global ^%CSMENCF"
 
 set sc = ##class(Src2.ServidorLinux).GerarCSMENCFBase(namespace, conta)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
 }
 
 write !,"Importando o arquivo diversosbase.xml"
 
 set sc = ##class(Src2.ServidorLinux).ImportarArquivoDiversosBaseXml(namespace)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
 }
 
 set sc = ##class(Src2.Menu).AtualizarMenuPerfilNamespace()
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
 }
 
 set sc = ##class(Src2.Menu).CriarUsuarioCSW()
 
 if (flgDataSource) {
   write !,"Gerando os DataSources no WildFly"
   set sc = ##class(Src2.Utils).GerarDataSourcesWildFly()
 }
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Namespace: "_namespace_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarCSMENCFBase">
<Description>

Gera a Global ^%CSMENCF - Para namespace de base
OBS: Chamar a partir do namespace de desenvolvimento (DESENV61/DESENV62/...)
     Passar por parametro o namespace de base

set sc = ##class(Src2.Utils).GerarCSMENCFBase("DESENVDA61", "DA")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>namespace:%String,conta:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento($znspace, 0)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb(, , 1, , .caminhoAplicWebRed, 0)
 
 set arquivoTempCsw = "/dados/tmp/"
 
 set arquivoPDF = "/usr/tmp/arqpdf.txt"
 
 set arquivoLicenca = "/consistem/csw.key"
 
 set enderecoIntegraWI = "http://192.168.254.1/csp/sistemas/"
 
 set codEmpresa = 1
 
 // Piece 1 ao 20
 set csmencf = "1^"_arquivoTempCsw_"^arq.txt^1^"_arquivoTempCsw_"^arq.htm^1^798^"_codEmpresa_"^"_conta_"^3000^99^2^1^1^1^^1^0^"
 
 // Piece 20 ao 40
 set csmencf = csmencf_"^1^2^0^^^^110^25^pop3.consistem.com.br^smtp.consistem.com.br^60^"_arquivoTempCsw_"^testerotinas@consistem.com.br^@Outro1234^1^1^### Situacao Anormal ##^^^0"
 
 // Piece 40 ao 60
 set csmencf = csmencf_"^^^1^999^^"_caminhoAplicWebRed_"^"_enderecoIntegraWI_"^"_$znspace_"^0^^1^0^1^^1^"_arquivoLicenca_"^1^"_arquivoPDF_"^1^0"
 
 // Piece 60 ao ...
 set csmencf = csmencf_"^1^"_arquivoTempCsw_"^0^^^ftp.consistem.com.br^consistem^cnovo2009^0^%SYS^1^1^1^^^9999^^^1^^localhost^8090^1"
 
 if (namespace = "") set namespace = $znspace
 set namespaceAtual = $znspace
 
 znspace namespace
 
 set ^%CSMENCF =csmencf
 
 znspace namespaceAtual
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarArquivoDiversosBaseXml">
<Description>

Importa o Arquivo diversos.xml
OBS: Chamar a partir do namespace de desenvolvimento (DESENV61/DESENV62/...)

set sc = ##class(Src2.Utils).ImportarArquivoDiversosXml("cswutil62")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>namespace:%String="",username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoDiff)
 quit:msgsc'=1 msgsc
 
 set msgsc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento($znspace, 0)
 quit:msgsc'=1 msgsc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "update "_caminhoWorkspace_barra_"configgeral", username, password)
 if (msgsc '= $$$OK) quit msgsc
 
 set caminhoDiversos = caminhoWorkspace_barra_"configgeral"_barra_"servidorlinux"_barra_"diversosbase.xml"
 
 if (namespace = "") set namespace = $znspace
 set namespaceAtual = $znspace
 
 znspace namespace
 
 set sc = $system.OBJ.Load(caminhoDiversos, "-d")
 
 znspace namespaceAtual
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.SourceBlock">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%Studio.SourceControl.Base</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="OnAfterCompile">
<Description>
Called before the compile of the item is done.</Description>
<FormalSpec>InternalName:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set status = $$$OK
 set status = $$GerarCSP^%CSW1(InternalName)
 zkill ^%CSW1CSPGEN(InternalName)
 if $$$ISOK(status) {
   if ($extract(InternalName,1,4) = "csp.") quit $$$OK
   if ($length(InternalName,".") > 2) quit $$$OK
   set ^%CSW1CSPGEN($piece(InternalName,".",1))=""
 }
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GetStatus">
<Description>
Return information about this entity.</Description>
<FormalSpec><![CDATA[InternalName:%String,&IsInSourceControl:%Boolean,&Editable:%Boolean,&IsCheckedOut:%Boolean,&UserCheckedOut:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set Editable=0,IsCheckedOut=0,UserCheckedOut="",IsInSourceControl=0
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.SourceCheck">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Controle de Código Fonte</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Controle de Código Fonte - Standard-checkers</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Method name="ValidarPadroes">
<Description>
set sc = ##class(Src2.SourceCheck).ValidarPadroes("XXEJCCESA020")
set sc = ##class(Src2.SourceCheck).ValidarPadroes("CCTCPRG003")
set sc = ##class(Src2.SourceCheck).ValidarPadroes("CCTCP055",,1)
set sc = ##class(Src2.SourceCheck).ValidarPadroes("CCTCP030")
set sc = ##class(Src2.SourceCheck).ValidarPadroes("CCEVB607")
set sc = ##class(Src2.SourceCheck).ValidarPadroes("CCTCO130")
set sc = ##class(Src2.SourceCheck).ValidarPadroes("CCESCT000TAB2")

nivel = 1 - Label de Retorno / quit:$$CSP^%CSW1UTI / News CSW / Nome Rotina / Macro com Componentes / Linha em Branco
        2 - {nivel 1} / Atalhos / Break / Rotina zzz / Label Obrigatório / Expandir Comandos /
            Parametro Obrigatorio / Col. Grid Editavel
        3 - {nivel 1 e 2} / Mensagens / News / Tamanho Tela / New Regra / Goto em Regra / ^%ZS
        4 - {nivel 1, 2 e 3} / TODO
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,arquivo:%String="",nivel:%String=4</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill ^mtempSoureCheck($job)
 kill ^mtempSoureMsg($job)
 kill ^mtempSoureEstrut($job)
 kill ^mtempSoureVar($job)
 kill ^mtempSoureParametros($job)
 kill ^mtempSoureRegra($job)
 
 set sc = ##class(Src2.SourceSyntaxConf).AtualizarConfiguracao()
 
 set sc = ##class(Src2.Rotina).ObterInforRotina(rotina, .tipoRot, .chamada, .intAux, .flgRegra)
 if (sc'=$$$OK) quit $$$OK
 
 set sc = ##class(Src2.Rotina).ValidarRotinaAtiva(rotina)
 if (sc'=$$$OK) quit $$$OK
 
 if (nivel '< 1) {
   set tabValida("101-labelRet") = 1 , tabValida("102-quitCsp") = 1 , tabValida("103-newcsw") = 1
   set tabValida("111-paramObrig") = 1 , tabValida("115-nomeRotina") = 1 , tabValida("116-colGridEdit") = 1
   set tabValida("117-labelTab") = 1, tabValida("121-labelCaracInval") = 1, tabValida("122-varCaracInval") = 1
   set tabValida("123-macroComp") = 1, tabValida("124-linhaBranco") = 1
 }
 
 if (nivel '< 2) {
   set tabValida("105-atalho") = 1 , tabValida("200-break") = 2, tabValida("107-obrigatorio") = 1
   set tabValida("108-expandir") = 1 , tabValida("109-cslenumerico") = 1, tabValida("112-cmdinvalido") = 1
   set tabValida("113-^%ZS") = 1 , tabValida("114-%Close()") = 1, tabValida("118-label") = 1
   set tabValida("119-assinGatilho") = 1 , tabValida("120-interfRegra") = 1
 }
 
 if (nivel '< 3) {
   set tabValida("110-mensagem") = 1 , tabValida("201-tela") = 2 , tabValida("104-newregra") = 1
   set tabValida("202-new") = 2
 }
 
 if (nivel '< 4) {
   set tabValida("301-todo") = 3
 }
 
 if (tipoRot = "naoconverter") {
   kill tabValida("102-quitCsp"), tabValida("101-labelRet")
   kill tabValida("103-newcsw"), tabValida("201-tela")
 }
 
 if (tipoRot = "rotina299") {
   kill tabValida("202-new")
 }
 
 set (flagLerNewsEnc, flgExpandir, varRetCSUTIOP) = ""
 
 for lin = 1:1:$get(^rMAC(rotina,0,0)) {
   set linha = $get(^rMAC(rotina,0,lin))
   
   set linhaUper = $zconvert(linha,"U")
   
   if ($piece(linha,";",2) [ " TODO ") {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("301-todo", lin, $$ZN^%SMU($piece(linha,"TODO",2),16+32))
   }
   
   set linha2=$translate(linha," "_$char(9),"")
   if (linha2 = "") {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("124-linhaBranco", lin, "Linha em Branco - Eliminar")
   }
   
   set sc = ##class(Src2.SourceCheck).GerarLabels(lin, linha, .tabLabels)
   
   set sc = ##class(Src2.SourceCheck).GerarTabEstruturas(lin, linha)
   
   set sc = ##class(Src2.SourceCheck).ValidarSyntaxLinha(lin, linha, .tabLabels, flgRegra, .flgExpandir, .tabMacros)
   
   if ##class(Src2.SourceCheck).LinhaComentada(linha) {
     set sc = ##class(Src2.SourceCheck).LerInterface(rotina, lin, linha, .tabDisplay, .tabAtalho, .tabLabelsRet)
     continue
   }
   
   set sc = ##class(Src2.SourceCheck).ValidarSyntaxGatilhos(lin, linha, .tabLabels, flgRegra, .flgExpandir)
   
   set sc = ##class(Src2.SourceCheck).GerarChamadasQuits(rotina, lin, linha, linhaUper, .tabChamadas, .tabQuit, .tabLabelsRet, .tabMacros)
   
   if (linha [ "<ok>") continue
   
   set sc = ##class(Src2.SourceCheck).ValidarChamadas(rotina, lin, linha, .tabLabelsRet, .tabChamadas, .tabGrid)
   
   set sc = ##class(Src2.SourceCheck).ValidarBreak(lin, linha, linhaUper)
   
   set sc = ##class(Src2.SourceCheck).ValidarParametros(lin, linha, .tabAtalhoCSUTIOP, .varRetCSUTIOP, .tabLabels)
   
   if ('flgRegra) {
     if (linha [ "^%CSUTI") {
       set sc = ##class(Src2.SourceCheck).ValidarParamUtilit(lin, linha, .tabMsgInvalida, .tabAtalho, .varRetCSUTIOP)
     }
     set sc = ##class(Src2.SourceCheck).LerCSLE(lin, linha, .tabCSLE)
     set sc = ##class(Src2.SourceCheck).LerSetCSW1UTI(lin, linha, .tabSetCSW1UTI)
   }
   
   if (flgRegra) {
     set sc = ##class(Src2.SourceCheck).ValidarInterfaceRegra(lin, linha)
   }
   
   if ('flagLerNewsEnc) {
     set sc = ##class(Src2.SourceCheck).LerNews(lin, linha, .flagLerNewsEnc)
   }
 }
 
 set sc = ##class(Src2.SourceCheck).ValidarNomeRotina(rotina)
 
 if (tipoRot = "gerar") ! (chamada = "Show") ! (chamada = "Ex") ! (intAux) {
   if ($data(tabValida("103-newcsw"))) {
     set sc = ##class(Src2.SourceCheck).ValidaNews()
   }
 }
 
 if (tipoRot = "gerar") ! (chamada = "Show") ! (chamada = "Ex") ! (intAux) ! (tipoRot = "rotina299") {
   if ($data(tabValida("101-labelRet"))) {
     set sc = ##class(Src2.SourceCheck).ValidarLabelsRetorno(.tabLabels, .tabLabelsRet)
   }
   if ($data(tabValida("102-quitCsp"))) {
     set sc = ##class(Src2.SourceCheck).ValidarQuitChamadas(rotina, .tabChamadas, .tabQuit, .tabLabels)
   }
 }
 
 if ($data(tabValida("110-mensagem"))) {
   set sc = ##class(Src2.SourceCheck).ValidarDisplaysValcps(.tabMsgInvalida, .tabCSLE, .tabDisplay)
 }
 
 if ($data(tabValida("105-atalho"))) {
   set sc = ##class(Src2.SourceCheck).ValidarAtalhos(.tabAtalho, .tabAtalhoCSUTIOP)
 }
 
 if ($data(tabValida("109-cslenumerico"))) {
   set sc = ##class(Src2.SourceCheck).ValidarCSLENumericos(.tabCSLE, .tabSetCSW1UTI)
 }
 
 if ($data(tabValida("119-assinGatilho")))  {
   if ('flgRegra) {
     set sc = ##class(Src2.SourceCheck).ValidarAssinGatilho(rotina, .tabLabels)
   } else {
     set sc = ##class(Src2.SourceCheck).ValidarAssinGatilhoRegra(rotina, .tabLabels)
   }
 }
 
 if ($data(tabValida("122-varCaracInval"))) {
   set sc = ##class(Src2.SourceCheck).ValidarCaracteresVariaveis()
 }
 
 if ($data(tabValida("104-newregra"))) {
   set sc = ##class(Src2.SourceCheck).ValidarNewRegra(rotina, .tabLabels)
 }
 
 if ($data(tabValida("117-labelTab"))) ! ($data(tabValida("121-labelCaracInval"))) {
   set sc = ##class(Src2.SourceCheck).ValidarTabLabel(rotina, .tabLabels)
 }
 
 if ($data(tabValida("202-new"))) {
   set sc = ##class(Src2.SourceCheck).ValidarNewVariaveis()
 }
 
 if ($data(tabValida("116-colGridEdit"))) {
   set sc = ##class(Src2.SourceCheck).ValidarColunaEditavelGrid(.tabCSLE, .tabGrid)
 }
 
 set sc = ##class(Src2.SourceCheck).MostrarMensagens(rotina, arquivo, .tabValida)
 
 kill ^mtempSoureCheck($job)
 kill ^mtempSoureMsg($job)
 kill ^mtempSoureEstrut($job)
 kill ^mtempSoureVar($job)
 kill ^mtempSoureParametros($job)
 kill ^mtempSoureRegra($job)
 kill ^mtempCSW1CSPTotais($job)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarBreak">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String,linhaUper:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ($piece(linhaUper,$char(9),2) = "B") {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("200-break", lin, "Linha com BREAK" , linha)
   quit $$$OK
 }
 
 if (linhaUper '[ "BREAK") quit $$$OK
 
 set var = $piece(linhaUper,$char(9),2)
 
 for cont = 2:1:$length(var,"BREAK") {
   set antes = $piece(var,"BREAK",cont-1)
   set pos = $piece(var,"BREAK",cont)
   
   if ((antes = "") !($extract(antes,$length(antes)) = " ")) & ((pos = "") ! ($extract(pos,1) = " ") ! ($extract(pos,1) = ":")) {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("200-break", lin, "Linha com BREAK" , linha)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarAtalhos">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabAtalho:%String,tabAtalhoCSUTIOP:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if $data(tabAtalho("btnManter")) {
   kill tabAtalho("^%CSUTIOP")
 } else {
   set atalho = ""
   for {
     set atalho = $order(tabAtalhoCSUTIOP(atalho))
     if (atalho = "") quit
     set tabAtalho("^%CSUTIOP",atalho,$get(tabAtalhoCSUTIOP(atalho)),1,"{Não Encontrado}") = ""
   }
 }
 
 set (origem, atalho, lin, ident, texto) = ""
 for {
   set origem = $order(tabAtalho(origem))
   if (origem = "") quit
   for {
     set atalho = $order(tabAtalho(origem,atalho))
     if (atalho = "") quit
     for {
       set lin = $order(tabAtalho(origem,atalho,lin))
       if (lin = "") quit
       for {
         set ident = $order(tabAtalho(origem,atalho,lin,ident))
         if (ident = "") quit
         for {
           set texto = $order(tabAtalho(origem,atalho,lin,ident,texto))
           if (texto = "") quit
           set atalho2 = $zconvert(atalho,"U")
           set tabela(atalho2) = $get(tabela(atalho2)) + 1
           set tabela(atalho2,lin,texto) = origem
         }
       }
     }
   }
 }
 
 set (atalho, lin, texto) = ""
 for {
   set atalho = $order(tabela(atalho))
   if (atalho = "") quit
   
   if ($get(tabela(atalho)) = 1) continue
   
   for {
     set lin = $order(tabela(atalho,lin))
     if (lin = "") quit
     for {
       set texto = $order(tabela(atalho,lin,texto))
       if (texto = "") quit
       set sc = ##class(Src2.SourceCheck).GravarMensagem("105-atalho", lin, "Atalho duplicado" , atalho_" - "_texto_" - "_$get(tabela(atalho,lin,texto)))
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarCSLENumericos">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabCSLE:%String,tabSetCSW1UTI:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set cp = ""
 for {
   set cp = $order(tabCSLE(3,cp))
   if (cp = "") quit
   
   if '$data(tabSetCSW1UTI(cp)) continue
   
   set lin = $get(tabCSLE(3,cp))
   
   set sc = ##class(Src2.SourceCheck).GravarMensagem("109-cslenumerico", lin, "^%CSLE numérico" , cp_" - "_$get(tabSetCSW1UTI(cp)))
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarNewVariaveis">
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set tabOK("sme")="",tabOK("smlf")="",tabOK("smff")="",tabOK("smnr")="",tabOK("smrv")="",tabOK("smwf")=""
 set tabOK("smp")="",tabOK("smtab")="",tabOK("smw")="",tabOK("smhi")="",tabOK("sml")="",tabOK("smc")=""
 set tabOK("CE")="",tabOK("CI")="",tabOK("%")="",tabOK("%index")="",tabOK("%conta")=""
 set tabOK("Z")="",tabOK("z")="",tabOK("Y")="",tabOK("y")="",tabOK("V")="",tabOK("v")=""
 set tabOK("%zp")=""
 
 set tabOK2("Z")="",tabOK2("z")="",tabOK2("Y")="",tabOK2("y")="",tabOK2("V")="",tabOK2("v")=""
 set tabOK2("%TR")="",tabOK2("sc")=""
 
 for cont=1:1:30 {
   if ($data(^mtempSoureVar($job,1,"V"_cont))) {
     set ^mtempSoureVar($job,1,"D"_cont) = ""
   }
 }
 
 set variavel = ""
 for {
   set variavel = $order(^mtempSoureVar($job,1,variavel))
   if (variavel = "") quit
   
   if $data(tabOK(variavel)) continue
   
   if $data(^mtempSoureVar($job,2,variavel)) ! $data(^mtempSoureVar($job,3,variavel)) {
     kill ^mtempSoureVar($job,1,variavel)
     kill ^mtempSoureVar($job,2,variavel)
     kill ^mtempSoureVar($job,3,variavel)
     continue
   }
   
   set tabVar(variavel) = ""
 }
 
 set variavel = ""
 for {
   set variavel = $order(^mtempSoureVar($job,2,variavel))
   if (variavel = "") quit
   
   if $data(tabOK2(variavel)) continue
   
   set tabVar2(variavel) = ""
 }
 
 if $data(tabVar) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("202-new", 0, "Variaveis sem NEW" , ##class(Src2.Utils).ConvertTabStr(.tabVar))
 }
 
 if $data(tabVar2) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("202-new", 0, "NEW inválido" , ##class(Src2.Utils).ConvertTabStr(.tabVar2))
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarCaracteresVariaveis">
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set variavel = ""
 for {
   set variavel = $order(^mtempSoureVar($job,0,variavel))
   if (variavel = "") quit
   if (variavel '= $$ZN^%SMU(variavel,8)) {
     set lin = $piece($get(^mtempSoureVar($job,0,variavel)),"^",1)
     set sc = ##class(Src2.SourceCheck).GravarMensagem("122-varCaracInval", lin, "Variavel com caracteres inválidos" , variavel)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarNewRegra">
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,tabLabels:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set tabOK("sme")="",tabOK("smlf")="",tabOK("smff")="",tabOK("smnr")="",tabOK("smrv")="",tabOK("smwf")=""
 set tabOK("smp")="",tabOK("smtab")="",tabOK("smw")="",tabOK("smhi")="",tabOK("sml")="",tabOK("smc")=""
 set tabOK("%conta")="",tabOK("%index")="",tabOK("%zp")="",tabOK("%PRG")=""
 
 set (regra, variavel) = ""
 for {
   set regra = $order(^mtempSoureRegra($job,regra))
   if (regra = "") quit
   
   kill tabVar
   
   for {
     set variavel = $order(^mtempSoureRegra($job,regra,1,variavel))
     if (variavel = "") quit
     
     if $data(tabOK(variavel)) continue
     
     if $data(^mtempSoureRegra($job,regra,2,variavel)) ! $data(^mtempSoureRegra($job,regra,3,variavel)) {
       kill ^mtempSoureRegra($job,regra,1,variavel)
       kill ^mtempSoureRegra($job,regra,2,variavel)
       kill ^mtempSoureRegra($job,regra,3,variavel)
       continue
     }
     
     set tabVar(variavel) = ""
   }
   
   set lin = $piece($get(tabLabels(1,regra)),"^",1)
   
   if ($get(^rMAC(rotina,0,lin)) [ "<ok>") continue
   
   if $data(tabVar) {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("104-newregra", lin, "Variaveis sem NEW - "_regra , ##class(Src2.Utils).ConvertTabStr(.tabVar,,","))
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarTabLabel">
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,tabLabels:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set lin = ""
 for {
   set lin = $order(tabLabels(2, lin))
   if (lin = "") quit
   set label = $get(tabLabels(2, lin))
   
   set var = $get(^rMAC(rotina,0,lin))
   
   if (label '= $$ZN^%SMU(label,8)) {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("121-labelCaracInval", lin, "Label com caracteres inválidos" , label)
   }
   
   if (var [ "<ok>") continue
   
   if ($extract(var,1,$length(label)+1) [ (label_"(")) {
     if ($piece(var,label_"(",2) '[ (")"_$char(9))) {
       set sc = ##class(Src2.SourceCheck).GravarMensagem("117-labelTab", lin, "Label sem TAB" , label)
     }
   } else {
     if ($piece(var,label,2) '[ ($char(9))) {
       set sc = ##class(Src2.SourceCheck).GravarMensagem("117-labelTab", lin, "Label sem TAB" , label)
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarAssinGatilho">
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,tabLabels:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set tabParc("CC") = "", tabParc("CI") = ""
 set tabParc("GC") = ""
 set tabParc("AS") = ""
 
 set lin = ""
 for {
   set lin = $order(tabLabels(2, lin))
   if (lin = "") quit
   set label = $get(tabLabels(2, lin))
   
   if (label '= "Inf") continue

   set var = $get(^rMAC(rotina,0,lin))
   set expressao = $piece(var,$char(9)_"quit """,2)
   if (expressao = "") {
     set var = $get(^rMAC(rotina,0,lin+1))
     set expressao = $piece(var,$char(9)_"quit """,2)
   }
   
   if (expressao = "") continue
   
   set parceiro = $piece($piece(expressao,"""",1),",",4)
   set qtdParam = $piece($piece(expressao,"""",1),",",3)
   
   if (parceiro = "") continue
   
   if ('$data(tabParc(parceiro))) {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("119-assinGatilho", lin, "Parceiro da assinatura inválido" , $piece(expressao,"""",1))
   }
   
   set (varParam, cont) = ""
   for {
     set varParam = $order(^mtempSoureParametros($job,1,varParam))
     if (varParam = "") quit
     set cont = cont + 1
   }
   
   if (cont '= qtdParam) {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("119-assinGatilho", lin, "O número de parâmetros da assinatura deve ser "_cont , $piece(expressao,"""",1))
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarAssinGatilhoRegra">
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,tabLabels:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set tabParc("CC") = "", tabParc("CI") = ""
 set tabParc("GC") = ""
 set tabParc("AS") = ""
 
 set lin = ""
 for {
   set lin = $order(tabLabels(2, lin))
   if (lin = "") quit
   set label = $get(tabLabels(2, lin))
   
   if ($extract(label,$length(label)-2,$length(label)) '= "Inf") continue
   
   set regra = $extract(label,1,$length(label)-3)
   
   if (regra '= "") , ('$data(tabLabels(1,regra))) continue

   set var = $get(^rMAC(rotina,0,lin))
   set expressao = $piece(var,$char(9)_"quit """,2)
   if (expressao = "") {
     set var = $get(^rMAC(rotina,0,lin+1))
     set expressao = $piece(var,$char(9)_"quit """,2)
   }
   if (expressao = "") {
     set var = $get(^rMAC(rotina,0,lin+2))
     set expressao = $piece(var,$char(9)_"quit """,2)
   }
   
   if (expressao = "") continue
   
   set parceiro = $piece($piece(expressao,"""",1),",",4)
   set qtdParam = $piece($piece(expressao,"""",1),",",3)
   
   if (parceiro = "") continue
   
   if ('$data(tabParc(parceiro))) {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("119-assinGatilho", lin, "Parceiro da assinatura inválido" , regra_" - "_$piece(expressao,"""",1))
   }
   
   set (varParam, cont) = ""
   for {
     set varParam = $order(^mtempSoureRegra($job,regra,3,varParam))
     if (varParam = "") quit
     set cont = cont + 1
   }
   
   if (cont '= qtdParam) {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("119-assinGatilho", lin, "O número de parâmetros da assinatura deve ser "_cont , regra_" - "_$piece(expressao,"""",1))
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarColunaEditavelGrid">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabCSLE:%String,tabGrid:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (codGrid, coluna) = ""
 for {
   set codGrid = $order(tabCSLE(4,codGrid))
   if (codGrid = "") quit
   
   if $piece($get(tabGrid(codGrid)),"^",1) = 1 {
     for {
       set coluna = $order(tabCSLE(4,codGrid,coluna))
       if (coluna = "") quit
       
       if ('$data(tabGrid(codGrid,coluna))) continue
       
       set cp = $piece($get(tabCSLE(4,codGrid,coluna)),"^",1)
       set lin = $piece($get(tabGrid(codGrid,coluna)),"^",1)
       
       if ($piece($get(tabGrid(codGrid,coluna)),"^",2) '= 1) {
         set sc = ##class(Src2.SourceCheck).GravarMensagem("116-colGridEdit", lin, "Grid "_codGrid_" Coluna "_coluna_" deve ser estática" , "Campo: "_cp)
       }
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarNomeRotina">
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set nomeRotina = $piece($piece($get(^rMAC(rotina,0,1)),"(",1),$char(9),1)
 
 if (nomeRotina '= rotina) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("115-nomeRotina", 1, "Nome da rotina inválido " , nomeRotina_" => "_rotina)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="MostrarMensagens">
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,arquivo:%String,tabValida:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ('$data(^mtempSoureMsg($job))) quit $$$OK
 
 if ($get(^rMAC(rotina,0,1)) [ "<ok>") { set avisos = 0 }
 else  { set avisos = 1 }
 
 set tipo = ""
 for {
   set tipo = $order(tabValida(tipo))
   if (tipo = "") quit
   if ('$data(^mtempSoureMsg($job,tipo))) continue
   set tipo2 = $get(tabValida(tipo))
   if ('avisos) , (tipo2 = 2) continue
   set tabSelValida(tipo) = ""
 }
 
 if ('$data(tabSelValida)) quit $$$OK
 
 if (arquivo '= "") {
   set % = $$WriteLine^%CSUTIIO(arquivo,"Rotina: "_rotina)
 }
 
 set (tipo, lin, codSeq) = ""
 for {
   set tipo = $order(tabSelValida(tipo),-1)
   if (tipo = "") quit
   
   set tipo2 = $get(tabValida(tipo))
   set desTipo = $piece("ERRO;AVISO;TODO",";",tipo2)
   
   for {
     set lin = $order(^mtempSoureMsg($job,tipo,lin))
     if (lin = "") quit
     for {
       set codSeq = $order(^mtempSoureMsg($job,tipo,lin,codSeq))
       if (codSeq = "") quit
       
       set mensagem = rotina_".MAC("_lin_") : "_desTipo_" : "_$get(^mtempSoureMsg($job,tipo,lin,codSeq))
       
       if (arquivo = "") {
         write !,mensagem
       } else {
         set % = $$WriteLine^%CSUTIIO(arquivo,mensagem)
       }
       
       set tabTipos(tipo2) = $get(tabTipos(tipo2)) + 1
     }
   }
 }
 
 if ($piece($get(^mtempCSW1CSPTotais($job)),"^",2) > 0) {
   set tabTipos(4) = $piece($get(^mtempCSW1CSPTotais($job)),"^",2)
 }
 
 if ($piece($get(^mtempCSW1CSPTotais($job)),"^",1) > 0) {
   set tabTipos(5) = $piece($get(^mtempCSW1CSPTotais($job)),"^",1)
 }
 
 if $data(tabTipos) {
   set erros = +$get(tabTipos(1))
   if (erros>5) set erros=5
   
   set errosCsp = +$get(tabTipos(4))
   if (errosCsp>5) set errosCsp=5
   
   set msg = "ERROS CSP: "_$translate($justify("",errosCsp)," ","[")_(+$get(tabTipos(4)))_$translate($justify("",errosCsp)," ","]")
   set msg = msg_" / ERROS SRC: "_$translate($justify("",erros)," ","[")_(+$get(tabTipos(1)))_$translate($justify("",erros)," ","]")
   if (avisos) { set msg = msg_" / AVISOS SRC: "_(+$get(tabTipos(2))) }
   else  { set msg = msg_" / AVISOS SRC: <ok>" }
   set msg = msg_" / AVISOS CSP: "_(+$get(tabTipos(5)))
   set msg = msg_" / TODO: "_(+$get(tabTipos(3)))
   
   if (arquivo = "") {
     write !,"Source Control - "_msg
   } else {
     set % = $$WriteLine^%CSUTIIO(arquivo,"Source Control - ERROS : "_+$get(tabTipos(1)))
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarChamadas">
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,lin:%String,linha:%String,tabLabelsRet:%String,tabChamadas:%String,tabGrid:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (linha [ "Ex^%CSW1UTI") , (linha '[ "$$ISEx^%CSW1UTI") {
   set sc = ##class(Src2.SourceCheck).ObterParametros("Ex^%CSW1UTI", linha, .tabPar)
   set sc = ##class(Src2.SourceCheck).ValidarLabelRetorno(rotina, lin, linha, 2, .tabPar, .tabLabelsRet, .tabChamadas)
 }
 
 if (linha [ " GatilhoInterface^%CSW1GATCUST") {
   set sc = ##class(Src2.SourceCheck).ObterParametros(" GatilhoInterface^%CSW1GATCUST", linha, .tabPar)
   set sc = ##class(Src2.SourceCheck).ValidarLabelRetorno(rotina, lin, linha, 1, .tabPar, .tabLabelsRet, .tabChamadas)
 }
 
 for cont = 2:1 {
   if ($piece(linha,"Show^",cont) = "") quit
   set rotinaChamada = $piece($piece(linha,"Show^",cont),"(")
   
   set parametro = 1
   if (rotinaChamada = "%CSW1UTI") set parametro = 2
   
   set sc = ##class(Src2.SourceCheck).ObterParametros("Show^"_rotinaChamada, linha, .tabPar)
   
   set sc = ##class(Src2.SourceCheck).ValidarLabelRetorno(rotina, lin, linha, parametro, .tabPar, .tabLabelsRet, .tabChamadas)
 }
 
 if (linha [ "csw:gridConf:") {
   set var = $piece(linha,"csw:gridConf:",2)
   
   set codGrid = $translate($piece($piece($piece(var,"cod",2),"=",2),";",1)," ","")
   
   set LbOP = $translate($piece($piece($piece(var,"LbOP",2),"=",2),";",1)," ","")
   
   if (LbOP '= "") {
     set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, LbOP_"^"_rotina, .tabLabelsRet)
   }
   
   set LbLinha = $translate($piece($piece($piece(var,"LbLinha",2),"=",2),";",1),""" ","")
   
   if (LbLinha '= "") {
     set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, LbLinha, .tabLabelsRet)
   }
   
   set LabelEdit = $translate($piece($piece($piece(var,"LabelEdit",2),"=",2),";",1)," ","")
   
   if (codGrid '= "") , (LabelEdit '= "") {
     set $piece(tabGrid(codGrid),"^",1) = 1
   }
 }
 
 if (linha [ "csw:gridCols:") {
   set var = $piece(linha,"csw:gridCols:",2)
   
   set codGrid = ""
   
   for cont = 1:1:$length(var,";") {
     set var2 = $piece(var,";",cont)
     
     if (var2["cod=") {
       set codGrid = $translate($piece(var2,"cod=",2)," ","")
     }
     
     if (var2["Csw=") {
       set descricao = $piece($piece(var2,"Csw=",2),"^",2)
       if ($piece(descricao,"!",1) '= "") { set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, $piece(descricao,"!",1)) }
       if ($piece(descricao,"!",2) '= "") { set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, $piece(descricao,"!",2)) }
       
       if (codGrid '= "") , $data(tabGrid(codGrid)) {
         set coluna = $piece($piece(var2,"Csw=",2),"^",3)
         set flgEstatica = $piece($piece(var2,"Csw=",2),"^",6)
         if (coluna '= "") {
           set tabGrid(codGrid,coluna) = lin_"^"_flgEstatica
         }
       }
     }
     
     if (var2["List=") {
       set descricao = $piece($piece(var2,"List=",2),"^",2)
       if ($piece(descricao,"!",1) '= "") { set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, $piece(descricao,"!",1)) }
       if ($piece(descricao,"!",2) '= "") { set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, $piece(descricao,"!",2)) }
     }
     
     if (var2["Csv=") {
       set descricao = $piece($piece(var2,"Csv=",2),"^",1)
       if (descricao '= "") { set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, descricao) }
     }
   }
 }
 
 if (linha [ "^%ZS(") {
   set sc = ##class(Src2.SourceCheck).ObterParametros("^%ZS", linha, .tabPar)
   set descricao = "merge "_$extract($get(tabPar(1,2)),2,$length($get(tabPar(1,2)))-1)_"="_$extract($get(tabPar(1,1)),2,$length($get(tabPar(1,1)))-1)
   set sc = ##class(Src2.SourceCheck).GravarMensagem("113-^%ZS", lin, "Trocar ^%ZS por merge" , descricao)
 }
 
 if (linha [ ".%Close()") {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("114-%Close()", lin, "Não utilizar '.%Close()'" , linha)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarLabelRetorno">
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,lin:%String,linha:%String,parametro:%String,tabPar:%String,tabLabelsRet:%String,tabChamadas:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ($get(tabPar(1,parametro)) = "") ! ($get(tabPar(1,parametro)) = """""") {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("101-labelRet", lin, "Label de retorno não definida", linha)
   quit $$$OK
 }
 
 if ('$data(tabPar(1,parametro,1))) quit $$$OK
 
 set sc = ##class(Src2.SourceCheck).GerarChamadas(lin, linha, .tabChamadas)
 
 set retorno = $get(tabPar(1,parametro,1))
 
 set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, retorno, .tabLabelsRet)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarChamadasQuits">
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[rotina:%String,lin:%String,linha:%String,linhaUper:%String,tabChamadas:%String,tabQuit:%String,tabLabelsRet:%String,&tabMacros:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 // Quits
 
 if (linhaUper [ "QUIT:$$CSP^%CSW1UTI") set sc = ##class(Src2.SourceCheck).GerarQuits(lin, linha, .tabQuit)
 
 if (linhaUper [ "Q:$$CSP^%CSW1UTI") set sc = ##class(Src2.SourceCheck).GerarQuits(lin, linha, .tabQuit)
 
 // Chamadas
 
 set utilitario = ""
 for {
   set utilitario = $order(^Src2Config("utilitarios",utilitario))
   if (utilitario = "") quit
   
   if (linha '[ utilitario) continue
   
   set sc = ##class(Src2.SourceCheck).GerarChamadas(lin, linha, .tabChamadas)
   
   if ($data(tabMacros)) {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("123-macroComp", lin, "Macro em linha com componente", utilitario_" x "_##class(Src2.Utils).ConvertTabStr(.tabMacros))
   }
 }
 
 if (linha [ "ME^%CSUTIUD") {
   set sc = ##class(Src2.SourceCheck).ObterParametros("ME^%CSUTIUD", linha, .tabPar)
   if ($get(tabPar(1,4)) '= "") {
     set sc = ##class(Src2.SourceCheck).ValidarLabelRetorno(rotina, lin, linha, 6, .tabPar, .tabLabelsRet, .tabChamadas)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarQuits">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String,tabQuit:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ($data(^mtempSoureEstrut($job,lin))) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("102-quitCsp", lin, "quit:$$CSP^%CSW1UTI dentro de uma estrutura", linha)
   quit $$$OK
 }
 
 set tabQuit(lin) = $piece(linha,$char(9),2)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarChamadas">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String,tabChamadas:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set tabChamadas(lin) = $piece(linha,$char(9),2)
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarTabEstruturas">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set var = $translate($piece(linha,$char(9),2)," ","")
 
 set nivel = 0
 for cont = 1:1:$length(var) {
   if ($extract(var,cont) '= ".") quit
   set nivel = nivel + 1
 }
 
 if (nivel > 0) set ^mtempSoureEstrut($job,lin) = nivel
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarQuitChamadas">
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,tabChamadas:%String,tabQuit:%String,tabLabels:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 // Valida o quit:$$CSP^%CSW1UTI das chamadas dentro de estruturas
 // obs: o quit deve estar na linha anterior ao inicio da estrutura que possui a chamada
 set lin = ""
 for {
   set lin = $order(tabChamadas(lin))
   if (lin = "") quit
   
   if ('$data(^mtempSoureEstrut($job,lin))) continue
   
   for linIniEstrut = lin:-1 {
     if ('$data(^mtempSoureEstrut($job,linIniEstrut))) quit
   }
   
   set linha = $get(tabChamadas(lin))
   
   if (linha [ "<ok>") continue
   
   if ($data(tabQuit(linIniEstrut))) ! ($data(tabQuitTmp(linIniEstrut))) {
     kill tabQuit(linIniEstrut)
     set tabQuitTmp(linIniEstrut) = ""
     continue
   }
   
   set sc = ##class(Src2.SourceCheck).GravarMensagem("102-quitCsp", lin, "Chamada sem quit:$$CSP^%CSW1UTI", "Inserir um quit:$$CSP^%CSW1UTI na linha "_linIniEstrut_" : """_linha_"""")
 }
 
 // Valida o quit:$$CSP^%CSW1UTI das chamadas fora das estruturas
 set lin = ""
 for {
   set lin = $order(tabChamadas(lin))
   if (lin = "") quit
   
   if ($data(^mtempSoureEstrut($job,lin))) continue
   
   set linIni = lin
   
   // Linha anterior a próxima chamada
   set linFim = $order(tabChamadas(lin))
   if (linFim = "") set linFim = $order(tabQuit(""),-1)
   else  set linFim = linFim - 1
   
   // Linha anterior ao próximo label
   set linLabel = $order(tabLabels(2,lin)) - 1
   if (linLabel '= -1) , (linLabel < linFim) { set linFim = linLabel }
   
   if (linFim = "") set linFim = $order(^rMAC(rotina,0,"LANG"),-1)
   
   set flgOk = 0
   for cont = linIni:1:linFim {
     if $data(tabQuit(cont)) { set flgOk = 1 quit }
   }
   
   set linha = $get(tabChamadas(lin))
   
   if (flgOk) ! (linha [ "<ok>") continue
   
   set sc = ##class(Src2.SourceCheck).GravarMensagem("102-quitCsp", lin, "Linha com chamada sem quit", """"_linha_"""")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="LerCSLE">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String,tabCSLE:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (linha '[ "^%CSLE") quit $$$OK
 
 set sc = ##class(Src2.SourceCheck).ObterParametros("^%CSLE", linha, .tabPar)
 
 set var = $get(tabPar(1,9,1))
 
 if (var = "") quit $$$OK
 
 set cp = $piece(var,",",4)
 
 if ($extract(cp,1,2) '= "cp") quit $$$OK
 
 if ($get(tabPar(1,6)) [ "@'?.N") {
   if ($piece($get(tabPar(1,7,1)),",",3) '= 16) {
     set tabCSLE(3,cp) = lin
   }
 }
 
 set linDisplay = $get(tabPar(1,1))
 
 if ($piece(var,",",6) '= "") set linDisplay = $piece(var,",",6)
 
 if (linDisplay ?.N) {
   set obrigatorio = 0
   if ($piece($get(tabPar(1,7,1)),",",1) = 1) set obrigatorio = 1
   if ($get(tabPar(1,7)) = 1) set obrigatorio = 1
   
   if (linDisplay '= "") {
     set tabCSLE(1,cp) = linDisplay_"^"_obrigatorio
     set tabCSLE(2,linDisplay) = $get(tabCSLE(2,linDisplay)) + 1
     set tabCSLE(2,linDisplay,cp) = ""
   }
 }
 
 set codGrid = $piece(var,",",13)
 
 set coluna = $get(tabPar(1,2))
 
 if (codGrid '= "") , (coluna ?.N) {
   set tabCSLE(4,codGrid,coluna) = cp
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="LerSetCSW1UTI">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String,tabSetCSW1UTI:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (linha '[ "Set^%CSW1UTI") quit $$$OK
 
 set sc = ##class(Src2.SourceCheck).ObterParametros("Set^%CSW1UTI", linha, .tabPar)
 
 set set = ""
 for {
   set set = $order(tabPar(set))
   if (set = "") quit
   
   set cp = $get(tabPar(set,2,1))
   
   if ($extract(cp,1,2) '= "cp") continue
   
   set var = $get(tabPar(set,3))
   
   if (var [ "$fnumber(") ! (var [ "$fn(") {
     set tabSetCSW1UTI(cp) = var
     continue
   }
   
   set var2 = $get(tabPar(set,4,1))
   
   for cont=1:1:10 {
     if (var [ ("V"_cont)) {
       set tabSetCSW1UTI(cp) = var
       quit
     }
     if (var2 [ ("v"_cont)) {
       set tabSetCSW1UTI(cp) = var
       quit
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarInterfaceRegra">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (linha [ "Set^%CSW1UTI") {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("120-interfRegra", lin, "Regra com interface", """"_linha_"""") 
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="LerInterface">
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,lin:%String,linha:%String,tabDisplay:%String,tabAtalho:%String,tabLabelsRet:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (linha [ "csw:aj:") {
   
   set var = $piece(linha,"csw:aj:",2)
   
   set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, $piece(var,",",3))
   
   if ($piece(var,",",1) > 108) ! ($piece(var,",",2) > 28) {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("201-tela", lin, "A tela não pode ser maior que 108 x 28", "Atual: "_$piece(var,",",1)_" x "_$piece(var,",",2))
   }
 }
 
 if (linha [ "//") quit $$$OK
 
 if (linha [ "csw:label:") {
   set var = $piece(linha,"csw:label:",2)
   
   set linDisplay = $piece(var,",",2)
   set descricao = $piece(var,",",4)
   
   if (descricao = "") ! (linDisplay = "") quit $$$OK
   
   set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, descricao)
   
   if (descricao [ "'") {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("118-label", lin, "Label com apóstrofo", """"_descricao_"""")
   }
   
   set tabDisplay(linDisplay) = $get(tabDisplay(linDisplay)) + 1
   set tabDisplay(linDisplay,descricao) = lin
 }
 
 if (linha [ "csw:btnManter:") {
   set var = $piece(linha,"csw:btnManter:",2)
   
   set ident = $piece(var,",",1)
   if (ident = "") set ident = "btnManter"
   
   set flgAtalho = $translate($piece(var,",",6)," ","")
   
   if ($piece(var,",",3) '= "") , ($piece($piece(var,",",3),"^",2) = "") { set $piece(var,",",3) = $piece(var,",",3)_"^"_rotina }
   
   if (flgAtalho '= 0) { set tabAtalho("btnManter","S",lin,ident,"Salvar") = "" }
   set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, $piece(var,",",3), .tabLabelsRet)
   
   if ($piece(var,",",4) '= "") {
     if (flgAtalho '= 0) { set tabAtalho("btnManter","C",lin,ident,"Cancelar") = "" }
     set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, $piece(var,",",4), .tabLabelsRet)
   }
   if ($piece(var,",",5) '= "") {
     if (flgAtalho '= 0) { set tabAtalho("btnManter","E",lin,ident,"Excluir") = "" }
     set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, $piece(var,",",5), .tabLabelsRet)
   }
 }
 
 if (linha [ "csw:btnConsultar:") {
   set var = $piece(linha,"csw:btnConsultar:",2)
   
   set ident = $piece(var,",",1)
   if (ident = "") set ident = "btnConsultar"
   
   set flgAtalho = $translate($piece(var,",",5)," ","")
   
   if ($piece(var,",",3) '= "") {
     if (flgAtalho '= 0) { set tabAtalho("btnConsultar","O",lin,ident,"Consultar") = "" }
     set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, $piece(var,",",3), .tabLabelsRet)
   }
   if ($piece(var,",",4) '= "") {
     if (flgAtalho '= 0) { set tabAtalho("btnConsultar","L",lin,ident,"Limpar") = "" }
     set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, $piece(var,",",4), .tabLabelsRet)
   }
 }
 
 if (linha [ "csw:btnManut:") {
   set var = $piece(linha,"csw:btnManut:",2)
   
   set ident = $piece(var,",",6)
   if (ident = "") set ident = $piece(var,",",1)
   if (ident = "") set ident = "btnManut"
   
   set flgAtalho = $translate($piece(var,",",7)," ","")
   
   if ($piece(var,",",3) '= "") {
     if (flgAtalho '= 0) { set tabAtalho("btnManut","M",lin,ident,"Manutencao") = "" }
     set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, $piece(var,",",3), .tabLabelsRet)
   }
   if ($piece(var,",",4) '= "") {
     if (flgAtalho '= 0) { set tabAtalho("btnManut","I",lin,ident,"Incluir") = "" }
     set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, $piece(var,",",4), .tabLabelsRet)
   }
   if ($piece(var,",",5) '= "") {
     if (flgAtalho '= 0) { set tabAtalho("btnManut","R",lin,ident,"Remover") = "" }
     set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, $piece(var,",",5), .tabLabelsRet)
   }
 }
 
 if (linha [ "csw:btnNavega:") {
   set var = $piece(linha,"csw:btnNavega:",2)
   
   set ident = $piece(var,",",6)
   if (ident = "") set ident = $piece(var,",",1)
   if (ident = "") set ident = "btnNavega"
   
   set flgAtalho = $translate($piece(var,",",5)," ","")
   
   if (flgAtalho '= 0) {
     set tabAtalho("btnNavega","A",lin,ident,"Anterior") = ""
     set tabAtalho("btnNavega","X",lin,ident,"Próximo") = ""
     
     if ($translate($piece(var,",",4)," ","") '= 2) {
       set tabAtalho("btnNavega","P",lin,ident,"Primeiro") = ""
       set tabAtalho("btnNavega","U",lin,ident,"Último") = ""
     }
   }
   
   set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, $piece(var,",",3), .tabLabelsRet, 1)
 }
 
 if (linha [ "csw:botaoupload:") {
   set var = $piece(linha,"csw:botaoupload:",2)
   
   set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, $piece(var,",",6), .tabLabelsRet, 1)
   
   set ident = $piece(var,",",1)
   if (ident = "") set ident = "botaoupload"
   
   set texto = $piece(var,",",4)
   
   set atalho = $piece(var,",",5)
   
   set sc = ##class(Src2.SourceCheck).ValidarAtalhoBotao(lin, texto, atalho)
   
   if (atalho '= "") , (texto '= "") {
     set tabAtalho("botao",atalho,lin,ident,texto) = ""
   }
   
   if ($piece(var,",",8) '= "") {
     set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, $piece(var,",",8))
   }
 }
 
 if (linha [ "csw:botao:") {
   set var = $piece(linha,"csw:botao:",2)
   
   set sc = ##class(Src2.SourceCheck).GravarLabelRetorno(rotina, lin, linha, $piece(var,",",6), .tabLabelsRet)
   
   set ident = $piece(var,",",1)
   if (ident = "") set ident = "botao"
   
   set texto = $piece(var,",",4)
   
   set atalho = $piece(var,",",5)
   
   set sc = ##class(Src2.SourceCheck).ValidarAtalhoBotao(lin, texto, atalho)
   
   if (atalho '= "") , (texto '= "") {
     set tabAtalho("botao",atalho,lin,ident,texto) = ""
   }
   
   if ($piece(var,",",8) '= "") {
     set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, $piece(var,",",8))
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarAtalhoBotao">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,texto:%String,atalho:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (texto2, u ,u2) = ""
 
 if (texto [ "<u>") ! (texto [ "</u>") { set u = "<u>", u2 = "</u>" }
 if (texto [ "<U>") ! (texto [ "</U>") { set u = "<U>", u2 = "</U>" }
 
 if (u = "") quit $$$OK
 
 set atalhoDisplay = $piece($piece(texto,u,2),u2,1)
 
 if (atalhoDisplay = "") ! (texto '[ u) ! (texto '[ u2) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("105-atalho", lin, "Atalho com problemas na definição do underline", texto)
   quit $$$OK
 }
 
 set texto2 = $piece(texto,u,1)_atalhoDisplay_$piece(texto,u2,2)
 
 if (atalhoDisplay '= "") , ($zconvert(atalho,"U") '= $zconvert(atalhoDisplay,"U")) {
   if (atalho = "") {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("105-atalho", lin, "Atalho não definido", texto)
  } else {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("105-atalho", lin, "Atalho definido diferente do atalho do display", texto_" - """_atalho_"""")
   }
 }
 
 set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, texto2)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarSyntaxLinha">
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[lin:%String,linha:%String,tabLabels:%String,flgRegra:%Boolean,flgExpandir:%Boolean,&tabMacros:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabMacros
 
 set sc = ##class(Src2.SourceSyntax).ObterExpressoes(linha, .tabExpressao)
     
 set sc = ##class(Src2.SourceSyntax).ValidarSyntax(.tabExpressao)
 if (sc'=$$$OK) quit $$$OK
 
 set sc = ##class(Src2.SourceSyntax).ObterDados(.tabExpressao, .tabComandos, .tabFuncCache, .tabMacros)
 
 if ('flgExpandir) , ($piece($get(tabExpressao),"^",1) = 1) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("108-expandir", lin, "Expandir comandos", linha)
   set flgExpandir = 1
 }
 
 if ('flgRegra) {
   set sc = ##class(Src2.SourceSyntax).ObterVariaveis(.tabExpressao, .tabVaraiveis, .tabGlobais, .tabNews, .tabParametros)
   
   merge ^mtempSoureVar($job,1) = tabVaraiveis
   merge ^mtempSoureVar($job,2) = tabNews
   merge ^mtempSoureVar($job,3) = tabParametros
   
   kill tabVaraiveis2
   merge tabVaraiveis2 = tabVaraiveis
   merge tabVaraiveis2 = tabNews
   merge tabVaraiveis2 = tabParametros
   
   set variavel = ""
   for {
     set variavel = $order(tabVaraiveis2(variavel))
     if (variavel = "") quit
     if ('$data(^mtempSoureVar($job,0,variavel))) {
       set ^mtempSoureVar($job,0,variavel) = lin
     }
   }
   
   merge ^mtempSoureParametros($job,lin) = tabParametros
   
   if (linha [ "RL^%CSUTIUD") {
     set ^mtempSoureVar($job,1,"PG") = ""
   }
 }
 
 if (flgRegra) {
   set sc = ##class(Src2.SourceCheck).ObterRegraLinha(.tabLabels, lin, .regra)
   
   if (regra '= "") {
     set sc = ##class(Src2.SourceSyntax).ObterVariaveis(.tabExpressao, .tabVaraiveis, .tabGlobais, .tabNews, .tabParametros)
     
     if (linha [ "$$$VAR") {
       set tabVaraiveis("Z") = "" , tabVaraiveis("z") = "" , tabVaraiveis("Y") = ""
       set tabVaraiveis("y") = "" , tabVaraiveis("V") = "" , tabVaraiveis("v") = ""
       set tabNews("Z") = "" , tabNews("z") = "" , tabNews("Y") = ""
       set tabNews("y") = "" , tabNews("V") = "" , tabNews("v") = ""
     }
     
     if (linha [ "^%CSMV001") {
       set tabVaraiveis("CE") = ""
     }
     
     if (linha [ "RL^%CSUTIUD") {
       set tabVaraiveis("PG") = ""
     }
     
     set variavel = ""
     for {
       set variavel = $order(tabVaraiveis(variavel))
       if (variavel = "") quit
       set tabVaraiveis(variavel) = lin
     }
     
     merge ^mtempSoureRegra($job,regra,1) = tabVaraiveis
     merge ^mtempSoureRegra($job,regra,2) = tabNews
     merge ^mtempSoureRegra($job,regra,3) = tabParametros
     
     kill tabVaraiveis2
     merge tabVaraiveis2 = tabVaraiveis
     merge tabVaraiveis2 = tabNews
     merge tabVaraiveis2 = tabParametros
     
     set variavel = ""
     for {
       set variavel = $order(tabVaraiveis2(variavel))
       if (variavel = "") quit
       if ('$data(^mtempSoureVar($job,0,variavel))) {
         set ^mtempSoureVar($job,0,variavel) = lin
       }
     }
     
     if $data(tabComandos("goto")) {
       set sc = ##class(Src2.SourceCheck).GravarMensagem("112-cmdinvalido", lin, "Comando inválido em regra - goto", """"_linha_"""")
     }
   }
 }
 
 if (linha [ "<naoconverter>") quit $$$OK
 
 if $data(tabComandos("lock")) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("112-cmdinvalido", lin, "Comando inválido - lock", """"_linha_"""")
 }
 if $data(tabFuncCache("$io")) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("112-cmdinvalido", lin, "Função inválida - $io", """"_linha_"""")
 }
 if $data(tabFuncCache("$principal")) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("112-cmdinvalido", lin, "Função inválida - $principal", """"_linha_"""")
 }
 if $data(tabFuncCache("$job")) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("112-cmdinvalido", lin, "Função inválida - $job", """"_linha_"""")
 }
 if $data(tabFuncCache("$horolog")) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("112-cmdinvalido", lin, "Função inválida - $horolog ($$$horolog / $$$horologEmp(codEmpresa))", """"_linha_"""")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarSyntaxGatilhos">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String,tabLabels:%String,flgRegra:%Boolean,flgExpandir:%Boolean</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (linha [ "$$GatilhoRegra^%CSW1GATCUST") {
   set sc = ##class(Src2.SourceCheck).ObterParametros("$$GatilhoRegra^%CSW1GATCUST", linha, .tabPar)
   if ('$data(tabPar(1,2,2))) & ('$data(tabPar(1,3,2))) {
     if ($get(tabPar(1,2,1)) '= "") & ($get(tabPar(1,3,1)) '= "") {
       set linha2 = $char(9)_"write $$"_$get(tabPar(1,2,1))_$get(tabPar(1,3,1))
       set sc = ##class(Src2.SourceCheck).ValidarSyntaxLinha(lin, linha2, .tabLabels, flgRegra, .flgExpandir)
     }
   }
 }
 
 if (linha [ " GatilhoInterface^%CSW1GATCUST") {
   set sc = ##class(Src2.SourceCheck).ObterParametros("GatilhoInterface^%CSW1GATCUST", linha, .tabPar)
   if ('$data(tabPar(1,3,2))) & ('$data(tabPar(1,4,2))) {
     if ($get(tabPar(1,3,1)) '= "") & ($get(tabPar(1,4,1)) '= "") {
       set linha2 = $char(9)_"do "_$get(tabPar(1,3,1))_$get(tabPar(1,4,1))
       set sc = ##class(Src2.SourceCheck).ValidarSyntaxLinha(lin, linha2, .tabLabels, flgRegra, .flgExpandir)
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterRegraLinha">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabLabels:%String,lin:%String,regra:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set regra = ""
 
 set lin2 = lin + 1
 
 for {
   set lin2 = $order(tabLabels(2,lin2),-1)
   if (lin2 = "") quit
   
   set label = $get(tabLabels(2,lin2))
   
   if $piece($get(tabLabels(1,label)),"^",2) = 1 {
     set regra = label
     quit
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarLabelRetorno">
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,lin:%String,linha:%String,retorno:%String,tabLabelsRet:%String,flgParametro:%String=0</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (retorno = "") {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("101-labelRet", lin, "Rotina de retorno não definido", linha)
   quit $$$OK
 }
 
 if (retorno [ "_") quit $$$OK
 
 set labelRet = $piece(retorno,"^",1)
 set rotinaRet = $piece(retorno,"^",2)
 
 if (rotina = rotinaRet) {
   if (labelRet = "") {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("101-labelRet", lin, "Label de retorno não encontrada", linha)
     quit $$$OK
   }
   set tabLabelsRet(labelRet,1) = lin_"^"_flgParametro
   set tabLabelsRet(labelRet,2) = retorno
 } else {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("101-labelRet", lin, "Rotina de retorno inválida", """"_retorno_"""")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarDisplaysValcps">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabMsgInvalida:%String,tabCSLE:%String,tabDisplay:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set lin = ""
 for {
   set lin = $order(tabMsgInvalida(lin))
   if (lin = "") quit
   set linha = $get(tabMsgInvalida(lin))
   
   set cp = $piece(linha,":",1) 
   
   set mensagem = ""
   
   if $data(tabCSLE(1,cp)) {
     set linCSLE = $piece($get(tabCSLE(1,cp)),"^",1)
     set obrigatorio = $piece($get(tabCSLE(1,cp)),"^",2)
     if ($get(tabCSLE(2,linCSLE)) = 1) , ($get(tabDisplay(linCSLE)) = 1) {
       set mensagem = " - LABEL: "_$translate($order(tabDisplay(linCSLE,"")),"*","")
     } 
   }
   
   set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Mensagem inválida" , """"_linha_""""_mensagem)
 }
 
 set linDisplay = ""
 for {
   set linDisplay = $order(tabDisplay(linDisplay))
   if (linDisplay = "") quit
   
   if ($get(tabDisplay(linDisplay)) '= 1) continue
   
   if ($get(tabCSLE(2,linDisplay)) '= 1) continue
   
   set cp = $order(tabCSLE(2,linDisplay,""))
   
   set obrigatorio = $piece($get(tabCSLE(1,cp)),"^",2)
   set descricao = $order(tabDisplay(linDisplay,""))
   set lin = $get(tabDisplay(linDisplay,descricao))
   
   if (obrigatorio) , (descricao '[ "*") {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("107-obrigatorio", lin, "CSLE "_cp_" da label é obrigatório ""*""" , descricao)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarParamUtilit">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String,tabMsgInvalida:%String,tabAtalho:%String,varRetCSUTIOP:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.SourceCheck).ObterParametros("ME^%CSUTIUD", linha, .tabPar)
 
 if $data(tabPar) {
   set (cont, cont2) = ""
   for {
     set cont = $order(tabPar(cont))
     if (cont = "") quit
     set var = $get(tabPar(cont,1))
     
     if (var [ """") , (var '[ "!") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Mensagem sem exclamação", """"_var_"""")
     
     for {
       set cont2 = $order(tabPar(cont,1,cont2))
       if (cont2 = "") quit
       set var = $get(tabPar(cont,1,cont2))
       
       if ($extract(var,1,2) = "cp") {
         set tabMsgInvalida(lin) = var
         continue
       }
       
       if ($extract(var,1,3) = "int") {
         set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Mensagem inválida" , """"_var_"""")
         continue
       }
       
       if (var [ " !") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Espaço antes da exclamação", """"_var_"""")
       if (var [ " ?") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Espaço antes da interrogação", """"_var_"""")
       if (var [ "?,") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Virgula após interrogação", """"_var_"""")
       if (var [ "!,") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Virgula após exclamação", """"_var_"""")
       
       set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, var)
     }
   }
 }
 
 set sc = ##class(Src2.SourceCheck).ObterParametros("SN^%CSUTIUD", linha, .tabPar)
 
 if $data(tabPar) {
   set (cont, cont2, varRetCSUTIOP) = ""
   for {
     set cont = $order(tabPar(cont))
     if (cont = "") quit
     set var = $get(tabPar(cont,4))
     
     if (var [ """") , (var '[ "?") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Mensagem sem interrogação", """"_var_"""")
     
     for {
       set cont2 = $order(tabPar(cont,4,cont2))
       if (cont2 = "") quit
       set var = $get(tabPar(cont,4,cont2))
       
       if (var [ " !") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Espaço antes da exclamação", """"_var_"""")
       if (var [ " ?") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Espaço antes da interrogação", """"_var_"""")
       if (var [ "?,") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Virgula após interrogação", """"_var_"""")
       if (var [ "!,") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Virgula após exclamação", """"_var_"""")
       
       set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, var)
     }
   } 
 }
 
 set sc = ##class(Src2.SourceCheck).ObterParametros("AJ^%CSUTIUD", linha, .tabPar)
 
 if $data(tabPar) {
   set (cont, cont2, varRetCSUTIOP) = ""
   for {
     set cont = $order(tabPar(cont))
     if (cont = "") quit
     
     for {
       set cont2 = $order(tabPar(cont,3,cont2))
       if (cont2 = "") quit
       set var = $get(tabPar(cont,3,cont2))
       
       set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, var)
     }
   }
 }
 
 set sc = ##class(Src2.SourceCheck).ObterParametros("^%CSUTIMM", linha, .tabPar)
 
 if $data(tabPar) {
   set (cont, cont2, varRetCSUTIOP) = ""
   for {
     set cont = $order(tabPar(cont))
     if (cont = "") quit
     
     for {
       set cont2 = $order(tabPar(cont,7,cont2))
       if (cont2 = "") quit
       set var = $get(tabPar(cont,7,cont2))
       
       set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, var)
     }
   }
 }
 
 set sc = ##class(Src2.SourceCheck).ObterParametros("^%CSUTIMB", linha, .tabPar)
 
 if $data(tabPar) {
   set (cont, cont2, varRetCSUTIOP) = ""
   for {
     set cont = $order(tabPar(cont))
     if (cont = "") quit
     
     for {
       set cont2 = $order(tabPar(cont,1,cont2))
       if (cont2 = "") quit
       set var = $get(tabPar(cont,1,cont2))
       for cont3 = 1:1:$length(var,",") {
          set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, $piece(var,",",cont3))
       }
     }
     
     for {
       set cont2 = $order(tabPar(cont,3,cont2))
       if (cont2 = "") quit
       set var = $get(tabPar(cont,3,cont2))
       set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, var)
     }
   }
 }
 
 set sc = ##class(Src2.SourceCheck).ObterParametros("^%CSUTIPE", linha, .tabPar)
 
 if $data(tabPar) {
   set (cont, cont2, varRetCSUTIOP) = ""
   for {
     set cont = $order(tabPar(cont))
     if (cont = "") quit
     
     for {
       set cont2 = $order(tabPar(cont,3,cont2))
       if (cont2 = "") quit
       set var = $get(tabPar(cont,3,cont2))
       for cont3 = 1:1:$length(var,",") {
          set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, $piece(var,",",cont3))
       }
     }
   }
 }
 
 set sc = ##class(Src2.SourceCheck).ObterParametros("^%CSUTIOP", linha, .tabPar)
 
 if $data(tabPar) {
   set (cont, cont2, varRetCSUTIOP) = ""
   for {
     set cont = $order(tabPar(cont))
     if (cont = "") quit
     
     if ($get(tabPar(1,3)) '= "") , ($order(tabPar(cont,3,"")) = "") {
       set varRetCSUTIOP = $get(tabPar(1,4))
       if (varRetCSUTIOP = "") set varRetCSUTIOP = "OP"
     }
     
     for {
       set cont2 = $order(tabPar(cont,3,cont2))
       if (cont2 = "") quit
       set var = $get(tabPar(cont,3,cont2))
       for cont3 = 1:1:$length(var,",") {
          set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, $piece(var,",",cont3))
          set sc = ##class(Src2.SourceCheck).ObterAtalho(lin, $piece(var,",",cont3), .tabAtalho)
       }
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarParametros">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String,tabAtalhoCSUTIOP:%String,varRetCSUTIOP:%String,tabLabels:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.SourceCheck).ObterParametros("$$$ERROR", linha, .tabPar)
 
 if $data(tabPar) {
   if ($get(tabPar(1,2)) [ "$$ParamObrigatorio^CCUTIRG001") {
     kill tabPar
     set sc = ##class(Src2.SourceCheck).ValidarParamObrigatorio(lin, linha, .tabLabels)
   }
   
   set exclama = 1
   set sc = ##class(Src2.SourceCheck).ObterParametros("$$RetornoMsgLock^%CSW1LOCKTAB", linha, .tabPar2)
   set sc = ##class(Src2.SourceCheck).ObterParametros("$$MsgLock^%CSW1F", linha, .tabPar3)
   set sc = ##class(Src2.SourceCheck).ObterParametros("$$$MsgLock", linha, .tabPar4)
   if ($data(tabPar2)) ! ($data(tabPar3) ! ($data(tabPar4))) set exclama = 0
   
   set (cont, cont2) = ""
   for {
     set cont = $order(tabPar(cont))
     if (cont = "") quit
     set var = $get(tabPar(cont,2))
     
     if (exclama) , (var [ """") , (var '[ "!") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Mensagem sem exclamação", """"_var_"""")
     
     for {
       set cont2 = $order(tabPar(cont,2,cont2))
       if (cont2 = "") quit
       set var = $get(tabPar(cont,2,cont2))
       
       if (var [ " !") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Espaço antes da exclamação", """"_var_"""")
       if (var [ " ?") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Espaço antes da interrogação", """"_var_"""")
       if (var [ "?,") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Virgula após interrogação", """"_var_"""")
       if (var [ "!,") set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Virgula após exclamação", """"_var_"""")
       
       set sc = ##class(Src2.SourceCheck).ValidarPalavras(lin, var)
     }
   }
 }
 
 if (varRetCSUTIOP '= "") {
   set var = varRetCSUTIOP_"="""
   
   if (linha [ var) {
     for cont = 2:1:$length(linha,var) {
       set atalho = $piece($piece(linha,var,cont),"""",1)
       if ($length(atalho) = 1) , ('$data(tabAtalhoCSUTIOP(atalho))) {
         set tabAtalhoCSUTIOP(atalho) = lin
       }
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarParamObrigatorio">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String,tabLabels:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.SourceCheck).ObterParametros("$$ParamObrigatorio^CCUTIRG001", linha, .tabPar)
 
 set linLabel=$order(tabLabels(2,lin),-1)
 if (linLabel = "") quit $$$OK
 
 if ($piece($get(tabLabels(2,linLabel)),"^",1) '= $piece($get(tabPar(1,1,1)),"^",1)) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("111-paramObrig", lin, "Regra incorreta em $$ParamObrigatorio", $piece($get(tabPar(1,1,1)),"^",1)_" => "_$piece($get(tabLabels(2,linLabel)),"^",1))
 }
 
 if (linha '[ ("$get("_$get(tabPar(1,2,1))_")=""""")) {
   set sc = ##class(Src2.SourceCheck).GravarMensagem("111-paramObrig", lin, "Variavel incorreta em $$ParamObrigatorio", "Variavel: "_$get(tabPar(1,2,1)))
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterAtalho">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,texto:%String,tabAtalho:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set textoUper = $zconvert(texto,"U")
 
 for cont = 1:1:$length(texto) {
   if ($extract(texto,cont) '= $extract(textoUper,cont)) continue
   if (" !@#$%¨&*()_+'""`´{}[]^~<>:?,.;/|\" [ $extract(texto,cont)) continue
   set tabAtalho("^%CSUTIOP",$extract(texto,cont),lin,1,texto) = ""
   quit
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarPalavras">
<Description>
kill ^mtempSoureMsg($job) set sc = ##class(Src2.SourceCheck).ValidarPalavras(1, "pingo-de-mel") zw ^mtempSoureMsg($job)
kill ^mtempSoureMsg($job) set sc = ##class(Src2.SourceCheck).ValidarPalavras(1, "1-teste") zw ^mtempSoureMsg($job)
kill ^mtempSoureMsg($job) set sc = ##class(Src2.SourceCheck).ValidarPalavras(1, "1-téste") zw ^mtempSoureMsg($job)
kill ^mtempSoureMsg($job) set sc = ##class(Src2.SourceCheck).ValidarPalavras(1, "2-3-pingo-de-mel") zw ^mtempSoureMsg($job)
kill ^mtempSoureMsg($job) set sc = ##class(Src2.SourceCheck).ValidarPalavras(1, "pingo-de-mél") zw ^mtempSoureMsg($job)
kill ^mtempSoureMsg($job) set sc = ##class(Src2.SourceCheck).ValidarPalavras(1, "1-10-23") zw ^mtempSoureMsg($job)
kill ^mtempSoureMsg($job) set sc = ##class(Src2.SourceCheck).ValidarPalavras(1, "A qtd é 3 palavra. Teste 5,5 + 6.6 de sistema.Nec.") zw ^mtempSoureMsg($job)
kill ^mtempSoureMsg($job) set sc = ##class(Src2.SourceCheck).ValidarPalavras(1, "A qtd.\né 3 palavra. Teste 5,5 6.6 de sistema. Nec.") zw ^mtempSoureMsg($job)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,mensagem:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (mensagem [ "\n") {
   set msg = mensagem
   set mensagem = ""
   for cont = 1:1:$length(msg,"\n") {
     set mensagem = mensagem_$select(mensagem="":"",1:" ")_$piece(msg,"\n",cont)
   }
 }
 
 set mensagem2 = $translate(mensagem,"()?!|:,;[]{}/\'<>^*+%"_$char(34),"                      ")
 
 for cont = 1:1:$length(mensagem2," ") {
   set expressao = $piece(mensagem2," ",cont)
   
   if (expressao = "") ! (expressao = "-") continue
   
   if (expressao [ "-") {
     for cont2 = 1:1:$length(expressao,"-") {
       if ($piece(expressao,"-",cont2) '?.N) quit
     }
     set expressao = $piece(expressao,"-",cont2,$length(expressao,"-"))
   }
   
   if (expressao ?.N) ! ($translate(expressao,".","") ?.N) continue
   
   set expressaoUper = $zconvert(expressao,"U")
   
   if ($data(^Src2Config("palavrasinv",expressaoUper))) {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Palavra '"_expressao_"' inválida", """"_mensagem_"""")
     continue
   }
   
   if ($data(^Src2Config("palavras",expressaoUper))) ! ($data(^Src2Config("dicionario",expressaoUper))) continue
   
   if ($extract(expressaoUper,$length(expressaoUper)) = ".") set $extract(expressaoUper,$length(expressaoUper))=""
   
   if ($data(^Src2Config("palavras",expressaoUper))) ! ($data(^Src2Config("dicionario",expressaoUper))) continue
   
   set sc = ##class(Src2.SourceCheck).GravarMensagem("110-mensagem", lin, "Palavra '"_expressao_"' não encontrada no dicionário", """"_mensagem_"""")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarMensagem">
<ClassMethod>1</ClassMethod>
<FormalSpec>tipo:%String,lin:%String,msg1:%String,msg2:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set codSeq = $order(^mtempSoureMsg($job,tipo,lin,""),-1) + 1
 
 set mensagem = $get(msg1)
 
 if ($get(msg2) '= "") {
   set mensagem = mensagem_$select(mensagem="":"",1:" : ")_msg2
 }
 
 set ^mtempSoureMsg($job,tipo,lin,codSeq) = mensagem
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarLabelsRetorno">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabLabels:%String,tabLabelsRet:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set label = ""
 for {
   set label = $order(tabLabelsRet(label))
   if (label = "") quit
   
   set lin = $piece($get(tabLabelsRet(label,1)),"^",1)
   set parametro = $piece($get(tabLabelsRet(label,1)),"^",2)
   set labelRet = $get(tabLabelsRet(label,2))
   
   if ($data(tabLabels(1,label))) {
     if ('parametro) , ($piece($get(tabLabels(1,label)),"^",2) = 1) {
       set sc = ##class(Src2.SourceCheck).GravarMensagem("101-labelRet", lin, "Label de retorno com parâmetros", """"_labelRet_"""")
     }
     continue
   }
   
   set sc = ##class(Src2.SourceCheck).GravarMensagem("101-labelRet", lin, "Label de retorno não encontrada", """"_labelRet_"""")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarLabels">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String,tabLabels:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (labelParam,label) = $piece(linha,$char(9),1)
 
 if (labelParam = "") quit $$$OK
 
 set parametros = 0
 
 if (labelParam [ "(") {
   set label = $piece(labelParam,"(",1)
   set parametros = 1
   ;set sc = ##class(Src2.SourceCheck).ObterParametros(label, labelParam, .tabPar)
 }
 
 set tabLabels(1,label) = lin_"^"_parametros
 set tabLabels(2,lin) = label
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="LinhaComentada">
<ClassMethod>1</ClassMethod>
<FormalSpec>linha:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ($translate($piece(linha,";",1),$char(9)_" .","") = "") quit $$$OK
 if ($translate($piece(linha,"//",1),$char(9)_" .","") = "") quit $$$OK
 if ($extract(linha,1) '= "") , ($translate($piece($piece(linha,$char(9),2),";",1),$char(9)_" .","") = "") quit $$$OK
 quit 0
]]></Implementation>
</Method>

<Method name="LerNews">
<ClassMethod>1</ClassMethod>
<FormalSpec>lin:%String,linha:%String,flagLerNewsEnc:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ($extract(linha,1,5) = "Valcp") {
   set flagLerNewsEnc = 1
   quit $$$OK
 }
 
 set var = $piece(linha,$char(9),2)
 
 set varUper = $zconvert(var,"U")
 
 if ($extract(varUper,1,15) = "D NEW^%CSW1UTI(") ! ($extract(varUper,1,16) = "DO NEW^%CSW1UTI(") {
   
   set sc = ##class(Src2.SourceCheck).ObterParametros("New^%CSW1UTI", var, .tabPar)
   
   set var2 = $get(tabPar(1,1,1))
   
   if (var2 '= "%VRM") {
     if ($length(var2) > 240) {
       set sc = ##class(Src2.SourceCheck).GravarMensagem("103-newcsw", lin, "Linha muito grande" , var2)
       quit $$$OK
     }
     
     if (var2 = "") {
       set sc = ##class(Src2.SourceCheck).GravarMensagem("103-newcsw", lin, "'New^%CSW1UTI' sem conteúdo" , linha)
       quit $$$OK
     }
     
     set ^mtempSoureCheck($job,1,var2) = lin
   }
 }
 
 if ($extract(varUper,1,17) = "D NEWF7^%CSW1UTI(") ! ($extract(varUper,1,18) = "DO NEWF7^%CSW1UTI(") {
   
   set sc = ##class(Src2.SourceCheck).ObterParametros("NewF7^%CSW1UTI", var, .tabPar)
   
   set var2 = $get(tabPar(1,1,1))
   
   if (var2 '= "") , (var2 '= "%VRM") {
     if ($length(var2) > 240) {
       set sc = ##class(Src2.SourceCheck).GravarMensagem("103-newcsw", lin, "Linha muito grande" , var2)
       quit $$$OK
     }
     
     if (var2 = "") {
       set sc = ##class(Src2.SourceCheck).GravarMensagem("103-newcsw", lin, "'New^%CSW1UTI' sem conteúdo" , linha)
       quit $$$OK
     }
     
     set ^mtempSoureCheck($job,1,var2) = lin
   }
 }
 
 if ($extract(varUper,1,2) = "N ") ! ($extract(varUper,1,4) = "NEW ") {
   set var2 = $piece(var," ",2)
   
   if ($length(var2) > 240) {
     set sc = ##class(Src2.SourceCheck).GravarMensagem("103-newcsw", lin, "Linha muito grande" , var2)
     quit $$$OK
   }
   
   if (var2 = "") quit $$$OK
   
   if ($data(^mtempSoureCheck($job,1,var2))) {
     kill ^mtempSoureCheck($job,1,var2)
   } else {
     set ^mtempSoureCheck($job,2,var2) = lin
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidaNews">
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set var = ""
 for {
   set var = $order(^mtempSoureCheck($job,1,var))
   if (var = "") quit
   set lin = $get(^mtempSoureCheck($job,1,var))
   
   set sc = ##class(Src2.SourceCheck).GravarMensagem("103-newcsw", lin, "Inválido 'New^%CSW1UTI'" , var)
 }
 
 set var = ""
 for {
   set var = $order(^mtempSoureCheck($job,2,var))
   if (var = "") quit
   set lin = $get(^mtempSoureCheck($job,2,var))
   
   set sc = ##class(Src2.SourceCheck).GravarMensagem("103-newcsw", lin, "Sem 'New^%CSW1UTI'" , var)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterParametros">
<Description>
set sc = ##class(Src2.SourceCheck).ObterParametros("SN^%CSUTIUD", $get(^rMAC("CCTCO215",0,41)), .tabPar)
set sc = ##class(Src2.SourceCheck).ObterParametros("ME^%CSUTIUD", $get(^rMAC("CCFFB065",0,41)), .tabPar)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>funcao:%String,string:%String,tabPars:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabPars
 
 if (string '[ funcao) quit $$$OK
 
 for parte = 2:1:$length(string,funcao) {
   set var = $piece(string,funcao,parte)
   
   set codSeq = $order(tabPars(""),-1) + 1
   
   set (parente, contPar, flgTexto, proxAspas)=0
   
   set contTexto = 1
   
   for cont = 1:1:$length(var) {
     
     set (carac, carac2) = $extract(var,cont)
     
     if ('proxAspas) {
       if (parente) , (carac = """") {
         if ($extract(var,cont+1) '= """") {
           if flgTexto set flgTexto = 0 , contTexto = contTexto + 1
           else  set flgTexto = 1
         } else {
           set proxAspas = 1
         }
         set carac2 = ""
       }
     } else {
       set proxAspas = 0
     }
     
     if ('flgTexto) {
       if (carac = "(") {
         set parente = parente + 1
         if (parente = 1) { set contPar = contPar + 1 continue }
         set tabPars(codSeq,contPar) = $get(tabPars(codSeq,contPar))_carac
         continue
       }
       
       if (carac = ")") {
         set parente = parente - 1
         if (parente = 0) quit
         set tabPars(codSeq,contPar) = $get(tabPars(codSeq,contPar))_carac
         continue
       }
       
       if (parente = 1) , (carac = ",") {
         if '$data(tabPars(codSeq,contPar)) set tabPars(codSeq,contPar) = ""
         set contPar = contPar + 1
         set contTexto = 1
         continue
       }
     }
     
     if (contPar > 0) {
       set tabPars(codSeq,contPar) = $get(tabPars(codSeq,contPar))_carac
       if (flgTexto) , (carac2 '= "") set tabPars(codSeq,contPar,contTexto) = $get(tabPars(codSeq,contPar,contTexto))_carac2
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTODOs">
<Description>
set sc = ##class(Src2.SourceCheck).ObterTODOs("CCTCP020", .tabTodos)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,tabTodos:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabTodos
 
 for lin = 1:1:$get(^rMAC(rotina,0,0)) {
   set linha = $get(^rMAC(rotina,0,lin))
   
   if ($piece(linha,";",2) [ " TODO ") {
     set tabTodos($order(tabTodos(lin),-1)+1) = "Linha ("_lin_") "_##class(Src2.Utils).RetirarBrancosIniciaisFinais($piece(linha,"TODO",2))
   }
 }
 
 if ($data(tabTodos)) quit "A rotina "_rotina_" possui TODOs pendentes"
 
 quit $$$OK
]]></Implementation>
</Method>

<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DataLocation>^Src2.SourceCheckD</DataLocation>
<DefaultData>SourceCheckDefaultData</DefaultData>
<IdLocation>^Src2.SourceCheckD</IdLocation>
<IndexLocation>^Src2.SourceCheckI</IndexLocation>
<StreamLocation>^Src2.SourceCheckS</StreamLocation>
<Data name="SourceCheckDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
</Data>
</Storage>
</Class>


<Class name="Src2.SourceCheckClasse">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>62490,30881.885609</TimeCreated>

<Method name="ValidarPadroes">
<Description>

Validar Padroes de Desenvolvimetno de Classes

set sc = ##class(Src2.SourceCheckClasse).ValidarPadroes("Teste.Classe2", "C:\workspacecsw\projetos\sourcecontrol10\classes\Teste\Classe2.xml")
set sc = ##class(Src2.SourceCheckClasse).ValidarPadroes("Teste.Classe3", "C:\workspacecsw\projetos\sourcecontrol10\classes\Teste\Classe3.xml")
set sc = ##class(Src2.SourceCheckClasse).ValidarPadroes("Teste.Classe4", "C:\workspacecsw\projetos\sourcecontrol10\classes\Teste\Classe4.xml")
set sc = ##class(Src2.SourceCheckClasse).ValidarPadroes("Tco.ConfigFasesSugestaoMovGradeFichasPacotes", "C:\workspacecsw\projetos\6.1\csw61\classes\Tco\ConfigFasesSugestaoMovGradeFichasPacotes.xml")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>classe:%String,arquivoClasse:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ('##class(%File).Exists(arquivoClasse)) quit $$$OK
 
 set (Super, ProcedureBlock, nameProperty) = ""
 
 set tamanhoNomeClasse = $length($piece(classe,".",$length(classe,".")))
 
 if (tamanhoNomeClasse > 25) {
   write !,"Source Control - Tamanho do nome da classe não deve ter mais que 25 caracteres - Atual: "_tamanhoNomeClasse
 }
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoClasse,.reader)
 
 while (reader.Read()) {
   
   // Class
   if (reader.Path = "/Export/Class/Super") & (reader.NodeType = "chars") {
     set Super = reader.Value
   }
   if (reader.Path = "/Export/Class/ProcedureBlock") & (reader.NodeType = "chars") {
     set ProcedureBlock = reader.Value
   }
   if (reader.Path = "/Export/Class/ClassType") & (reader.NodeType = "element") {
     set ClassType = ""
   }
   if (reader.Path = "/Export/Class/ClassType") & (reader.NodeType = "chars") {
     set ClassType = reader.Value
   }
   
   // Property
   if (reader.Path = "/Export/Class/Property") & (reader.NodeType = "element") {
     set (nameProperty) = ""
     if reader.MoveToAttributeName("name") set nameProperty = reader.Value
   }
   if (reader.Path = "/Export/Class/Property/Type") & (reader.NodeType = "chars") {
     if (nameProperty '= "") {
       set tabProperty(nameProperty,"Type") = reader.Value
     }
   }
   if (reader.Path = "/Export/Class/Property/Parameter") & (reader.NodeType = "element") {
     set (nameParameter, valueParameter) = ""
     if reader.MoveToAttributeName("name") set nameParameter = reader.Value
     if reader.MoveToAttributeName("value") set valueParameter = reader.Value
     if (nameProperty '= ""), (nameParameter '= "") {
       set tabProperty(nameProperty,"Property",nameParameter) = valueParameter
     }
   }
   
 }
 
 set reader = ""
 
 if (Super = "%Persistent") {
   if ($get(ClassType) = "") {
     write !,"Source Control - Definir na classe - [ ClassType = persistent ]"
   }
   ;if ('$data(ClassType)) {
   ;  write !,"Source Control - Definir na classe - [ ClassType = """" ]"
   ;}
 }
 
 if (ProcedureBlock = "") {
   write !,"Source Control - Definir na classe -  [ ProcedureBlock ] ou [ Not ProcedureBlock ]"
 }
 
 set nameProperty = ""
 for {
   set nameProperty = $order(tabProperty(nameProperty))
   if (nameProperty = "") quit
   
   if ($get(tabProperty(nameProperty,"Type")) = "%String") {
     if '$data(tabProperty(nameProperty,"Property","TRUNCATE")) {
       write !,"Source Control - Definir na propriedade '"_nameProperty_"' - (TRUNCATE = 1)"
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.SourceControl">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%Studio.SourceControl.Base</Super>
<TimeCreated>61727,0</TimeCreated>

<XData name="Menu">
<Data><![CDATA[
<MenuBase>
<Menu Name="%SourceMenu" Type="0">
<MenuItem Name="Checkout"/>
<MenuItem Name="Update"/>
<MenuItem Name="Update - Todos os Projetos"/>
<MenuItem Name="Switch"/>
<MenuItem Separator="1"/>
<MenuItem Name="Importar Item"/>
<MenuItem Name="Importar Itens - Alterados"/>
<MenuItem Name="Importar Itens - Todos"/>
<MenuItem Name="Exportar Item"/>
<MenuItem Name="Reverter Item"/>
<MenuItem Name="Converter Item"/>
<MenuItem Separator="1"/>
<MenuItem Name="Analisar Diferenças - Workspace > Caché"/>
<MenuItem Name="Analisar Diferenças - Caché > Workspace"/>
<MenuItem Separator="1"/>
<MenuItem Name="Status das Alterações do Projeto"/>
<MenuItem Separator="1"/>
<MenuItem Name="Atualizar Configurações/Gerar Backup"/>
<MenuItem Name="Exportar Objetos para Aplicação CSP"/>
<MenuItem Name="Gerar Serviço Consistem"/>
<MenuItem Name="Gerar/Configurar Base"/>
<MenuItem Separator="1"/>
<MenuItem Name="Executar Teste Unitário"/>
<MenuItem Separator="1"/>
<MenuItem Name="Ajuda"/>
</Menu>
<Menu Name="%SourceContext" Type="1">
<MenuItem Name="Checkout"/>
<MenuItem Name="Update"/>
<MenuItem Name="Update - Todos os Projetos"/>
<MenuItem Name="Switch"/>
<MenuItem Separator="1"/>
<MenuItem Name="Importar Item"/>
<MenuItem Name="Importar Itens - Alterados"/>
<MenuItem Name="Importar Itens - Todos"/>
<MenuItem Name="Exportar Item"/>
<MenuItem Name="Reverter Item"/>
<MenuItem Name="Converter Item"/>
<MenuItem Separator="1"/>
<MenuItem Name="Analisar Diferenças - Workspace > Caché"/>
<MenuItem Name="Analisar Diferenças - Caché > Workspace"/>
<MenuItem Separator="1"/>
<MenuItem Name="Status das Alterações do Projeto"/>
<MenuItem Separator="1"/>
<MenuItem Name="Atualizar Configurações/Gerar Backup"/>
<MenuItem Name="Exportar Objetos para Aplicação CSP"/>
<MenuItem Name="Gerar Serviço Consistem"/>
<MenuItem Name="Gerar/Configurar Base"/>
<MenuItem Separator="1"/>
<MenuItem Name="Executar Teste Unitário"/>
<MenuItem Separator="1"/>
<MenuItem Name="Ajuda"/>
</Menu>
</MenuBase>
]]></Data>
</XData>

<UDLText name="T">
<Content><![CDATA[
/*
<MenuItem Name="Log Alterações - Item"/>
*/
]]></Content>
</UDLText>

<Parameter name="Flags">
<Type>STRING</Type>
<Default>0000</Default>
</Parameter>

<Property name="Password">
<Type>%String</Type>
<Parameter name="TRUNCATE" value="1"/>
</Property>

<Method name="Login">
<FormalSpec>Name:%String,Password:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill ^mtempSrc2ValidarCopiaTrab($job)
 kill ^mtempSrc2ItemRelProj($job)
 
 set ..Password = Password
 
 set sc = ##class(Src2.Utils).ExcluirLog()
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="Logout">
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill ^mtempSrc2ValidarCopiaTrab($job)
 kill ^mtempSrc2ItemRelProj($job)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="OnMenuItem">
<FormalSpec><![CDATA[MenuName:%String,InternalName:%String,SelectedText:%String,&Enabled:%Boolean,&DisplayName:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set Enabled = 1
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="UserAction">
<FormalSpec><![CDATA[Type:%Integer,Name:%String,InternalName:%String,SelectedText:%String,&Action:%String,&Target:%String,&Msg:%String,&Reload:%Boolean]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set Action = 0
 set Target = ""
 set Msg = ""
 set Reload = 0
 
 set menu = $piece(Name,",")
 set name = $piece(Name,",",2)
 
 if (menu = "%SourceMenu") ! (menu = "%SourceContext") {
   if (name = "Checkout") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosCheckout(.Msg)
     quit $$$OK
   }
   
   if (name = "Update - Todos os Projetos") {
     set sc = ##class(Src2.Svn).UpdateTodosProjetos(..Username, ..Password)
     quit $$$OK
   }
   
   if (name = "Update") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosUpdate(.Msg, InternalName)
     quit $$$OK
   }
   
   if (name = "Switch") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosSwitch(.Msg, InternalName)
     quit $$$OK
   }
   
   if (name = "Importar Itens - Alterados") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosImportarAlterados(.Msg, InternalName)
     quit $$$OK
   }
   
   if (name = "Importar Itens - Todos") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosImportarTodos(.Msg, InternalName)
     quit $$$OK
   }
   
   if (name = "Importar Item") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosImportarItem(.Msg, InternalName)
     quit $$$OK
   }
   
   if (name = "Exportar Item") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosExportarItem(.Msg, InternalName)
     quit $$$OK
   }
   
   if (name = "Reverter Item") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosReverterItem(.Msg, InternalName)
     quit $$$OK
   }
   
   if (name = "Converter Item") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosConverterItem(.Msg, InternalName)
     quit $$$OK
   }
   
   if (name = "Analisar Diferenças - Workspace > Caché") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosDifWorksCache(.Msg, InternalName)
     quit $$$OK
   }
   
   if (name = "Analisar Diferenças - Caché > Workspace") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosDifCacheWorks(.Msg, InternalName)
     quit $$$OK
   }
   
   if (name = "Status das Alterações do Projeto") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosStatus(.Msg, InternalName)
     quit $$$OK
   }
   
   /* Retirado por falta de espaço no menu
   if (name = "Log Alterações - Item") {
     set sc = ##class(Src2.Svn).LogAlteracoesItem(InternalName, ..Username, ..Password)
     quit $$$OK
   }
   
   if (name = "Analise do Item") {
     set sc = ##class(Src2.Svn).AnalisarItemProjetos(InternalName, ..Username, ..Password)
     quit $$$OK
   }
   */
   
   if (name = "Atualizar Configurações/Gerar Backup") {
     set sc = ##class(Src2.Config).AtualizarConfiguracoes(1, 1, , ..Username, ..Password)
     quit $$$OK
   }
   
   if (name = "Exportar Objetos para Aplicação CSP") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosExpObjAplicCSP(.Msg)
     quit $$$OK
   }
   
   if (name = "Gerar Serviço Consistem") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosGerarServConsistem(.Msg)
     quit $$$OK
   }
   
   if (name = "Gerar/Configurar Base") {
     set Action=7
     set sc = ##class(Src2.SvnAux).ObterDadosAtualizarMenu(.Msg)
     quit $$$OK
   }
   
   if (name = "Executar Teste Unitário") {
     set Action=7
     set Msg = ##class(Src2.UnitTest).ObterMensagemParaExecucao(InternalName)
     quit $$$OK
   }
   
   if (name = "Ajuda") {
     set sc = ##class(Src2.Utils).Ajuda()
     quit $$$OK
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AfterUserAction">
<FormalSpec><![CDATA[Type:%Integer,Name:%String,InternalName:%String,Answer:%Integer,Msg:%String="",&Reload:%Boolean]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set menu = $piece(Name,",")
 set name = $piece(Name,",",2)
 
 if (menu = "%SourceMenu") ! (menu = "%SourceContext") {
   if (Answer = 1) {
     if (name = "Checkout") {
       set sc = ##class(Src2.SvnAux).GravarDadosCheckout(Msg)
       set sc = ##class(Src2.Svn).CheckoutStr(Msg, ..Username, ..Password)
       quit $$$OK
     }
     
     if (name = "Update") {
       set sc = ##class(Src2.SvnAux).GravarDadosUpdate(Msg)
       set sc = ##class(Src2.Svn).UpdateStr(Msg, ..Username, ..Password)
       quit $$$OK
     }
     
     if (name = "Switch") {
       set sc = ##class(Src2.Svn).SwitchStr(Msg, ..Username, ..Password)
       quit $$$OK
     }
     
     if (name = "Importar Itens - Alterados") {
       set sc = ##class(Src2.SvnAux).GravarDadosImportarAlterados(Msg)
       set sc = ##class(Src2.Svn).ImportarItensAlteradosStr(Msg, ..Username, ..Password)
       quit $$$OK
     }
     
     if (name = "Importar Itens - Todos") {
       set sc = ##class(Src2.SvnAux).GravarDadosImportarTodos(Msg)
       set sc = ##class(Src2.Svn).ImportarTodosItensProjetoStr(Msg, ..Username, ..Password)
       quit $$$OK
     }
     
     if (name = "Importar Item") {
       set sc = ##class(Src2.Svn).ImportarItem(InternalName, ..Username, ..Password)
       quit $$$OK
     }
     
     if (name = "Exportar Item") {
       set sc = ##class(Src2.Svn).ExportarItem(InternalName, ..Username, ..Password)
       quit $$$OK
     }
     
     if (name = "Reverter Item") {
       set sc = ##class(Src2.Svn).ReverterItem(InternalName, ..Username, ..Password)
       quit $$$OK
     }
     
     if (name = "Converter Item") {
       set sc = ##class(Src2.Svn).ConverterItem(InternalName, ..Username, ..Password)
       quit $$$OK
     }
     
     if (name = "Analisar Diferenças - Workspace > Caché") {
       set sc = ##class(Src2.SvnAux).GravarDadosDifWorksCache(Msg)
       set sc = ##class(Src2.Svn).AnalisarDifWorkspaceCacheStr(Msg, ..Username, ..Password)
       quit $$$OK
     }

     if (name = "Analisar Diferenças - Caché > Workspace") {
       set sc = ##class(Src2.SvnAux).GravarDadosDifCacheWorks(Msg)
       set sc = ##class(Src2.Svn).AnalisarDifCacheWorkspaceStr(Msg, ..Username, ..Password)
       quit $$$OK
     }
     
     if (name = "Status das Alterações do Projeto") {
       set sc = ##class(Src2.SvnAux).GravarDadosStatus(Msg)
       set sc = ##class(Src2.Svn).StatusAlteracoesStr(Msg, ..Username, ..Password)
       quit $$$OK
     }
     
     /*
     if (name = "Log Alterações - Projeto") {
       set sc = ##class(Src2.SvnAux).GravarDadosLog(Msg)
       set sc = ##class(Src2.Svn).LogAlteracoesStr(Msg, ..Username, ..Password)
       quit $$$OK
     }
     */
     
     if (name = "Exportar Objetos para Aplicação CSP") {
       set sc = ##class(Src2.Svn).ExportarObjetosAplicacaoCSP(..Username, ..Password)
       quit $$$OK
     }
     
     if (name = "Gerar Serviço Consistem") {
       set sc = ##class(Src2.Svn).GerarServicoConsistem(..Username, ..Password)
       quit $$$OK
     }
     
     if (name = "Gerar/Configurar Base") {
       set sc = ##class(Src2.Svn).AtualizarMenuConfigStr(Msg)
       quit $$$OK
     }
     
     if (name = "Executar Teste Unitário") {
       set sc = ##class(Src2.UnitTest).AnalisarMensagemParaExecucao(Msg)
       quit $$$OK
     }
     
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="OnAfterLoad">
<FormalSpec>InternalName:%String,Object:%RegisteredObject=$$$NULLOREF,Print:%Status</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (InternalName = "") quit $$$OK
 
 kill ^mtempSourceNotEditable(InternalName)
 
 if ($get(Print) = "") set Print = 1
 
 if (Print) write !
 
 set sc = ..ValidarControleVersao(InternalName, .flgSourceControl, .extensao)
 if $$$ISERR(sc) {
   set ^mtempSourceNotEditable(InternalName) = ""
   if (Print) {
     write !,"Source Control: "_InternalName
     write !,"Source Control: Somente leitura"
   }
   quit $$$OK
 }
 
 if ('flgSourceControl) {
   if (Print) & (extensao = "mac")  & (extensao = "int") & (extensao = "cls") {
     write !,"Source Control: "_InternalName_" (SEM CONTROLE)"
   }
   quit $$$OK
 }
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, .item, .pastaCopiaTrabalho, .itemCopiaTrabalho, .pastaRepositorio, .itemRepositorio, .descricao, .extensao, .pasta, .projeto)
 
 if ('##class(Src2.Item).ValidarFonteItemCache(InternalName)) quit $$$OK
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual, .versao, .rotinaVersao, , , , , .projetoAtual)
 
 if (Print) {
   write !,"Source Control: "_projetoAtual_" | "_InternalName_" | "_descricao
 }
 
 set sc = ##class(Src2.Item).ValidarVersaoRelacionada(InternalName)
 if (sc'=1) {
   write !,"Source Control: ATENÇÃO - "_sc
 }
 
 set msgsc = ##class(Src2.Item).CompararItemArquivo(InternalName, .linDifNr, .linDifItem, .linDifArq)
 if (msgsc'=$$$OK) {
   set ^mtempSourceNotEditable(InternalName) = ""
   if (Print) {
     write !,"Source Control: "_msgsc
     write !,"Source Control: Linha..: "_linDifNr
     write !,"Source Control: Fonte..: "_linDifItem
     write !,"Source Control: Arquivo: "_linDifArq
     write !,"Source Control: Somente leitura"
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="OnBeforeSave">
<FormalSpec>InternalName:%String,Location:%String="",Object:%RegisteredObject=$$$NULLOREF</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
  set sc = ..ValidarControleVersao(InternalName, .flgSourceControl)
  if $$$ISERR(sc) quit sc
  
  if ('flgSourceControl) quit $$$OK
  
  if ('..GetEditable(InternalName)) {
    write !,"Source Control: Item '"_InternalName_"' em modo de leitura"
    quit $$$ERROR(10000,"Item "_InternalName_" em modo de leitura!")
  }
  
  if ##class(Src2.Item).ValidarFonteItemCache(InternalName) quit $$$OK
  
  set msgsc = ##class(Src2.Item).ExportarItemArquivo(InternalName, , ..Username, ..Password)
  if (msgsc'=$$$OK) quit $$$ERROR(10000,msgsc)
  
  quit $$$OK
]]></Implementation>
</Method>

<Method name="OnAfterSave">
<FormalSpec>InternalName:%String,Object:%RegisteredObject</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ..ValidarControleVersao(InternalName, .flgSourceControl)
 if $$$ISERR(sc) quit sc
 
 if ('flgSourceControl) quit $$$OK
 
 if ('..GetEditable(InternalName)) {
   write !,"Source Control: Item '"_InternalName_"' em modo de leitura"
   quit $$$ERROR(10000,"Item "_InternalName_" em modo de leitura!")
 }
 
 set msgsc = ##class(Src2.Item).ExportarItemArquivo(InternalName, , ..Username, ..Password)
 if (msgsc'=$$$OK) quit $$$ERROR(10000,msgsc)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="OnAfterCompile">
<FormalSpec>InternalName:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ..ValidarControleVersao(InternalName, .flgSourceControl)
 if $$$ISERR(sc) quit sc
 
 if ('flgSourceControl) quit $$$OK
 
 if ('..GetEditable(InternalName)) quit $$$OK
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, .item, , .itemCopiaTrabalho, , , , .extensao)
 
 set msgsc = ##class(Src2.Item).ExportarItemArquivo(InternalName, ..Username, ..Password)
 if (msgsc'=$$$OK) quit $$$ERROR(10000,msgsc)
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema("csw", .projeto)
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, , , , , .versao)
 
 write !,"Source Control: Exportado '"_InternalName_"' para o arquivo '"_itemCopiaTrabalho_"'"
 
 if (extensao = "mac") {
   set msgsc = ##class(Src2.Rotina).GerarPaginaCSP(item, , 1)
   if (versao = "6.2") {
     set tamanho = $$SIZE^%R(item_".OBJ")
     write !,"Source Control: Tamanho: "_$fnumber(tamanho,".",0)_" bytes"
     if (tamanho>30000) { write " - ATENÇÃO PARA <ROUTINE TOO BIG TO SAVE>" }
   }
   set msgsc = ##class(Src2.SourceCheck).ValidarPadroes(item)
 }
 
 if (extensao = "cls") {
   set sc = ##class(Src2.SourceCheckClasse).ValidarPadroes(item, itemCopiaTrabalho)
 }
 
 set sc = ##class(Src2.Config).AtualizarConfiguracoes( , , , ..Username, ..Password)
 
 set sc = ##class(Src2.Item).ValidarVersaoRelacionada(InternalName)
 if (sc'=1) {
   write !!,"Source Control: ATENÇÃO - "_sc,!
   if ('$data(^mtempSrc2ItemRelProj($job,InternalName))) {
     set ^mtempSrc2ItemRelProj($job,InternalName) = ""
     quit $$$ERROR(10000,"ATENÇÃO - "_sc)
   }
 }
 
 set msgsc = ##class(Src2.Config).ValidarVersaoSrc()
 if (msgsc '= 1) {
   write !,"Source Control: ATENÇÃO - "_msgsc
   write !,"Source Control: "_##class(Src2.Utils).StringAtualizador()
   quit $$$ERROR(10000,"ATENÇÃO - "_msgsc)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="OnBeforeDelete">
<FormalSpec>InternalName:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ..ValidarControleVersao(InternalName, .flgSourceControl)
 if $$$ISERR(sc) quit sc
 
 if ('flgSourceControl) quit $$$OK
 
 if ('..GetEditable(InternalName)) quit $$$ERROR(10000,"Item "_InternalName_" em modo de leitura!")
 
 set msgsc = ##class(Src2.Item).CompararItemArquivo(InternalName)
 if (msgsc'=$$$OK) quit msgsc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="OnAfterDelete">
<FormalSpec>InternalName:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ..ValidarControleVersao(InternalName, .flgSourceControl)
 if $$$ISERR(sc) quit sc
 
 if ('flgSourceControl) quit $$$OK
 
 if ('..GetEditable(InternalName)) quit $$$ERROR(10000,"Item "_InternalName_" em modo de leitura!")
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, , , .itemCopiaTrabalho)
 
 set sc = ##class(Src2.Item).ExcluirArquivoItem(InternalName, , ..Username, ..Password)
 if $$$ISERR(sc) quit sc
 
 write !,"Source Control: Excluído o arquivo '"_itemCopiaTrabalho_"'"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="RemoveFromSourceControl">
<FormalSpec>InternalName:%String,Description:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ..ValidarControleVersao(InternalName, .flgSourceControl)
 if $$$ISERR(sc) quit sc
 
 if ('flgSourceControl) quit $$$OK
 
 if ('..GetEditable(InternalName)) quit $$$ERROR(10000,"Item "_InternalName_" em modo de leitura!")
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, , , .itemCopiaTrabalho)
 
 if ('##class(%File).Exists(filename)) quit $$$OK
 
 set sc = ##class(Src2.Item).ExcluirArquivoItem(InternalName, , ..Username, ..Password)
 if $$$ISERR(sc) quit sc
 
 write !,"Source Control: Excluído o arquivo '"_itemCopiaTrabalho_"'"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GetEditable">
<FormalSpec>InternalName:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
 if (InternalName = "") quit $$$OK
 quit '$data(^mtempSourceNotEditable(InternalName))
]]></Implementation>
</Method>

<Method name="GetStatus">
<FormalSpec><![CDATA[InternalName:%String,&IsInSourceControl:%Boolean,&Editable:%Boolean,&IsCheckedOut:%Boolean,&UserCheckedOut:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set IsCheckedOut = 0
 set UserCheckedOut = ""
 set IsInSourceControl = 0
 
 set Editable = ..GetEditable(InternalName)
 
 quit ..OnAfterLoad(InternalName, , 0)
]]></Implementation>
</Method>

<Method name="IsInSourceControl">
<FormalSpec>InternalName:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[ quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarControleVersao">
<Description>
set sc = ##class(Src2.SourceControl).ValidarControleVersao("CCEVA800.mac", .flgSourceControl, .extensao)
set sc = ##class(Src2.SourceControl).ValidarControleVersao("CCEVA800.int", .flgSourceControl, .extensao)</Description>
<FormalSpec><![CDATA[InternalName:%String,&flgSourceControl:%Boolean=0,&extensao:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, .item, .pastaCopiaTrabalho, .itemCopiaTrabalho, .pastaRepositorio, .itemRepositorio, .descricao, .extensao, .pasta, .projeto)
 
 if ((extensao = "int") ! (extensao = "mac")) {
   if (item [ ".") & ('##class(Src2.Item).ValidarFonteItemCache(InternalName)) {
     quit $$$ERROR(10000,"Rotina "_InternalName_"/"_item_" não pode ser criada dentro de um package!")
   }
 }
 
 if (extensao = "int") quit "Rotinas com extensão 'INT' não podem ser editadas!"
 
 set flgSourceControl = ##class(Src2.Item).ValidarItemControleFonte(InternalName)
 
 if ('flgSourceControl) quit $$$OK
 
 if (itemCopiaTrabalho = "") quit "Não foi possível determinar o arquivo no controle de fonte do item "_InternalName_"!"
 
 set usernameEdt = $zconvert(..Username,"l")
 if (usernameEdt = "_system") ! (usernameEdt = "customax") {
   write !,"Source Control: Usuário "_..Username_" inválido para edição de rotinas"
   quit $$$ERROR(10000,"Usuário "_..Username_" inválido para edição de rotinas")
 }
 
 if (##class(Src2.Item).ValidarFonteItemCache(InternalName)) & ('##class(%File).Exists(itemCopiaTrabalho)) {
   write !,"Source Control: Arquivo "_itemCopiaTrabalho_" não encontrado"
   quit "Arquivo "_itemCopiaTrabalho_" não encontrado!"
 }
 
 if (pasta = "") {
   write !,"Source Control: Item "_InternalName_" sem pasta definida"
   quit "Item "_InternalName_" sem pasta definida!"
 }
 
 if ('$data(^mtempSrc2ValidarCopiaTrab($job,itemCopiaTrabalho))) {
   set sc = ##class(Src2.Utils).ValidarWorkspaceProjeto(projeto)
   if (sc '= 1) {
     write !,"Source Control: "_sc
     quit sc
   }
   set sc = ##class(Src2.Utils).ValidarCopiaTrabalhoRepositorio(pastaCopiaTrabalho, pastaRepositorio, projeto, ..Username)
   if (sc '= 1) {
     write !,"Source Control: "_sc
     quit sc
   }
   set ^mtempSrc2ValidarCopiaTrab($job,itemCopiaTrabalho) = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.SourceImport">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Controle de Código Fonte</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Controle de Código Fonte - Importação/Sincronização com o Subversion</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Method name="Importar">
<Description>
urlRepositorio - Informar a URL do repositório
  Exemplo de repositório de rotina: "http://192.168.15.10:18080/svn/rotina61"
  Exemplo de repositório de classe: "http://192.168.15.10:18080/svn/classe61"

revisao - Informar uma revisão (Opção padrão "head")

grupo - Informar/delimitar um grupo de rotinas ou classes (passar a extensão)
  Obs: Quando um grupo é determinado, as rotinas deste grupo são excluídas antes da importação
  Exemplos de filtros de rotinas: "CCCGI*.MAC" / "CCCGI015.MAC"
  Exemplos de filtros de classes: "Tcp.Eng*.cls" / "Tcp.Engengenharia.cls"

flagCsp - Gera a página CSP das rotinas importadas (Opção padrão: TRUE)

force - Importa as rotinas/classes mesmo em namespaces com controle de fonte (Opção padrão: FALSE)

excluir - Exclui os grupos de rotinas importadas (Opção padrão: TRUE)
  Obs1: Exclui somente os grupos informados no parametro "grupo"
  Obs2: Quando importar o grupo de rotinas %CS colocar este parametro como false.
        Este método utiliza rotinas %CS.

flagWorkspace - Atualizar o Workspace (Opção padrão: FALSE)

set sc = ##class(Src2.SourceImport).Importar("http://192.168.15.10:18080/svn/teste/trunk", , "CCEVB9*.mac", 0, 0, 0, 0)
set sc = ##class(Src2.SourceImport).Importar("http://192.168.15.10:18080/svn/teste/trunk", , "nfe.v110*.cls", , 1, 1, 1, "-dia")
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[urlRepositorio:%String,revisao:%String="head",grupo:%String="",flagCsp:%Boolean=1,force:%Boolean=0,excluir:%Boolean=1,flagWorkspace:%Boolean=0,flagCompClasses:%Boolean="",username:%String="",password:%String="",&tabPackage:%String,autenticacao:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabPackage
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (sc '= 1) quit $$$ERROR(10000,sc)
 
 if ('force),($data(^Src2Config("projetorev"))) {
   write !,"Namespace com controle de fonte! Utilize o force para importar."
   quit $$$ERROR(10000,"Namespace com controle de fonte!")
 }
 
 if (excluir) & (grupo '= "") {
   set sc = ##class(Src2.Item).ExcluirGrupoItens(grupo)
 }
 
 set strGeraRotina = ""
 if (flagCsp) set strGeraRotina = strGeraRotina_";csp"
 if (flagWorkspace) set strGeraRotina = strGeraRotina_";workspace"
 
 if (flagCompClasses = "") {
   set flagCompClasses = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(2)
 }
 
 if (autenticacao = "") {
   set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, , 1)
   if (msgsc '= 1) quit $$$ERROR(10000,msgsc)
 }
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "list "_urlRepositorio_" --revision "_revisao_" -R", , , autenticacao, arquivoTemp)
 if (msgsc '= $$$OK) {
   write !,msgsc
   quit $$$ERROR(10000,msgsc)
 }
 
 set sc = ##class(Src2.Utils).ObterDadosArquivoSvnList(codTerm, arquivoTemp, urlRepositorio)
 
 // Classe
 set itemId = ""
 for {
   set itemId = $order(^mtempInfoArquivo(codTerm,"classes",itemId))
   if (itemId = "") quit
   set var = $get(^mtempInfoArquivo(codTerm,"classes",itemId))
   
   set msgsc = ##class(Src2.Classe).ObterInfoClasseId(itemId, , , , .package, .packageRed)
   if (msgsc '= $$$OK) continue
   
   set itemRepositorio = $piece(var,"^",4)
   set InternalName = $piece(var,"^",5)
   set item = $piece(var,"^",6)
   
   set sc = ##class(Src2.Item).ValidarSelecaoItem(grupo, InternalName)
   if (sc '= 1) continue
   
   write !,"Classe: ",##class(Src2.Utils).Just(InternalName, 48)
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "cat "_itemRepositorio_"@"_revisao, , , autenticacao, arquivoTemp2)
   if (msgsc '= $$$OK) continue
   
   set msgsc = ##class(Src2.Classe).GerarClasseArquivo(arquivoTemp2, item, flagCompClasses, .tabErros, .tabOK)
   
   write "  Import.["_$select($data(tabOK(1)):"X",1:" ")_"]"
   write "  Compil.["_$select($data(tabOK(2)):"X",1:" ")_"]"
   
   if (package '= "") {
     set tabPackage(2,package) = ""
     set tabPackage(3,packageRed) = ""
   }
 }
 
 // Rotina
 set itemId = ""
 for {
   set itemId = $order(^mtempInfoArquivo(codTerm,"rotinas",itemId))
   if (itemId = "") quit
   set var = $get(^mtempInfoArquivo(codTerm,"rotinas",itemId))
   
   set msgsc = ##class(Src2.Rotina).ObterInfoRotinaId(itemId, , , , , .package)
   if (msgsc '= $$$OK) continue
   
   set itemRepositorio = $piece(var,"^",4)
   set InternalName = $piece(var,"^",5)
   set item = $piece(var,"^",6)
   
   set sc = ##class(Src2.Item).ValidarSelecaoItem(grupo, InternalName)
   if (sc '= 1) continue
   
   write !,"Rotina: ",##class(Src2.Utils).Just(InternalName, 30)
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "cat "_itemRepositorio_"@"_revisao, , , autenticacao, arquivoTemp2)
   if (msgsc '= $$$OK) continue
   
   set msgsc = ##class(Src2.Rotina).GerarRotinaArquivo(arquivoTemp2, item, strGeraRotina, .tabErros, .tabOK)
   
   write "  Import.["_$select($data(tabOK(1)):"X",1:" ")_"]"
   write "  Compil.["_$select($data(tabOK(2)):"X",1:" ")_"]"
   if (flagCsp) { write "  CSP["_$select($data(tabOK(3)):"X",1:" ")_"]" }
   if (flagWorkspace) { write "  Workspace["_$select($data(tabOK(5)):"X",1:" ")_"]" }
   
   if (package '= "") {
     set tabPackage(1,package) = ""
   }
 }
 
 kill ^mtempInfoArquivo(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarFontesNamespace">
<Description>

Atualiza Fontes Namespace

Parametros:
  projetoDes = Código do projeto de desenvolvimento a ser atualizado
               Este parametro é utilizado para o "tipo" = 3.

Global de Configuração:
  ^Src2SourceImport( "projeto" ) = "Rev. Inicial" ^ "tipo" ^ "flagComp" ^ "flagEmail" ^ "flagCsp" ^ "flagTODO" ^ "flagMerge"
  
  Chave 1 - "projeto" = Do arquivo "projetos.xml" - csw61 / csw62 / cswutil62 / ...
  Piece 1 - "Rev. Inicial" = Para determinar a partir de que revisão deve inicar as importações. (Não é obrigatório)
  Piece 2 - "tipo" = 1 - Atualiza tudo
                     2 - Atualiza um projeto de desenvolvimento informado e tudo que não é projeto de desenvolvimento
                     3 - Atualiza tudo que não é projeto de desenvolvimento
  Piece 3 - "flagComp" = Flags a serem utilizados no Load da classe. $System.OBJ.Load() (Não é obrigatório)
  Piece 4 - "flagEmail" = Flag para determinar se envia e-mail para erros de comilação (Valor padrão = 0)
  Piece 5 - "flagCsp" = Flag para determinar se gera a página csp da rotina (Valor padrão = 1)
  Piece 6 - "flagTODO" = Flag para determinar se verifica TODO's não implementados (Valor padrão = 0)
  Piece 7 - "flagMerge" = Flag para determinar se importa revisões de merge (Valor padrão = 1)

set sc = ##class(Src2.SourceImport).AtualizarFontesNamespace()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projetoDes:%String="",username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (msgsc '= 1) quit $$$ERROR(10000,msgsc)
 
 if ($order(^Src2SourceImport("")) = "") quit $$$ERROR(10000,"Não existem atualizações cadastradas!")
 
 set msgsc = ##class(Src2.Utils).UpdateConfigGeralWorkspace()
 if (msgsc '= 1) quit $$$ERROR(10000,msgsc)
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, , 1)
 if (msgsc '= 1) quit $$$ERROR(10000,msgsc)
 
 lock +^Src2SourceImport:0
 else  quit $$$ERROR(10000,"Atualização sendo realizada por outro usuário!")
 
 set msgsc = ##class(Src2.UtilsXml).ObterProjetosXML(.tabProjetos)
 
 set projeto = ""
 for {
   set projeto = $order(^Src2SourceImport(projeto))
   if (projeto = "") quit
   
   if ('$data(tabProjetos(projeto))) continue
   
   set urlRepositorio = $piece($get(tabProjetos(projeto)),"^",2)
   
   set tipo = $piece($get(^Src2SourceImport(projeto)),"^",2)
   
   if (urlRepositorio = "") ! (tipo = "") continue
   
   if (tipo = 1) {
     set sc = ##class(Src2.SourceImport).AtualFontesNamespaceRepos(codTerm, caminhoSvn, arquivoTemp, projeto, urlRepositorio, 1, autenticacao)
   }
   
   if (tipo = 2) {
     set sc = ##class(Src2.SourceImport).AtualFontesNamespaceRepos(codTerm, caminhoSvn, arquivoTemp, projeto, urlRepositorio, 3, autenticacao)
     if (projetoDes '= "") {
       set sc = ##class(Src2.SourceImport).AtualFontesNamespaceRepos(codTerm, caminhoSvn, arquivoTemp, projeto, urlRepositorio, 2, autenticacao, projetoDes)
     }
   }
   
   if (tipo = 3) {
     set sc = ##class(Src2.SourceImport).AtualFontesNamespaceRepos(codTerm, caminhoSvn, arquivoTemp, projeto, urlRepositorio, 3, autenticacao)
   }
 }
 
 lock -^Src2SourceImport
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualFontesNamespaceRepos">
<Description>

Atualizar Fontes no Namespace do Projeto



set sc = ##class(Src2.SourceImport).AtualFontesNamespaceRepos()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,caminhoSvn:%String,arquivoTemp:%String,projeto:%String,urlRepositorio:%String,tipo:%Integer=1,autenticacao:%String="",projetoDes:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set identificador = "all"
 
 if (tipo = 2) {
   if (projetoDes = "") quit $$$ERROR(10000,"Projeto não informado!")
   set identificador = projetoDes
 }
 
 if (tipo = 3) set identificador = "notproj"
 
 set sc = ##class(Src2.SourceImport).ObterDadosRepositorioImport(projeto, identificador, .flagEmail, .flagCsp, .flagTODO, .flagComp, .revInicio, .flagMerge)
 if (sc '= 1) quit sc
 
 kill ^mtempSrc2Revisoes(codTerm)
 
 set sc = ##class(Src2.Utils).ObterDadosRevisoes(codTerm, caminhoSvn, arquivoTemp, urlRepositorio, revInicio, , , , autenticacao)
 if (sc '= 1) quit sc
 
 set sc = ##class(Src2.SourceImport).FiltrarRevisoes(codTerm, projeto, tipo, projetoDes, revInicio, flagMerge)
 
 set sc = ##class(Src2.Utils).ImportarRevisoes(codTerm, caminhoSvn, arquivoTemp, urlRepositorio, 1, flagCsp, flagTODO, flagComp, , , autenticacao)
 
 set sc = ##class(Src2.SourceImport).GravarRevisoesImportadas(codTerm, projeto, tipo, identificador, projetoDes)
 
 if (flagEmail) , ($data(^mtempSrc2Erros(codTerm))) {
   set sc = ##class(Src2.SourceImport).EnviarLogErrosEmail(codTerm, urlRepositorio)
 }
 
 kill ^mtempSrc2Revisoes(codTerm)
 kill ^mtempSrc2Erros(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="FiltrarRevisoes">
<Description>

Filtra as Revisoes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,projeto:%String,tipo:%Integer=1,projetoDes:%String="",revInicio:%String="",flagMerge:%Boolean=1</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill ^mtempSrc2Revisoes(codTerm,"rev",revInicio)
 
 set (revisao, rotina, classe) = ""
 for {
   set revisao = $order(^mtempSrc2Revisoes(codTerm,"rev",revisao))
   if (revisao = "") quit
   
   // Revisões que devem ser desconsideradas
   if $data(^Src2SourceImport(projeto,5,revisao)) {
     kill ^mtempSrc2Revisoes(codTerm,"rev",revisao)
     continue
   }
   
   set message = $get(^mtempSrc2Revisoes(codTerm,"rev",revisao,2))
   
   set sc = ##class(Src2.Dados).ObterInfMessage(message, , .tabProjetosDes, , , , .flgMsgMerge)
   
   if ('flagMerge) && (flgMsgMerge) {
     kill ^mtempSrc2Revisoes(codTerm,"rev",revisao)
     continue
   }
   
   if (tipo = 2) && ('$data(tabProjetosDes(projetoDes))) {
     kill ^mtempSrc2Revisoes(codTerm,"rev",revisao)
     continue
   }
   
   if (tipo = 3) && ($order(tabProjetosDes(""))'="") {
     kill ^mtempSrc2Revisoes(codTerm,"rev",revisao)
     continue
   }
   
   for {
     set classe = $order(^mtempSrc2Revisoes(codTerm,"rev",revisao,1,2,classe))
     if (classe = "") quit
     set var = $get(^mtempSrc2Revisoes(codTerm,"rev",revisao,1,2,classe))
     
     set revisaoUlt = $piece($get(^Src2SourceImport(projeto,3,2,classe)),"^",1)
     if (revisaoUlt '= "") & (revisaoUlt > revisao) {
       kill ^mtempSrc2Revisoes(codTerm,"rev",revisao,1,2,classe)
     }
   }
   for {
     set rotina = $order(^mtempSrc2Revisoes(codTerm,"rev",revisao,1,1,rotina))
     if (rotina = "") quit
     set var = $get(^mtempSrc2Revisoes(codTerm,"rev",revisao,1,1,rotina))
     
     set revisaoUlt = $piece($get(^Src2SourceImport(projeto,3,1,rotina)),"^",1)
     if (revisaoUlt '= "") & (revisaoUlt > revisao) {
       kill ^mtempSrc2Revisoes(codTerm,"rev",revisao,1,1,rotina)
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarRevisoesImportadas">
<Description>

Gravar as Revisoes Importadas
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,projeto:%String,tipo:%Integer=1,identificador:%String,projetoDes:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (revisao, rotina, classe) = ""
 for {
   set revisao = $order(^mtempSrc2Revisoes(codTerm,"rev",revisao))
   if (revisao = "") quit
   for {
     set classe = $order(^mtempSrc2Revisoes(codTerm,"rev",revisao,1,2,classe))
     if (classe = "") quit
     set var = $get(^mtempSrc2Revisoes(codTerm,"rev",revisao,1,2,classe))
     set ^Src2SourceImport(projeto,1,identificador,revisao,2,classe) = $piece(var,"^",2)
     set ^Src2SourceImport(projeto,3,2,classe) = revisao
   }
   for {
     set rotina = $order(^mtempSrc2Revisoes(codTerm,"rev",revisao,1,1,rotina))
     if (rotina = "") quit
     set var = $get(^mtempSrc2Revisoes(codTerm,"rev",revisao,1,1,rotina))
     set ^Src2SourceImport(projeto,1,identificador,revisao,1,rotina) = $piece(var,"^",2)
     set ^Src2SourceImport(projeto,3,1,rotina) = revisao
   }
   set ^Src2SourceImport(projeto,1,identificador,revisao) = $zdatetime($horolog,4)
 }
 
 set revisao = $order(^mtempSrc2Revisoes(codTerm,"rev",""),-1)
   
 if (revisao > $piece($get(^Src2SourceImport(projeto)),"^",1)) {
   set $piece(^Src2SourceImport(projeto,1,identificador),"^",1) = revisao
 }
 
 set codSeq = $order(^Src2SourceImport(projeto,2,""),-1) + 1
 set ^Src2SourceImport(projeto,2,codSeq) = projetoDes_"^"_revisao_"^"_$zdatetime($horolog,4)_"^"_tipo
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosRepositorioImport">
<Description>

Obter Dados do Repositorio de Importação
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[projeto:%String,identificador:%String,&flagEmail:%Boolean,&flagCsp:%Boolean,&flagTODO:%Boolean,&flagComp:%String,&revInicio:%String,&flagMerge:%Boolean]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (flagComp) = ""
 set (flagEmail, flagCsp, flagTODO, revInicio) = 0
 
 if ('$data(^Src2SourceImport(projeto))) quit $$$ERROR(10000,"Repositório não configurado!")
 
 set var = $get(^Src2SourceImport(projeto))
 
 set flagComp = $piece($get(^Src2SourceImport(projeto)),"^",3)
 
 set flagEmail = +$piece($get(^Src2SourceImport(projeto)),"^",4)
 
 set flagCsp = $piece($get(^Src2SourceImport(projeto)),"^",5)
 if (flagCsp = "") set flagCsp = 1
 
 set flagTODO = +$piece($get(^Src2SourceImport(projeto)),"^",6)
 
 set flagMerge = $piece($get(^Src2SourceImport(projeto)),"^",7)
 if (flagMerge = "") set flagMerge = 1
 
 if ($piece($get(^Src2SourceImport(projeto)),"^",1) '= "") {
   set revInicio = ($piece($get(^Src2SourceImport(projeto)),"^",1) - 1)
 }
 
 if ($piece($get(^Src2SourceImport(projeto,1,identificador)),"^",1) '= "") {
   set revInicio = $piece($get(^Src2SourceImport(projeto,1,identificador)),"^",1)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="EnviarLogErrosEmail">
<Description>

Envia um Log de Erros por Email
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,urlRepositorio:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set from = "desenvolvimento@consistem.com.br"
 
 set subject = "Source Control :: Erros de Compilação"
 
 set (autor,revisao,rotina,codSeq) = ""
 for {
   set autor = $order(^mtempSrc2Erros(codTerm,autor))
   if (autor = "") quit
   
   set sc=##class(Src2.Utils).ObterEmailUsuario(autor, .email)
   
   set to(1) = email
   ;set to(2) = "gestor.desenvolvimento@consistem.com.br"
   
   kill tabMensagem
   
   set tabMensagem(1) = "==========================================================================="
   set tabMensagem(2) = "Source Control :: Erros de Compilação / Geração CSP / TODOs Pendentes"
   set tabMensagem(3) = "==========================================================================="
   
   for {
     set revisao = $order(^mtempSrc2Erros(codTerm,autor,revisao))
     if (revisao = "") quit
     set sc=##class(Src2.Utils).ObterTabMensagensErroRevisao(codTerm, urlRepositorio, autor, revisao, .tabMensagem)
   }
   
   set sc = ##class(Src2.Utils2).EnviarEmail(subject, from, .to, .tabMensagem, 0)
 }
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.SourceSyntax">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>62407,52662.508834</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Validador de Sintax Caché Code</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Validador de Sintax Caché Code</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Method name="CompilarRotina">
<Description>
set sc = ##class(Src2.SourceSyntax).Teste("XXEJCCFT240",15)
set sc = ##class(Src2.SourceSyntax).CompilarRotina("XXEJCCFT240")
set sc = ##class(Src2.SourceSyntax).CompilarRotina("CCTCP020")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 ;set sc = ##class(Src2.SourceSyntaxConf).Configurar()
 
 set msgErro = ""
 
 for lin = 1:1:$get(^rMAC(rotina,0,0)) {
   set linha = $get(^rMAC(rotina,0,lin))
   
   set sc = ##class(Src2.SourceSyntax).ObterExpressoes(linha, .tabExpressao)
   
   set sc = ##class(Src2.SourceSyntax).ValidarSyntax(.tabExpressao)
   if $$$ISOK(sc) continue
   
   set msgErro = sc
   
   set sc = ##class(Src2.SourceSyntax).ObterLinhaExpressao(.tabExpressao, .linhaExp)
   
   write !,lin," => ",linhaExp
 }
 
 if (msgErro '= "") quit msgErro
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="Teste">
<Description>
set sc = ##class(Src2.SourceSyntax).Teste("CCTCORG000",15)
set sc = ##class(Src2.SourceSyntax).Teste("XXEJTESTECMD",7)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,lin:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.SourceSyntaxConf).Configurar()
 
 set linha = $get(^rMAC(rotina,0,lin))
 
 set sc = ##class(Src2.SourceSyntax).ObterExpressoes(linha, .tabExpressao)
 
 set sc = ##class(Src2.SourceSyntax).ValidarSyntax(.tabExpressao)
 
 set sc2 = ##class(Src2.SourceSyntax).DepurarExpressao(.tabExpressao, 2)
 
 set sc2 = ##class(Src2.SourceSyntax).ObterLinhaExpressao(.tabExpressao, .linhaExp)
 
 set sc2 = ##class(Src2.SourceSyntaxConv).ObterLinhaConvExpressao(.tabExpressao, .linhaConv)
 
 set sc2 = ##class(Src2.SourceSyntax).ObterVariaveis(.tabExpressao, .tabVaraiveis, .tabGlobais, .tabNews, .tabParametro, .comentario)
 
 set sc2 = ##class(Src2.SourceSyntax).ObterDados(.tabExpressao, .tabComandos, .tabFuncCache)
 
 write !!,"Compilacao: ",$select(sc=1:"OK",1:"ERRO"),"  sc=",sc
 
 write !!,linha
 write !,linhaExp
 write !,linhaConv
 write !!,"Variaveis: ",$$ConvertTabStr^%CSW1E(.tabVaraiveis)
 write !!,"Globais: ",$$ConvertTabStr^%CSW1E(.tabGlobais)
 write !!,"News: ",$$ConvertTabStr^%CSW1E(.tabNews)
 write !!,"Parametros: ",$$ConvertTabStr^%CSW1E(.tabParametro)
 write !!,"Comandos: ",$$ConvertTabStr^%CSW1E(.tabComandos)
 write !!,"Func. Cache: ",$$ConvertTabStr^%CSW1E(.tabFuncCache)
 write !!,"Expandir/Minusculo: ",$piece("Nao^Sim","^",$piece($get(tabExpressao),"^",1)+1)
 write !!,"Comentario: ",comentario
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterLinhaExpressao">
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tabExpressao:%String,&linha:%Integer]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (codSeq, linha) = ""
 for {
   set codSeq = $order(tabExpressao(codSeq))
    if (codSeq = "") quit
    if ($list($get(tabExpressao(codSeq)),5) = "erro") set linha = linha_"{erro}"
    set linha = linha_$list($get(tabExpressao(codSeq)),1)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="DepurarExpressao">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabExpressao:%String,opcoes:%String=1</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (opcoes = 1) {
   set codSeq = ""
   for {
     set codSeq = $order(tabExpressao(codSeq))
     if (codSeq = "") quit
     set var = $list($get(tabExpressao(codSeq)),1)
     if (var = $char(9)) { set var = " " }
     write !,$justify(codSeq,2)
     write $$Just^%CSUTIUD(" =>"_var_"<=",27)
     write $$Just^%CSUTIUD($list($get(tabExpressao(codSeq)),2),16)
     write $$Just^%CSUTIUD($list($get(tabExpressao(codSeq)),3),14)
     write $$Just^%CSUTIUD($list($get(tabExpressao(codSeq)),4),16)
     write $$Just^%CSUTIUD($list($get(tabExpressao(codSeq)),5),5)
   }
 }
 
 if (opcoes = 2) {
   set codSeq = ""
   for {
     set codSeq = $order(tabExpressao(codSeq))
     if (codSeq = "") quit
     set var = $list($get(tabExpressao(codSeq)),1)
     if (var = $char(9)) { set var = " " }
     write !,$justify(codSeq,2)
     write $$Just^%CSUTIUD(" =>"_var_"<=",27)
     write $$Just^%CSUTIUD($list($get(tabExpressao(codSeq)),2),16)
     write $$Just^%CSUTIUD($list($get(tabExpressao(codSeq)),3),14)
     write $$Just^%CSUTIUD($list($get(tabExpressao(codSeq)),4),16)
     write $$Just^%CSUTIUD($list($get(tabExpressao(codSeq)),6),5)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterVariaveis">
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tabExpressao:%String,&tabVariaveis:%String,&tabGlobais:%String,&tabNews:%String,&tabParametro:%String,&comentario:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabVariaveis, tabGlobais, tabNews, tabParametro
 
 set comentario = ""
 set nivel = 0
 
 set codSeq = ""
 for {
   set codSeq = $order(tabExpressao(codSeq))
   if (codSeq = "") quit
   set var = $list($get(tabExpressao(codSeq)),1)
   
   set idSyntax = $list($get(tabExpressao(codSeq)),2)
   set posicao = $list($get(tabExpressao(codSeq)),3)
   set tipo = $list($get(tabExpressao(codSeq)),4)
   
   if (idSyntax = "variavel") {
     if (tipo = "pipe") {
       if (posicao = "var-02") set nivel = nivel + 1
       if (posicao = "var-10") set nivel = nivel - 1
     }
     
     if (tipo = "abreNsp[") {
       set nivel = nivel + 1
     }
     
     if (tipo = "fechaNsp]") {
       set nivel = nivel - 1
     }
     
     if (posicao = "var-01") {
       if (tipo = "uperro") set global(nivel) = 1
       else  set global(nivel) = 0
     }
   }
   
   if (tipo = "variavel") {
     if (idSyntax = "new") {
       set tabNews(var) = ""
       continue
     }
     
     if (idSyntax = "label") {
       set tabParametro(var) = ""
       continue
     }
     
     if (idSyntax = "include") continue
     
     if ($get(global(nivel))) set tabGlobais("^"_var) = ""
     else  set tabVariaveis(var) = ""
   }
   
   if (idSyntax = "coment") {
     if (comentario '= "") ! ((var'="//")&&(var'=";")) {
       set comentario = comentario_var
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDados">
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tabExpressao:%String,&tabComandos:%String,&tabFuncCache:%String,&tabMacros:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabComandos, tabFuncCache, tabMacros
 
 set codSeq = ""
 for {
   set codSeq = $order(tabExpressao(codSeq))
   if (codSeq = "") quit
   
   set comando = $list($get(tabExpressao(codSeq)),6)
   if (comando '= "") set tabComandos(comando) = ""
   
   if (($list($get(tabExpressao(codSeq)),2) = "funcCache")) {
     if $data(tabExpressao(codSeq-1)) {
       if ($list($get(tabExpressao(codSeq)),4) = "ident") & ($list($get(tabExpressao(codSeq-1)),4) = "funcCache") {
         set tabFuncCache("$"_$list($get(tabExpressao(codSeq)),1)) = ""
       }
     }
   }
   
   if (($list($get(tabExpressao(codSeq)),4) = "macro")) {
     if $data(tabExpressao(codSeq+1)) {
       if ($list($get(tabExpressao(codSeq+1)),4) = "ident") {
         set tabMacros("$$$"_$list($get(tabExpressao(codSeq+1)),1)) = ""
       }
     }
   }
   
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarSyntax">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabExpressao:%String,idSyntax:%String="linha",codExpressao:%String="",codExpressaoRet:%String="",comando:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (codExpressao '= "") set codExpressao = $order(tabExpressao(codExpressao),-1)
 
 set msgErro = ""
 
 set posicao = $order(^%Src2SourceSyntax("syntax",idSyntax,""))
 
 for {
   set codExpressao = $order(tabExpressao(codExpressao))
   
   if (codExpressao '= "") {
     set expressao = $list($get(tabExpressao(codExpressao)),1)
     set sc = ##class(Src2.SourceSyntax).ValidarExpressao(idSyntax, .tabExpressao, .codExpressao, .codExpressaoRet, expressao, .posicao, comando)
     if (sc'=$$$OK) set msgErro = sc quit
   }
   
   if (posicao = "") quit
   
   if (codExpressao = "") {
     set sc = ##class(Src2.SourceSyntax).ValidarExpressao(idSyntax, .tabExpressao, .codExpressao, .codExpressaoRet, codExpressao, .posicao, comando)
     quit
   }
 }
 
 if (idSyntax = "linha") & (codExpressao '= "") {
   set $list(tabExpressao(codExpressao),2) = idSyntax
   set $list(tabExpressao(codExpressao),3) = posicao
   set $list(tabExpressao(codExpressao),5) = "erro"
   
   quit "Syntax do '"_idSyntax_"' inválida!"
 }
 
 if (msgErro '= "") quit msgErro
 
 if (posicao '= "") quit "Erro na posicao "_posicao_" do "_idSyntax_"!"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarExpressao">
<ClassMethod>1</ClassMethod>
<FormalSpec>idSyntax:%String,tabExpressao:%String,codExpressao:%String,codExpressaoRet:%String,expressao:%String,posicao:%String,comando:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.SourceSyntax).ObterTiposExpressao(expressao, .tabTipos)
 
 if (posicao = "") quit $$$OK
 
 set (tipo, flgOK, msgErro) = ""
 for {
   set tipo = $order(tabTipos(tipo))
   if (tipo = "") quit
   
   if ('$data(^%Src2SourceSyntax("syntax",idSyntax,posicao,tipo))) continue
   
   set flgOK = 1
   
   set sc = ##class(Src2.SourceSyntax).EfetivarExpressao(idSyntax, .tabExpressao, .codExpressao, .codExpressaoRet, expressao, .posicao, .tabTipos, tipo, comando)
   if (sc'=$$$OK) set msgErro = sc
   
   quit
 }
 
 if (msgErro '= "") quit msgErro
 
 if ('flgOK) & (posicao '= "") {
   if $data(^%Src2SourceSyntax("syntax",idSyntax,posicao,"{direta}")) {
     
     set flgOK = 1
     
     set sc = ##class(Src2.SourceSyntax).EfetivarExpressao(idSyntax, .tabExpressao, .codExpressao, .codExpressaoRet, expressao, .posicao, .tabTipos, "{direta}", comando)
     if (sc'=$$$OK) quit sc
   }
 }
 
 if ('flgOK) {
   if (posicao '= "") , (codExpressaoRet '= "") , ($data(^%Src2SourceSyntax("syntax",idSyntax,posicao,"fim"))) {
     set codExpressao = codExpressaoRet
     set posicao = ""
     quit $$$OK
   }
   
   if (codExpressao '= "") {
     set $list(tabExpressao(codExpressao),2) = idSyntax
     set $list(tabExpressao(codExpressao),3) = posicao
     set $list(tabExpressao(codExpressao),5) = "erro"
   }
   
   quit "Syntax do '"_idSyntax_"' inválida!"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="EfetivarExpressao">
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[idSyntax:%String,&tabExpressao:%String,&codExpressao:%String,&codExpressaoRet:%String,expressao:%String,&posicao:%String,&tabTipos:%String,tipo:%String,comando:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set idSyntax2 = ""
 
 if (codExpressao '= "") , ($piece($get(tabTipos(tipo)),"^",1) '= "") {
   if ($list(tabExpressao(codExpressao),1) '= $piece($get(tabTipos(tipo)),"^",1)) { set $piece(tabExpressao,"^",1) = 1 }
   set $list(tabExpressao(codExpressao),1) = $piece($get(tabTipos(tipo)),"^",1)
 }
 
 if ($piece($get(tabTipos(tipo)),"^",2) '= "") {
   set comando = $piece($get(tabTipos(tipo)),"^",2)
 }
 
 if (codExpressao '= "") , (idSyntax = "funcCache") , (tipo = "ident") {
   if ($data(^%Src2SourceSyntax("funcCache",$zconvert(expressao,"U")))) {
     set var = $get(^%Src2SourceSyntax("funcCache",$zconvert(expressao,"U")))
     
     set cmd = $piece(var,"^",1)
     
     if ($piece(var,"^",2) '= "") {
       if ('$data(tabExpressao(codExpressao+1))) {
         set cmd = $piece(var,"^",2)
       }
       if ($data(tabExpressao(codExpressao+1))) , ($list(tabExpressao(codExpressao+1),1) '= "(") {
         set cmd = $piece(var,"^",2)
       }
     }
     
     if ($list(tabExpressao(codExpressao),1) '= cmd) { set $piece(tabExpressao,"^",1) = 1 }
     set $list(tabExpressao(codExpressao),1) = cmd
     
     if ($piece(var,"^",3) '= "") { set idSyntax2 = $piece(var,"^",3) }
   }
 }
 
 if (codExpressao '= "") {
   set $list(tabExpressao(codExpressao),2) = idSyntax
   set $list(tabExpressao(codExpressao),3) = posicao
   set $list(tabExpressao(codExpressao),4) = tipo
   set $list(tabExpressao(codExpressao),6) = comando
 }
 
 if (idSyntax2 = "") {
   set idSyntax2 = $piece($get(^%Src2SourceSyntax("syntax",idSyntax,posicao,tipo)),"^",2)
 }
 
 if ($piece($get(^%Src2SourceSyntax("syntax",idSyntax,posicao,tipo)),"^",3) = "<ok>") {
   set codExpressaoRet = codExpressao
 }
 
 set posicao = $piece($get(^%Src2SourceSyntax("syntax",idSyntax,posicao,tipo)),"^",1)
 
 set flgOK = 1
 
 if (idSyntax2 = "") quit $$$OK
 
 set sc = ##class(Src2.SourceSyntax).ValidarSyntax(.tabExpressao, idSyntax2, .codExpressao, .codExpressaoRet, comando)
 if (sc'=$$$OK) quit sc
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTiposExpressao">
<Description><![CDATA[
http://192.168.15.10:1972/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_operators&CSPCHD=2302442905287456823#GCOS_operators_pattern
set sc = ##class(Src2.SourceSyntax).ObterTiposExpressao("1asdf", .tabTipos)]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>expressao:%String,tabTipos:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabTipos
 
 if (expressao = "") {
   set tabTipos("fim") = ""
   quit $$$OK
 }
 
 set priCaracter = $extract(expressao,1) 
 
 if (priCaracter = """") {
   set tabTipos("texto") = ""
   quit $$$OK
 }
 
 if $data(^%Src2SourceSyntax("tipo",expressao)) {
   merge tabTipos = ^%Src2SourceSyntax("tipo",expressao)
   set tabTipos(expressao) = ""
   quit $$$OK
 }
 
 if ($data(^%Src2SourceSyntax("comando",$zconvert(expressao,"U")))) {
   set comando = $get(^%Src2SourceSyntax("comando",$zconvert(expressao,"U")))
   set tabTipos(comando) = comando_"^"_comando
   set tabTipos("variavel") = ""
   set tabTipos("rotina") = ""
   set tabTipos("label") = ""
   set tabTipos("ident") = ""
   quit $$$OK
 }
 
 if (expressao?.N) {
   set tabTipos("numero") = ""
   set tabTipos("rotina") = ""
   set tabTipos("label") = ""
   quit $$$OK
 }
 
 if ($translate(expressao,".","")?.N) {
   set tabTipos("numero") = ""
   quit $$$OK
 }
 
 if (priCaracter'?.N) {
   set tabTipos("variavel") = ""
   set tabTipos("rotina") = ""
   set tabTipos("label") = ""
   set tabTipos("ident") = ""
   quit $$$OK
 }
 
 set tabTipos("label") = ""
 set tabTipos("ident") = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterExpressoes">
<Description>

set sc = ##class(Src2.SourceSyntax).ObterExpressoes($get(^rMAC("XXEJCCFT240",0,28)), .tabela)
S S  =  B  ,   F = 3 SET B  = 34535345 , I = F W W , I , 45 ,4,AA</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>linha:%String,tabela:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabela
 
 set (var, tipoAnt, aspas) = ""
 
 set codSeq = 1
 
 for cont = 1:1:$length(linha) {
   set caracter = $extract(linha,cont)
   set caracter2 = $extract(linha,cont,cont+1)
   set caracter3 = $extract(linha,cont,cont+2)
   
   set tipo = 0
   
   if ($data(^%Src2SourceSyntax("tipo",caracter3))) {
     set tipo = 1
     set caracter = caracter3
     set cont = cont + 2
   } elseif ($data(^%Src2SourceSyntax("tipo",caracter2))) {
     set tipo = 1
     set caracter = caracter2
     set cont = cont + 1
   } elseif ($data(^%Src2SourceSyntax("tipo",caracter))) {
     set tipo = 1
   }
   
   if (caracter = ".") & ($extract(linha,cont+1) ?.N) { set tipo = 0 }
   
   if (caracter = """") {
     set aspas = $select(aspas=1:0,1:1)
     set tipo = 0
   }
   
   if (aspas) { set tipo = 0 }
   
   if ((tipoAnt '= tipo) ! (tipo = 1)) & ($data(tabela(codSeq))) {
     set codSeq = codSeq + 1
   }
   
   if ('$data(tabela(codSeq))) {
     for cont2=1:1:6 { set $list(tabela(codSeq),cont2) = "" }
   }
   
   set $list(tabela(codSeq),1) = $list(tabela(codSeq),1)_caracter
   ;set tabela(codSeq) = $get(tabela(codSeq))_caracter
   
   set tipoAnt = tipo
 }
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.SourceSyntaxConf">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>62407,52817.669021</TimeCreated>

<Method name="AtualizarConfiguracao">
<Description>

Pendências
  Parametros com valor pré-definido

Definições
  
  set CASA=^["NAMESPACE"]PEDRA      ; ACEITA
  set CASA=^[VARIAVELNS]PEDRA       ; ACEITA
  set CASA=^[(VARIAVELNS_AAA)]PEDRA ; NÃO ACEITA - UTILIZAR | E NÃO []
</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if $data(^mtempSrc2SourceSyntaxConf(+$horolog)) quit $$$OK
 
 set ^mtempSrc2SourceSyntaxConf(+$horolog)=""
 
 set sc = ##class(Src2.SourceSyntaxConf).Configurar()
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="Configurar">
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.SourceSyntaxConf).GerarSyntax()
 
 set sc = ##class(Src2.SourceSyntaxConf).GerarTipos()
 
 set sc = ##class(Src2.SourceSyntaxConf).GerarComandos()
 
 set sc = ##class(Src2.SourceSyntaxConf).GerarFuncoesCache()
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarComandos">
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill ^%Src2SourceSyntax("comando")
 
 set ^%Src2SourceSyntax("comando","WRITE")   = "write"   , ^%Src2SourceSyntax("comando","W")  = "write"
 set ^%Src2SourceSyntax("comando","ZWRITE")  = "zwrite"  , ^%Src2SourceSyntax("comando","ZW") = "zwrite"
 set ^%Src2SourceSyntax("comando","SET")     = "set"     , ^%Src2SourceSyntax("comando","S")  = "set"
 set ^%Src2SourceSyntax("comando","IF")      = "if"      , ^%Src2SourceSyntax("comando","I")  = "if"
 set ^%Src2SourceSyntax("comando","DO")      = "do"      , ^%Src2SourceSyntax("comando","D")  = "do"
 set ^%Src2SourceSyntax("comando","GOTO")    = "goto"    , ^%Src2SourceSyntax("comando","G")  = "goto"
 set ^%Src2SourceSyntax("comando","QUIT")    = "quit"    , ^%Src2SourceSyntax("comando","Q")  = "quit"
 set ^%Src2SourceSyntax("comando","FOR")     = "for"     , ^%Src2SourceSyntax("comando","F")  = "for"
 set ^%Src2SourceSyntax("comando","NEW")     = "new"     , ^%Src2SourceSyntax("comando","N")  = "new"
 set ^%Src2SourceSyntax("comando","KILL")    = "kill"    , ^%Src2SourceSyntax("comando","K")  = "kill"
 set ^%Src2SourceSyntax("comando","ZKILL")   = "zkill"   , ^%Src2SourceSyntax("comando","ZK") = "zkill"
 set ^%Src2SourceSyntax("comando","MERGE")   = "merge"   , ^%Src2SourceSyntax("comando","M")  = "merge"
 set ^%Src2SourceSyntax("comando","XECUTE")  = "xecute"  , ^%Src2SourceSyntax("comando","X")  = "xecute"
 set ^%Src2SourceSyntax("comando","LOCK")    = "lock"    , ^%Src2SourceSyntax("comando","L")  = "lock"
 set ^%Src2SourceSyntax("comando","HANG")    = "hang"    , ^%Src2SourceSyntax("comando","H")  = "hang"
 set ^%Src2SourceSyntax("comando","ELSE")    = "else"    , ^%Src2SourceSyntax("comando","E")  = "else"
 set ^%Src2SourceSyntax("comando","BREAK")   = "break"   , ^%Src2SourceSyntax("comando","B")  = "break"
 set ^%Src2SourceSyntax("comando","ZNSPACE") = "znspace" , ^%Src2SourceSyntax("comando","ZN") = "znspace"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarFuncoesCache">
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill ^%Src2SourceSyntax("funcCache")
 
 ; piece 1 = Comando expandido principal
 ; piece 2 = Comando expandido secundario
 ;           Caso exista dois comandos colocar no segundo piece sempre o comando sem parametros
 ; piece 3 = Identificador da sintaxe do comando principal
 
 set ^%Src2SourceSyntax("funcCache","LIST")         = "list"
 set ^%Src2SourceSyntax("funcCache","LI")           = "list"
 
 set ^%Src2SourceSyntax("funcCache","LISTBUILD")    = "listbuild"
 set ^%Src2SourceSyntax("funcCache","LB")           = "listbuild"
 
 set ^%Src2SourceSyntax("funcCache","LISTTOSTRING") = "listtostring"
 set ^%Src2SourceSyntax("funcCache","LTS")          = "listtostring"
 
 set ^%Src2SourceSyntax("funcCache","GET")          = "get"
 set ^%Src2SourceSyntax("funcCache","G")            = "get"
 
 set ^%Src2SourceSyntax("funcCache","ORDER")        = "order"
 set ^%Src2SourceSyntax("funcCache","O")            = "order"
 
 set ^%Src2SourceSyntax("funcCache","QUERY")        = "query"
 set ^%Src2SourceSyntax("funcCache","Q")            = "query"
 
 set ^%Src2SourceSyntax("funcCache","DATA")         = "data"
 set ^%Src2SourceSyntax("funcCache","D")            = "data"
 
 set ^%Src2SourceSyntax("funcCache","SELECT")       = "select^^$select"
 set ^%Src2SourceSyntax("funcCache","S")            = "select^^$select"
 
 set ^%Src2SourceSyntax("funcCache","LENGTH")       = "length"
 set ^%Src2SourceSyntax("funcCache","L")            = "length"
 
 set ^%Src2SourceSyntax("funcCache","EXTRACT")      = "extract"
 set ^%Src2SourceSyntax("funcCache","E")            = "extract"
 
 set ^%Src2SourceSyntax("funcCache","HOROLOG")      = "horolog"
 set ^%Src2SourceSyntax("funcCache","H")            = "horolog"
 
 set ^%Src2SourceSyntax("funcCache","FNUMBER")      = "fnumber"
 set ^%Src2SourceSyntax("funcCache","FN")           = "fnumber"
 
 set ^%Src2SourceSyntax("funcCache","FIND")         = "find"
 set ^%Src2SourceSyntax("funcCache","F")            = "find"
 
 set ^%Src2SourceSyntax("funcCache","ZDATE")        = "zdate"
 set ^%Src2SourceSyntax("funcCache","ZD")           = "zdate"
 
 set ^%Src2SourceSyntax("funcCache","ZDATEH")       = "zdateh"
 set ^%Src2SourceSyntax("funcCache","ZDH")          = "zdateh"
 
 set ^%Src2SourceSyntax("funcCache","ZTIMEH")       = "ztimeh"
 set ^%Src2SourceSyntax("funcCache","ZTH")          = "ztimeh"
 
 set ^%Src2SourceSyntax("funcCache","ZDATETIME")    = "zdatetime"
 set ^%Src2SourceSyntax("funcCache","ZDT")          = "zdatetime"
 
 set ^%Src2SourceSyntax("funcCache","ZDATETIMEH")   = "zdatetimeh"
 set ^%Src2SourceSyntax("funcCache","ZDTH")         = "zdatetimeh"
 
 set ^%Src2SourceSyntax("funcCache","ZCONVERT")     = "zconvert"
 set ^%Src2SourceSyntax("funcCache","ZCVT")         = "zconvert"
 
 set ^%Src2SourceSyntax("funcCache","NAME")         = "name"
 set ^%Src2SourceSyntax("funcCache","NA")           = "name"
 
 set ^%Src2SourceSyntax("funcCache","ZNSPACE")      = "znspace"
 
 set ^%Src2SourceSyntax("funcCache","ZU")           = "zutil"
 set ^%Src2SourceSyntax("funcCache","ZUTIL")        = "zutil"
 
 set ^%Src2SourceSyntax("funcCache","ZF")           = "zf"
 
 set ^%Src2SourceSyntax("funcCache","PIECE")        = "piece"
 set ^%Src2SourceSyntax("funcCache","P")            = "piece^principal"
 set ^%Src2SourceSyntax("funcCache","PRINCIPAL")    = "principal"
 
 set ^%Src2SourceSyntax("funcCache","JUSTIFY")      = "justify"
 set ^%Src2SourceSyntax("funcCache","J")            = "justify^job"
 set ^%Src2SourceSyntax("funcCache","JOB")          = "job"
 
 set ^%Src2SourceSyntax("funcCache","IO")           = "io"
 set ^%Src2SourceSyntax("funcCache","I")            = "increment^io"
 set ^%Src2SourceSyntax("funcCache","INCREMENT")    = "increment"
 
 set ^%Src2SourceSyntax("funcCache","ZTIME")        = "ztime^ztrap"
 set ^%Src2SourceSyntax("funcCache","ZT")           = "ztime"
 set ^%Src2SourceSyntax("funcCache","ZTRAP")        = "ztrap"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarTipos">
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill ^%Src2SourceSyntax("tipo")
 
 set ^%Src2SourceSyntax("tipo","+","operador")  = ""
 set ^%Src2SourceSyntax("tipo","-","operador")  = ""
 set ^%Src2SourceSyntax("tipo","*","operador") = ""
 set ^%Src2SourceSyntax("tipo","/","operador")  = ""
 set ^%Src2SourceSyntax("tipo","\","operador")  = ""
 set ^%Src2SourceSyntax("tipo","**","operador") = ""
 set ^%Src2SourceSyntax("tipo","_","operador")  = ""
 set ^%Src2SourceSyntax("tipo","'","operador") = ""
 set ^%Src2SourceSyntax("tipo","'=","operador")  = ""
 set ^%Src2SourceSyntax("tipo",">","operador") = ""
 set ^%Src2SourceSyntax("tipo","'>","operador")  = ""
 set ^%Src2SourceSyntax("tipo","<","operador")  = ""
 set ^%Src2SourceSyntax("tipo","'<","operador") = ""
 set ^%Src2SourceSyntax("tipo","[","operador")  = ""
 set ^%Src2SourceSyntax("tipo","[","abreNsp[")  = ""
 set ^%Src2SourceSyntax("tipo","]","operador")  = "" 
 set ^%Src2SourceSyntax("tipo","]","fechaNsp]")  = ""
 set ^%Src2SourceSyntax("tipo","]]","operador") = ""
 set ^%Src2SourceSyntax("tipo","&&","operador")  = ""
 set ^%Src2SourceSyntax("tipo","&","operador")  = ""
 set ^%Src2SourceSyntax("tipo","|","pipe") = ""
 set ^%Src2SourceSyntax("tipo","||","operador") = ""
 set ^%Src2SourceSyntax("tipo","!","operador")  = ""
 set ^%Src2SourceSyntax("tipo","=","operador")  = ""
 set ^%Src2SourceSyntax("tipo","=","atribuicao")  = ""
 set ^%Src2SourceSyntax("tipo","@","operador") = ""
 set ^%Src2SourceSyntax("tipo","@","indirecao") = ""
 set ^%Src2SourceSyntax("tipo","#","operador")  = ""
 set ^%Src2SourceSyntax("tipo","#","include")  = ""
 set ^%Src2SourceSyntax("tipo",":","doispontos") = ""
 set ^%Src2SourceSyntax("tipo",";","coment") = ""
 set ^%Src2SourceSyntax("tipo","//","coment") = ""
 set ^%Src2SourceSyntax("tipo",$char(9),"tab") = ""
 set ^%Src2SourceSyntax("tipo"," ","espaco") = ""
 set ^%Src2SourceSyntax("tipo",".","ponto") = ""
 set ^%Src2SourceSyntax("tipo","(","abre(") = ""
 set ^%Src2SourceSyntax("tipo",")","fecha)") = ""
 set ^%Src2SourceSyntax("tipo","$","funcCache") = ""
 set ^%Src2SourceSyntax("tipo","$$","funcDes") = ""
 set ^%Src2SourceSyntax("tipo","$$$","macro") = ""
 set ^%Src2SourceSyntax("tipo",",","virgula") = ""
 set ^%Src2SourceSyntax("tipo","^","uperro") = ""
 set ^%Src2SourceSyntax("tipo","?","interroga") = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarSyntax">
<ClassMethod>1</ClassMethod>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill ^%Src2SourceSyntax("syntax")
 
 // Linha de comandos
 
 set ^%Src2SourceSyntax("syntax","linha","linha-1","label")   = "linha-2^label^<ok>"
 set ^%Src2SourceSyntax("syntax","linha","linha-1","tab")     = "linha-3"
 set ^%Src2SourceSyntax("syntax","linha","linha-1","espaco")  = "linha-3"
 set ^%Src2SourceSyntax("syntax","linha","linha-1","fim")     = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","linha","linha-2","coment")  = "^coment^<ok>"
 set ^%Src2SourceSyntax("syntax","linha","linha-2","espaco")  = "linha-3"
 set ^%Src2SourceSyntax("syntax","linha","linha-2","tab")     = "linha-3"
 set ^%Src2SourceSyntax("syntax","linha","linha-2","ponto")   = "linha-3"
 set ^%Src2SourceSyntax("syntax","linha","linha-2","fim")     = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","linha","linha-3","coment")  = "^coment^<ok>"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","ponto")   = "linha-3"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","espaco")  = "linha-3"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","tab")     = "linha-3"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","set")     = "linha-4^set"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","write")   = "linha-4^write"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","zwrite")  = "linha-4^kill"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","if")      = "linha-4^if"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","else")    = "linha-4^else"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","do")      = "linha-4^do"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","goto")    = "linha-4^goto"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","quit")    = "linha-4^quit"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","for")     = "linha-4^for"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","new")     = "linha-4^new"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","kill")    = "linha-4^kill"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","zkill")   = "linha-4^kill"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","merge")   = "linha-4^merge"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","xecute")  = "linha-4^comExp"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","lock")    = "linha-4^lock"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","break")   = "linha-4^break"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","hang")    = "linha-4^comExp"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","macro")   = "linha-4^funcCache"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","include") = "linha-4^include"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","znspace") = "linha-4^comExp"
 set ^%Src2SourceSyntax("syntax","linha","linha-3","fim")     = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","linha","linha-4","coment")  = "^coment^<ok>"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","espaco")  = "linha-4"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","tab")     = "linha-4"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","set")     = "linha-4^set"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","write")   = "linha-4^write"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","zwrite")  = "linha-4^kill"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","if")      = "linha-4^if"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","else")    = "linha-4^else"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","do")      = "linha-4^do"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","goto")    = "linha-4^goto"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","quit")    = "linha-4^quit"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","for")     = "linha-4^for"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","new")     = "linha-4^new"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","kill")    = "linha-4^kill"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","zkill")   = "linha-4^kill"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","merge")   = "linha-4^merge"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","xecute")  = "linha-4^comExp"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","lock")    = "linha-4^lock"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","break")   = "linha-4^break"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","hang")    = "linha-4^comExp"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","macro")   = "linha-4^funcCache"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","include") = "linha-4^include"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","znspace") = "linha-4^comExp"
 set ^%Src2SourceSyntax("syntax","linha","linha-4","fim")     = "^^<ok>"
 
 // Comentario
 
 set ^%Src2SourceSyntax("syntax","coment","coment-1","{direta}") = "coment-1"
 set ^%Src2SourceSyntax("syntax","coment","coment-1","fim")      = "^^<ok>"
 
 // Comando - set
 
 set ^%Src2SourceSyntax("syntax","set","set-01","set")        = "set-02"
   
 set ^%Src2SourceSyntax("syntax","set","set-02","doispontos") = "set-09"
 set ^%Src2SourceSyntax("syntax","set","set-02","espaco")     = "set-03"
   
 set ^%Src2SourceSyntax("syntax","set","set-03","{direta}")   = "set-05^exprAtrib"
 set ^%Src2SourceSyntax("syntax","set","set-03","indirecao")  = "set-04^indirecao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","set","set-04","espaco")     = "set-05"
 set ^%Src2SourceSyntax("syntax","set","set-04","tab")        = "set-05"
 set ^%Src2SourceSyntax("syntax","set","set-04","atribuicao") = "set-06"
 set ^%Src2SourceSyntax("syntax","set","set-04","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","set","set-05","espaco")     = "set-05"
 set ^%Src2SourceSyntax("syntax","set","set-05","tab")        = "set-05"
 set ^%Src2SourceSyntax("syntax","set","set-05","atribuicao") = "set-06"
   
 set ^%Src2SourceSyntax("syntax","set","set-06","espaco")     = "set-06"
 set ^%Src2SourceSyntax("syntax","set","set-06","tab")        = "set-06"
 set ^%Src2SourceSyntax("syntax","set","set-06","{direta}")   = "set-07^expressao^<ok>"
   
 set ^%Src2SourceSyntax("syntax","set","set-07","espaco")     = "set-07"
 set ^%Src2SourceSyntax("syntax","set","set-07","tab")        = "set-07"
 set ^%Src2SourceSyntax("syntax","set","set-07","virgula")    = "set-08"
 set ^%Src2SourceSyntax("syntax","set","set-07","fim")        = "^^<ok>"
   
 set ^%Src2SourceSyntax("syntax","set","set-08","espaco")     = "set-08"
 set ^%Src2SourceSyntax("syntax","set","set-08","tab")        = "set-08"
 set ^%Src2SourceSyntax("syntax","set","set-08","{direta}")   = "set-05^exprAtrib"
 
 set ^%Src2SourceSyntax("syntax","set","set-09","{direta}")   = "set-10^expressao2"
 
 set ^%Src2SourceSyntax("syntax","set","set-10","espaco")     = "set-03"

 // Comando - merge
 
 set ^%Src2SourceSyntax("syntax","merge","merge-01","merge")      = "merge-02"
 
 set ^%Src2SourceSyntax("syntax","merge","merge-02","doispontos") = "merge-08"
 set ^%Src2SourceSyntax("syntax","merge","merge-02","espaco")     = "merge-03"
 
 set ^%Src2SourceSyntax("syntax","merge","merge-03","{direta}")   = "merge-04^variavel^<ok>"
 set ^%Src2SourceSyntax("syntax","merge","merge-03","indirecao")  = "merge-04^indirecao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","merge","merge-04","espaco")     = "merge-04"
 set ^%Src2SourceSyntax("syntax","merge","merge-04","tab")        = "merge-04"
 set ^%Src2SourceSyntax("syntax","merge","merge-04","atribuicao") = "merge-05"
 
 set ^%Src2SourceSyntax("syntax","merge","merge-05","espaco")     = "merge-05"
 set ^%Src2SourceSyntax("syntax","merge","merge-05","tab")        = "merge-05"
 set ^%Src2SourceSyntax("syntax","merge","merge-05","{direta}")   = "merge-06^variavel^<ok>"
 set ^%Src2SourceSyntax("syntax","merge","merge-05","indirecao")  = "merge-06^indirecao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","merge","merge-06","espaco")     = "merge-06"
 set ^%Src2SourceSyntax("syntax","merge","merge-06","tab")        = "merge-06"
 set ^%Src2SourceSyntax("syntax","merge","merge-06","virgula")    = "merge-07"
 set ^%Src2SourceSyntax("syntax","merge","merge-06","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","merge","merge-07","espaco")     = "merge-07"
 set ^%Src2SourceSyntax("syntax","merge","merge-07","tab")        = "merge-07"
 set ^%Src2SourceSyntax("syntax","merge","merge-07","{direta}")   = "merge-04^variavel"
 set ^%Src2SourceSyntax("syntax","merge","merge-07","indirecao")  = "merge-04^indirecao"
 
 set ^%Src2SourceSyntax("syntax","merge","merge-08","{direta}")   = "merge-09^expressao2"
 
 set ^%Src2SourceSyntax("syntax","merge","merge-09","espaco")     = "merge-03"
 
 // Comando - xecute / hang / znspace - (comando:expressao expressao)
 
 set ^%Src2SourceSyntax("syntax","comExp","comExp-01","xecute")     = "comExp-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","comExp","comExp-01","hang")       = "comExp-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","comExp","comExp-01","znspace")    = "comExp-02^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","comExp","comExp-02","doispontos") = "comExp-06"
 set ^%Src2SourceSyntax("syntax","comExp","comExp-02","espaco")     = "comExp-03"
 set ^%Src2SourceSyntax("syntax","comExp","comExp-02","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","comExp","comExp-03","{direta}")   = "comExp-04^expressao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","comExp","comExp-04","espaco")     = "comExp-04"
 set ^%Src2SourceSyntax("syntax","comExp","comExp-04","tab")        = "comExp-04"
 set ^%Src2SourceSyntax("syntax","comExp","comExp-04","virgula")    = "comExp-05"
 set ^%Src2SourceSyntax("syntax","comExp","comExp-04","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","comExp","comExp-05","espaco")     = "comExp-05"
 set ^%Src2SourceSyntax("syntax","comExp","comExp-05","tab")        = "comExp-05"
 set ^%Src2SourceSyntax("syntax","comExp","comExp-05","{direta}")   = "comExp-04^expressao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","comExp","comExp-06","{direta}")   = "comExp-07^expressao2"
 
 set ^%Src2SourceSyntax("syntax","comExp","comExp-07","espaco")     = "comExp-03"
 
 // Comando - write
 
 set ^%Src2SourceSyntax("syntax","write","write-01","write")      = "write-02^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","write","write-02","doispontos") = "write-08"
 set ^%Src2SourceSyntax("syntax","write","write-02","espaco")     = "write-03"
 set ^%Src2SourceSyntax("syntax","write","write-02","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","write","write-03","{direta}")   = "write-04^expressao^<ok>"
 set ^%Src2SourceSyntax("syntax","write","write-03","!")          = "write-06^^<ok>"
 set ^%Src2SourceSyntax("syntax","write","write-03","#")          = "write-06^^<ok>"
 set ^%Src2SourceSyntax("syntax","write","write-03","?")          = "write-07"
 
 set ^%Src2SourceSyntax("syntax","write","write-04","espaco")     = "write-04"
 set ^%Src2SourceSyntax("syntax","write","write-04","tab")        = "write-04"
 set ^%Src2SourceSyntax("syntax","write","write-04","virgula")    = "write-05"
 set ^%Src2SourceSyntax("syntax","write","write-04","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","write","write-05","espaco")     = "write-05"
 set ^%Src2SourceSyntax("syntax","write","write-05","tab")        = "write-05"
 set ^%Src2SourceSyntax("syntax","write","write-05","{direta}")   = "write-04^expressao^<ok>"
 set ^%Src2SourceSyntax("syntax","write","write-05","!")          = "write-06^^<ok>"
 set ^%Src2SourceSyntax("syntax","write","write-05","#")          = "write-06^^<ok>"
 set ^%Src2SourceSyntax("syntax","write","write-05","?")          = "write-07"
 
 set ^%Src2SourceSyntax("syntax","write","write-06","espaco")     = "write-06"
 set ^%Src2SourceSyntax("syntax","write","write-06","tab")        = "write-06"
 set ^%Src2SourceSyntax("syntax","write","write-06","virgula")    = "write-05"
 set ^%Src2SourceSyntax("syntax","write","write-06","!")          = "write-06^^<ok>"
 set ^%Src2SourceSyntax("syntax","write","write-06","#")          = "write-06^^<ok>"
 set ^%Src2SourceSyntax("syntax","write","write-06","?")          = "write-07"
 set ^%Src2SourceSyntax("syntax","write","write-06","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","write","write-07","espaco")     = "write-07"
 set ^%Src2SourceSyntax("syntax","write","write-07","tab")        = "write-07"
 set ^%Src2SourceSyntax("syntax","write","write-07","{direta}")   = "write-04^expressao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","write","write-08","{direta}")   = "write-09^expressao2"
 
 set ^%Src2SourceSyntax("syntax","write","write-09","espaco")     = "write-03"
 
 // Comando - quit
 
 set ^%Src2SourceSyntax("syntax","quit","quit-01","quit")       = "quit-02^^<ok>"
   
 set ^%Src2SourceSyntax("syntax","quit","quit-02","doispontos") = "quit-05"
 set ^%Src2SourceSyntax("syntax","quit","quit-02","espaco")     = "quit-04"
 set ^%Src2SourceSyntax("syntax","quit","quit-02","tab")        = "quit-03"
 set ^%Src2SourceSyntax("syntax","quit","quit-02","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","quit","quit-03","espaco")     = "quit-04"
 set ^%Src2SourceSyntax("syntax","quit","quit-03","tab")        = "quit-03"
 set ^%Src2SourceSyntax("syntax","quit","quit-03","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","quit","quit-04","espaco")     = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","quit","quit-04","tab")        = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","quit","quit-04","coment")     = "^coment^<ok>"
 set ^%Src2SourceSyntax("syntax","quit","quit-04","{direta}")   = "^expressao^<ok>"
 set ^%Src2SourceSyntax("syntax","quit","quit-04","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","quit","quit-05","{direta}")   = "quit-06^expressao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","quit","quit-06","espaco")     = "quit-04"
 set ^%Src2SourceSyntax("syntax","quit","quit-06","tab")        = "quit-03"
 set ^%Src2SourceSyntax("syntax","quit","quit-06","fim")        = "^^<ok>"
 
 // Comando - break
 
 set ^%Src2SourceSyntax("syntax","break","break-01","break")      = "break-02^^<ok>"
   
 set ^%Src2SourceSyntax("syntax","break","break-02","doispontos") = "break-05"
 set ^%Src2SourceSyntax("syntax","break","break-02","espaco")     = "break-04"
 set ^%Src2SourceSyntax("syntax","break","break-02","tab")        = "break-03"
 set ^%Src2SourceSyntax("syntax","break","break-02","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","break","break-03","espaco")     = "break-04"
 set ^%Src2SourceSyntax("syntax","break","break-03","tab")        = "break-03"
 set ^%Src2SourceSyntax("syntax","break","break-03","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","break","break-04","espaco")     = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","break","break-04","tab")        = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","break","break-04","coment")     = "^coment^<ok>"
 set ^%Src2SourceSyntax("syntax","break","break-04","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","break","break-05","{direta}")   = "break-06^expressao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","break","break-06","espaco")     = "break-04"
 set ^%Src2SourceSyntax("syntax","break","break-06","tab")        = "break-03"
 set ^%Src2SourceSyntax("syntax","break","break-06","fim")        = "^^<ok>"
 
 // Comando - if
 
 set ^%Src2SourceSyntax("syntax","if","if-01","if")       = "if-02"
 
 set ^%Src2SourceSyntax("syntax","if","if-02","espaco")   = "if-03"
 
 set ^%Src2SourceSyntax("syntax","if","if-03","{direta}") = "if-04^expressao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","if","if-04","espaco")   = "if-04"
 set ^%Src2SourceSyntax("syntax","if","if-04","tab")      = "if-04"
 set ^%Src2SourceSyntax("syntax","if","if-04","virgula")  = "if-05"
 set ^%Src2SourceSyntax("syntax","if","if-04","fim")      = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","if","if-05","espaco")   = "if-05"
 set ^%Src2SourceSyntax("syntax","if","if-05","tab")      = "if-05"
 set ^%Src2SourceSyntax("syntax","if","if-05","{direta}") = "if-04^expressao^<ok>"
 
 // Comando - else
 
 set ^%Src2SourceSyntax("syntax","else","else-01","else")   = "else-02^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","else","else-02","espaco") = "else-03"
 set ^%Src2SourceSyntax("syntax","else","else-02","fim")    = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","else","else-03","espaco") = "^^<ok>"
 
 // Comando - do
 
 set ^%Src2SourceSyntax("syntax","do","do-01","do")         = "do-02^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","do","do-02","doispontos") = "do-06"
 set ^%Src2SourceSyntax("syntax","do","do-02","espaco")     = "do-03"
 set ^%Src2SourceSyntax("syntax","do","do-02","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","do","do-03","espaco")     = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","do","do-03","{direta}")   = "do-04^labRot()^<ok>"
 set ^%Src2SourceSyntax("syntax","do","do-03","indirecao")  = "do-04^indirecao^<ok>"
 set ^%Src2SourceSyntax("syntax","do","do-03","macro")      = "do-04^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","do","do-03","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","do","do-04","doispontos") = "do-08"
 set ^%Src2SourceSyntax("syntax","do","do-04","espaco")     = "do-04"
 set ^%Src2SourceSyntax("syntax","do","do-04","tab")        = "do-04"
 set ^%Src2SourceSyntax("syntax","do","do-04","virgula")    = "do-05"
 set ^%Src2SourceSyntax("syntax","do","do-04","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","do","do-05","espaco")     = "do-05"
 set ^%Src2SourceSyntax("syntax","do","do-05","tab")        = "do-05"
 set ^%Src2SourceSyntax("syntax","do","do-05","{direta}")   = "do-04^labRot()^<ok>"
 set ^%Src2SourceSyntax("syntax","do","do-05","indirecao")  = "do-04^indirecao^<ok>"
 set ^%Src2SourceSyntax("syntax","do","do-05","macro")      = "do-04^funcCache^<ok>"
 
 set ^%Src2SourceSyntax("syntax","do","do-06","{direta}")   = "do-07^expressao2^<ok>"
 
 set ^%Src2SourceSyntax("syntax","do","do-07","espaco")     = "do-03"
 set ^%Src2SourceSyntax("syntax","do","do-07","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","do","do-08","{direta}")   = "do-09^expressao2^<ok>"
 
 set ^%Src2SourceSyntax("syntax","do","do-09","espaco")     = "do-09"
 set ^%Src2SourceSyntax("syntax","do","do-09","tab")        = "do-09"
 set ^%Src2SourceSyntax("syntax","do","do-09","virgula")    = "do-05"
 set ^%Src2SourceSyntax("syntax","do","do-09","fim")        = "^^<ok>"
 
 // Comando - goto
 
 set ^%Src2SourceSyntax("syntax","goto","goto-01","goto")       = "goto-02"
 
 set ^%Src2SourceSyntax("syntax","goto","goto-02","doispontos") = "goto-06"
 set ^%Src2SourceSyntax("syntax","goto","goto-02","espaco")     = "goto-03"
 
 set ^%Src2SourceSyntax("syntax","goto","goto-03","{direta}")   = "goto-04^labRot^<ok>"
 set ^%Src2SourceSyntax("syntax","goto","goto-03","indirecao")  = "goto-04^indirecao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","goto","goto-04","doispontos") = "goto-08"
 set ^%Src2SourceSyntax("syntax","goto","goto-04","espaco")     = "goto-04"
 set ^%Src2SourceSyntax("syntax","goto","goto-04","tab")        = "goto-04"
 set ^%Src2SourceSyntax("syntax","goto","goto-04","virgula")    = "goto-05"
 set ^%Src2SourceSyntax("syntax","goto","goto-04","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","goto","goto-05","espaco")     = "goto-05"
 set ^%Src2SourceSyntax("syntax","goto","goto-05","tab")        = "goto-05"
 set ^%Src2SourceSyntax("syntax","goto","goto-05","{direta}")   = "goto-04^labRot^<ok>"
 set ^%Src2SourceSyntax("syntax","goto","goto-05","indirecao")  = "goto-04^indirecao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","goto","goto-06","{direta}")   = "goto-07^expressao2"
 
 set ^%Src2SourceSyntax("syntax","goto","goto-07","espaco")     = "goto-03"
 
 set ^%Src2SourceSyntax("syntax","goto","goto-08","{direta}")   = "goto-09^expressao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","goto","goto-09","espaco")     = "goto-09"
 set ^%Src2SourceSyntax("syntax","goto","goto-09","tab")        = "goto-09"
 set ^%Src2SourceSyntax("syntax","goto","goto-09","virgula")    = "goto-05"
 set ^%Src2SourceSyntax("syntax","goto","goto-09","fim")        = "^^<ok>"
 
 // Comando - for
 
 set ^%Src2SourceSyntax("syntax","for","for-01","for")        = "for-02"
 
 set ^%Src2SourceSyntax("syntax","for","for-02","espaco")     = "for-03"
 
 set ^%Src2SourceSyntax("syntax","for","for-03","espaco")     = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","for","for-03","variavel")   = "for-04"
 
 set ^%Src2SourceSyntax("syntax","for","for-04","espaco")     = "for-04"
 set ^%Src2SourceSyntax("syntax","for","for-04","tab")        = "for-04"
 set ^%Src2SourceSyntax("syntax","for","for-04","atribuicao") = "for-05"
 
 set ^%Src2SourceSyntax("syntax","for","for-05","espaco")     = "for-05"
 set ^%Src2SourceSyntax("syntax","for","for-05","tab")        = "for-05"
 set ^%Src2SourceSyntax("syntax","for","for-05","{direta}")   = "for-06^expressao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","for","for-06","espaco")     = "for-06"
 set ^%Src2SourceSyntax("syntax","for","for-06","tab")        = "for-06"
 set ^%Src2SourceSyntax("syntax","for","for-06","doispontos") = "for-07"
 set ^%Src2SourceSyntax("syntax","for","for-06","virgula")    = "for-05"
 set ^%Src2SourceSyntax("syntax","for","for-06","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","for","for-07","espaco")     = "for-07"
 set ^%Src2SourceSyntax("syntax","for","for-07","tab")        = "for-07"
 set ^%Src2SourceSyntax("syntax","for","for-07","{direta}")   = "for-08^expressao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","for","for-08","espaco")     = "for-08"
 set ^%Src2SourceSyntax("syntax","for","for-08","tab")        = "for-08"
 set ^%Src2SourceSyntax("syntax","for","for-08","doispontos") = "for-09"
 set ^%Src2SourceSyntax("syntax","for","for-08","virgula")    = "for-05"
 set ^%Src2SourceSyntax("syntax","for","for-08","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","for","for-09","espaco")     = "for-09"
 set ^%Src2SourceSyntax("syntax","for","for-09","tab")        = "for-09"
 set ^%Src2SourceSyntax("syntax","for","for-09","{direta}")   = "for-10^expressao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","for","for-10","espaco")     = "for-10"
 set ^%Src2SourceSyntax("syntax","for","for-10","tab")        = "for-10"
 set ^%Src2SourceSyntax("syntax","for","for-10","virgula")    = "for-05"
 set ^%Src2SourceSyntax("syntax","for","for-10","fim")        = "^^<ok>"
 
 // Comando - new
 
 set ^%Src2SourceSyntax("syntax","new","new-01","new")        = "new-02"
 
 set ^%Src2SourceSyntax("syntax","new","new-02","doispontos") = "new-06"
 set ^%Src2SourceSyntax("syntax","new","new-02","espaco")     = "new-03"
 
 set ^%Src2SourceSyntax("syntax","new","new-03","espaco")     = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","new","new-03","variavel")   = "new-04^^<ok>"
 set ^%Src2SourceSyntax("syntax","new","new-03","indirecao")  = "new-04^indirecao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","new","new-04","espaco")     = "new-04"
 set ^%Src2SourceSyntax("syntax","new","new-04","tab")        = "new-04"
 set ^%Src2SourceSyntax("syntax","new","new-04","virgula")    = "new-05"
 set ^%Src2SourceSyntax("syntax","new","new-04","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","new","new-05","espaco")     = "new-05"
 set ^%Src2SourceSyntax("syntax","new","new-05","tab")        = "new-05"
 set ^%Src2SourceSyntax("syntax","new","new-05","variavel")   = "new-04^^<ok>"
 set ^%Src2SourceSyntax("syntax","new","new-05","indirecao")  = "new-04^indirecao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","new","new-06","{direta}")   = "new-07^expressao2"
 
 set ^%Src2SourceSyntax("syntax","new","new-07","espaco")     = "new-03"
 
 // Comando - kill / zkill / zwrite
 
 set ^%Src2SourceSyntax("syntax","kill","kill-01","kill")       = "kill-02"
 set ^%Src2SourceSyntax("syntax","kill","kill-01","zkill")      = "kill-02"
 set ^%Src2SourceSyntax("syntax","kill","kill-01","zwrite")     = "kill-02"
 
 set ^%Src2SourceSyntax("syntax","kill","kill-02","doispontos") = "kill-06"
 set ^%Src2SourceSyntax("syntax","kill","kill-02","espaco")     = "kill-03"
 
 set ^%Src2SourceSyntax("syntax","kill","kill-03","espaco")     = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","kill","kill-03","{direta}")   = "kill-04^variavel^<ok>"
 set ^%Src2SourceSyntax("syntax","kill","kill-03","indirecao")  = "kill-04^indirecao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","kill","kill-04","espaco")     = "kill-04"
 set ^%Src2SourceSyntax("syntax","kill","kill-04","tab")        = "kill-04"
 set ^%Src2SourceSyntax("syntax","kill","kill-04","virgula")    = "kill-05"
 set ^%Src2SourceSyntax("syntax","kill","kill-04","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","kill","kill-05","espaco")     = "kill-05"
 set ^%Src2SourceSyntax("syntax","kill","kill-05","tab")        = "kill-05"
 set ^%Src2SourceSyntax("syntax","kill","kill-05","{direta}")   = "kill-04^variavel^<ok>"
 set ^%Src2SourceSyntax("syntax","kill","kill-05","indirecao")  = "kill-04^indirecao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","kill","kill-06","{direta}")   = "kill-07^expressao2"
 
 set ^%Src2SourceSyntax("syntax","kill","kill-07","espaco")     = "kill-03"
 
 // Comando - lock
 
 set ^%Src2SourceSyntax("syntax","lock","lock-01","lock")       = "lock-02^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","lock","lock-02","doispontos") = "lock-10"
 set ^%Src2SourceSyntax("syntax","lock","lock-02","espaco")     = "lock-03"
 set ^%Src2SourceSyntax("syntax","lock","lock-02","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","lock","lock-03","espaco")     = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","lock","lock-03","+")          = "lock-04"
 set ^%Src2SourceSyntax("syntax","lock","lock-03","-")          = "lock-04"
 set ^%Src2SourceSyntax("syntax","lock","lock-03","{direta}")   = "lock-05^variavel^<ok>"
 
 set ^%Src2SourceSyntax("syntax","lock","lock-04","{direta}")   = "lock-05^variavel^<ok>"
 
 set ^%Src2SourceSyntax("syntax","lock","lock-05","espaco")     = "lock-05"
 set ^%Src2SourceSyntax("syntax","lock","lock-05","tab")        = "lock-05"
 set ^%Src2SourceSyntax("syntax","lock","lock-05","doispontos") = "lock-06"
 set ^%Src2SourceSyntax("syntax","lock","lock-05","virgula")    = "lock-08"
 set ^%Src2SourceSyntax("syntax","lock","lock-05","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","lock","lock-06","{direta}")   = "lock-07^expressao2^<ok>"
 
 set ^%Src2SourceSyntax("syntax","lock","lock-07","espaco")     = "lock-07"
 set ^%Src2SourceSyntax("syntax","lock","lock-07","tab")        = "lock-07"
 set ^%Src2SourceSyntax("syntax","lock","lock-07","virgula")    = "lock-08"
 set ^%Src2SourceSyntax("syntax","lock","lock-07","fim")        = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","lock","lock-08","espaco")     = "lock-08"
 set ^%Src2SourceSyntax("syntax","lock","lock-08","tab")        = "lock-08"
 set ^%Src2SourceSyntax("syntax","lock","lock-08","+")          = "lock-09"
 set ^%Src2SourceSyntax("syntax","lock","lock-08","-")          = "lock-09"
 set ^%Src2SourceSyntax("syntax","lock","lock-08","{direta}")   = "lock-05^variavel^<ok>"
 
 set ^%Src2SourceSyntax("syntax","lock","lock-09","{direta}")   = "lock-05^variavel^<ok>"
 
 set ^%Src2SourceSyntax("syntax","lock","lock-10","{direta}")   = "lock-11^expressao2"
 
 set ^%Src2SourceSyntax("syntax","lock","lock-11","espaco")     = "lock-03"
 
 // Expressao para ser atribuida
 
 set ^%Src2SourceSyntax("syntax","expressao","expres-01","abre(")     = "expres-04"
 set ^%Src2SourceSyntax("syntax","expressao","expres-01","{direta}")  = "expres-02^variavel^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-01","numero")    = "expres-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-01","texto")     = "expres-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-01","funcDes")   = "expres-02^funcDes^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-01","funcCache") = "expres-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-01","macro")     = "expres-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-01","indirecao") = "expres-02^indirecao^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-01","operador")  = "expres-03"
 
 set ^%Src2SourceSyntax("syntax","expressao","expres-02","espaco")    = "expres-02"
 set ^%Src2SourceSyntax("syntax","expressao","expres-02","tab")       = "expres-02"
 set ^%Src2SourceSyntax("syntax","expressao","expres-02","operador")  = "expres-03"
 set ^%Src2SourceSyntax("syntax","expressao","expres-02","fim")       = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-02","interroga") = "expres-02^interroga^<ok>"
 
 set ^%Src2SourceSyntax("syntax","expressao","expres-03","espaco")    = "expres-03"
 set ^%Src2SourceSyntax("syntax","expressao","expres-03","tab")       = "expres-03"
 set ^%Src2SourceSyntax("syntax","expressao","expres-03","abre(")     = "expres-04"
 set ^%Src2SourceSyntax("syntax","expressao","expres-03","operador")  = "expres-03"
 set ^%Src2SourceSyntax("syntax","expressao","expres-03","{direta}")  = "expres-02^variavel^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-03","numero")    = "expres-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-03","texto")     = "expres-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-03","funcDes")   = "expres-02^funcDes^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-03","funcCache") = "expres-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-03","macro")     = "expres-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-03","indirecao") = "expres-02^indirecao^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao","expres-03","interroga") = "expres-02^interroga^<ok>"
 
 set ^%Src2SourceSyntax("syntax","expressao","expres-04","espaco")    = "expres-04"
 set ^%Src2SourceSyntax("syntax","expressao","expres-04","tab")       = "expres-04"
 set ^%Src2SourceSyntax("syntax","expressao","expres-04","{direta}")  = "expres-05^expressao"
 
 set ^%Src2SourceSyntax("syntax","expressao","expres-05","espaco")    = "expres-05"
 set ^%Src2SourceSyntax("syntax","expressao","expres-05","tab")       = "expres-05"
 set ^%Src2SourceSyntax("syntax","expressao","expres-05","fecha)")    = "expres-02^^<ok>"
 
 // Expressao para ser atribuida - sem espaços
 
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-01","abre(")     = "expres2-04"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-01","{direta}")  = "expres2-02^variavel^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-01","numero")    = "expres2-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-01","texto")     = "expres2-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-01","funcDes")   = "expres2-02^funcDes^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-01","funcCache") = "expres2-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-01","macro")     = "expres2-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-01","indirecao") = "expres2-02^indirecao^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-01","operador")  = "expres2-03"
 
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-02","operador")  = "expres2-03"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-02","interroga") = "expres2-02^interroga^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-02","fim")       = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-03","abre(")     = "expres2-04"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-03","operador")  = "expres2-03"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-03","{direta}")  = "expres2-02^variavel^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-03","numero")    = "expres2-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-03","texto")     = "expres2-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-03","funcDes")   = "expres2-02^funcDes^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-03","funcCache") = "expres2-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-03","macro")     = "expres2-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-03","indirecao") = "expres2-02^indirecao^<ok>"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-03","interroga") = "expres2-02^interroga^<ok>"
 
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-04","espaco")    = "expres2-04"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-04","tab")       = "expres2-04"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-04","{direta}")  = "expres2-05^expressao"
 
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-05","espaco")    = "expres2-05"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-05","tab")       = "expres2-05"
 set ^%Src2SourceSyntax("syntax","expressao2","expres2-05","fecha)")    = "expres2-02^^<ok>"
 
 // Indireção @
 
 set ^%Src2SourceSyntax("syntax","indirecao","indir-00","indirecao") = "indir-01"
 
 set ^%Src2SourceSyntax("syntax","indirecao","indir-01","espaco")    = "indir-01"
 set ^%Src2SourceSyntax("syntax","indirecao","indir-01","tab")       = "indir-01"
 set ^%Src2SourceSyntax("syntax","indirecao","indir-01","abre(")     = "indir-02"
 set ^%Src2SourceSyntax("syntax","indirecao","indir-01","{direta}")  = "^variavel^<ok>"
 
 set ^%Src2SourceSyntax("syntax","indirecao","indir-02","espaco")    = "indir-02"
 set ^%Src2SourceSyntax("syntax","indirecao","indir-02","tab")       = "indir-02"
 set ^%Src2SourceSyntax("syntax","indirecao","indir-02","{direta}")  = "indir-03^expressao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","indirecao","indir-03","espaco")    = "indir-03"
 set ^%Src2SourceSyntax("syntax","indirecao","indir-03","tab")       = "indir-03"
 set ^%Src2SourceSyntax("syntax","indirecao","indir-03","fecha)")    = "^^<ok>"
 
 // ?
 
 set ^%Src2SourceSyntax("syntax","interroga","inter-01","interroga") = "inter-02"
 
 set ^%Src2SourceSyntax("syntax","interroga","inter-02","ponto")     = "inter-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","interroga","inter-02","ident")     = "inter-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","interroga","inter-02","espaco")    = ""
 set ^%Src2SourceSyntax("syntax","interroga","inter-02","fim")       = "^^<ok>"
 
 // Variavel / Global / Tabela
 
 set ^%Src2SourceSyntax("syntax","variavel","var-01","uperro")    = "var-02"
 set ^%Src2SourceSyntax("syntax","variavel","var-01","variavel")  = "var-03^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","variavel","var-02","variavel")  = "var-03^^<ok>"
 set ^%Src2SourceSyntax("syntax","variavel","var-02","abreNsp[")  = "var-06"
 set ^%Src2SourceSyntax("syntax","variavel","var-02","pipe")      = "var-09"
 
 set ^%Src2SourceSyntax("syntax","variavel","var-03","espaco")    = "var-03"
 set ^%Src2SourceSyntax("syntax","variavel","var-03","tab")       = "var-03"
 set ^%Src2SourceSyntax("syntax","variavel","var-03","abre(")     = "var-04"
 set ^%Src2SourceSyntax("syntax","variavel","var-03","fim")       = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","variavel","var-04","espaco")    = "var-04"
 set ^%Src2SourceSyntax("syntax","variavel","var-04","tab")       = "var-04"
 set ^%Src2SourceSyntax("syntax","variavel","var-04","{direta}")  = "var-05^expressao"
 
 set ^%Src2SourceSyntax("syntax","variavel","var-05","espaco")    = "var-05"
 set ^%Src2SourceSyntax("syntax","variavel","var-05","tab")       = "var-05"
 set ^%Src2SourceSyntax("syntax","variavel","var-05","virgula")   = "var-04"
 set ^%Src2SourceSyntax("syntax","variavel","var-05","fecha)")    = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","variavel","var-06","espaco")    = "var-06"
 set ^%Src2SourceSyntax("syntax","variavel","var-06","tab")       = "var-06"
 set ^%Src2SourceSyntax("syntax","variavel","var-06","variavel")  = "var-07"
 set ^%Src2SourceSyntax("syntax","variavel","var-06","texto")     = "var-07"
 
 set ^%Src2SourceSyntax("syntax","variavel","var-07","espaco")    = "var-07"
 set ^%Src2SourceSyntax("syntax","variavel","var-07","tab")       = "var-07"
 set ^%Src2SourceSyntax("syntax","variavel","var-07","fechaNsp]") = "var-08"
 
 set ^%Src2SourceSyntax("syntax","variavel","var-08","variavel")  = "var-03^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","variavel","var-09","espaco")    = "var-09"
 set ^%Src2SourceSyntax("syntax","variavel","var-09","tab")       = "var-09"
 set ^%Src2SourceSyntax("syntax","variavel","var-09","{direta}")  = "var-10^expressao"
 
 set ^%Src2SourceSyntax("syntax","variavel","var-10","espaco")    = "var-10"
 set ^%Src2SourceSyntax("syntax","variavel","var-10","tab")       = "var-10"
 set ^%Src2SourceSyntax("syntax","variavel","var-10","pipe")      = "var-11"
 
 set ^%Src2SourceSyntax("syntax","variavel","var-11","variavel")  = "var-03^^<ok>"
 
 // Expressao para receber atribuição
 
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-01","abre(")       = "exprAtrib-04"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-01","{direta}")    = "exprAtrib-02^variavel^<ok>"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-01","funcCache")   = "exprAtrib-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-01","macro")       = "exprAtrib-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-01","indirecao")   = "exprAtrib-02^indirecao^<ok>"
 
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-02","espaco")      = "exprAtrib-02"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-02","tab")         = "exprAtrib-02"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-02","virgula")     = "exprAtrib-03"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-02","fim")         = "^^<ok>"
   
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-03","espaco")      = "exprAtrib-03"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-03","tab")         = "exprAtrib-03"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-03","{direta}")    = "exprAtrib-02^variavel^<ok>"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-03","funcCache")   = "exprAtrib-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-03","macro")       = "exprAtrib-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-03","indirecao")   = "exprAtrib-02^indirecao^<ok>"
   
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-04","espaco")      = "exprAtrib-04"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-04","tab")         = "exprAtrib-04"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-04","{direta}")    = "exprAtrib-05^exprAtrib2"
   
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-05","espaco")      = "exprAtrib-05"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-05","tab")         = "exprAtrib-05"
 set ^%Src2SourceSyntax("syntax","exprAtrib","exprAtrib-05","fecha)")      = "exprAtrib-02^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-01","{direta}")  = "exprAtrib2-02^variavel^<ok>"
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-01","funcCache") = "exprAtrib2-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-01","macro")     = "exprAtrib2-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-01","indirecao") = "exprAtrib2-02^indirecao^<ok>"
   
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-02","espaco")    = "exprAtrib2-02"
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-02","tab")       = "exprAtrib2-02"
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-02","virgula")   = "exprAtrib2-03"
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-02","fim")       = "^^<ok>"
   
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-03","espaco")    = "exprAtrib2-03"
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-03","tab")       = "exprAtrib2-03"
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-03","{direta}")  = "exprAtrib2-02^variavel^<ok>"
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-03","funcCache") = "exprAtrib2-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-03","macro")     = "exprAtrib2-02^funcCache^<ok>"
 set ^%Src2SourceSyntax("syntax","exprAtrib2","exprAtrib2-03","indirecao") = "exprAtrib2-02^indirecao^<ok>"
 
 // Função Desenvolvida
 // $$Teste(variavel, teste)
 // $$Teste^rotina(variavel, teste)
 
 set ^%Src2SourceSyntax("syntax","funcDes","funcDes-01","funcDes")  = "funcDes-02"
 
 set ^%Src2SourceSyntax("syntax","funcDes","funcDes-02","{direta}") = "^labRot()^<ok>"

 // Função Caché / Macro
 
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-01","funcCache") = "funcCache-02"
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-01","macro")     = "funcCache-02"
   
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-02","ident")     = "funcCache-03^^<ok>"
   
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-03","abre(")     = "funcCache-04"
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-03","fim")       = "^^<ok>"
   
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-04","espaco")    = "funcCache-04"
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-04","tab")       = "funcCache-04"
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-04","virgula")   = "funcCache-04"
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-04","fecha)")    = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-04","{direta}")  = "funcCache-05^expressao"
   
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-05","espaco")    = "funcCache-05"
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-05","tab")       = "funcCache-05"
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-05","virgula")   = "funcCache-04"
 set ^%Src2SourceSyntax("syntax","funcCache","funcCache-05","fecha)")    = "^^<ok>"
 
 // $select
 
 set ^%Src2SourceSyntax("syntax","$select","$select-01","ident")      = "$select-02"
 
 set ^%Src2SourceSyntax("syntax","$select","$select-02","abre(")      = "$select-03"
   
 set ^%Src2SourceSyntax("syntax","$select","$select-03","espaco")     = "$select-03"
 set ^%Src2SourceSyntax("syntax","$select","$select-03","tab")        = "$select-03"
 set ^%Src2SourceSyntax("syntax","$select","$select-03","{direta}")   = "$select-04^expressao"
 
 set ^%Src2SourceSyntax("syntax","$select","$select-04","espaco")     = "$select-04"
 set ^%Src2SourceSyntax("syntax","$select","$select-04","tab")        = "$select-04"
 set ^%Src2SourceSyntax("syntax","$select","$select-04","doispontos") = "$select-05"
 
 set ^%Src2SourceSyntax("syntax","$select","$select-05","espaco")     = "$select-05"
 set ^%Src2SourceSyntax("syntax","$select","$select-05","tab")        = "$select-05"
 set ^%Src2SourceSyntax("syntax","$select","$select-05","{direta}")   = "$select-07^expressao"
 
 set ^%Src2SourceSyntax("syntax","$select","$select-07","espaco")     = "$select-07"
 set ^%Src2SourceSyntax("syntax","$select","$select-07","tab")        = "$select-07"
 set ^%Src2SourceSyntax("syntax","$select","$select-07","virgula")    = "$select-03"
 set ^%Src2SourceSyntax("syntax","$select","$select-07","fecha)")     = "^^<ok>"
 
 // Label
 
 set ^%Src2SourceSyntax("syntax","label","label-01","label")     = "label-03^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","label","label-03","abre(")     = "label-04"
 set ^%Src2SourceSyntax("syntax","label","label-03","fim")       = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","label","label-04","espaco")    = "label-04"
 set ^%Src2SourceSyntax("syntax","label","label-04","tab")       = "label-04"
 set ^%Src2SourceSyntax("syntax","label","label-04","fecha)")    = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","label","label-04","variavel")  = "label-05"
 
 set ^%Src2SourceSyntax("syntax","label","label-05","espaco")    = "label-05"
 set ^%Src2SourceSyntax("syntax","label","label-05","tab")       = "label-05"
 set ^%Src2SourceSyntax("syntax","label","label-05","virgula")   = "label-04"
 set ^%Src2SourceSyntax("syntax","label","label-05","fecha)")    = "^^<ok>"
 
 // Label / Label^Rotina / ^Rotina
 
 set ^%Src2SourceSyntax("syntax","labRot","labRot-01","label")     = "labRot-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot","labRot-01","indirecao") = "labRot-02^indirecao^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot","labRot-01","uperro")    = "labRot-03"
 
 set ^%Src2SourceSyntax("syntax","labRot","labRot-02","uperro")    = "labRot-03"
 set ^%Src2SourceSyntax("syntax","labRot","labRot-02","espaco")    = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot","labRot-02","fim")       = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","labRot","labRot-03","rotina")    = "labRot-04^^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot","labRot-03","indirecao") = "labRot-04^indirecao^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot","labRot-03","fim")       = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","labRot","labRot-04","espaco")    = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot","labRot-04","fim")       = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","labRot","labRot-07","variavel")  = "labRot-06"
 
 // Label / Label^Rotina / ^Rotina / Label() / Label^Rotina() / ^Rotina()
 
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-01","label")     = "labRot()-02^^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-01","indirecao") = "labRot()-02^indirecao^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-01","uperro")    = "labRot()-03"
 
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-02","uperro")    = "labRot()-03"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-02","abre(")     = "labRot()-05"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-02","espaco")    = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-02","fim")       = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-03","rotina")    = "labRot()-04^^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-03","indirecao") = "labRot()-04^indirecao^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-03","fim")       = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-04","espaco")    = "labRot()-04"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-04","fim")       = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-04","abre(")     = "labRot()-05"
 
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-05","espaco")    = "labRot()-05"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-05","tab")       = "labRot()-05"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-05","virgula")   = "labRot()-05"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-05","ponto")     = "labRot()-07"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-05","fecha)")    = "^^<ok>"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-05","{direta}")  = "labRot()-06^expressao"
   
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-06","espaco")    = "labRot()-06"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-06","tab")       = "labRot()-06"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-06","virgula")   = "labRot()-05"
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-06","fecha)")    = "^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","labRot()","labRot()-07","variavel")  = "labRot()-06"
 
 // Comando - include
 
 set ^%Src2SourceSyntax("syntax","include","include-01","include")  = "include-02"
   
 set ^%Src2SourceSyntax("syntax","include","include-02","ident")    = "include-03^^<ok>"
 
 set ^%Src2SourceSyntax("syntax","include","include-03","espaco")   = "include-03"
 set ^%Src2SourceSyntax("syntax","include","include-03","tab")      = "include-03"
 set ^%Src2SourceSyntax("syntax","include","include-03","variavel") = "^^<ok>"
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.SourceSyntaxConv">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Parameter name="AUTOR">
<Default>Ederson E. Jantsch</Default>
</Parameter>

<Parameter name="SISTEMA">
<Default>Utilitários</Default>
</Parameter>

<Parameter name="TABELA">
<Default>Validador de Sintax Caché Code</Default>
</Parameter>

<Parameter name="TITULO">
<Default>Validador de Sintax Caché Code</Default>
</Parameter>

<Parameter name="SITUACAO">
<Default>1</Default>
</Parameter>

<Method name="ConverterGrupoRotinas">
<Description>

[ ] Converter o fonte das classes também
[ ] Converter na mão também as rotinas com COS
[ ] Implementar desvio de rotinas inativas e QGs

set sc = ##class(Src2.Item).ValidarItem("CCTCP02*.MAC", , .qtdItens, .tabItens)

set sc = ##class(Src2.SourceSyntaxConv).ConverterGrupoRotinas("CCTCPRG000.MAC")
set sc = ##class(Src2.SourceSyntaxConv).ConverterGrupoRotinas("CCTCPRG005.MAC")
set sc = ##class(Src2.SourceSyntaxConv).ConverterGrupoRotinas("CCTCPRG*.MAC")
set sc = ##class(Src2.SourceSyntaxConv).ConverterGrupoRotinas("CCTCP02*.MAC")
set sc = ##class(Src2.SourceSyntaxConv).ConverterGrupoRotinas("CCTCP*.MAC")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>grupo:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace)
 quit:sc'=1 sc
 
 set tabItensNaoConv("CCUTIINTEGRA") = ""
 set tabItensNaoConv("%CSINTEGRA") = ""
 set tabItensNaoConv("%CSUTICSP") = ""
 
 set dataHora = $translate($zdatetime($horolog,3),": ","-_")
 set dsGrupo = $translate($piece(grupo,"."),"*","")
 
 set arquivoLog = caminhoWorkspace_"\temp\log_conv_"_dataHora_"_"_dsGrupo_".txt"
 
 set objFile = ##class(%File).%New(arquivoLog)
 do objFile.Open("WSN")
 if ('objFile.IsOpen) {
   set objFile = ""
   quit "Erro ao gerar o arquivo de log "_arquivoLog_"!"
 }
 
 set sc = ##class(Src2.SourceSyntaxConf).Configurar()
 
 set sc = ##class(Src2.Item).ValidarItem(grupo, , .qtdItens, .tabItens)
 quit:sc'=1 sc
 
 set sc = objFile.WriteLine(##class(Src2.Utils).ObterBarra())
 
 set (qtdConvert, qtdNConvert, qtdErros) = ""
 
 set InternalName = ""
 for {
   set InternalName = $order(tabItens(InternalName))
   if (InternalName = "") quit
   
   set sc = ##class(Src2.Item).ObterInfoInternalName(InternalName, .item, .extensao)
   
   if (extensao '= "mac") ! (item = "") continue
   
   if ($data(tabItensNaoConv(item))) continue
   
   set sc = ##class(Src2.Rotina).ValidarRotinaAtiva(item)
   
   if (sc'=$$$OK) {
     set qtdNConvert = qtdNConvert + 1
     write !,"Rotina: ",##class(Src2.Utils).Just(InternalName, 20)_" [INATIVA]"
     set sc = objFile.WriteLine(##class(Src2.Utils).ObterBarra(InternalName_" [OK] - [INATIVA]","-"))
     continue
   }
   
   set sc = ##class(Src2.SourceSyntaxConv).ConverterRotina(item, item, .flgConv, .tabErros)
   
   if ('$data(tabErros)) {
     if (flgConv) {
       set qtdConvert = qtdConvert + 1
       write !,"Rotina: ",##class(Src2.Utils).Just(InternalName, 20)_" [CONVERTIDA]"
       set sc = objFile.WriteLine(##class(Src2.Utils).ObterBarra(InternalName_" [OK] - [CONVERTIDA]","-"))
     } else {
       set qtdNConvert = qtdNConvert + 1
       write !,"Rotina: ",##class(Src2.Utils).Just(InternalName, 20)_" [NAO CONVERTIDA]"
       set sc = objFile.WriteLine(##class(Src2.Utils).ObterBarra(InternalName_" [OK] - [NAO CONVERTIDA]","-"))
     }
     continue
   }
   
   set qtdErros = qtdErros + 1
   
   write !,"Rotina: ",##class(Src2.Utils).Just(InternalName, 20)_" [ERRO]"
   
   if $data(tabErros(10)) {
     set sc = objFile.WriteLine(##class(Src2.Utils).ObterBarra(InternalName_" - [ERRO] [CONVERSAO]","-"))
     set codSeq = ""
     for {
       set codSeq = $order(tabErros(10,codSeq))
       if (codSeq = "") quit
       set sc = objFile.WriteLine($justify(codSeq,5)_": "_$get(tabErros(10,codSeq)))
     }
   }
   if $data(tabErros(2)) {
     set sc = objFile.WriteLine(##class(Src2.Utils).ObterBarra(InternalName_" - [ERRO] [COMPILACAO]","-"))
     set codSeq = ""
     for {
       set codSeq = $order(tabErros(10,codSeq))
       if (codSeq = "") quit
       set sc = objFile.WriteLine($get(tabErros(10,codSeq)))
     }
   }
   if $data(tabErros(3)) {
     set sc = objFile.WriteLine(##class(Src2.Utils).ObterBarra(InternalName_" - [ERRO] [GERACAO CSP]","-"))
     set codSeq = ""
     for {
       set codSeq = $order(tabErros(10,codSeq))
       if (codSeq = "") quit
       set sc = objFile.WriteLine($get(tabErros(10,codSeq)))
     }
   }
 }
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 set sc = objFile.WriteLine(##class(Src2.Utils).ObterBarra("Resumo"))
 set sc = objFile.WriteLine("Grupo de Rotinas: "_grupo)
 set sc = objFile.WriteLine("Total: "_qtdItens_" / Convertidas: "_qtdConvert_" / Não Convertida: "_qtdNConvert_" / ERROS: "_qtdErros)
 set sc = objFile.WriteLine("Tempo: "_tempoTotalEdt)
 set sc = objFile.WriteLine(##class(Src2.Utils).ObterBarra())
 
 do objFile.Close()
 set objFile = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ConverterRotina">
<Description>

Converter Rotina

  tipoConv = 0 - Converte somente se tiver macro (Padrão)
             1 - Converte sempre

set sc = ##class(Src2.SourceSyntaxConv).ConverterRotina("XXEJCCFT240", "XXEJCCFT240CONV")
set sc = ##class(Src2.SourceSyntaxConv).ConverterRotina("CCTCOC700RG", "XXEJCCTCOC700RG")
set sc = ##class(Src2.SourceSyntaxConv).ConverterRotina("XXEJCCTCOC700RG", "XXEJCCTCOC700RGCONV")
set sc = ##class(Src2.SourceSyntaxConv).ConverterRotina("CCTCORG002", "XXEJCCTCORG002")
set sc = ##class(Src2.SourceSyntaxConv).ConverterRotina("XXEJCCTCORG000", "XXEJCCTCORG000CONV")
set sc = ##class(Src2.SourceSyntaxConv).ConverterRotina("CCESN100", "XXEJCCESN100")
set sc = ##class(Src2.SourceSyntaxConv).ConverterRotina("CCTCORG006", "XXEJCCTCORG006")
set sc = ##class(Src2.SourceSyntaxConv).ConverterRotina("CCTCPRG000", "XXEJCCTCPRG000")
set sc = ##class(Src2.SourceSyntaxConv).ConverterRotina("CCUTIRG001", "XXEJCCUTIRG001", .flgConv, .tabErrosCompCS)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[rotina:%String,rotinaDest:%String="",&flgConv:%Boolean,&tabErros:%String,&tipoConv:%Integer=0]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabErros
 
 set flgConv = 0
 
 if (rotinaDest = "") set rotinaDest = rotina
 
 set linFim = $order(^rMAC(rotina,0,"LANG"),-1)
 
 set tabStrings("$$MsgLock^%CSW1F(") = "$$$MsgLock("
 set tabStrings("$$Error^%CSUTICSP(10000,") = "$$$ERROR(10000,"
 
 set tabStringsFull($char(9)_"new Z,z,Y,y,V,v set Z=""^"",z=""^"",Y="";"",y="";"",V="","",v="",""") = $char(9)_"$$$VAR"
 
 set (flgTemMacro, flgIncMacro) = 0
 
 for lin = 1:1:$get(^rMAC(rotina,0,0)) {
   set linha = $get(^rMAC(rotina,0,lin))
   
   if (linha [ "<naoconverter>") {
     set tabRotina(lin) = linha
     continue
   }
   
   set sc = ##class(Src2.SourceSyntax).ObterExpressoes(linha, .tabExpressao)
   
   set sc = ##class(Src2.SourceSyntax).ValidarSyntax(.tabExpressao)
   if (sc '= 1) {
     set tabRotina(lin) = linha
     set tabErrosCompCS(lin) = linha
     continue
   }
   
   if (linha [ "#include %CSUTICSP") {
     set tabStringsFull($char(9)_"quit 1") = $char(9)_"quit $$$OK"
     set flgTemMacro = 1
   }
   
   set sc = ##class(Src2.SourceSyntaxConv).ObterLinhaConvExpressao(.tabExpressao, .linhaRet, .flgMacro)
   if flgMacro set flgIncMacro = 1
   
   set sc = ##class(Src2.SourceSyntaxConv).TrocarStrings(.linhaRet, .flgMacro, .tabStrings, .tabStringsFull)
   if flgMacro set flgIncMacro = 1
   
   set tabRotina(lin) = linhaRet
 }
 
 merge tabErros(10) = tabErrosCompCS
 
 if (tipoConv = 0) & ('flgIncMacro) quit $$$OK
 
 set flgConv = 1
 
 if ('flgTemMacro) {
   set sc = ##class(Src2.SourceSyntaxConv).IncluirInclude(.tabRotina)
 }
 
 set strOpcoes = "csp;workspace"
 
 set sc = ##class(Src2.Rotina).GerarRotinaArquivo(, rotinaDest, "csp;workspace", .tabErrosTemp, .tabOK, .tabRotina)
 
 merge tabErros = tabErrosTemp
 
 quit sc
]]></Implementation>
</Method>

<Method name="ObterLinhaConvExpressao">
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tabExpressao:%String,&linha:%Integer,&flgMacro:%Integer]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set flgMacro = 0
 
 // Troca as funções caché ($principal / $io / $job) por macros
 
 set tabFuncoes("principal") = ""
 set tabFuncoes("io") = ""
 set tabFuncoes("job") = ""
 set tabFuncoes("horolog") = ""
 
 set codSeq = ""
 for {
   set codSeq = $order(tabExpressao(codSeq))
   if (codSeq = "") quit
   
   if (($list($get(tabExpressao(codSeq)),2) '= "funcCache")) continue
   
   if ($data(tabFuncoes($list($get(tabExpressao(codSeq)),1)))) {
     set $list(tabExpressao(codSeq-1),1) = "$$$"
     set flgMacro = 1
   }
 }
 
 // Troca os comandos caché (set / merge / kill / zkill / lock) por macros e funções
 
 set codSeq = ""
 for {
   set codSeq = $order(tabExpressao(codSeq))
   if (codSeq = "") quit
   
   set comando = $list($get(tabExpressao(codSeq)),6)
   
   /*
   if (comando = "set") ! (comando = "merge") {
     set sc = ##class(Src2.SourceSyntaxConv).DepurarSetMerge(.tabExpressao, codSeq, .tab, comando)
   }
   if (comando = "kill") ! (comando = "zkill") {
     set sc = ##class(Src2.SourceSyntaxConv).DepurarKillZKill(.tabExpressao, codSeq, .tab, comando)
   }
   */
   if (comando = "lock") {
     set sc = ##class(Src2.SourceSyntaxConv).DepurarLock(.tabExpressao, codSeq, .tab, comando)
   }
 }
 
 set (codSeq, linha) = ""
 for {
   set codSeq = $order(tabExpressao(codSeq))
    if (codSeq = "") quit
    
    if ('$data(tab("ref",codSeq))) {
      set linha = linha_$list($get(tabExpressao(codSeq)),1)
      continue
    }
    
    set codCmd = $get(tab("ref",codSeq))
    
    if ('$piece($get(tab("cmd",codCmd)),"^",1)) {
      set linha = linha_$list($get(tabExpressao(codSeq)),1)
      continue
    }
    
    set cmd = $piece($get(tab("cmd",codCmd)),"^",3)
    
    /*
    if (cmd = "set") {
      set sc = ##class(Src2.SourceSyntaxConv).MontarSet(.tabExpressao, .linha, .tab, codCmd)
    }
    if (cmd = "merge") {
      set sc = ##class(Src2.SourceSyntaxConv).MontarMerge(.tabExpressao, .linha, .tab, codCmd)
    }
    if (cmd = "kill") {
      set sc = ##class(Src2.SourceSyntaxConv).MontarKillZKill(.tabExpressao, .linha, .tab, codCmd, "kill", "Kill^%CSINTEGRA")
    }
    if (cmd = "zkill") {
      set sc = ##class(Src2.SourceSyntaxConv).MontarKillZKill(.tabExpressao, .linha, .tab, codCmd, "zkill", "ZKill^%CSINTEGRA")
    }
    if (cmd = "lock") {
      set sc = ##class(Src2.SourceSyntaxConv).MontarLock(.tabExpressao, .linha, .tab, codCmd)
    }
    */
    if (cmd = "lock") {
      set sc = ##class(Src2.SourceSyntaxConv).MontarMacroLock(.tabExpressao, .linha, .tab, codCmd)
      set flgMacro = 1
    }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="TrocarStrings">
<Description>
set sc = ##class(Src2.SourceSyntaxConv).TrocarStrings("else  quit $$Error^%CSUTICSP(10000,$$MsgLock^%CSW1F(Natureza para comprometimento,a,$name(^TCOCFG($$Error^%CSUTICSP(10000,codEmpresa),12,codNatureza))))")
set sc = ##class(Src2.SourceSyntaxConv).TrocarStrings($get(^rMAC("CCTCORG000",0,17)))
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&linha:%Integer,&flgMacro:%Integer,&tabStrings:%Integer,&tabStringsFull:%Integer]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set flgMacro = 0
 
 set string = ""
 for {
   set string = $order(tabStringsFull(string))
   if (string = "") quit
   if (linha '= string) continue
   set linha = $get(tabStringsFull(string))
   set flgMacro = 1
   quit
 }
 
 if (flgMacro) quit $$$OK
 
 set novaLinha = ""
 
 set string = ""
 for {
   set string = $order(tabStrings(string))
   if (string = "") quit
   
   if (linha'[string) continue
   
   set newString = $get(tabStrings(string))
   
   set novaLinha = $piece(linha,string,1)
   
   for cont=2:1:$length(linha,string) {
     set novaLinha = novaLinha_newString_$piece(linha,string,cont)
   }
   
   set linha = novaLinha
   
   set flgMacro = 1
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="DepurarSetMerge">
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tabExpressao:%String,codSeq:%Integer,&tab:%String,cmd:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set syntax = $list($get(tabExpressao(codSeq)),2)
 set tipo = $list($get(tabExpressao(codSeq)),4)
 
 if (syntax = cmd) & (tipo = cmd) {
   set tab("codCmd") = $order(tab("cmd",""),-1) + 1
   set $piece(tab("cmd",tab("codCmd")),"^",3) = cmd
   set (tab("codParte"), tab("codExp")) = 1
   set tab("ref",codSeq) = tab("codCmd")
   kill tab("condicao"),tab("atribuicao")
   quit $$$OK
 }
 
 set tab("ref",codSeq) = tab("codCmd")
 
 if (syntax = cmd) & (tipo = "virgula") {
   set tab("codParte") = tab("codParte") + 1
   set tab("codExp") = tab("codExp") + 1
   kill tab("condicao"),tab("atribuicao")
   quit $$$OK
 }
 
 if (syntax = cmd) & (tipo = "doispontos") {
   set tab("condicao") = ""
   quit $$$OK
 }
 
 if (syntax = cmd) & (tipo = "espaco") {
   kill tab("condicao")
   quit $$$OK
 }
 
 if ($data(tab("condicao"))) {
   set tab("cmd",tab("codCmd"),2,":",codSeq) = ""
   quit $$$OK
 }
 
 if ((syntax = "exprAtrib") ! (syntax = "exprAtrib2"))  {
   if (tipo = "virgula") {
     set tab("codExp") = tab("codExp") + 1
     kill tab("condicao"),tab("atribuicao")
   }
   quit $$$OK
 }
 
 if (syntax = cmd) & (tipo = "atribuicao") {
   set tab("atribuicao") = ""
   quit $$$OK
 }
 
 if ($data(tab("atribuicao"))) {
   set tab("cmd",tab("codCmd"),1,tab("codParte"),2,"=",codSeq) = ""
   quit $$$OK
 }
 
 if (syntax = "variavel") & (tipo = "uperro") {
   if (##class(Src2.SourceSyntaxConv).ValidarGlobal($get(tabExpressao(codSeq+1)))) {
     set $piece(tab("cmd",tab("codCmd")),"^",1) = 1
     set tab("cmd",tab("codCmd"),1,tab("codParte"),1,tab("codExp")) = 1
   }
 }
 
 set tab("cmd",tab("codCmd"),1,tab("codParte"),1,tab("codExp"),codSeq) = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="DepurarKillZKill">
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tabExpressao:%String,codSeq:%Integer,&tab:%String,cmd:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set syntax = $list($get(tabExpressao(codSeq)),2)
 set tipo = $list($get(tabExpressao(codSeq)),4)
 
 if (syntax = "kill") & (tipo = cmd) {
   set tab("codCmd") = $order(tab("cmd",""),-1) + 1
   set $piece(tab("cmd",tab("codCmd")),"^",3) = tipo
   set (tab("codParte"), tab("codExp")) = 1
   set tab("ref",codSeq) = tab("codCmd")
   kill tab("condicao")
   quit $$$OK
 }
 
 set tab("ref",codSeq) = tab("codCmd")
 
 if (syntax = "kill") & (tipo = "virgula") {
   set tab("codParte") = tab("codParte") + 1
   set tab("codExp") = tab("codExp") + 1
   kill tab("condicao")
   quit $$$OK
 }
 
 if (syntax = "kill") & (tipo = "doispontos") {
   set tab("condicao") = ""
   quit $$$OK
 }
 
 if (syntax = "kill") & (tipo = "espaco") {
   kill tab("condicao")
   quit $$$OK
 }
 
 if ($data(tab("condicao"))) {
   set tab("cmd",tab("codCmd"),2,":",codSeq) = ""
   quit $$$OK
 }
 
 if ((syntax = "exprAtrib") ! (syntax = "exprAtrib2"))  {
   if (tipo = "virgula") {
     set tab("codExp") = tab("codExp") + 1
     kill tab("condicao")
   }
   quit $$$OK
 }
 
 if (syntax = "variavel") & (tipo = "uperro") {
   if (##class(Src2.SourceSyntaxConv).ValidarGlobal($get(tabExpressao(codSeq+1)))) {
     set $piece(tab("cmd",tab("codCmd")),"^",1) = 1
     set tab("cmd",tab("codCmd"),1,tab("codParte"),1,tab("codExp")) = 1
   }
 }
 
 set tab("cmd",tab("codCmd"),1,tab("codParte"),1,tab("codExp"),codSeq) = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="DepurarLock">
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tabExpressao:%String,codSeq:%Integer,&tab:%String,cmd:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set syntax = $list($get(tabExpressao(codSeq)),2)
 set fase = $list($get(tabExpressao(codSeq)),3)
 set tipo = $list($get(tabExpressao(codSeq)),4)
 
 if (syntax = "lock") & (tipo = cmd) {
   set tab("codCmd") = $order(tab("cmd",""),-1) + 1
   set $piece(tab("cmd",tab("codCmd")),"^",1) = 1
   set $piece(tab("cmd",tab("codCmd")),"^",3) = tipo
   set (tab("codParte"), tab("codExp")) = 1
   set tab("ref",codSeq) = tab("codCmd")
   kill tab("doispontos"),tab("condicao")
   quit $$$OK
 }
 
 set tab("ref",codSeq) = tab("codCmd")
 
 if (syntax = "lock") & (tipo = "virgula") {
   set tab("codParte") = tab("codParte") + 1
   set tab("codExp") = tab("codExp") + 1
   kill tab("doispontos"),tab("condicao")
   quit $$$OK
 }
 
 if (syntax = "lock") & (fase = "lock-02") & (tipo = "doispontos") {
   set tab("condicao") = ""
   quit $$$OK
 }
 
 if (syntax = "lock") & (tipo = "espaco") {
   kill tab("condicao")
   quit $$$OK
 }
 
 if ($data(tab("condicao"))) {
   set tab("cmd",tab("codCmd"),2,":",codSeq) = ""
   quit $$$OK
 }
 
 if ((syntax = "exprAtrib") ! (syntax = "exprAtrib2"))  {
   if (tipo = "virgula") {
     set tab("codExp") = tab("codExp") + 1
     kill tab("doispontos"),tab("condicao")
   }
   quit $$$OK
 }
 
 if (syntax = "lock") & ((tipo = "+") ! (tipo = "-")) {
   set tab("cmd",tab("codCmd"),1,tab("codParte"),2,"tipo") = tipo
   quit $$$OK
 }
 
 if (syntax = cmd) & (tipo = "doispontos") {
   set tab("doispontos") = ""
   quit $$$OK
 }
 
 if ($data(tab("doispontos"))) {
   set tab("cmd",tab("codCmd"),1,tab("codParte"),2,":",codSeq) = ""
   quit $$$OK
 }
 
 set tab("cmd",tab("codCmd"),1,tab("codParte"),1,tab("codExp"),codSeq) = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="MontarSet">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabExpressao:%String,linha:%String,tab:%String,codCmd:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ($piece($get(tab("cmd",codCmd)),"^",2) = 1) quit $$$OK
 
 set condicao = ""
 
 if ($data(tab("cmd",codCmd,2,":"))) {
   set condicao = ":"
   kill tabSeq
   merge tabSeq = tab("cmd",codCmd,2,":")
   set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .condicao)
 }
 
 set (codParte,codSeq,flag) = ""
 for {
   set codParte = $order(tab("cmd",codCmd,1,codParte))
   if (codParte = "") quit
   
   set codExp = ""
   for {
     set codExp = $order(tab("cmd",codCmd,1,codParte,1,codExp))
     if (codExp = "") quit
     set global = $get(tab("cmd",codCmd,1,codParte,1,codExp))
     
     kill tabSeq
     merge tabSeq = tab("cmd",codCmd,1,codParte,1,codExp)
     
     if (global) {
       set sc = ##class(Src2.SourceSyntaxConv).ObterTipoSet(.tabExpressao, .tabSeq, .cmd, .parametro)
       
       if (flag = "") { set linha = linha_"do"_condicao_" "_cmd_"("_parametro }
       if (flag = "comando") { set linha = linha_" do"_condicao_" "_cmd_"("_parametro }
       if (flag = "funcao") { set linha = linha_","_cmd_"("_parametro }
       set flag = "funcao"
     } else {
       if (flag = "") { set linha = linha_"set"_condicao_" " }
       if (flag = "funcao") { set linha = linha_" "_"set"_condicao_" " }
       if (flag = "comando") { set linha = linha_"," }
       set flag = "comando"
       
       set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .linha, 0)
     }
     
     if (global) { set linha = linha_"," }
     else { set linha = linha_"=" }
     
     kill tabSeq
     merge tabSeq = tab("cmd",codCmd,1,codParte,2,"=")
     set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .linha, 0)
     
     if (global) { set linha = linha_")" }
   }
 }
 
 set $piece(tab("cmd",codCmd),"^",2) = 1
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTipoSet">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabExpressao:%String,tabSeq:%String,cmd:%String,parametro:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set cmd = "Set^%CSINTEGRA"
 
 set parametro = """"
 
 set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .parametro, 1)
 
 set parametro = parametro _ """"
 
 set codSeq = $order(tabSeq(""))
 if (codSeq = "") quit $$$OK
 
 set codSeq = $order(tabSeq(codSeq))
 if (codSeq = "") quit $$$OK
 
 set var = $list($get(tabExpressao(codSeq)),1)
 set syntax = $list($get(tabExpressao(codSeq)),2)
 set tipo = $list($get(tabExpressao(codSeq)),4)
 
 if (var '= "piece") ! (syntax '= "funcCache") ! (tipo '= "ident") quit $$$OK
 
 set cmd = "SetPiece^%CSINTEGRA"
 
 set nivel = 0
 set parametro = 1
 
 for {
   set codSeq = $order(tabSeq(codSeq))
   if (codSeq = "") quit
   set syntax = $list($get(tabExpressao(codSeq)),2)
   set tipo = $list($get(tabExpressao(codSeq)),4)
   
   if (syntax = "funcCache") & (tipo = "abre(") {
     set nivel = nivel + 1
     if (nivel '> 1) continue
   }
   
   if (syntax = "funcCache") & (tipo = "fecha)") {
     set nivel = nivel - 1
     if (nivel '> 0) continue
   }
   
   if (syntax = "funcCache") & (tipo = "virgula") & (nivel = 1) {
     set parametro = parametro + 1
     continue
   }
   
   set tabFunc(parametro,codSeq) = ""
 }
 
 set parametro = """"
 
 kill tabSeq2
 merge tabSeq2 = tabFunc(1)
 set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq2, .parametro, 1)
 
 set parametro = parametro _ ""","
 
 kill tabSeq2
 merge tabSeq2 = tabFunc(2)
 set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq2, .parametro, 0)
 
 set parametro = parametro _ ","
 
 kill tabSeq2
 merge tabSeq2 = tabFunc(3)
 set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq2, .parametro, 0)
 
 set parametro = parametro _ ","
 
 kill tabSeq2
 merge tabSeq2 = tabFunc(4)
 set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq2, .parametro, 0)
]]></Implementation>
</Method>

<Method name="MontarMerge">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabExpressao:%String,linha:%String,tab:%String,codCmd:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ($piece($get(tab("cmd",codCmd)),"^",2) = 1) quit $$$OK
 
 set condicao = ""
 
 if ($data(tab("cmd",codCmd,2,":"))) {
   set condicao = ":"
   kill tabSeq
   merge tabSeq = tab("cmd",codCmd,2,":")
   set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .condicao)
 }
 
 set (codParte,codSeq,flag) = ""
 for {
   set codParte = $order(tab("cmd",codCmd,1,codParte))
   if (codParte = "") quit
   
   set codExp = ""
   for {
     set codExp = $order(tab("cmd",codCmd,1,codParte,1,codExp))
     if (codExp = "") quit
     set global = $get(tab("cmd",codCmd,1,codParte,1,codExp))
     
     if (global) {
       if (flag = "") { set linha = linha_"do"_condicao_" Merge^%CSINTEGRA(""" }
       if (flag = "comando") { set linha = linha_" do"_condicao_" Merge^%CSINTEGRA(""" }
       if (flag = "funcao") { set linha = linha_",Merge^%CSINTEGRA(""" }
       set flag = "funcao"
     } else {
       if (flag = "") { set linha = linha_"merge"_condicao_" " }
       if (flag = "funcao") { set linha = linha_" merge"_condicao_" " }
       if (flag = "comando") { set linha = linha_"," }
       set flag = "comando"
     }
     
     kill tabSeq
     merge tabSeq = tab("cmd",codCmd,1,codParte,1,codExp)
     set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .linha, global)
     
     if (global) { set linha = linha_""",""" set texto = 1 }
     else { set linha = linha_"=" set texto = 0 }
     
     kill tabSeq
     merge tabSeq = tab("cmd",codCmd,1,codParte,2,"=")
     set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .linha, texto)
     
     if (global) { set linha = linha_""")" }
   }
 }
 
 set $piece(tab("cmd",codCmd),"^",2) = 1
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="MontarKillZKill">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabExpressao:%String,linha:%String,tab:%String,codCmd:%String,cmd:%String,cmd2:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ($piece($get(tab("cmd",codCmd)),"^",2) = 1) quit $$$OK
 
 set condicao = ""
 
 if ($data(tab("cmd",codCmd,2,":"))) {
   set condicao = ":"
   kill tabSeq
   merge tabSeq = tab("cmd",codCmd,2,":")
   set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .condicao)
 }
 
 set (codParte,codSeq,codExp,flag) = ""
 for {
   set codParte = $order(tab("cmd",codCmd,1,codParte))
   if (codParte = "") quit
   for {
     set codExp = $order(tab("cmd",codCmd,1,codParte,1,codExp))
     if (codExp = "") quit
     set global = $get(tab("cmd",codCmd,1,codParte,1,codExp))
     
     if (global) {
       if (flag = "") { set linha = linha_"do"_condicao_" "_cmd2_"(""" }
       if (flag = "comando") { set linha = linha_" do"_condicao_" "_cmd2_"(""" }
       if (flag = "funcao") { set linha = linha_","_cmd2_"(""" }
       set flag = "funcao"
     } else {
       if (flag = "") { set linha = linha_cmd_condicao_" " }
       if (flag = "funcao") { set linha = linha_" "_cmd_condicao_" " }
       if (flag = "comando") { set linha = linha_"," }
       set flag = "comando"
     }
     
     kill tabSeq
     merge tabSeq = tab("cmd",codCmd,1,codParte,1,codExp)
     set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .linha, global)
     
     if global { set linha = linha_""")" }
   }
 }
 
 set $piece(tab("cmd",codCmd),"^",2) = 1
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="MontarLock">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabExpressao:%String,linha:%String,tab:%String,codCmd:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ($piece($get(tab("cmd",codCmd)),"^",2) = 1) quit $$$OK
 
 set condicao = ""
 
 if ($data(tab("cmd",codCmd,2,":"))) {
   set condicao = ":"
   kill tabSeq
   merge tabSeq = tab("cmd",codCmd,2,":")
   set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .condicao)
 }
 
 set (codParte,codSeq,codExp,ultComando) = ""
 for {
   set codParte = $order(tab("cmd",codCmd,1,codParte))
   if (codParte = "") quit
   for {
     set codExp = $order(tab("cmd",codCmd,1,codParte,1,codExp))
     if (codExp = "") quit
     
     set tipo = $get(tab("cmd",codCmd,1,codParte,2,"tipo"))
     
     set comando = "do"_condicao_" "
     set comando2 = ""
     if (condicao = "") , (tipo '= "-") & ($data(tab("cmd",codCmd,1,codParte,2,":"))) {
       set comando = "if $$"
       set comando2 = "$$"
     }
     
     if (ultComando = "") { set linha = linha_comando_"Lock^%CSINTEGRA(" }
     elseif (ultComando = comando) { set linha = linha_","_comando2_"Lock^%CSINTEGRA(" }
     else { set linha = linha_" "_comando_"Lock^%CSINTEGRA(" }
     
     if ($data(tab("cmd",codCmd,1,codParte,2,"tipo"))) {
       set linha = linha_""""_tipo_""","""
     } else {
       set linha = linha_","""
     }
     
     kill tabSeq
     merge tabSeq = tab("cmd",codCmd,1,codParte,1,codExp)
     set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .linha, 1)
     
     set linha = linha_""""
     
     if ($data(tab("cmd",codCmd,1,codParte,2,":"))) {
       set linha = linha_","
       
       kill tabSeq
       merge tabSeq = tab("cmd",codCmd,1,codParte,2,":")
       set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .linha)
     }
     
     set linha = linha_")"
     
     set ultComando = comando
   }
 }
 
 set $piece(tab("cmd",codCmd),"^",2) = 1
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="MontarMacroLock">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabExpressao:%String,linha:%String,tab:%String,codCmd:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ($piece($get(tab("cmd",codCmd)),"^",2) = 1) quit $$$OK
 
 set condicao = ""
 
 if ($data(tab("cmd",codCmd,2,":"))) {
   set condicao = ":"
   kill tabSeq
   merge tabSeq = tab("cmd",codCmd,2,":")
   set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .condicao)
 }
 
 set (codParte,codSeq,codExp,ultComando) = ""
 for {
   set codParte = $order(tab("cmd",codCmd,1,codParte))
   if (codParte = "") quit
   for {
     set codExp = $order(tab("cmd",codCmd,1,codParte,1,codExp))
     if (codExp = "") quit
     
     set tipo = $get(tab("cmd",codCmd,1,codParte,2,"tipo"))
     
     set comando = "do"_condicao_" $$$DoLock("
     set comando2 = "$$$DoLock("
     if (condicao = "") , (tipo '= "-") & ($data(tab("cmd",codCmd,1,codParte,2,":"))) {
       set comando = "if $$$IfLock("
       set comando2 = "$$$IfLock("
     }
     
     if (ultComando = "") { set linha = linha_comando }
     elseif (ultComando = comando) { set linha = linha_","_comando2 }
     else { set linha = linha_" "_comando }
     
     if ($data(tab("cmd",codCmd,1,codParte,2,"tipo"))) {
       set linha = linha_""""_tipo_""","""
     } else {
       set linha = linha_","""
     }
     
     kill tabSeq
     merge tabSeq = tab("cmd",codCmd,1,codParte,1,codExp)
     set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .linha, 1)
     
     set linha = linha_""""
     
     if ($data(tab("cmd",codCmd,1,codParte,2,":"))) {
       set linha = linha_","
       
       kill tabSeq
       merge tabSeq = tab("cmd",codCmd,1,codParte,2,":")
       set sc = ##class(Src2.SourceSyntaxConv).ExcreverTabSeq(.tabExpressao, .tabSeq, .linha)
     }
     
     set linha = linha_")"
     
     set ultComando = comando
   }
 }
 
 if ('$data(tab("cmd",codCmd,1))) {
   set linha = linha_"do"_condicao_" $$$UnLockAll()"
   set ultSeq = $order(tab("ref",""),-1)
   if (ultSeq '= "") , $data(tabExpressao(ultSeq+1)) {
     set linha = linha_" "
   }
 }
 
 set $piece(tab("cmd",codCmd),"^",2) = 1
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcreverTabSeq">
<ClassMethod>1</ClassMethod>
<FormalSpec>tabExpressao:%String,tabSeq:%String,linha:%String,texto:%Status=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set codSeq = ""
 for {
   set codSeq = $order(tabSeq(codSeq))
   if (codSeq = "") quit
   set tipo = $list($get(tabExpressao(codSeq)),4)
   if (tipo '= "espaco") & (tipo '= "tab") quit
   kill tabSeq(codSeq)
 }
 
 set codSeq = ""
 for {
   set codSeq = $order(tabSeq(codSeq),-1)
   if (codSeq = "") quit
   set tipo = $list($get(tabExpressao(codSeq)),4)
   if (tipo '= "espaco") & (tipo '= "tab") quit
   kill tabSeq(codSeq)
 }
 
 set codSeq = ""
 for {
   set codSeq = $order(tabSeq(codSeq))
   if (codSeq = "") quit
   
   set var = $list($get(tabExpressao(codSeq)),1)
   set tipo = $list($get(tabExpressao(codSeq)),4)
   
   if (texto) , (tipo = "texto") {
     set var = ##class(Src2.SourceSyntaxConv).ProcessarTexto(var)
   }
   
   set linha = linha_var
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ProcessarTexto">
<ClassMethod>1</ClassMethod>
<FormalSpec>texto:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set textoRet = $piece(texto,"""",1)
 
 for cont = 2:1:$length(texto,"""") {
   set textoRet = textoRet_""""""_$piece(texto,"""",cont)
 }
 
 quit ""_textoRet_""
]]></Implementation>
</Method>

<Method name="ValidarGlobal">
<ClassMethod>1</ClassMethod>
<FormalSpec>express:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (express = "") quit 0
 
 if ($list(express,2) '= "variavel") ! ($list(express,4) '= "variavel") quit 0
 
 set global = $list(express,1)
 
 // TODO - verificar com o Marcio a tabela de globais / indices
 ;if $data(tabGlobais(global)) quit $$$OK
 
 set num = 0
 for cont = 1:1:$length(global) {
   if ($extract(global,cont)?.N) { set num = num + 1 }
 }
 
 if (num > 1) quit 0
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="IncluirInclude">
<Description>
set sc = ##class(Src2.SourceSyntaxConv).IncluirInclude(.tabRotina)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabRotina]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (lin, flag) = ""
 for {
   set lin = $order(tabRotina(lin))
   if (lin = "") quit
   set var = $get(tabRotina(lin))
   
   if (('flag) & (var = ($char(9)_";"))) {
     set flag = 1
     set tabTemp($order(tabTemp(""),-1)+1) = var
     set tabTemp($order(tabTemp(""),-1)+1) = $char(9)_"#include %CSUTICSP"
     set tabTemp($order(tabTemp(""),-1)+1) = $char(9)_";"
     continue
   }
   
   set tabTemp($order(tabTemp(""),-1)+1) = var
 }
 
 kill tabRotina
 merge tabRotina = tabTemp
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Svn">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="CheckoutStr">
<Description>

Realiza um Svn Checkout Atualizando os Fontes no Caché (por string)
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 
 set (flagCsp, flagCompClasse) = 0
 
 set sistema = $zconvert($get(tabInf("Sistema")),"l")
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema(sistema, .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   quit $$$OK
 }
 
 set revisao = $get(tabInf("Revisão"))
 
 if ($zconvert($get(tabInf("Gerar CSP")),"l") = "sim") {
   set flagCsp = 1
 }
 
 if ($zconvert($get(tabInf("Compilar Classes")),"l") = "sim") {
   set flagCompClasse = 1
 }
 
 if (projeto '= "") & (revisao '= "") {
   set sc = ##class(Src2.Svn).Checkout(projeto, revisao, username, password, flagCsp, flagCompClasse)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="Checkout">
<Description>

Realiza um Svn Checkout Atualizando os Fontes no Caché

set sc = ##class(Src2.Svn).Checkout("csw63", "36")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,revisao:%String="head",username:%String="",password:%String="",flagCsp:%Boolean=0,flagCompClasse:%Boolean=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Checkout | "_$zdatetime(timestampInicio,4))
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 if (##class(%File).Exists(caminhoCopiaTrabalho)) {
   write !,"Source Control: Diretório já existe"
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 write !,"Excluíndo os itens do sistema: "_sistema,!
 
 set sc = ##class(Src2.Item).ExcluirItensSistema(sistema)
 
 write !!,"Iniciado o checkout do projeto: "_projeto,!
 
 set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "checkout --revision "_revisao_" "_urlRepositorio_" "_caminhoCopiaTrabalho, username, password, , arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp, "checkout", .nrRevisao, .tabFlags)
 
 set sc = ##class(Src2.Utils).AtualizarFlagsAntesImportFontes(projeto, .tabFlags)
 
 set strOpcoesRotinas = ""
 
 if (flagCsp) { set strOpcoesRotinas = "csp" }
 
 set tipoFlag = 1
 if (flagCompClasse) set tipoFlag = 2
 
 set flagCompClasses = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(tipoFlag)
 
 set sc = ##class(Src2.Item).ImportarFontes(codTerm, strOpcoesRotinas, flagCompClasses)
 
 kill ^mtempInfoArquivo(codTerm)
 
 if (nrRevisao = "") {
   write !,"Não foi possível conectar ao subversion"
   set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
   write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Tempo: "_tempoTotalEdt)
   quit "Não foi possível conectar ao subversion"
 }
 
 set ^Src2Config("projetorev",projeto) = nrRevisao
 
 write !,"Check-out da revisão "_nrRevisao
 
 set sc = ##class(Src2.Utils).AtualizarFlagsAposImportFontes(projeto, .tabFlags, username, password)
 
 write !,"Encerrado o checkout do projeto: "_projeto
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_nrRevisao_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Checkout | Projeto: "_projeto_" | Revisão: "_nrRevisao_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="UpdateTodosProjetos">
<Description>

Realiza um Svn Update Atualizando os Fontes no Caché de Todos os Projetos
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set projeto = ""
 for {
   set projeto = $order(^Src2Config("projetorev",projeto))
   if (projeto = "") quit
   set sc = ##class(Src2.Svn).Update(projeto, , username, password)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="UpdateStr">
<Description>

Realiza um Svn Update Atualizando os Fontes no Caché (por string)
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 
 set sistema = $zconvert($get(tabInf("Sistema")),"l")
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema(sistema, .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   quit $$$OK
 }
 
 set revisao = $get(tabInf("Revisão"))
 
 if (projeto '= "") & (revisao '= "") {
   set sc = ##class(Src2.Svn).Update(projeto, revisao, username, password)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="Update">
<Description>

Realiza um Svn Update Atualizando os Fontes no Caché

set sc = ##class(Src2.Svn).Update("csw63")
set sc = ##class(Src2.Svn).Update("csw63", "36")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,revisao:%String="head",username:%String="",password:%String="",autenticacao:%String="",flgUrlRepos:%Boolean=1,flgUpdateDifHead:%Boolean=1</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Update | "_$zdatetime(timestampInicio,4))
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual, .versao, .rotinaVersao, , , , .descProjeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ValidarWorkspaceProjeto(projeto, , , flgUrlRepos)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set anoSemana = ##class(Src2.Utils2).ObterAnoSemana()
 
 // Faz esta validação somente uma vez por semana
 if ('$data(^Src2Config("update",anoSemana,projeto))) && (sistema '= "cswutil") && (username '= "ederson.jantsch") {
   // Verifica sem tem arquivos com conflito ou não versionados na cópia de trabalho
   set msgsc = ##class(Src2.Utils).ValidarSitArqCopiaTrab(projeto, , username, password)
   if (msgsc '= $$$OK) {
     write !,"Source Control: "_msgsc
     write !,##class(Src2.Utils).ObterBarra()
     quit sc
   }
   set ^Src2Config("update",anoSemana,projeto) = ""
 }
 
 set sc = ##class(Src2.Utils2).LockProjeto(projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 // Caso seja um update que não seja para o head, a cópia de trabalho não
 //   pode ter alterações pendentes de commit.
 if (flgUpdateDifHead) , (revisao '= "head") {
   set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "status "_caminhoCopiaTrabalho, username, password, autenticacao, arquivoTemp)
   if (sc '= $$$OK) {
     write !,"Source Control: "_sc
     write !,##class(Src2.Utils).ObterBarra()
     set sc = ##class(Src2.Utils2).UnLockProjeto(projeto)
     quit sc
   }
   
   set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp, "status")
   
   if $data(^mtempInfoArquivo(codTerm,"status")) {
     kill ^mtempInfoArquivo(codTerm)
     write !,"A cópia de trabalho não pode ter alterações para update diferente de head"
     set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
     write !,##class(Src2.Utils).ObterBarra("Projeto: "_descProjeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
     set sc = ##class(Src2.Utils2).UnLockProjeto(projeto)
     quit sc
   }
 }
 
 write !,"Iniciado o update do projeto: "_descProjeto,!
 
 set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "update --revision "_revisao_" --accept postpone "_caminhoCopiaTrabalho, username, password, autenticacao, arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   set sc = ##class(Src2.Utils2).UnLockProjeto(projeto)
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp, "update", .nrRevisao, .tabFlags)
 
 set sc = ##class(Src2.Utils).CarregarItensPastasExcluidas(codTerm, projeto)
 
 set sc = ##class(Src2.Utils).AtualizarFlagsAntesImportFontes(projeto, .tabFlags)
 
 set flagCompClasses = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(2)
 
 set sc = ##class(Src2.Item).ImportarFontes(codTerm, "csp", flagCompClasses)
 
 if (nrRevisao = "") {
   write !,"Não foi possível conectar ao subversion"
   set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
   write !,##class(Src2.Utils).ObterBarra("Projeto: "_descProjeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
   kill ^mtempInfoArquivo(codTerm)
   set sc = ##class(Src2.Utils2).UnLockProjeto(projeto)
   quit "Não foi possível conectar ao subversion"
 }
 
 set ^Src2Config("projetorev",projeto) = nrRevisao
 
 write !,"Atualizado para revisão "_nrRevisao
 
 set sc = ##class(Src2.Utils).AtualizarFlagsAposImportFontes(projeto, .tabFlags, username, password, autenticacao)
 
 set msgsc = ##class(Src2.Utils).ObterItensStatus(codTerm, "G", .strItens)
 if (msgsc) {
   write !,"ATENÇÃO - Merged: "_strItens
   set sc = ##class(Src2.Utils).GeraLog(3, "Studio - Update | Projeto: "_projeto_" | Merged: "_strItens)
 }
 
 set msgsc = ##class(Src2.Utils).ObterItensStatus(codTerm, "C", .strItens)
 if (msgsc) {
   write !,"ATENÇÃO - Conflito: "_strItens
   set sc = ##class(Src2.Utils).GeraLog(4, "Studio - Update | Projeto: "_projeto_" | Conflito: "_strItens)
 }
 
 if (rotinaVersao '= "") {
   set msgsc = ##class(Src2.Utils2).GerarRotinaZZZ(rotinaVersao, versao_".x."_nrRevisao, nrRevisao, "Controle de Fonte", $zdatetime($horolog,4), urlRepositorio)
   set msgsc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb(, , 1, .caminhoAplicWeb)
   set sc = ##class(Src2.PatchUtils2).GerarVersaoTxtCsw(versao, caminhoAplicWeb_"versao.txt")
 }
 
 if (sistema = "cswutil") {
   set sc = ##class(Src2.Menu).CriarUsuarioCSW( , , , "CC")
 }
 
 write !,"Encerrado o update do projeto: "_descProjeto
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_descProjeto_" | Revisao: "_nrRevisao_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Update | Projeto: "_descProjeto_" | Revisão: "_revisaoAtual_" => "_nrRevisao_" | Tempo: "_tempoTotalEdt)
 
 kill ^mtempInfoArquivo(codTerm)
 
 set sc = ##class(Src2.Utils2).UnLockProjeto(projeto)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarItensAlteradosStr">
<Description>

Importa os Itens Alterados no Workspace para o Caché (por string)
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 
 set sistema = $zconvert($get(tabInf("Sistema")),"l")
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema(sistema, .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   quit $$$OK
 }
 
 if (projeto '= "") {
   set sc = ##class(Src2.Svn).ImportarItensAlterados(projeto, username, password)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarItensAlterados">
<Description>

Importa os Itens Alterados no Workspace para o Caché

set sc = ##class(Src2.Svn).ImportarItensAlterados("csw63")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Importar Itens Alterados")
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ValidarWorkspaceProjeto(projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 write !,"Iniciando a importação dos itens alterados do projeto: "_projeto,!
 
 set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "status "_caminhoCopiaTrabalho, username, password, , arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp, "status")
 
 set flagCompClasses = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(2)
 
 set sc = ##class(Src2.Item).ImportarFontes(codTerm, "csp", flagCompClasses, 1)
 
 write !,"Encerrada a importação dos itens alterados do projeto: "_projeto
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Importar Itens - Alterados | Projeto: "_projeto_" | Revisão: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 kill ^mtempInfoArquivo(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarTodosItensProjetoStr">
<Description>

Importa Todos os Itens do Workspace para o Caché (por string)
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 
 set (flagCsp, flagCompClasse) = 0
 
 set sistema = $zconvert($get(tabInf("Sistema")),"l")
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema(sistema, .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   quit $$$OK
 }
 
 if ($zconvert($get(tabInf("Gerar CSP")),"l") = "sim") {
   set flagCsp = 1
 }
 
 if ($zconvert($get(tabInf("Compilar Classes")),"l") = "sim") {
   set flagCompClasse = 1
 }
 
 if (projeto '= "") {
   set sc = ##class(Src2.Svn).ImportarTodosItensProjeto(projeto, username, password, flagCsp, flagCompClasse)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarTodosItensProjeto">
<Description>

Importa Todos os Itens do Workspace para o Caché

set sc = ##class(Src2.Svn).ImportarTodosItensProjeto("teste64", "admin", "admin")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,username:%String="",password:%String="",flagCsp:%Boolean=0,flagCompClasse:%Boolean=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Importar Itens Alterados")
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ValidarCopiaTrabalho(caminhoCopiaTrabalho, , .revisaoWorkspace)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 write !,"Excluíndo os itens do sistema: "_sistema,!
 
 set sc = ##class(Src2.Item).ExcluirItensSistema(sistema)
 
 write !,"Iniciando a importação de todos os itens do projeto: "_projeto,!
 
 set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "list -R "_caminhoCopiaTrabalho, username, password, , arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosArquivoSvnList(codTerm, arquivoTemp, urlRepositorio, caminhoCopiaTrabalho)
 
 set strOpcoesRotinas = ""
 if (flagCsp) { set strOpcoesRotinas = "csp" }
 
 set tipoFlag = 1
 if (flagCompClasse) set tipoFlag = 2
 
 set flagCompClasses = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(tipoFlag)
 
 set sc = ##class(Src2.Item).ImportarFontes(codTerm, strOpcoesRotinas, flagCompClasses)
 
 set ^Src2Config("projetorev",projeto) = revisaoWorkspace
 
 write !,"Encerrada a importação de todos os itens do projeto: "_projeto
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoWorkspace_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Importar Itens - Todos | Projeto: "_projeto_" | Revisão: "_revisaoAtual_" => "_revisaoWorkspace_" | Tempo: "_tempoTotalEdt)
 
 kill ^mtempInfoArquivo(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="StatusAlteracoesStr">
<Description>

Gera o Status das Alterações no Projeto (por string)
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 
 set sistema = $zconvert($get(tabInf("Sistema")),"l")
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema(sistema, .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   quit $$$OK
 }
 
 if (projeto '= "") {
   set sc = ##class(Src2.Svn).StatusAlteracoes(projeto, username, password)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="StatusAlteracoes">
<Description>

Gera o Status das Alterações no Projeto

set sc = ##class(Src2.Svn).StatusAlteracoes("csw63")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Source Control - Status do Projeto")
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ValidarWorkspaceProjeto(projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 write !,"Analisando o Log de alterações do projeto: "_projeto
 
 set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "status "_caminhoCopiaTrabalho, username, password, , arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp, "status")
 
 set sc = ##class(Src2.Utils).ObterResumoStatus(codTerm, .tabResumo)
 
 set sc = ##class(Src2.Utils).ObterTiposStatus(.tabTiposStatus)
 
 set status = ""
 for {
   set status = $order(tabResumo(status))
   if (status = "") quit
   set var = $get(tabResumo(status))
   
   write !,##class(Src2.Utils).Just($get(tabTiposStatus(status)), 15)
   write ##class(Src2.Utils).Just("Rotinas: "_$piece(var,"^",1), 14)
   write ##class(Src2.Utils).Just("Classes: "_$piece(var,"^",2), 14)
 }
 
 write !,##class(Src2.Utils).ObterBarra()
 
 set (status, itemId) = ""
 for {
   set status = $order(^mtempInfoArquivo(codTerm,"status",status))
   if (status = "") quit
   set var = $get(tabResumo(status))
   
   write !!,"Status: "_$get(tabTiposStatus(status))_" ("_"Rotinas: "_$piece(var,"^",1)_" / "_"Classes: "_$piece(var,"^",2)_")"
   
   for {
     set itemId = $order(^mtempInfoArquivo(codTerm,"status",status,"rotinas",itemId))
     if (itemId = "") quit
     set sc = ##class(Src2.Item).ObterInfoItemId(itemId, .InternalName)
     set sc = ##class(Src2.Item).ObterDadosArquivoItem(InternalName, .dataAlteracao, .tamanho)
     set dias = 0
     if (dataAlteracao '= "") {
       set dias = ($horolog - dataAlteracao)
       set dataAlteracao = $zdatetime(dataAlteracao,4)
     }
     write !,"  "_##class(Src2.Utils).Just(InternalName, 35)
     write "|  "_$justify($fnumber(tamanho/1024,".",2), 6)_" KB  "
     write "|  "_##class(Src2.Utils).Just(dataAlteracao, 21)
     write "|  "_$justify($fnumber(dias,".",0)_" dias", 8)
   }
   for {
     set itemId = $order(^mtempInfoArquivo(codTerm,"status",status,"classes",itemId))
     if (itemId = "") quit
     set sc = ##class(Src2.Item).ObterInfoItemId(itemId, .InternalName)
     set sc = ##class(Src2.Item).ObterDadosArquivoItem(InternalName, .dataAlteracao, .tamanho)
     set dias = 0
     if (dataAlteracao '= "") {
       set dias = ($horolog - dataAlteracao)
       set dataAlteracao = $zdatetime(dataAlteracao,4)
     }
     write !,"  "_##class(Src2.Utils).Just(InternalName, 35)
     write "|  "_$justify($fnumber(tamanho/1024,".",2), 6)_" KB  "
     write "|  "_##class(Src2.Utils).Just(dataAlteracao, 21)
     write "|  "_$justify($fnumber(dias,".",0)_" dias", 8)
   }
 }
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 kill ^mtempInfoArquivo(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarItem">
<Description>

Exporta o Item
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>InternalName:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Importar Item")
 
 if (InternalName = "") {
   write !,"Source Control: Item não informado"
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, , , .itemCopiaTrabalho, , , , , , .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Item).ImportarItemArquivo(InternalName, 1)
 
 write !,"Importado o item "_InternalName_" do arquivo "_itemCopiaTrabalho
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Importar Item | Projeto: "_projeto_" | "_InternalName_" | Revisão: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarItem">
<Description>

Exporta o Item

set sc = ##class(Src2.Svn).ExportarItem("CCEVA300.mac")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>InternalName:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Exportar Item")
 
 if (InternalName = "") {
   write !,"Source Control: Item não informado"
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, , , .itemCopiaTrabalho, , , , , , .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Item).ExportarItemArquivo(InternalName, , username, password, 1)
 
 write !,"Exportado o item "_InternalName_" para "_itemCopiaTrabalho
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Exportar Item | Projeto: "_projeto_" | "_InternalName_" | Revisão: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ReverterItem">
<Description>

Reverte o Item
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>InternalName:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Reverter Item")
 
 if (InternalName = "") {
   write !,"Source Control: Item não informado"
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, , , .itemCopiaTrabalho, , , , , , .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, , , , .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "revert "_itemCopiaTrabalho, username, password)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Item).ImportarItemArquivo(InternalName, 1)
 
 write !,"Revertidas as alterações do item "_InternalName
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Reverter Item | Projeto: "_projeto_" | "_InternalName_" | Revisão: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ConverterItem">
<Description>

Converter o Item
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>InternalName:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Importar Item")
 
 if (InternalName = "") {
   write !,"Source Control: Item não informado"
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, .item, , .itemCopiaTrabalho, , , , .extensao, , .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 if (extensao '= "mac") {
   write !,"Source Control: Converte somente rotinas"
   write !,##class(Src2.Utils).ObterBarra()
   quit "Converte somente rotinas"
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, , , , .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.SourceSyntaxConv).ConverterRotina(item, , , .tabErros, 1)
 
 write !,"Item convertido "_InternalName
 
 if $data(tabErros(10)) {
   write !,"ERROS: Linhas não convertidas"
   set codSeq = ""
   for {
     set codSeq = $order(tabErros(10,codSeq))
     if (codSeq = "") quit
     write !,"=> "_$justify(codSeq,5)_": "_$get(tabErros(10,codSeq))
   }
 }
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Converter Item | Projeto: "_projeto_" | "_InternalName_" | Revisão: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AnalisarDifWorkspaceCacheStr">
<Description><![CDATA[

Analisa as Diferencas do Projeto - Workspace > Caché (por string)
]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 
 set acertar = $get(tabInf("Acertar"))
 
 set sistema = $zconvert($get(tabInf("Sistema")),"l")
 
 set grupoItensSel = $get(tabInf("Grupo de Itens"))
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema(sistema, .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   quit $$$OK
 }
 
 if (projeto '= "") {
   set sc = ##class(Src2.Svn).AnalisarDifWorkspaceCache(projeto, $zconvert(acertar,"l")="sim", username, password, , , grupoItensSel)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AnalisarDifWorkspaceCache">
<Description><![CDATA[

Analisa as Diferencas do Projeto - Workspace > Caché

set sc = ##class(Src2.Svn).AnalisarDifWorkspaceCache("teste64", 0)]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,flgAcertar:%Boolean=0,username:%String="",password:%String="",flagCsp:%Boolean=0,flagCompClasse:%Boolean=0,grupoItensSel:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Analisar Diferenças - Workspace > Caché")
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ValidarWorkspaceProjeto(projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "list -R "_caminhoCopiaTrabalho, username, password, , arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosArquivoSvnList(codTerm, arquivoTemp, urlRepositorio, caminhoCopiaTrabalho)
 
 set strOpcoesRotinas = ""
 if (flagCsp) { set strOpcoesRotinas = "csp" }
 
 set tipoFlag = 1
 if (flagCompClasse) set tipoFlag = 2
 
 set flagCompClasses = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(tipoFlag)
 
 set sc = ##class(Src2.Item).CompararWorkspaceCache(codTerm, flgAcertar, strOpcoesRotinas, flagCompClasses, 1, grupoItensSel)
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 kill ^mtempInfoArquivo(codTerm)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Analisar Diferenças - Workspace > Caché | Projeto: "_projeto_" | Revisão: "_revisaoAtual_" | Tempo: "_tempoTotalEdt_" | Acertar: "_$select(flgAcertar:"Sim",1:"Não"))
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AnalisarDifCacheWorkspaceStr">
<Description><![CDATA[

Analisa as Diferencas do Projeto - Caché > Workspace (por string)
]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 
 set acertar = $get(tabInf("Acertar"))
 
 set sistema = $zconvert($get(tabInf("Sistema")),"l")
 
 set grupoItensSel = $get(tabInf("Grupo de Itens"))
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema(sistema, .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   quit $$$OK
 }
 
 if (projeto '= "") {
   set sc = ##class(Src2.Svn).AnalisarDifCacheWorkspace(projeto, $zconvert(acertar,"l")="sim", , username, password, grupoItensSel)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AnalisarDifCacheWorkspace">
<Description><![CDATA[

Analisa as Diferencas do Projeto - Caché > Workspace

set sc = ##class(Src2.Svn).AnalisarDifCacheWorkspace("csw63")
set sc = ##class(Src2.Svn).AnalisarDifCacheWorkspace("csw63", 1)]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,flgAcertar:%Boolean=0,flgSubversion:%Boolean=1,username:%String="",password:%String="",grupoItensSel:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ValidarWorkspaceProjeto(projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 write !!,##class(Src2.Utils).ObterBarra("Analisar Diferenças - Caché > Workspace")
 
 if (grupoItensSel '= "") {
   set sc = ##class(Src2.Item).CompararItensArquivos(grupoItensSel, flgAcertar, flgSubversion, username, password)
 }
 
 if (grupoItensSel = "") {
   set grupo = ""
   for  {
     set grupo = $order(^Src2Config("rotina",grupo))
     if (grupo = "") quit
     set var = $get(^Src2Config("rotina",grupo))
     
     set projetoGrupo = $piece(var,"^",1)
     
     if (projetoGrupo '= projeto) continue
     
     if ('$data(^Src2Config("projetorev",projetoGrupo))) continue
     
     set sc = ##class(Src2.Item).CompararItensArquivos(grupo_"*.mac", flgAcertar, flgSubversion, username, password)
   }
   
   set grupo = ""
   for  {
     set grupo = $order(^Src2Config("classe",grupo))
     if (grupo = "") quit
     set var = $get(^Src2Config("classe",grupo))
     
     set projetoGrupo = $piece(var,"^",1)
     
     if (projetoGrupo '= projeto) continue
     
     if ('$data(^Src2Config("projetorev",projetoGrupo))) continue
     
     set sc = ##class(Src2.Item).CompararItensArquivos(grupo_"*.cls", flgAcertar, flgSubversion, username, password)
   }
 }
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Analisar Diferenças - Caché > Workspace | Projeto: "_projeto_" | Revisão: "_revisaoAtual_" | Tempo: "_tempoTotalEdt_" | Acertar: "_$select(flgAcertar:"Sim",1:"Não"))
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarObjetosAplicacaoCSP">
<Description>

Exportar os Objetos para a Aplicacao CSP
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Exportar Objetos para a Aplicacao CSP")
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema("cswutil", .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 write !,"Iniciada a exportação dos objetos "_projeto_" para a aplicação CSP"
 
 set sc = ##class(Src2.Utils).ExportarObjetosAplicacaoCSP(projeto, username, password)
 
 write !,"Iniciado o LoadPages do "_projeto_" para a aplicação CSP"
 
 do utilitario^%CSW1LOADPAGES()
 
 write !,"Encerrada a exportação"
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Exportar Objetos Aplicação CSP | Projeto: "_projeto_" | Revisão: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarServicoConsistem">
<Description>

Importa o Serviço Consistem
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Gerar Serviço Consistem")
 
 set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set sc = ##class(Src2.Utils).GerarServicoConsistem(1, autenticacao)
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Importar Serviço Consistem | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="LogAlteracoesItem">
<Description>

Lista o Log de Alterações do Item

set sc = ##class(Src2.Svn).LogAlteracoesItem("CCAFC002.mac", "admin", "admin")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>InternalName:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 if (InternalName = "") {
   write !,"Source Control: Item não informado"
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, , , .itemCopiaTrabalho, , , , , , .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, , , , .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 write !!,##class(Src2.Utils).ObterBarra("Log de Alterações do Item")
 
 set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "log "_itemCopiaTrabalho, username, password, , arquivoTemp)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 write !,"Item: "_InternalName
 
 set file = ##class(%File).%New(arquivoTemp)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   write !,linhaFile
 }
 
 do file.Close()
 set file=""
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AnalisarItemProjetos">
<Description>

Analisa as Diferenças do Item entre os Projetos

set sc = ##class(Src2.Svn).AnalisarItemProjetos("CCAFC002.mac", "admin", "admin")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>InternalName:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 if (InternalName = "") {
   write !,"Source Control: Item não informado"
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, , , , , , , , , .projeto)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, , , , .revisaoAtual)
 if (sc '= $$$OK) {
   write !,"Source Control: "_sc
   write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 write !!,##class(Src2.Utils).ObterBarra("Analise do Item nos Projetos")
 
 set sc = ##class(Src2.Utils).AnalisarItemProjetos(InternalName, username, password, .tabProjetos)
 
 write !,"Item: "_InternalName,!
 
 set proj = ""
 for  {
   set proj = $order(tabProjetos(proj))
   if (proj = "") quit
   set var = $get(tabProjetos(proj))
   
   write !,##class(Src2.Utils).Just(proj, 20)
   write ##class(Src2.Utils).Just($piece(var,"^",4), 15)
 }
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarMenuConfigStr">
<Description>

Gerar/Configurar Base (por string)
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Config).ValidarVersaoSrc()
 if (msgsc '= 1) {
   write !,"Source Control: ATENÇÃO - "_msgsc
   write !,"Source Control: "_##class(Src2.Utils).StringAtualizador()
   quit msgsc
 }
 
 set versao = ""
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema("csw", .projeto)
 
 if (projeto '= "") {
   set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, , , , , .versao)
 }
 
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 
 set codContaConfig = $zconvert($get(tabInf("1 - Configurar Base/Menu - Conta")),"u")
 
 set codContaCriar = $zconvert($get(tabInf("2 - Gerar Base - Conta")),"u")
 
 set tagCriar = $get(tabInf("2 - Gerar Base - Tag"))
 
 set codContaExcluir = $zconvert($get(tabInf("3 - Excluir Base - Conta")),"u")
 
 if (codContaConfig '= "") {
   set sc = ##class(Src2.Utils).ObterNamespacesBaseDados(, .tabContas)
   set namespace = $get(tabContas(codContaConfig))
   if (namespace '= "") {
     set sc = ##class(Src2.Svn).AtualizarMenuConfig(namespace)
   }
   quit $$$OK
 }
 
 if (codContaCriar '= "") & (versao '= "") {
   set sc = ##class(Src2.Utils2).CriarAplicacaoContaVersao(codContaCriar, versao, tagCriar)
   quit $$$OK
 }
 
 if (codContaExcluir '= "") & (versao '= "") {
   set sc = ##class(Src2.Utils2).ExcluirAplicacaoContaVersao(codContaExcluir, versao)
   quit $$$OK
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarMenuConfig">
<Description>

Configurar Base

set sc = ##class(Src2.Svn).AtualizarMenuConfig("DESENVDA61")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>namespace:%String="",flgWrite:%Boolean=1,flgDataSource:%Boolean=1</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 if (flgWrite) write !!,##class(Src2.Utils).ObterBarra("Configurar Base")
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoDiff)
 quit:sc'=1 sc
 
 if (##class(Src2.Utils).ObterSistOper() '= "windows") {
   if (flgWrite) write !,"Source Control: Recurso disponivel somente para windows"
   quit $$$OK
 }
 
 set sc = ##class(Src2.Utils).ValidarNamespaceBaseDados(namespace, , .conta, .versao)
 if (sc '= $$$OK) {
   if (flgWrite) write !,"Source Control: "_sc
   if (flgWrite) write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema("cswutil", .projeto)
 if (sc '= $$$OK) {
   if (flgWrite) write !,"Source Control: "_sc
   if (flgWrite) write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual)
 if (sc '= $$$OK) {
   if (flgWrite) write !,"Source Control: "_sc
   if (flgWrite) write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 if (flgWrite) write !,"Gerando da global ^%CSMENCF"
 
 set sc = ##class(Src2.Utils).GerarCSMENCFBase(namespace, conta)
 if (sc '= $$$OK) {
   if (flgWrite) write !,"Source Control: "_sc
 }
 
 if (flgWrite) write !,"Atualizando os menus do CSW"
 
 set sc = ##class(Src2.Menu).AtualizarMenuCSW(namespace)
 if (sc '= $$$OK) {
   if (flgWrite) write !,"Source Control: "_sc
 }
 
 if (flgWrite) write !,"Importando o arquivo \outros\diversosbase.xml"
 
 set sc = ##class(Src2.Utils).ImportarArquivoDiversosBaseXml(namespace, projeto)
 if (sc '= $$$OK) {
   if (flgWrite) write !,"Source Control: "_sc
 }
 
 if (flgDataSource) {
   if (flgWrite) write !,"Gerando os DataSources no WildFly"
   set sc = ##class(Src2.Utils).GerarDataSourcesWildFly()
 }
 
 if (flgWrite) write !,"Iniciada a configuracao dos certificados eletronicos"
 
 set sc = $$ManipularConfiguracoes^CCUTIRG003()
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 if (flgWrite) write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Namespace: "_namespace_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Configurar Base | Namespace: "_namespace_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SwitchProjetos">
<Description>

Switch Projetos

set sc = ##class(Src2.Svn).SwitchProjetos()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.UtilsXml).ObterSwitchXML(.tabSwitch)
 if (msgsc '= 1) quit $$$ERROR(10000,msgsc)
 
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoDiff)
 if (msgsc '= 1) quit $$$ERROR(10000,msgsc)
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, , 1)
 if (msgsc '= 1) quit $$$ERROR(10000,msgsc)
 
 write #
 
 set projeto = ""
 for {
   set projeto = $order(tabSwitch(projeto))
   if (projeto = "") quit
   set var = $get(tabSwitch(projeto))
   
   set urlOrigem = $piece(var,"^",1)
   set revisaoMinima = $piece(var,"^",2)
   set revisaoMaxima = $piece(var,"^",3)
   set urlDestino = $piece(var,"^",4)
   set revisaoDestino = $piece(var,"^",5)
   
   if (urlOrigem = "") ! (revisaoMinima = "") ! (urlDestino = "") ! (revisaoDestino = "") continue
   
   set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual, .versao)
   if (msgsc '= 1) continue
   
   if '$data(^Src2Config("projetorev",projeto)) continue
   
   write !!,projeto
   
   set msgsc = ##class(Src2.Utils).ValidarCopiaTrabalho(caminhoCopiaTrabalho, .urlRepositorioReal, .revisaoAtualReal)
   if (msgsc '= 1) continue
   
   //set revisaoMaxima=""
   //set revisaoAtualReal = 15825
   //set urlRepositorioReal = "http://192.168.15.10:18080/svn/csw/branches/6.5"
   
   if (urlRepositorioReal '= urlOrigem) {
     if (urlRepositorioReal = urlDestino) write " - Ja Convertido"
     else  write " - Erro - URL do repositorio invalida: "_urlRepositorioReal_"@"_revisaoAtualReal
     continue
   }
   
   // Realiza o Update automatico, para chegar a revisão minima
   if (revisaoAtualReal < revisaoMinima) {
     set sc = ##class(Src2.Svn).Update(projeto, revisaoMinima, , , autenticacao, 0, 0)
     set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual, .versao)
     if (msgsc '= 1) continue
     set msgsc = ##class(Src2.Utils).ValidarCopiaTrabalho(caminhoCopiaTrabalho, .urlRepositorioReal, .revisaoAtualReal)
     if (msgsc '= 1) continue
   }
   
   if (revisaoMaxima = "") & (revisaoAtualReal < revisaoMinima) {
     write " - Erro - Revisao do repositorio deve ser maior que: "_revisaoMinima_" | set sc = ##class(Src2.Svn).Update("""_projeto_""", """_revisaoMinima_""", , , , 0)"
     continue
   }
   
   if (revisaoMaxima '= "") & ((revisaoAtualReal < revisaoMinima) ! (revisaoAtualReal > revisaoMaxima)) {
     write " - Erro - Revisao do repositorio de estar entre "_revisaoMinima_":"_revisaoMaxima_" | set sc = ##class(Src2.Svn).Update("""_projeto_""", """_revisaoMinima_""", , , , 0)"
     continue
   }
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "switch "_urlDestino_"@"_revisaoDestino_" "_caminhoCopiaTrabalho, , , autenticacao)
   if (msgsc '= 1) {
     write " - Erro - "_msgsc
     continue
   }
   
   set ^Src2Config("projetorev",projeto) = revisaoDestino
   
   write " - Convertido de "_urlRepositorioReal_"@"_revisaoAtualReal_" para "_urlDestino_"@"_revisaoDestino
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SwitchStr">
<Description>

Realiza um Svn Switch Atualizando os Fontes no Caché (por string)
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 
 set projeto = $zconvert($get(tabInf("Projeto")),"l")
 
 set sc = ##class(Src2.Svn).Switch(projeto, username, password)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="Switch">
<Description>

Switch

set sc = ##class(Src2.Svn).Switch("teste64rf1")
set sc = ##class(Src2.Svn).Switch("teste64")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projetoSwitch:%String="",username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Switch | "_$zdatetime(timestampInicio,4))
 
 set msgsc = ##class(Src2.Svn).ValidarSwitch(projetoSwitch, username, password, .projeto, , , .flgAlteracoes)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Svn).GerarBackupPatchProjeto(projeto, username, password, flgAlteracoes, projetoSwitch)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 if (flgAlteracoes) {
   set msgsc = ##class(Src2.Svn).ReverterProjeto(projeto, username, password)
   if (msgsc '= $$$OK) {
     write !,"Source Control: "_msgsc
     quit msgsc
   }
 }
 
 set msgsc = ##class(Src2.Svn).SwitchProjeto(projetoSwitch, username, password)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Svn).AplicarPatchProjeto(projeto, username, password)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !!,##class(Src2.Utils).ObterBarra("Switch Finalizado com Sucesso | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarSwitch">
<Description>

Validar Switch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[projetoSwitch:%String="",username:%String="",password:%String="",&projeto:%String,&urlDestino:%String,flgValidarCopiaTrab:%Boolean=1,&flgAlteracoes:%Boolean]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (projeto, urlDestino) = ""
 
 set msgsc = ##class(Src2.UtilsXml).ObterProjetosXML(.tabProjetos)
 
 if (projetoSwitch = "") {
   quit "Projeto destino não informado!"
 }
 
 if ('$data(tabProjetos(projetoSwitch))) {
   quit "Projeto destino '"_projetoSwitch_"' não encontrado!"
 }
 
 set varProj = $get(tabProjetos(projetoSwitch))
 
 set sistema = $piece(varProj,"^",1)
 set urlDestino = $piece(varProj,"^",2)
 set versaoDest = $piece(varProj,"^",8)
 
 set msgsc = ##class(Src2.Utils).ObterProjetoSistema(sistema, .projeto)
 if (msgsc '= $$$OK) quit msgsc
 
 set msgsc = ##class(Src2.Utils).ValidarWorkspaceProjeto(projeto, , , 1)
 if (msgsc '= $$$OK) quit msgsc
 
 set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, , , , , .versao, , , , .projetoSwitch2)
 if (msgsc '= $$$OK) quit msgsc
 
 if (versaoDest '= versao) {
   quit "Source Control: Projetos com versões incompatíveis para switch!"
 }
 
 if (projetoSwitch2 '= "") & (projetoSwitch2 = projetoSwitch) {
   quit "Source Control: Namespace já está com o projeto "_projetoSwitch_" carregado!"
 }
 
 if (projetoSwitch2 = "") & (projeto = projetoSwitch) {
   quit "Source Control: Namespace já está com o projeto "_projetoSwitch_" carregado!"
 }
 
 if (flgValidarCopiaTrab) {
   // Verifica sem tem arquivos com conflito ou não versionados na cópia de trabalho
   set msgsc = ##class(Src2.Utils).ValidarSitArqCopiaTrab(projeto, , username, password, .flgAlteracoes)
   if (msgsc '= $$$OK) quit msgsc
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="SwitchProjeto">
<Description>

Switch Projeto
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projetoSwitch:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Svn Switch | "_$zdatetime(timestampInicio,4))
 
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set sc = ##class(Src2.Svn).ValidarSwitch(projetoSwitch, username, password, .projeto, .urlDestino, 0)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, , .revisaoAtual)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set revisaoDestino = "head"
 
 set msgsc = ##class(Src2.Utils2).LockProjeto(projeto)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   write !,##class(Src2.Utils).ObterBarra()
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "switch "_urlDestino_"@"_revisaoDestino_" "_caminhoCopiaTrabalho, , , autenticacao, arquivoTemp)
 if (msgsc '= $$$OK) {
   write !,"Source Control: SVN Switch - "_msgsc
   write !,##class(Src2.Utils).ObterBarra()
   set msgsc2 = ##class(Src2.Utils2).UnLockProjeto(projeto)
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp, "update", .nrRevisao, .tabFlags)
 
 set msgsc = ##class(Src2.Utils).CarregarItensPastasExcluidas(codTerm, projeto)
 
 set msgsc = ##class(Src2.Utils).AtualizarFlagsAntesImportFontes(projeto, .tabFlags)
 
 set flagCompClasses = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(2)
 
 set msgsc = ##class(Src2.Item).ImportarFontes(codTerm, "csp", flagCompClasses)
 
 if (nrRevisao = "") {
   write !,"Não foi possível conectar ao subversion"
   set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
   write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
   kill ^mtempInfoArquivo(codTerm)
   set msgsc = ##class(Src2.Utils2).UnLockProjeto(projeto)
   quit "Não foi possível conectar ao subversion"
 }
 
 if (projetoSwitch '= projeto) {
   set ^Src2Config("projeto2",projeto) = projetoSwitch
 } else {
   kill ^Src2Config("projeto2",projeto)
 }
 
 set $piece(^Src2Config("projeto",projeto),"^",2) = urlDestino
 
 set ^Src2Config("projetorev",projeto) = nrRevisao
 
 set msgsc = ##class(Src2.Utils).AtualizarFlagsAposImportFontes(projeto, .tabFlags, username, password, autenticacao)
 
 write !,"Atualizado para revisão "_nrRevisao
 
 write !,"Encerrado o switch do projeto "_projeto_" para o projeto "_projetoSwitch
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_projeto_" (Switch: "_projetoSwitch_") | Revisao: "_nrRevisao_" | Tempo: "_tempoTotalEdt)
 
 set msgsc = ##class(Src2.Utils).GeraLog(0, "Studio - Svn Switch | Projeto: "_projeto_" > "_projetoSwitch_" | Revisão: "_revisaoAtual_" => "_nrRevisao_" | Tempo: "_tempoTotalEdt)
 
 kill ^mtempInfoArquivo(codTerm)
 
 set msgsc = ##class(Src2.Utils2).UnLockProjeto(projeto)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ReverterProjeto">
<Description>

Reverte Totas as Alterações em um Projeto
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Reverter Alterações Projeto | "_$zdatetime(timestampInicio,4))
 
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual, , , , , , .descProjeto)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 write !,"Iniciando a reversao de todas as alterações do projeto: "_descProjeto
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "revert -R "_caminhoCopiaTrabalho, , , autenticacao, arquivoTemp)
 if (msgsc '= $$$OK) {
   write !,"Source Control: SVN Switch - "_msgsc
   write !,##class(Src2.Utils).ObterBarra()
   set msgsc2 = ##class(Src2.Utils2).UnLockProjeto(projeto)
   quit msgsc
 }
 
 write !,"Revertendo alterações na copia de trabalho"
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "status "_caminhoCopiaTrabalho, username, password, autenticacao, arquivoTemp2)
 
 set msgsc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp2, "status")
 
 write !,"Excluindo arquivos e pastas não versionadas na copia de trabalho"
 
 set msgsc = ##class(Src2.Utils).ExcluirArquivosPastasNaoVersionados(codTerm)
 
 write !,"Atualizando rotinas e classes no Cache"
 
 set msgsc = ##class(Src2.Utils).ObterDadosArquivoSvnRevert(codTerm, projeto, arquivoTemp)
 
 set flagCompClasses = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(2)
 
 set msgsc = ##class(Src2.Item).ImportarFontes(codTerm, "csp", flagCompClasses)
 
 write !,"Encerrada a reversao de todas as alteracoes do projeto: "_descProjeto
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_descProjeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Reverter Projeto | Projeto: "_descProjeto_" | Revisão: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarBackupPatchProjeto">
<Description>

Gerar Backup e Patch com Totas as Alterações em um Projeto
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String="",username:%String="",password:%String="",flgAlteracoes:%Boolean,projetoSwitch:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Gerar Backup/Patch do Projeto | "_$zdatetime(timestampInicio,4))
 
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual, , , , , , .descProjeto, .projetoAtual)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 if (username = "") {
   set msgsc = "Usuário não informado!"
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set caminhoConf = $piece($get(^Src2Config("usuarios",username)),"^",1)
 
 if (caminhoConf = "") {
   set msgsc = "Usuário sem endereço do backup definido!"
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set caminho = caminhoConf_barra_"switch"
 set caminho2 = caminhoConf_barra_"switchback"
 
 if ('##class(%File).DirectoryExists(caminho)) {
   do ##class(%File).CreateDirectory(caminho)
 }
 
 if ('##class(%File).DirectoryExists(caminho2)) {
   do ##class(%File).CreateDirectory(caminho2)
 }
 
 if ('##class(%File).DirectoryExists(caminho)) {
   set msgsc = "Não foi possível acessar a pasta do backup "_caminho_"!"
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 if ('##class(%File).DirectoryExists(caminho2)) {
   set msgsc = "Não foi possível acessar a pasta do backup "_caminho2_"!"
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 write !,"Gerando um patch com as alterações do projeto: "_descProjeto
 
 // Gerar Backup Padrão de Todos os Projetos
 // set sc = ##class(Src2.Utils2).GerarBackup(username)
 
 // Definir Arquivos
 
 set dataHora = $translate($zdatetime($horolog,3),"-: ","___")
 
 // Arquivo xml - Informações
 set arquivoInfoXml = caminho_barra_$zconvert($znspace,"l")_"_"_projetoAtual_"_info.xml"
 set arquivoInfoXml2 = caminho2_barra_dataHora_"_"_$zconvert($znspace,"l")_"_"_projetoAtual_"_info.xml"
 
 // Arquivo xml - Backup Redundante
 set arquivoXml = caminho_barra_$zconvert($znspace,"l")_"_"_projetoAtual_"_export.xml"
 set arquivoXml2 = caminho2_barra_dataHora_"_"_$zconvert($znspace,"l")_"_"_projetoAtual_"_export.xml"
 
 // Arquivo diff - Arquivo para Recuperação
 set arquivoDiff = caminho_barra_$zconvert($znspace,"l")_"_"_projetoAtual_"_patch.diff"
 set arquivoDiff2 = caminho2_barra_dataHora_"_"_$zconvert($znspace,"l")_"_"_projetoAtual_"_patch.diff"
 
 // Excluir Arquivos
 
 set sc = ##class(%File).Delete(arquivoInfoXml)
 set sc = ##class(%File).Delete(arquivoXml)
 set sc = ##class(%File).Delete(arquivoDiff)
 
 if (flgAlteracoes) {
   
   // Arquivo xml - Informações
   
   kill tabLinhas
   set tabLinhas(1) = "<?xml version=""1.0"" encoding=""UTF-8""?>"
   set tabLinhas(2) = "<Info>"
   set tabLinhas(3) = $char(9)_"<ProjetoOrigem>"_projetoAtual_"</ProjetoOrigem>"
   set tabLinhas(4) = $char(9)_"<RevisaoOrigem>"_revisaoAtual_"</RevisaoOrigem>"
   set tabLinhas(5) = $char(9)_"<ProjetoDestino>"_projetoSwitch_"</ProjetoDestino>"
   set tabLinhas(6) = $char(9)_"<DataHora>"_$zdatetime($horolog,4)_"</DataHora>"
   set tabLinhas(7) = "</Info>"
   
   set sc = ##class(Src2.Utils2).ConverteTabelaArquivo(arquivoInfoXml, .tabLinhas)
   
   set sc = ##Class(%File).CopyFile(arquivoInfoXml, arquivoInfoXml2)
   
   // Arquivo xml - Backup Redundante
   
   set sc = ##class(Src2.Item).ObterItensAlterados(projeto, username, password, .tabItens)
   
   set sc = ##class(Src2.ImportExport).ExportarArquivoXml(.tabItens, arquivoXml)
   
   set sc = ##Class(%File).CopyFile(arquivoXml, arquivoXml2)
   
   // Arquivo diff - Arquivo para Recuperação
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "diff "_caminhoCopiaTrabalho, , , autenticacao, arquivoDiff)
   
   set sc = ##Class(%File).CopyFile(arquivoDiff, arquivoDiff2)
 }
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_descProjeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Gerar Backup/Patch do Projeto | Projeto: "_descProjeto_" | Revisão: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AplicarPatchProjeto">
<Description>

Aplicar Patch com Totas as Alterações em um Projeto
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String="",username:%String="",password:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 write !!,##class(Src2.Utils).ObterBarra("Aplicar Patch no Projeto | "_$zdatetime(timestampInicio,4))
 
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoTemp2)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual, , , , , , .descProjeto, .projetoAtual)
 if (msgsc '= $$$OK) {
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 if (username = "") {
   set msgsc = "Usuário não informado!"
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set caminhoConf = $piece($get(^Src2Config("usuarios",username)),"^",1)
 
 if (caminhoConf = "") {
   set msgsc = "Usuário sem endereço do backup definido!"
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set caminho = caminhoConf_barra_"switch"
 
 if ('##class(%File).DirectoryExists(caminho)) {
   set msgsc = "Não foi possível acessar a pasta do backup "_caminho_"!"
   write !,"Source Control: "_msgsc
   quit msgsc
 }
 
 write !,"Aplicando um patch com as alterações do projeto: "_descProjeto
 
 set arquivoInfoXml = caminho_barra_$zconvert($znspace,"l")_"_"_projetoAtual_"_info.xml"
 set arquivoXml = caminho_barra_$zconvert($znspace,"l")_"_"_projetoAtual_"_export.xml"
 set arquivoDiff = caminho_barra_$zconvert($znspace,"l")_"_"_projetoAtual_"_patch.diff"
 
 if (##class(%File).Exists(arquivoDiff)) {
   
   set sc = ##Class(%File).CopyFile(arquivoDiff, arquivoTemp2)
   
   set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "patch "_arquivoTemp2_" "_caminhoCopiaTrabalho, , , autenticacao, arquivoTemp)
   
   set sc = ##class(%File).Delete(arquivoTemp2)
   
   set msgsc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp, "patch")
   
   set msgsc = ##class(Src2.Utils).CarregarItensPastasExcluidas(codTerm, projeto)
   
   set flagCompClasses = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(2)
   
   set msgsc = ##class(Src2.Item).ImportarFontes(codTerm, "csp", flagCompClasses)
 }
 
 set sc = ##class(%File).Delete(arquivoInfoXml)
 set sc = ##class(%File).Delete(arquivoXml)
 set sc = ##class(%File).Delete(arquivoDiff)
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 write !,##class(Src2.Utils).ObterBarra("Projeto: "_descProjeto_" | Revisao: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Studio - Aplicar Patch no Projeto | Projeto: "_descProjeto_" | Revisão: "_revisaoAtual_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.SvnAux">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="ObterDadosCheckout">
<Description>

Obter Dados - Checkout
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema)
 
 set string = "Operação: Checkout"
 set string = string_$char(13,10,13)_"Sistema: "_sistema
 set string = string_$char(13,10,13)_"Revisão: head"
 set string = string_$char(13,10,13)_"Gerar CSP: Não"
 set string = string_$char(13,10,13)_"Compilar Classes: Não"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarDadosCheckout">
<Description>

Grava Dados - Checkout
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 set sc = ##class(Src2.SvnAux).GravarUltimoSistema($get(tabInf("Sistema")))
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosUpdate">
<Description>

Obter Dados - Update
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema, InternalName)
 
 set string = "Operação: Update"
 set string = string_$char(13,10,13)_"Sistema: "_sistema
 set string = string_$char(13,10,13)_"Revisão: head"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosSwitch">
<Description>

Obter Dados - Switch
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterProjetosSwitch(.tabProjetos)
 
 set string = "Operação: Switch"
 set string = string_$char(13,10,13)_"Disponiveis: "_##class(Src2.Utils).ConvertTabStr(.tabProjetos)
 set string = string_$char(13,10,13)_"Projeto: "
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarDadosUpdate">
<Description>

Grava Dados - Update
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 set sc = ##class(Src2.SvnAux).GravarUltimoSistema($get(tabInf("Sistema")))
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosImportarAlterados">
<Description>

Obter Dados - Importar Itens - Alterados
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema, InternalName)
 
 set string = "Operação: Importar Itens - Alterados"
 set string = string_$char(13,10,13)_"Descrição: Workspace => Caché"
 set string = string_$char(13,10,13)_"Sistema: "_sistema
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarDadosImportarAlterados">
<Description>

Grava Dados - Importar Itens - Alterados
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 set sc = ##class(Src2.SvnAux).GravarUltimoSistema($get(tabInf("Sistema")))
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosImportarTodos">
<Description>

Obter Dados - Importar Itens - Todos
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema, InternalName)
 
 set string = "Operação: Importar Itens - Todos"
 set string = string_$char(13,10,13)_"Descrição: Workspace => Caché"
 set string = string_$char(13,10,13)_"ATENÇÃO - Processo Demorado"
 set string = string_$char(13,10,13)_"Sistema: "_sistema
 set string = string_$char(13,10,13)_"Gerar CSP: Não"
 set string = string_$char(13,10,13)_"Compilar Classes: Não"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarDadosImportarTodos">
<Description>

Grava Dados - Importar Itens - Todos
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 set sc = ##class(Src2.SvnAux).GravarUltimoSistema($get(tabInf("Sistema")))
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosImportarItem">
<Description>

Obter Dados - Importar Item
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema, InternalName)
 
 if (InternalName = "") set InternalName = "Não Encontrado"
 
 set string = "Operação: Importar Item"
 set string = string_$char(13,10,13)_"Descrição: Workspace => Caché"
 set string = string_$char(13,10,13)_"Item: "_InternalName_" <<= Não Alterar"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosExportarItem">
<Description>

Obter Dados - Exportar Item
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema, InternalName)
 
 if (InternalName = "") set InternalName = "Não Encontrado"
 
 set string = "Operação: Exportar Item"
 set string = string_$char(13,10,13)_"Descrição: Caché => Workspace"
 set string = string_$char(13,10,13)_"Item: "_InternalName_" <<= Não Alterar"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosReverterItem">
<Description>

Obter Dados - Reverter Item
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema, InternalName)
 
 if (InternalName = "") set InternalName = "Não Encontrado"
 
 set string = "Operação: Reverter Item"
 set string = string_$char(13,10,13)_"ATENÇÃO - Exclui Todas as Alterações do Item"
 set string = string_$char(13,10,13)_"Item: "_InternalName_" <<= Não Alterar"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosConverterItem">
<Description>

Obter Dados - Converter Item
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema, InternalName)
 
 if (InternalName = "") set InternalName = "Não Encontrado"
 
 set string = "Operação: Converter Item"
 set string = string_$char(13,10,13)_"ATENÇÃO - Recurso disponível somente para rotinas"
 set string = string_$char(13,10,13)_"Item: "_InternalName_" <<= Não Alterar"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosDifWorksCache">
<Description><![CDATA[

Obter Dados - Analisar as Diferencas - Workspace > Caché
]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema, InternalName)
 
 set string = "Operação: Analisar Diferenças (ATENÇÃO: FAZER UPDATE ANTES)"
 set string = string_$char(13,10,13)_"Descrição: Workspace => Caché"
 set string = string_$char(13,10,13)_"Sistema: "_sistema
 set string = string_$char(13,10,13)_"Grupo de Itens: "
 set string = string_$char(13,10,13)_"Acertar: Não"
 set string = string_$char(13,10,13)_"Exemplos de Grupos de Itens: CCPV*.MAC / Fat.Nfe.*.cls"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarDadosDifWorksCache">
<Description><![CDATA[

Grava Dados - Analisar as Diferencas - Workspace > Caché
]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 set sc = ##class(Src2.SvnAux).GravarUltimoSistema($get(tabInf("Sistema")))
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosDifCacheWorks">
<Description><![CDATA[

Obter Dados - Analisar as Diferencas - Caché > Workspace
]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema, InternalName)
 
 set string = "Operação: Analisar Diferenças"
 set string = string_$char(13,10,13)_"Descrição: Caché => Workspace"
 set string = string_$char(13,10,13)_"Sistema: "_sistema
 set string = string_$char(13,10,13)_"Grupo de Itens: "
 set string = string_$char(13,10,13)_"Acertar: Não"
 set string = string_$char(13,10,13)_"Exemplos de Grupos de Itens: CCPV*.MAC / Fat.Nfe.*.cls"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarDadosDifCacheWorks">
<Description><![CDATA[

Grava Dados - Analisar as Diferencas - Caché > Workspace
]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 set sc = ##class(Src2.SvnAux).GravarUltimoSistema($get(tabInf("Sistema")))
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosStatus">
<Description>

Obter Dados - Status Alterações
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema, InternalName)
 
 set string = "Operação: Status Alterações"
 set string = string_$char(13,10,13)_"Sistema: "_sistema
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarDadosStatus">
<Description>

Grava Dados - Status Alterações
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 set sc = ##class(Src2.SvnAux).GravarUltimoSistema($get(tabInf("Sistema")))
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosLog">
<Description>

Obter Dados - Log Alterações
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema, InternalName)
 
 set string = "Operação: Log Alterações"
 set string = string_$char(13,10,13)_"Sistema: "_sistema
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarDadosLog">
<Description>

Grava Dados - Log Alterações
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 set sc = ##class(Src2.SvnAux).GravarUltimoSistema($get(tabInf("Sistema")))
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosExpObjAplicCSP">
<Description>

Obter Dados - Exportar Objetos para Aplicação CSP
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set string = "Observação: Exporta os Objetos para a Aplicação CSP"
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosGerarServConsistem">
<Description>

Obter Dados - Gerar Serviço Consistem
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set string = "Atenção: Antes de efetuar este procedimento, atualizar o projeto 'cswutil'"
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosAtualizarMenu">
<Description>

Obter Dados - Atualizar Menu
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterNamespacesBaseDados(, .tabContas)
 
 set string = "Operação: Gerar/Configurar Base"
 set string = string_$char(13,10,13)_"Contas Atuais: "_##class(Src2.Utils).ConvertTabStr(.tabContas)
 set string = string_$char(13,10,13)_"1 - Configurar Base/Menu - Conta: "
 set string = string_$char(13,10,13)_"2 - Gerar Base - Conta: "
 set string = string_$char(13,10,13)_"2 - Gerar Base - Tag: "
 set string = string_$char(13,10,13)_"3 - Excluir Base - Conta: "
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarUltimoSistema">
<Description>

Grava Ultimo Projeto
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sistema:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set ^Src2UserConf("ultSistema") = sistema
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.SvnHookScript">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>62428,56271.964316</TimeCreated>

<Method name="AtualizarFontesNamespaceJob">
<Description>

Atualiza Fontes Namespace

set sc = ##class(Src2.SvnHookScript).AtualizarFontesNamespaceJob()
set sc = ##class(Src2.SvnHookScript).AtualizarFontesNamespaceJob(15)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String="",username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 job ##class(Src2.SourceImport).AtualizarFontesNamespace(projeto, username, password)
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarLogJob">
<Description>

Atualizar Log de Dados do SVN no Gercon

set sc = ##class(Src2.SvnHookScript).AtualizarLogJob()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 job ##class(Src2.Dados).AtualizarLog(0 ,"" ,"" ,"" , username, password)
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarRevisaoJob">
<Description>

Atualizar Log de Dados do SVN no Gercon

set sc = ##class(Src2.SvnHookScript).AtualizarRevisaoJob()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>repositorio:%String="",revisao:%String="",user:%String="",propname:%String="",action:%String="",username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (action '= "M") quit $$$OK
 
 if (propname '= "svn:log") quit $$$OK
 
 set nomeRepo = $piece(repositorio,"/",$length(repositorio,"/"))
 
 if (nomeRepo = "") quit $$$OK
 
 set endRepositorio = "http://192.168.15.10:18080/svn/"_$piece(repositorio,"/",$length(repositorio,"/"))
 
 job ##class(Src2.Dados).AtualizarLog(0 ,"" , endRepositorio, revisao, username, password)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarRevisaoCopiaTrabalho">
<Description>

Importar uma Revisão a Partir do Endereço de uma Cópia de Trabalho

set sc = ##class(Src2.SvnHookScript).ImportarRevisaoCopiaTrabalho("C:\workspacecsw\projetos\6.1\csw61\rotinas\CCUTI", "560")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminhoCopiaTrabalhoInfo:%String,nrRevisao:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 job ##class(Src2.Utils).ImportarRevisaoCopiaTrabalho(caminhoCopiaTrabalhoInfo, nrRevisao, username, password)
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.UnitTest">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="ExecutarTesteUnitario">
<ClassMethod>1</ClassMethod>
<FormalSpec>suite="",className="",todos="",isCobertura=0</FormalSpec>
<Implementation><![CDATA[

     set userparam("codeCoverage")=isCobertura
     
     if className'="" {
       quit ##class(Utils.UnitTest.UnitTestCaseManager).ExecuteUnitClass(suite, className,.userparam)
     }
     
     if suite'="" && (className = "") {
       quit ##class(Utils.UnitTest.UnitTestCaseManager).ExecuteUnitSuite(suite,.userparam)
     }
     
     if todos = "todos" {
       quit ##class(Utils.UnitTest.UnitTestCaseManager).ExecuteUnitAll(.userparam)
     }
     
     quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterMensagemParaExecucao">
<ClassMethod>1</ClassMethod>
<FormalSpec>nomeClasse:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set tamanhoRaiz = ..ObterTamanhoCaminhoRaiz()
 set nomeExibicao = $piece(nomeClasse,".",tamanhoRaiz,tamanhoRaiz+1)
 
 if nomeExibicao="" set nomeExibicao="Todos"
 
 set string = "Teste Unitário"
 set string = string_$char(13,10,13)_"Informar o classe ou pacote ou todos (para todos os testes unitários)"
 set string = string_$char(13,10,13)_"Execução: "_nomeExibicao
 set string = string_$char(13,10,13)_"Cobertura de Código: Não"
 
 quit string
]]></Implementation>
</Method>

<Method name="AnalisarMensagemParaExecucao">
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterDadosInformados(string,.tabInf)
 
 set execucao = $get(tabInf("Execução"))
 set cobertura = $get(tabInf("Cobertura de Código"))
 
 set (suite,className,todos)=""
 
 if $piece(execucao,".",1)'="" set suite=$piece(execucao,".",1)
 
 if $piece(execucao,".",2)'="" set className=..ObterCaminhoRaiz()_"."_execucao
 
 if $zconvert(execucao,"l")="todos" do
 . set todos="todos"
 . set suite=""
 . set className=""
 
 if $zconvert(cobertura,"l")="sim" set isCobertura = 1
 else  set isCobertura = 0
 
 quit ..ExecutarTesteUnitario(suite, className, todos, isCobertura)
]]></Implementation>
</Method>

<Method name="ObterCaminhoRaiz">
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[  quit "br.com.consistem.UT"
]]></Implementation>
</Method>

<Method name="ObterTamanhoCaminhoRaiz">
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[  quit ($length(..ObterCaminhoRaiz(),".")+1)
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Utils">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="ObterConfig">
<Description>

Obtem Configurações Básicas

set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoTemp2, .versao, .pastaTemp, .flgServAplicJava)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&codTerm:%String,&caminhoWorkspace:%String,&caminhoSvn:%String,&arquivoTemp:%String,&arquivoTemp2:%String,versao:%String,&pastaTemp:%String,&flgServAplicJava:%Boolean]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (caminhoSvn, arquivoTemp, arquivoTemp2, pastaTemp) = ""
 
 set codTerm = $job
 
 set flgServAplicJava = +$piece($get(^WORKSPACE),"^",4)
 
 set versao = $piece($get(^WORKSPACE),"^",3)
 
 set caminhoWorkspace = $piece($get(^WORKSPACE),"^",1)
 
 if caminhoWorkspace = "" quit "Workspace não definido!"
 
 if (##class(Src2.Utils).ObterSistOper() = "windows") {
   set pastaTemp = caminhoWorkspace_"\temp"
   set arquivoTemp = caminhoWorkspace_"\temp\tmp"_$job_".txt"
   set arquivoTemp2 = caminhoWorkspace_"\temp\tmp"_$job_"_a.txt"
 } else {
   set pastaTemp = caminhoWorkspace_"/temp"
   set arquivoTemp = caminhoWorkspace_"/temp/tmp"_$job_".txt"
   set arquivoTemp2 = caminhoWorkspace_"/temp/tmp"_$job_"_a.txt"
 }
 
 set caminhoSvn = $piece($get(^WORKSPACE),"^",2)
 
 if caminhoSvn = "" quit "Cliente do subversion não definido!"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="UpdateConfigGeralWorkspace">
<Description>

Realiza o Update das Configurações Gerais do Workspace

set sc = ##class(Src2.Utils).UpdateConfigGeralWorkspace(.nrRevisao)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&nrRevisao:%String,username:%String="",password:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set nrRevisao = ""
 
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoDiff)
 quit:msgsc'=1 msgsc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set caminhoWorkspace = caminhoWorkspace_barra_"configgeral"
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "update "_caminhoWorkspace, username, password, , arquivoTemp)
 if (msgsc '= $$$OK) quit msgsc
 
 set msgsc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp, "update", .nrRevisao)
 
 kill ^mtempInfoArquivo(codTerm)
 
 if (nrRevisao = "") {
   quit "Não foi possível conectar ao subversion para atualizar as configurações do workspace"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterSistOper">
<Description>

Obter Sistema Operacional

write ##class(Src2.Utils).ObterSistOper()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if $zversion["Windows" quit "windows"
 quit "linux"
]]></Implementation>
</Method>

<Method name="ObterBarraSistOper">
<Description>

Obter Barra Sistema Operacional

write ##class(Src2.Utils).ObterBarraSistOper()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if $zversion["Windows" quit "\"
 quit "/"
]]></Implementation>
</Method>

<Method name="ObterDadosProjeto">
<Description>

Obtem Dados do Projeto

set sc = ##class(Src2.Utils).ObterDadosProjeto("csw64", .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual, .versao, .rotinaVersao, .pasta, .urlRepositorioBase, .projetoSwitch, .descProjeto)
set sc = ##class(Src2.Utils).ObterDadosProjeto("sourcecontrol20", .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual, .versao, .rotinaVersao, .urlRepositorioBase, .projetoSwitch, .descProjeto)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[projeto:%String,&caminhoCopiaTrabalho:%String,&urlRepositorio:%String,&sistema:%String,&revisaoAtual:%String,&versao:%String,&rotinaVersao:%String,&pasta:%String,&urlRepositorioBase:%String,&projetoSwitch:%String,&descProjeto:%String,&projetoAtual:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (caminhoCopiaTrabalho, urlRepositorio, sistema, revisaoAtual, versao) = ""
 set (rotinaVersao, pasta, urlRepositorioBase, projetoSwitch, descProjeto) = ""
 set (projetoAtual) = ""
 
 set sc = ##class(Src2.Utils).ObterConfig(, .caminhoWorkspace)
 quit:sc'=1 sc
 
 if (projeto = "") quit "Projeto não informado!"
 
 set (projetoAtual, descProjeto) = projeto
 
 if '$data(^Src2Config("projeto",projeto)) quit "Projeto não encontrado!"
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set caminhoCopiaTrabalho = caminhoWorkspace_barra_"projetos"_barra_projeto
 
 set var = $get(^Src2Config("projeto",projeto))
 
 if ($piece(var,"^",7) '= "") {
   set pasta = $piece(var,"^",7)
   set caminhoCopiaTrabalho = caminhoWorkspace_barra_"projetos"_barra_pasta_barra_projeto
 }
 
 set sistema = $piece(var,"^",1)
 
 set urlRepositorio = $piece(var,"^",2)
 set urlRepositorioBase = $piece(urlRepositorio,sistema,1)_sistema
 
 set versao = $piece(var,"^",9)
 
 set revisaoAtual = $get(^Src2Config("projetorev",projeto))
 
 if (sistema = "csw") set rotinaVersao = "CCCSWzzz"
 if (sistema = "cswutil") set rotinaVersao = "%CSzzz"
 if (sistema = "gercon") set rotinaVersao = "CCGERzzz"
 
 if ($data(^Src2Config("projeto2",projeto))) {
   set projetoSwitch = $piece($get(^Src2Config("projeto2",projeto)),"^",1)
   if (projetoSwitch '= "") {
     set projetoAtual = projetoSwitch
     set descProjeto = projeto_" (Switch: "_projetoSwitch_")"
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterProjetoCamCopiaTrab">
<Description>

Obter Projeto a Partir do Caminho da Copia de Trabalho

set sc = ##class(Src2.Utils).ObterProjetoCamCopiaTrab("C:\workspacecsw\projetos\6.1\csw61\rotinas\CCUTI", .projeto)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[caminhoCopiaTrabalhoInfo:%String,&projeto:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set projeto = ""
 
 set sc = ##class(Src2.Utils).ObterConfig(, .caminhoWorkspace)
 quit:sc'=1 sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set caminhoCopiaTrabalho = caminhoWorkspace_barra_"projetos"_barra
 
 set var = $piece(caminhoCopiaTrabalhoInfo,caminhoCopiaTrabalho,2)
 
 if ($piece(var,barra,1) '= "") , ($data(^Src2Config("projeto",$piece(var,barra,1)))) {
   set projeto = $piece(var,barra,1)
   quit $$$OK
 }
 
 if ($piece(var,barra,2) '= "") , ($data(^Src2Config("projeto",$piece(var,barra,2)))) {
   set projeto = $piece(var,barra,2)
   quit $$$OK
 }
 
 quit $$$ERROR(10000,"Projeto não encontrado para a cópia de trabalho!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarCopiaTrabalhoRepositorio">
<Description>

Validar Copia de Trabalho

set sc = ##class(Src2.Utils).ValidarCopiaTrabalhoRepositorio("C:\workspacecsw\projetos\6.3\cswutil63\rotinas\_SM", "http://192.168.15.10:18080/svn/cswutil/branches/6.3/rotinas/_SM", "cswutil63", "ederson.jantsch")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>pastaCopiaTrabalho:%String,pastaRepositorio:%String,projeto:%String,username:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ('##class(%File).DirectoryExists(pastaCopiaTrabalho)) quit $$$OK
 
 set sc = ##class(Src2.Utils).ValidarCopiaTrabalho(pastaCopiaTrabalho, .urlRepositorio, .revisaoWorkspace, .lastChangeAuthor, .lastChangeRev, .schedule)
 quit:sc'=1 sc
 
 if (urlRepositorio '= pastaRepositorio) {
   quit "Cópia de trabalho "_pastaCopiaTrabalho_" inválida para o repositório "_urlRepositorio
 }
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, , , , .revisaoAtual)
 
 if (revisaoWorkspace = revisaoAtual) quit $$$OK
 
 // Implementação para tratar a seguinte situação:
 // - No commit de uma pasta com merge, a revisão da pasta é alterada para a revisão do commit.
 if ((username = lastChangeAuthor) & (revisaoWorkspace = lastChangeRev)) quit $$$OK
 
 if (schedule = "add") quit $$$OK
 
 if (revisaoWorkspace '= revisaoAtual) {
   quit "Projeto: "_projeto_" :: Revisão do workspace ("_revisaoWorkspace_") diferente da revisão no Caché ("_revisaoAtual_"). (Update to revision "_revisaoAtual_") Pasta: "_pastaCopiaTrabalho
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarWorkspaceProjeto">
<Description>

Validar Workspace do Projeto

set sc = ##class(Src2.Utils).ValidarWorkspaceProjeto("csw63")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[projeto:%String,&revisaoAtual:%String,&revisaoWorkspace:%String,flgUrlRepos:%Boolean=1]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (revisaoAtual, revisaoWorkspace) = ""
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorioConf, .sistema, .revisaoAtual)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ValidarCopiaTrabalho(caminhoCopiaTrabalho, .urlRepositorio, .revisaoWorkspace)
 quit:sc'=1 sc
 
 if (flgUrlRepos) & (urlRepositorioConf '= urlRepositorio) {
   quit "Cópia de trabalho "_caminhoCopiaTrabalho_" inválida para o repositório "_urlRepositorioConf
 }
 
 if (revisaoWorkspace '= revisaoAtual) {
   quit "Projeto: "_projeto_" :: Revisão do workspace ("_revisaoWorkspace_") diferente da revisão no Caché ("_revisaoAtual_"). (Update to revision "_revisaoAtual_") Pasta: "_caminhoCopiaTrabalho
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarCopiaTrabalho">
<Description>

Valida uma Copia de Trabalho (Retorna a Url do Repositorio)

set sc = ##class(Src2.Utils).ValidarCopiaTrabalho("C:\workspacecsw\projetos\6.1\csw61", .urlRepositorio, .revisaoWorkspace, .lastChangeAuthor, .lastChangeRev)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[copiaTrabalho:%String,&urlRepositorio:%String,&revisaoWorkspace:%String,&lastChangeAuthor:%String,&lastChangeRev:%String,&schedule:%String,username:%String="",password:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (urlRepositorio, revisaoWorkspace, lastChangeAuthor, lastChangeRev, schedule) = ""
 
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp)
 quit:msgsc'=1 msgsc
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "info "_copiaTrabalho, username, password, , arquivoTemp)
 if (msgsc '= $$$OK) quit msgsc
 
 set msgsc = ##class(Src2.Utils).ObterDadosArquivoSvnInfo(arquivoTemp, .tabInformacao)
 
 set urlRepositorio = $get(tabInformacao("urlRepositorio"))
 
 set revisaoWorkspace = $get(tabInformacao("revisao"))
 
 set lastChangeAuthor = $get(tabInformacao("lastChangeAuthor"))
 
 set lastChangeRev = $get(tabInformacao("lastChangeRev"))
 
 set schedule = $get(tabInformacao("schedule"))
 
 if (urlRepositorio = "") {
   quit "A pasta "_copiaTrabalho_" não é uma cópia de trabalho válida!"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTiposStatus">
<Description>

Obtem os Tipos de Status do Subversion

set sc = ##class(Src2.Utils).ObterTiposStatus(.tabTiposStatus)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabTiposStatus:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set tabTiposStatus("A") = "Adicionado"   // Added
 set tabTiposStatus("C") = "Conflito"     // Conflicted
 set tabTiposStatus("D") = "Excluído"     // Deleted
 set tabTiposStatus("I") = "Ignorado"     // Ignored
 set tabTiposStatus("M") = "Modificado"   // Modified
 set tabTiposStatus("R") = "Substituído"  // Replaced
 
 set tabTiposStatus("G") = "Merged"       // Merged
 set tabTiposStatus("U") = "Atualizado"   // Updated
 set tabTiposStatus("E") = "Existente"    // Existed
 
 set tabTiposStatus("?") = "Sem Controle"
 set tabTiposStatus("!") = "Faltando"
 
 // Svn Update
 // A - Added
 // D - Deleted
 // U - Updated
 // C - Conflict
 // G - Merged
 // E - Existed
 
 // Svn Status
 //  First column: Says if item was added, deleted, or otherwise changed
 //    ' ' no modifications
 //    'A' Added
 //    'C' Conflicted
 //    'D' Deleted
 //    'I' Ignored
 //    'M' Modified
 //    'R' Replaced
 //    'X' an unversioned directory created by an externals definition
 //    '?' item is not under version control
 //    '!' item is missing (removed by non-svn command) or incomplete
 //    '~' versioned item obstructed by some item of a different kind
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ConverterStringUTF8">
<Description>

Converte uma String de UTF8 para Ansi

write ##class(Src2.Utils).ConverterStringUTF8("teste")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String="1"</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[ quit $zconvert(string,"I","UTF8")
]]></Implementation>
</Method>

<Method name="ObterCaminhoArquivo">
<Description>

Obtem o Caminho de um Arquivo

write ##class(Src2.Utils).ObterCaminhoArquivo("C:\workspacecsw\csw63\rotinas\CCEVA\CCEVA010.mac")
write ##class(Src2.Utils).ObterCaminhoArquivo("/sourcecontrol/csw63/rotinas/CCEVA/CCEVA010.mac")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivo:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 quit $piece(arquivo,barra,1,$length(arquivo,barra)-1)
]]></Implementation>
</Method>

<Method name="AcertarCaminhoArquivo">
<Description>

Acerta o Caminho do Arquivo

write ##class(Src2.Utils).AcertarCaminhoArquivo("/cache/cachesys/csp///sistemas//pasta/arquivo.txt")
write ##class(Src2.Utils).AcertarCaminhoArquivo("cache/ cachesys /csp///sistemas//pasta/arquivo.txt")
write ##class(Src2.Utils).AcertarCaminhoArquivo("c:\cache\cachesys\ csp \\\sistemas \\pasta\arquivo.txt")
write ##class(Src2.Utils).AcertarCaminhoArquivo("c:\\cache\cachesys\csp\\\sistemas\\pasta\arquivo.txt")
write ##class(Src2.Utils).AcertarCaminhoArquivo("c:\\cache/cachesys\csp\\\sistemas\/pasta\arquivo",".csv")
write ##class(Src2.Utils).AcertarCaminhoArquivo("c:\\cache\cachesys\csp\\\sistemas\\pasta\arquivo.txt",".csv")
write ##class(Src2.Utils).AcertarCaminhoArquivo("c:\\cache\cachesys\csp\\\sistemas\\pasta\/\")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminho:%String,extensaoPadrao:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sisOper = ##class(Src2.Utils).ObterSistOper()
 
 set extensaoPadrao = $get(extensaoPadrao)
 
 set caminho = $translate(caminho,"/\",barra_barra)
 
 set caminhoRet=""
 
 for cont=1:1:$length(caminho,barra) {
   if $piece(caminho,barra,cont)="" continue
   if (caminhoRet '= "") ! (sisOper = "linux") {
     set caminhoRet = caminhoRet_barra
   }
   set caminhoRet = caminhoRet_##class(Src2.Utils).RetirarBrancosIniciaisFinais($piece(caminho,barra,cont))
 }
 
 if (extensaoPadrao '= "") & ($piece(caminhoRet,".",2) = "") {
   set $piece(caminhoRet,".",2) = $translate(extensaoPadrao,".","")
 }
 
 quit caminhoRet
]]></Implementation>
</Method>

<Method name="RetirarBrancosIniciaisFinais">
<Description><![CDATA[

Obter Dados Informados

write ##class(Src2.Utils).RetirarBrancosIniciaisFinais(" dasf fa f ff  ")_"<=="
write ##class(Src2.Utils).RetirarBrancosIniciaisFinais(" a ")_"<=="
write ##class(Src2.Utils).RetirarBrancosIniciaisFinais("    ")_"<=="]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[string:%String,&tabInf:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (posIni, posFim) = ""
 
 if ($translate(string," ","") = "") set string = ""
 
 for cont=1:1:$length(string) {
   set var=$extract(string,cont)
   if (var '= " ") {
     if (posIni = "") set posIni = cont
     set posFim = cont
   }
 }
 
 if (posIni '= "") set string = $extract(string,posIni,posFim)
 
 quit string
]]></Implementation>
</Method>

<Method name="Just">
<Description><![CDATA[

Obtem o Caminho de um Arquivo

write ##class(Src2.Utils).Just("casa", 10)_"<=="]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String,tamanho:%String,caracter:%String=" "</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[ quit string_$translate($justify("",tamanho-$length(string))," ",caracter)
]]></Implementation>
</Method>

<Method name="Translate">
<Description><![CDATA[

Troca um Conjunto de Caracteres por Outro

write ##class(Src2.Utils).Translate("casa de teste", "de", "ABC")_"<=="
write ##class(Src2.Utils).Translate("casa de teste", "NOVO", "ABC")_"<=="
write ##class(Src2.Utils).Translate("casa de teste", "casa", "ABC")_"<=="
write ##class(Src2.Utils).Translate("casa de teste", "teste", "ABC")_"<=="]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String,strOld:%String,strNew:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set novaString = $piece(string,strOld,1)
 for cont=2:1:$length(string,strOld) {
   set novaString = novaString_strNew_$piece(string,strOld,cont)
 }
 
 quit novaString
]]></Implementation>
</Method>

<Method name="ObterTabItens">
<Description>

Obtem Uma Tabela de Itens de Uma String

set sc = ##class(Src2.Utils).ObterTabItens(,.tabItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[strItens:%String,&tabItens:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set strItens = $translate(strItens,$char(10,9,9)_",/",";;;")
 set strItens = $translate(strItens," ",";")
 
 set sc = ##class(Src2.Utils).ConvertStrTab(strItens, .tabela)
 
 set str = ""
 for  {
   set str = $order(tabela(str))
   if (str = "") quit	
   
   set item = str
   
   if (item [ "<GrupoRotina>") {
     set item = ##class(Src2.Utils).Translate(item, "<GrupoRotina>", "")
     set item = ##class(Src2.Utils).Translate(item, "</GrupoRotina>", "")
   }
   
   if (item [ "<GrupoClasse>") {
     set item = ##class(Src2.Utils).Translate(item, "<GrupoClasse>", "")
     set item = ##class(Src2.Utils).Translate(item, "</GrupoClasse>", "")
   }
   
   if (item = "") continue
   
   set sc = ##class(Src2.Item).ValidarItemInf(.item)
   if (sc = 1) set tabItens(item)=""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterBarra">
<Description>

Obter uma Barra

write ##class(Src2.Utils).ObterBarra("Teste")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&string:%String="",caracter:%String="=",tamanho:%String=80]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (string = "") quit $translate($justify(" ",tamanho)," ",caracter)
 
 set tam = (tamanho - ($length(string) + 2))
 
 set (barra,barra2) = $translate($justify(" ",tam\2)," ",caracter)
 
 if ((tam#2) = 1) set barra2 = barra2_caracter
 
 quit barra_" "_string_" "_barra2
]]></Implementation>
</Method>

<Method name="ConvertTabStr">
<Description>

Converte uma Tabela em uma String

set sc = ##class(Src2.Utils).ConvertTabStr(.tabela)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>tabela:%String,padrao:%String="",separador:%String=" / "</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (codigo, string)=""
 for  {
   set codigo = $order(tabela(codigo))
   if (codigo = "") quit
   set string=string_$select(string="":"",1:separador)_codigo
 }
 if (string = "") {
   set string = padrao
 }
 
 quit string
]]></Implementation>
</Method>

<Method name="ConvertStrTab">
<Description>

Converte uma String em uma Tabela

set sc = ##class(Src2.Utils).ConvertStrTab("csp;TODO;;workspace",.tabela)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>string:%String,tabela:%String="",separador:%String=";"</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabela
 
 for cont=1:1:$length(string,separador) {
   if ($piece(string,separador,cont) '= "") {
     set tabela($piece(string,separador,cont)) = ""
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="IniciarCronometragem">
<Description>

Iniciar Cronometragem

set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&timestampInicio:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set timestampInicio = $zdatetimeh($ztimestamp,-3)
 quit $$$OK
]]></Implementation>
</Method>

<Method name="EncerrarCronometragem">
<Description>

Encerrar Cronometragem

set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt, .tempoTotal)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[timestampInicio:%String,&tempoTotalEdt:%String="",&tempoTotal:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).CalcularPeriodo(timestampInicio, $zdatetimeh($ztimestamp,-3), .tempoTotalEdt, .tempoTotal)
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CalcularPeriodo">
<Description>

Cálcular Período

set sc = ##class(Src2.Utils).CalcularPeriodo($zdth("10/10/2013 08:00:00",4), $zdth("10/10/2013 09:00:00",4), .tempoTotalEdt, .segundos, .minutos, .horas)
set sc = ##class(Src2.Utils).CalcularPeriodo($zdth("10/10/2013 22:00:00",4), $zdth("11/10/2013 02:00:00",4), .tempoTotalEdt, .segundos, .minutos, .horas)
set sc = ##class(Src2.Utils).CalcularPeriodo($zdth("10/10/2013 22:00:00",4), $zdth("11/10/2013 02:35:00",4), .tempoTotalEdt, .segundos, .minutos, .horas)
set sc = ##class(Src2.Utils).CalcularPeriodo($zdth("10/10/2013 22:00:00",4), $zdth("11/10/2013 02:35:25",4), .tempoTotalEdt, .segundos, .minutos, .horas)
set sc = ##class(Src2.Utils).CalcularPeriodo($zdth("10/10/2013 22:00:00",4), $zdth("19/10/2013 02:00:00",4), .tempoTotalEdt, .segundos, .minutos, .horas)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[timestampInicio:%String,timestampFim:%String,&tempoTotalEdt:%String="",&segundos:%String="",&minutos:%String="",&horas:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set dataInicio = +timestampInicio
 set horaInicio = $piece(timestampInicio,",",2)
 
 set dataFim = +timestampFim
 set horaFim = $piece(timestampFim,",",2)
 
 if (dataFim > dataInicio) {
   set segundos = horaFim - horaInicio
 }
 
 if (dataFim = dataInicio) {
   set segundos = $piece(timestampFim,",",2) - $piece(timestampInicio,",",2)
 } else {
   set segundos = (86400 - horaInicio) + horaFim
   for cont = (dataInicio+1):1:(dataFim-1) {
     set segundos = segundos + 86400
   }
 }
 
 set minutos = segundos / 60
 set horas = segundos / 3600
 
 set tempoTotalEdt = $translate($justify(horas\1,2)," ","0")_":"_$piece($ztime(segundos#3600),":",2,3)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterSugestaoSistema">
<Description>

Obter Sugestão de Sistema

set sc = ##class(Src2.Utils).ObterSugestaoSistema(.sistema)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&sistema:%String,InternalName:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sistema = $get(^Src2UserConf("ultSistema"))
 
 if (InternalName '= "") {
   set sc = ##class(Src2.Item).ObterDadosItem(InternalName, , , , , , , , , .projeto)
   if (projeto '= "") {
     set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, , , .sistema)
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="Subversion">
<Description>

Exporta Fontes do Controle de Fonte para o Workspace

set sc = ##class(Src2.Utils).CmdSubversion("C:\""Program Files""\TortoiseSVN\bin\svn", "list -R http://192.168.15.10:18080/svn/cswesp/branches/6.1", "admin", "acessorestrito", "C:\workspacecsw\temp\teste.txt")
set sc = ##class(Src2.Utils).CmdSubversion("C:\""Program Files""\TortoiseSVN\bin\svn", "list -R http://192.168.15.10:18080/svn/cswesp/branches/6.1", "oi", "teste", "C:\workspacecsw\temp\teste.txt")
set sc = ##class(Src2.Utils).CmdSubversion("C:\""Program Files""\TortoiseSVN\bin\svn", "list -R http://192.168.15.10:18080/svn/sourcecontrol/trunk", , , "C:\workspacecsw\temp\teste.txt")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminhoSvn:%String,comando:%String,username:%String="",password:%String="",autenticacao:%String="",arquivoSaida:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (autenticacao = "") {
   set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 }
 
 set string = caminhoSvn_" "_comando_" "_autenticacao
 
 if (arquivoSaida '= "") set string = string_" > "_arquivoSaida
 
 set status = $zf(-1,string)
 if (status '= 0) {
   set sc = ##class(Src2.Utils).GeraLog(2, "Chamada Subversion | "_caminhoSvn_" "_comando)
   quit "Chamada ao subversion retornou erro! svn "_comando
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterStrAutenticacao">
<Description>

Obter String de Autenticacao no Subversion

set sc = ##class(Src2.Utils).ObterStrAutenticacao("usuario.nome", "1234", .autenticacao)
set sc = ##class(Src2.Utils).ObterStrAutenticacao(, , .autenticacao)
set sc = ##class(Src2.Utils).ObterStrAutenticacao(, , .autenticacao, 0)
set sc = ##class(Src2.Utils).ObterStrAutenticacao(, , .autenticacao, , 1)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[username:%String="",password:%String="",&autenticacao:%String="",flgObrigatorio:%Boolean=1,flgRead:%Boolean=0]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ($get(autenticacao) '= "") quit $$$OK
 
 if (flgRead) & (username = "") & (password = "") {
   write #,"Autenticacao Subversion"
   read !,"Usuario: ",username
   write !,"Senha: "
   do ##class(Src2.Utils).ReadPassword(.password)
 }
 
 set autenticacao = "--non-interactive --no-auth-cache"
 
 if (flgObrigatorio) , ((username = "") ! (password = "")) quit "Usuário/senha não informados para autenticação no Subversion"
 
 if (username '= "") & (password '= "") {
   set autenticacao = "--username "_username_" --password "_password_" --non-interactive --no-auth-cache"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ReadPassword">
<Description>

Leitor de Password

do ##class(Src2.Utils).ReadPassword(.var)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>var:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set var=""
 do {
   read *char
   if (char '= 13) {
     if (char = 8) {
       write $char(8)_" "_$char(8)
       set $extract(var,$length(var))=""
     } else {
       write $char(8)_"*"
       set var = var_$char(char)
     }
   }
 } while (char '= 13)
]]></Implementation>
</Method>

<Method name="ObterResumoStatus">
<Description>

Obtem os Tipos de Status do Subversion

set sc = ##class(Src2.Utils).ObterResumoStatus(1564, .tabResumo)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,&tabResumo:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (status, item) = ""
 for {
   set status = $order(^mtempInfoArquivo(codTerm,"status",status))
   if (status = "") quit
   
   set (qtdRotinas, qtdClasses) = 0
   
   for {
     set item = $order(^mtempInfoArquivo(codTerm,"status",status,"rotinas",item))
     if (item = "") quit
     set qtdRotinas = qtdRotinas + 1
   }
   
   for {
     set item = $order(^mtempInfoArquivo(codTerm,"status",status,"classes",item))
     if (item = "") quit
     set qtdClasses = qtdClasses + 1
   }
   
   set tabResumo(status) = qtdRotinas_"^"_qtdClasses_"^"_(qtdRotinas+qtdClasses)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterItensStatus">
<Description>

Obtem os Itens em um de Status do Subversion

set sc = ##class(Src2.Utils).ObterItensStatus("a", "G", .strItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,status:%String,&strItens:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ('$data(^mtempInfoArquivo(codTerm,"status",status))) quit "Não existem itens neste status"
 
 set (strItens, itemId) = ""
 for {
   set itemId = $order(^mtempInfoArquivo(codTerm,"status",status,"rotinas",itemId))
   if (itemId = "") quit
   set sc = ##class(Src2.Item).ObterInfoItemId(itemId, .InternalName)
   set strItens = strItens_$select(strItens="":"",1:" / ")_InternalName
 }
 
 for {
   set itemId = $order(^mtempInfoArquivo(codTerm,"status",status,"classes",itemId))
   if (itemId = "") quit
   set sc = ##class(Src2.Item).ObterInfoItemId(itemId, .InternalName)
   set strItens = strItens_$select(strItens="":"",1:" / ")_InternalName
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosInformados">
<Description>

Obter Dados Informados

set sc = ##class(Src2.Utils).ObterDadosInformados("Projeto: ads"_$char(13,10,13)_"Revisão: casa",.tabInf)
set sc = ##class(Src2.Utils).ObterDadosInformados("Namespace: ",.tabInf)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[string:%String,&tabInf:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabInf
 
 for cont=1:1:$length(string,$char(13,10,13)) {
   set var = $piece(string,$char(13,10,13),cont)
   
   set parametro = ##class(Src2.Utils).RetirarBrancosIniciaisFinais($piece(var,":",1))
   set valor = ##class(Src2.Utils).RetirarBrancosIniciaisFinais($piece(var,":",2))
   
   if (parametro '= "") {
     set tabInf(parametro) = valor
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterStrReposRevis">
<Description>
set sc = ##class(Src2.Utils).ObterStrReposRevis(.tabReposRevis, .strReposRevis)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>tabReposRevis:%String,strReposRevis:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set strReposRevis = ""
 
 set (urlRepositorio, revision) = ""
 for {
   set urlRepositorio = $order(tabReposRevis(urlRepositorio))
   if (urlRepositorio = "") quit
   
   set projeto = $piece($get(tabReposRevis(urlRepositorio)),"^",1)
   
   set (contRotinas, contClasses) = 0
   
   set revisoes = ""
   for {
     set revision = $order(tabReposRevis(urlRepositorio,1,revision))
     if (revision = "") quit
     set revisoes = revisoes_$select(revisoes="":"",1:",")_revision
   }
   
   set (rotina, contRotinas) = ""
   for {
     set rotina = $order(tabReposRevis(urlRepositorio,2,rotina))
     if (rotina = "") quit
     set contRotinas = contRotinas + 1
   }
   
   set (classe, contClasses) = ""
   for {
     set classe = $order(tabReposRevis(urlRepositorio,3,classe))
     if (classe = "") quit
     set contClasses = contClasses + 1
   }
   
   set var = urlRepositorio_";"_revisoes_";"_(+contRotinas)_";"_(+contClasses)_";"_projeto
   
   set strReposRevis = strReposRevis_$select(strReposRevis="":"",1:"^")_var
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabReposRevis">
<Description>
set sc = ##class(Src2.Utils).ObterTabReposRevis(strReposRevis, .tabReposRevis)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>strReposRevis:%String,tabReposRevis:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabReposRevis
 
 for cont = 1:1:$length(strReposRevis,"^") {
   set var = $piece(strReposRevis,"^",cont)
   set urlRepositorio = $piece(var,";",1)
   for cont2 = 1:1:$length($piece(var,";",2),",") {
     set revisao = $piece($piece(var,";",2),",",cont2)
     set tabReposRevis(urlRepositorio,revisao) = ""
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterVersaoCache">
<Description>
set sc = ##class(Src2.Utils).ObterVersaoCache(.versao, .versao2)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>versao:%String,versao2:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set versao = $translate($piece($piece($zversion,")",2),"(",1)," ","")
 set versao2 = $piece(versao,".",1)
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabErrosCompilacaoRotina">
<Description>

Obter Tabela de Erros da Compilacao de uma Rotina
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[string:%String,&tabErros:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabErros
 
 do $system.Status.DecomposeStatus(string, .erro)
 
 set quebra = $char(13)_$char(10)_$char(32)
 
 set msgErro = $get(erro(1,"param",2))
 
 set $extract(msgErro,1,2) = ""
 
 for cont = 1:1:$length(msgErro,quebra) {
   set tabErros($order(tabErros(""),-1)+1) = $piece(msgErro,quebra,cont)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterMensagemStatusCode">
<Description>

Obter Mensagem Status Code

write ##class(Src2.Utils).ObterMensagemStatusCode(sc)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>sc:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (sc = "") quit ""
 do $system.Status.DecomposeStatus(sc, .erro)
 quit $get(erro(1,"param",1))
]]></Implementation>
</Method>

<Method name="ObterDadosRevisoes">
<Description>

Obtem as Revisoes

set sc = ##class(Src2.Utils).ObterDadosRevisoes("aa", "C:\csvn\bin\svn", "C:\workspacecsw\temp\3100.txt", "http://192.168.15.10:18080/svn/teste/trunk", 38, 38)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,caminhoSvn:%String,arquivoTemp:%String,urlRepositorio:%String,revInicio:%String,revFim:%String="head",username:%String="",password:%String="",autenticacao:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 // Nunca matar a global abaixo neste método, fazer isto conforme a necessidade antes da chamado do método
 //   kill ^mtempSrc2Revisoes(codTerm)
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "log --xml -v -r "_revInicio_":"_revFim_" "_urlRepositorio, username, password, autenticacao, arquivoTemp)
 if (msgsc '= $$$OK) quit sc
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoTemp,.reader)
 if $$$ISERR(sc) {
   set sc = ##class(%File).Delete(arquivoTemp)
   quit "Não foi possível ler os dados do Subversion!"
 }
 
 set (path, revisao, kind) = ""
 
 while (reader.Read()) {
   
   if (reader.Path '= "") { set path = reader.Path }
   
   if (reader.NodeType = "element") , (reader.Path = "/log/logentry") {
     if reader.MoveToAttributeName("revision") set revisao = reader.Value
     set (mensagem, autor) = ""
   }
   
   if (reader.NodeType = "chars") , (path = "/log/logentry/msg") {
     set mensagem = reader.Value
   }
   
   if (reader.NodeType = "chars") , (path = "/log/logentry/author") {
     set autor = reader.Value
   }
   
   if (path = "/log/logentry/paths/path") {
     ; OBS: Para alguns repositório a propriedade kind vem com nulo
     if reader.MoveToAttributeName("kind") set kind = reader.Value
     if reader.MoveToAttributeName("action") set acao = reader.Value
     if (kind '= "dir") & (reader.NodeType = "chars") {
       set file = reader.Value
       if (file = "") continue
       
       set msgsc = ##class(Src2.Item).ObterItem(file, .tipoItem, .item, , , .InternalName, .itemId)
       if (msgsc '= $$$OK) continue
       
       set ^mtempSrc2Revisoes(codTerm,"rev",revisao,1,tipoItem,item) = itemId_"^"_acao_"^"_InternalName
       set ^mtempSrc2Revisoes(codTerm,"item",tipoItem,item,revisao) = ""
     }
   }
   
   if (reader.NodeType = "endelement") & (reader.Depth = "1") {
     if (revisao '= "") {
       set ^mtempSrc2Revisoes(codTerm,"rev",revisao,2) = mensagem
       set ^mtempSrc2Revisoes(codTerm,"rev",revisao,3) = autor
     }
   }
 }
 
 set reader = ""
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarRevisoes">
<Description>

Importar as Revisoes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,caminhoSvn:%String,arquivoTemp:%String,urlRepositorio:%String,flagShowLog:%Boolean=1,flagCsp:%Boolean=1,flagTODO:%Boolean=0,&flagComp:%String="",username:%String="",password:%String="",autenticacao:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill ^mtempSrc2Erros(codTerm)
 
 if ('$data(^mtempSrc2Revisoes(codTerm))) quit $$$OK
 
 if (autenticacao = "") {
   set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 }
 
 if (flagComp = "") {
   set flagComp = ##class(Src2.Classe).ObterFlagsCompilacaoPadrao(2)
 }
 
 set strGeraRotina = ""
 if (flagCsp) set strGeraRotina = strGeraRotina_";csp"
 if (flagTODO) set strGeraRotina = strGeraRotina_";todo"
 
 set (revisao, rotina, classe) = ""
 for {
   set revisao = $order(^mtempSrc2Revisoes(codTerm,"rev",revisao))
   if (revisao = "") quit
   
   set autor = $get(^mtempSrc2Revisoes(codTerm,"rev",revisao,3))
   
   if (flagShowLog) { write !!,"Repositorio: "_urlRepositorio," - ",revisao,! }
   
   for {
     set classe = $order(^mtempSrc2Revisoes(codTerm,"rev",revisao,1,2,classe))
     if (classe = "") quit
     set var = $get(^mtempSrc2Revisoes(codTerm,"rev",revisao,1,2,classe))
     
     set itemId = $piece(var,"^",1)
     set acao = $piece(var,"^",2)
     
     if (flagShowLog) { 
       write !,$justify(acao,1)
       write "  "_##class(Src2.Utils).Just(classe, 40)
     }
     
     if (acao = "A") ! (acao = "U") ! (acao = "M") ! (acao = "R") {
       set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "cat "_urlRepositorio_"/classes/"_itemId_"@"_revisao, , , autenticacao, arquivoTemp)
       if (msgsc '= $$$OK) {
         write "  "_msgsc
         continue
       }
       
       set msgsc = ##class(Src2.Classe).GerarClasseArquivo(arquivoTemp, classe, flagComp, .tabErros, .tabOK)
       
       if (flagShowLog) { 
         write "  Importacao ["_$select($data(tabOK(1)):"X",1:" ")_"]"
         write "  Compilacao ["_$select($data(tabOK(2)):"X",1:" ")_"]"
       }
       
       if ($data(tabErros)) {
         merge ^mtempSrc2Erros(codTerm,autor,revisao,2,classe) = tabErros
       }
     }
     
     if (acao = "D") {
       set msgsc = ##class(Src2.Classe).ExcluirClasse(classe)
       if (msgsc '= $$$OK) {
         if (flagShowLog) { write "  Exclusao [ ]" }
       } else {
         if (flagShowLog) { write "  Exclusao [X]" }
       }
     }
   }
   
   for {
     set rotina = $order(^mtempSrc2Revisoes(codTerm,"rev",revisao,1,1,rotina))
     if (rotina = "") quit
     set var = $get(^mtempSrc2Revisoes(codTerm,"rev",revisao,1,1,rotina))
     
     set itemId = $piece(var,"^",1)
     set acao = $piece(var,"^",2)
     
     if (flagShowLog) {
       write !,$justify(acao,1)
       write "  "_##class(Src2.Utils).Just(rotina, 18)
     }
     
     if (acao = "A") ! (acao = "U") ! (acao = "M") ! (acao = "R") {
       set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "cat "_urlRepositorio_"/rotinas/"_itemId_"@"_revisao, , , autenticacao, arquivoTemp)
       if (msgsc '= $$$OK) {
         write "  "_msgsc
         continue
       }
       
       set msgsc = ##class(Src2.Rotina).GerarRotinaArquivo(arquivoTemp, rotina, strGeraRotina, .tabErros, .tabOK)
       
       if (flagShowLog) {
         write "  Importacao ["_$select($data(tabOK(1)):"X",1:" ")_"]"
         write "  Compilacao ["_$select($data(tabOK(2)):"X",1:" ")_"]"
         if (flagCsp) { write "  CSP ["_$select($data(tabOK(3)):"X",1:" ")_"]" }
         if (flagTODO) { write "  Sem TODO ["_$select($data(tabOK(4)):"X",1:" ")_"]" }
       }
       
       if ($data(tabErros)) {
         merge ^mtempSrc2Erros(codTerm,autor,revisao,1,rotina) = tabErros
       }
     }
     
     if (acao = "D") {
       set msgsc = ##class(Src2.Rotina).ExcluirRotina(rotina)
       if (msgsc '= $$$OK) {
         if (flagShowLog) { write "  Exclusao [ ]" }
       } else {
         if (flagShowLog) { write "  Exclusao [X]" }
       }
     }
   }
 }
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarRevisaoCopiaTrabalho">
<Description>

Importar uma Revisão a Partir do Endereço de uma Cópia de Trabalho

set sc = ##class(Src2.Utils).ImportarRevisaoCopiaTrabalho("C:\workspacecsw\projetos\6.1\csw61\rotinas\CCUTI", "560")
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminhoCopiaTrabalhoInfo:%String,nrRevisao:%String,username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, , .caminhoSvn, .arquivoTemp)
 if (sc '= 1) quit $$$OK
 
 set sc = ##class(Src2.Utils).ObterProjetoCamCopiaTrab(caminhoCopiaTrabalhoInfo, .projeto)
 if (sc '= 1) quit $$$OK
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual)
 if (sc '= 1) quit $$$OK
 
 kill ^mtempSrc2Revisoes(codTerm)
 
 set sc = ##class(Src2.Utils).ObterDadosRevisoes(codTerm, caminhoSvn, arquivoTemp, urlRepositorio, nrRevisao, nrRevisao, username, password)
 if (sc '= 1) {
   set sc2 = ##class(Src2.Utils).GeraLog(2, "Hook Script - post-commit | Projeto: "_projeto_" | Revisão: "_nrRevisao_" | Erro: "_sc)
   quit sc
 }
 
 set sc = ##class(Src2.Utils).ImportarRevisoes(codTerm, caminhoSvn, arquivoTemp, urlRepositorio, 0, , , , username, password)
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Hook Script - post-commit | Projeto: "_projeto_" | Revisão: "_nrRevisao_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabMensagensErroRevisao">
<Description>

Obtem uma Tabela de Mensagens de Erro da Revisao
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,urlRepositorio:%String,autor:%String,revisao:%String,tabMensagem:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 // obs: nunca dar kill na tabela tabMensagem
 
 set mensagem = $get(^mtempSrc2Revisoes(codTerm,"rev",revisao,2))
 
 set tabMensagem($order(tabMensagem(""),-1)+1) = ""
 set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , ,100)
 set tabMensagem($order(tabMensagem(""),-1)+1) = "Repositório: "_urlRepositorio_" - Revisão: "_revisao_" - Namespace: "_$znspace
 set tabMensagem($order(tabMensagem(""),-1)+1) = "Mensagem: "_mensagem
 set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , ,100)
 set tabMensagem($order(tabMensagem(""),-1)+1) = ""
 
 set (rotina, classe, codSeq) = ""
 
 for {
   set rotina = $order(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina))
   if (rotina = "") quit
   
   if $data(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina,1)) {
     set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , "-",100)
     set tabMensagem($order(tabMensagem(""),-1)+1) = "Rotina com Erros de Importação: "_rotina
     set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , "-",100)
     set tabMensagem($order(tabMensagem(""),-1)+1) = ""
     for {
       set codSeq = $order(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina,1,codSeq))
       if (codSeq = "") quit
       set tabMensagem($order(tabMensagem(""),-1)+1) = $get(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina,1,codSeq))
     }
     set tabMensagem($order(tabMensagem(""),-1)+1) = ""
   }
   
   if $data(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina,2)) {
     set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , "-",100)
     set tabMensagem($order(tabMensagem(""),-1)+1) = "Rotina com Erro de Compilação: "_rotina
     set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , "-",100)
     set tabMensagem($order(tabMensagem(""),-1)+1) = ""
     for {
       set codSeq = $order(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina,2,codSeq))
       if (codSeq = "") quit
       set tabMensagem($order(tabMensagem(""),-1)+1) = $get(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina,2,codSeq))
     }
     set tabMensagem($order(tabMensagem(""),-1)+1) = ""
   }
   
   if $data(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina,3)) {
     set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , "-",100)
     set tabMensagem($order(tabMensagem(""),-1)+1) = "Rotina com Erro na Geração da Página CSP: "_rotina
     set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , "-",100)
     set tabMensagem($order(tabMensagem(""),-1)+1) = ""
     for {
       set codSeq = $order(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina,3,codSeq))
       if (codSeq = "") quit
       set tabMensagem($order(tabMensagem(""),-1)+1) = $get(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina,3,codSeq))
     }
     set tabMensagem($order(tabMensagem(""),-1)+1) = ""
   }
   
   if $data(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina,4)) {
     set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , "-",100)
     set tabMensagem($order(tabMensagem(""),-1)+1) = "Rotina com TODO's não implementados: "_rotina
     set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , "-",100)
     set tabMensagem($order(tabMensagem(""),-1)+1) = ""
     for {
       set codSeq = $order(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina,4,codSeq))
       if (codSeq = "") quit
       set tabMensagem($order(tabMensagem(""),-1)+1) = $get(^mtempSrc2Erros(codTerm,autor,revisao,1,rotina,4,codSeq))
     }
     set tabMensagem($order(tabMensagem(""),-1)+1) = ""
   }
 }

 for {
   set classe = $order(^mtempSrc2Erros(codTerm,autor,revisao,2,classe))
   if (classe = "") quit
   
   if $data(^mtempSrc2Erros(codTerm,autor,revisao,2,classe,1)) {
     set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , "-",100)
     set tabMensagem($order(tabMensagem(""),-1)+1) = "Classe com Erros de Importação: "_classe
     set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , "-",100)
     set tabMensagem($order(tabMensagem(""),-1)+1) = ""
     for {
       set codSeq = $order(^mtempSrc2Erros(codTerm,autor,revisao,2,classe,1,codSeq))
       if (codSeq = "") quit
       set tabMensagem($order(tabMensagem(""),-1)+1) = $get(^mtempSrc2Erros(codTerm,autor,revisao,2,classe,1,codSeq))
     }
     set tabMensagem($order(tabMensagem(""),-1)+1) = ""
   }
   
   if $data(^mtempSrc2Erros(codTerm,autor,revisao,2,classe,2)) {
     set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , "-",100)
     set tabMensagem($order(tabMensagem(""),-1)+1) = "Classe com Erro de Compilação: "_classe
     set tabMensagem($order(tabMensagem(""),-1)+1) = ##class(Src2.Utils).ObterBarra( , "-",100)
     set tabMensagem($order(tabMensagem(""),-1)+1) = ""
     for {
       set codSeq = $order(^mtempSrc2Erros(codTerm,autor,revisao,2,classe,2,codSeq))
       if (codSeq = "") quit
       set tabMensagem($order(tabMensagem(""),-1)+1) = $get(^mtempSrc2Erros(codTerm,autor,revisao,2,classe,2,codSeq))
     }
     set tabMensagem($order(tabMensagem(""),-1)+1) = ""
   }
 }

 quit $$$OK
]]></Implementation>
</Method>

<Method name="Ajuda">
<Description>

Ajuda

set sc = ##class(Src2.Utils).Ajuda()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConfig(, .caminhoWorkspace)
 quit:sc'=1 sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 write !!,##class(Src2.Utils).ObterBarra("Ajuda")
 
 write !,"Update em um Projeto"
 write !,"  set sc = ##class(Src2.Svn).Update(""teste64"")"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Gera um Patch com Todas as Alterações em um Projeto - Na Raiz do Projeto"
 write !,"  set sc = ##class(Src2.Svn).GerarPatchProjeto(""teste64"", ""usuario.nome"")"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Aplica um Patch em um Projeto - Na Raiz do Projeto"
 write !,"  set sc = ##class(Src2.Svn).AplicarPatchProjeto(""teste64"", ""usuario.nome"")"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Reverte todas as alterações em um projeto - ATENÇÃO: Não tem retorno!"
 write !,"  set sc = ##class(Src2.Svn).ReverterProjeto(""teste64"")"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Reverte as alterações de um item - ATENÇÃO: Não tem retorno!"
 write !,"  set sc = ##class(Src2.Svn).ReverterItem(""CCCGI015.mac"")"
 write !,"  set sc = ##class(Src2.Svn).ReverterItem(""Cgi.Item.cls"")"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Importa um item do workspace para o Caché!"
 write !,"  set sc = ##class(Src2.Svn).ImportarItem(""CCCGI015.mac"")"
 write !,"  set sc = ##class(Src2.Svn).ImportarItem(""Cgi.Item.cls"")"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Gera página csp"
 write !,"  do ^%CSW1CSPGEN()"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Compila todas as classes"
 write !,"  do $system.OBJ.CompileAll("""_##class(Src2.Classe).ObterFlagsCompilacaoPadrao(3)_""")"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Compila todas as classes desatualizadas"
 write !,"  do $system.OBJ.CompileAll(""u"")"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Compila todas as classes de um pachage"
 write !,"  do $SYSTEM.OBJ.CompilePackage(""Package"","""_##class(Src2.Classe).ObterFlagsCompilacaoPadrao(3)_""")"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Flags de compilação"
 write !,"  do $System.OBJ.ShowFlags()"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Compila classes de utilitarios"
 write !,"  do utilitario^%CSW1LOADPAGES()"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Cadastra a mensagem padrão 10000"
 write !,"  do ^%CSUTICSP"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Gera o Serviço Consistem"
 write !,"  set sc = ##class(Src2.Utils).GerarServicoConsistem(1)"
 
 write !,##class(Src2.Utils).ObterBarra(,"-")
 
 write !,"Atualiza o controle de fonte"
 write !,"  Studio => Controle de Fonte => Atualizar Configurações"
 write !,"  do $system.OBJ.DeletePackage(""Src2"")"
 write !,"  "_##class(Src2.Utils).StringAtualizador()
 write !,"  Executar em cada namespace de desenvolvimento: DESENV64 / DESENV64RF / DESENV65 / ..."
 
 write !,##class(Src2.Utils).ObterBarra()
 quit $$$OK
]]></Implementation>
</Method>

<Method name="StringAtualizador">
<Description>

Obter String do Atualizador

write ##class(Src2.Utils).StringAtualizador()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConfig(, .caminhoWorkspace)
 quit:sc'=1 ""
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 quit "set sc = $system.OBJ.Load("""_caminhoWorkspace_barra_"configgeral"_barra_"Src2.xml"", ""cbk"")"
]]></Implementation>
</Method>

<Method name="ObterDadosArquivoSvnInfo">
<Description>

Obter Dados de um Arquivo Gerado pelo Svn Info
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[arquivo:%String,&tabInformacao:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabInformacao
 
 set file = ##class(%File).%New(arquivo)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   
   if ($extract(linhaFile,1,5) = "URL: ") {
     set tabInformacao("urlRepositorio") = $piece(linhaFile,"URL: ",2)
   }
   if (linhaFile [ "Revision: ") {
     set tabInformacao("revisao") = $piece(linhaFile,"Revision: ",2)
   }
   if (linhaFile [ "Last Changed Author: ") {
     set tabInformacao("lastChangeAuthor") = $piece(linhaFile,"Last Changed Author: ",2)
   }
   if (linhaFile [ "Last Changed Rev: ") {
     set tabInformacao("lastChangeRev") = $piece(linhaFile,"Last Changed Rev: ",2)
   }
   if (linhaFile [ "Schedule: ") {
     set tabInformacao("schedule") = $piece(linhaFile,"Schedule: ",2)
   }
 }
 
 do file.Close()
 set file=""
 
 set sc = ##class(%File).Delete(arquivo)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosArquivoSvnCUS">
<Description>

Obter Dados de um Arquivo Gerado pelo Svn Checkout/Update/Status/Diff

set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS("a", "C:\workspacecsw\temp\checkout.txt", "checkout", .nrRevisao, .tabFlags)
set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS("a", "C:\workspacecsw\temp\update.txt", "update", .nrRevisao, .tabFlags)
set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS("a", "C:\workspacecsw\temp\update_2.txt", "update", .nrRevisao, .tabFlags)
set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS("a", "C:\workspacecsw\temp\update_conflito.txt", "update", .nrRevisao, .tabFlags)
set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS("a", "C:\workspacecsw\temp\update_paginas.txt", "update", .nrRevisao, .tabFlags)
set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS("a", "C:\workspacecsw\temp\update_restored.txt", "update", .nrRevisao, .tabFlags)
set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS("a", "C:\workspacecsw\temp\status.txt", "status", .nrRevisao, .tabFlags)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String="",arquivo:%String,cmd:%String,&nrRevisao:%String,&tabFlags:%String,codConta:%String=""]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill ^mtempInfoArquivo(codTerm)
 
 kill tabFlags
 
 set nrRevisao = ""
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 set posIni = 6
 
 if (cmd = "status") {
   set posIni = 9
 }
 
 if (cmd = "diff") {
   set barra = "/"
   set posIni = 9
 }
 
 if (cmd = "patch") {
   set posIni = 11
 }
 
 set barraRotinas = barra_"rotinas"_barra
 set barraClasses = barra_"classes"_barra
 set barraPaginas = barra_"paginas"_barra
 set barraOutros = barra_"outros"_barra
 set barraAjuda = barra_"ajuda"_barra
 set barraRelatorios = barra_"relatorios"_barra
 set barraMenuBase = barra_"menubase"_barra
 
 set file = ##class(%File).%New(arquivo)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   
   if (tam = -1) quit
   
   set status = $extract(linhaFile,1)
   
   set operacao = $select(status="A":1,status="U":1,status="M":1,status="G":1,status="D":2,status="C":3,1:"")
   
   if (status = "R") , ($extract(linhaFile,1,8) = "Restored") {
     if (linhaFile [ barraRotinas) , (linhaFile [ ".mac") {
       set pathRotina = $piece(linhaFile,"'",2)
       set rotinaId = $piece(pathRotina,barraRotinas,2)
       set ^mtempInfoArquivo(codTerm,"rotinas",rotinaId) = "1^"_pathRotina_"^Restaurada"
       continue
     }
     if (linhaFile [ barraClasses) , (linhaFile [ ".xml") {
       set pathClasse = $piece(linhaFile,"'",2)
       set classeId = $piece(pathClasse,barraClasses,2)
       set ^mtempInfoArquivo(codTerm,"classes",classeId) = "1^"_pathClasse_"^Restaurada"
       continue
     }
   }
   
   set caminhoItem = $extract(linhaFile,posIni,$length(linhaFile))
   
   set tipo = "pasta"
   if ($piece(caminhoItem,barra,$length(caminhoItem,barra)) [ ".") set tipo = "arquivo"
   
   if (linhaFile [ barraRotinas) {
     set rotinaId = $piece(caminhoItem,barraRotinas,2)
     if (linhaFile [ ".mac") {
       set ^mtempInfoArquivo(codTerm,"rotinas",rotinaId) = operacao_"^"_caminhoItem_"^"_status
       if (status '= "") {
         set ^mtempInfoArquivo(codTerm,"status",status,"rotinas",rotinaId) = caminhoItem
       }
     }
     if (tipo = "pasta") {
       set ^mtempInfoArquivo(codTerm,"status",status,"pastaRotinas",rotinaId) = caminhoItem
     }
     continue
   }
   
   if (linhaFile [ barraClasses) {
     set classeId = $piece(caminhoItem,barraClasses,2)
     if (linhaFile [ ".xml") {
       set ^mtempInfoArquivo(codTerm,"classes",classeId) = operacao_"^"_caminhoItem_"^"_status
       if (status '= "") {
         set ^mtempInfoArquivo(codTerm,"status",status,"classes",classeId) = caminhoItem
       }
     }
     if (tipo = "pasta") {
       set ^mtempInfoArquivo(codTerm,"status",status,"pastaClasses",classeId) = caminhoItem
     }
     continue
   }
   
   if (linhaFile [ barraPaginas) {
     set tabFlags("flgPaginas") = ""
     continue
   }
   
   if (linhaFile [ barraAjuda) {
     set ^mtempInfoArquivo(codTerm,"ajuda",status,tipo,caminhoItem) = $piece(caminhoItem,barraAjuda,2)
     continue
   }
   
   if (linhaFile [ barraRelatorios) {
     set ^mtempInfoArquivo(codTerm,"relatorios",status,tipo,caminhoItem) = $piece(caminhoItem,barraRelatorios,2)
     continue
   }
   
   if (linhaFile [ barraOutros) {
     if (linhaFile [ (barraOutros_"diversos.xml")) {
       set tabFlags("flgDiversos") = ""
       continue
     }
     if (linhaFile [ (barraOutros_"procedimentos.xml")) {
       set tabFlags("flgProcedimentos") = ""
       continue
     }
     if (linhaFile [ (barraOutros_"serasahttp.keystore")) {
       set tabFlags("flgSerasahttp") = ""
       continue
     }
     if (linhaFile [ (barraOutros_"server_producao.keystore")) {
       set tabFlags("flgServerProducao") = ""
       continue
     }
   }
   
   if (linhaFile [ barraMenuBase) {
     if (linhaFile [ (barraMenuBase_"cswmenu2_")) {
       set tabFlags("flgMenu") = ""
       continue
     }
   }
   
   if (cmd = "checkout") , (linhaFile [ "Checked out revision") {
     set nrRevisao = $piece($piece(linhaFile,"revision ",2),".")
     set ^mtempInfoArquivo(codTerm,0,"revisao") = nrRevisao
     continue
   }
   
   if (cmd = "update") , ((linhaFile [ "Updated to revision") ! (linhaFile [ "At revision")) {
     set nrRevisao = $piece($piece(linhaFile,"revision ",2),".")
     set ^mtempInfoArquivo(codTerm,0,"revisao") = nrRevisao
     continue
   }
 }
 
 do file.Close()
 set file=""
 
 set sc = ##class(%File).Delete(arquivo)
 
 if ($data(^mtempInfoArquivo(codTerm,"rotinas","_CS"_barra_"_CSUTICSP.mac"))) {
   set tabFlags("flgCSUTICSP") = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CarregarItensPastasExcluidas">
<Description>

Carregar Itens de Pastas Excluídas
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,projeto:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio)
 if (msgsc '= $$$OK) quit msgsc
 
 set pasta = ""
 for {
   set pasta = $order(^mtempInfoArquivo(codTerm,"status","D","pastaRotinas",pasta))
   if (pasta = "") quit
   
   set msgsc = ##class(Src2.Item).ValidarItem(pasta_"*.mac", , , .tabItens)
   
   set InternalName = ""
   for  {
     set InternalName = $order(tabItens(InternalName))
     if (InternalName = "") quit
     
     set rotina = $piece(InternalName,".",1)
     
     set msgsc = ##class(Src2.Rotina).ObterInfoRotina(rotina, .rotinaId, .pasta2)
     if (msgsc '= $$$OK) continue
     
     if (pasta '= pasta2) continue
     
     if ($data(^mtempInfoArquivo(codTerm,"rotinas",rotinaId))) continue
     
     set msgsc = ##class(Src2.Rotina).ObterInfoRotinaId2(rotinaId, urlRepositorio, caminhoCopiaTrabalho, , .rotinaCopiaTrabalho)
     
     set ^mtempInfoArquivo(codTerm,"rotinas",rotinaId) = "2^"_rotinaCopiaTrabalho_"^D"
     set ^mtempInfoArquivo(codTerm,"status","D","rotinas",rotinaId) = rotinaCopiaTrabalho
   }
 }
 
 set pasta = ""
 for {
   set pasta = $order(^mtempInfoArquivo(codTerm,"status","D","pastaClasses",pasta))
   if (pasta = "") quit
   
   set msgsc = ##class(Src2.Item).ValidarItem($translate(pasta,"_",".")_"*.cls", , , .tabItens)
   
   set InternalName = ""
   for  {
     set InternalName = $order(tabItens(InternalName))
     if (InternalName = "") quit
     
     set classe = $piece(InternalName,".cls",1)
     
     set msgsc = ##class(Src2.Classe).ObterInfoClasse(classe, .classeId, .pasta2)
     if (msgsc '= $$$OK) continue
     
     if (pasta '= pasta2) continue
     
     if ($data(^mtempInfoArquivo(codTerm,"classes",classeId))) continue
     
     set msgsc = ##class(Src2.Classe).ObterInfoClasseId2(classeId, urlRepositorio, caminhoCopiaTrabalho, , .classeCopiaTrabalho)
     
     set ^mtempInfoArquivo(codTerm,"classes",classeId) = "2^"_classeCopiaTrabalho_"^D"
     set ^mtempInfoArquivo(codTerm,"status","D","classes",classeId) = classeCopiaTrabalho
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosArquivoSvnList">
<Description>

Obter Dados de um Arquivo Gerado pelo Svn List

set sc = ##class(Src2.Utils).ObterDadosArquivoSvnList("a", "C:\workspacecsw\temp\list-r.txt")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String="",arquivo:%String,urlRepositorio:%String="",caminhoCopiaTrabalho:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill ^mtempInfoArquivo(codTerm)
 
 set file = ##class(%File).%New(arquivo)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   
   set sc = ##class(Src2.Item).ObterItem(linhaFile, .tipoItem, .item, , , .InternalName, .itemId)
   if (sc = 1) {
     set sc = ##class(Src2.Item).ObterInfoItemId2(itemId, urlRepositorio, caminhoCopiaTrabalho, , .itemCopiaTrabalho, , .itemRepositorio)
     if (sc '= 1) continue
     set tipoItem2 = $select(tipoItem=1:"rotinas",1:"classes")
     set operacao = ""
     if (caminhoCopiaTrabalho '= "") {
       set operacao = 1
       if ('##class(%File).Exists(itemCopiaTrabalho)) set operacao = 2
     }
     set ^mtempInfoArquivo(codTerm,tipoItem2,itemId) = operacao_"^"_itemCopiaTrabalho_"^^"_itemRepositorio_"^"_InternalName_"^"_item
     continue
   }
   
   if ($extract(linhaFile,1,11) [ "relatorios/") {
     set item = $piece(linhaFile,"relatorios/",2)
     set tipo = "pasta"
     if ($piece(linhaFile,"/",$length(linhaFile,"/")) [ ".") set tipo = "arquivo"
     else  set $extract(item,$length(item))=""
     if (item '= "") {
       set ^mtempInfoArquivo(codTerm,"relatorios",tipo,item) = ""
     }
     continue
   }
   
   if ($extract(linhaFile,1,11) [ "ajuda/") {
     set item = $piece(linhaFile,"ajuda/",2)
     set tipo = "pasta"
     if ($piece(linhaFile,"/",$length(linhaFile,"/")) [ ".") set tipo = "arquivo"
     else  set $extract(item,$length(item))=""
     if (item '= "") {
       set ^mtempInfoArquivo(codTerm,"ajuda",tipo,item) = ""
     }
     continue
   }
 }
 
 do file.Close()
 set file=""
 
 set sc = ##class(%File).Delete(arquivo)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosArquivoSvnRevert">
<Description>

Obter Dados de um Arquivo Gerado pelo Svn Revert
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String,projeto:%String,arquivo:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill ^mtempInfoArquivo(codTerm)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio)
 if (msgsc '= $$$OK) quit msgsc
 
 set file = ##class(%File).%New(arquivo)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   
   set caminhoArquivo = $piece(linhaFile,"Reverted '",2)
   set $extract(caminhoArquivo,$length(caminhoArquivo)) = ""
   
   set caminhoArquivo = $translate($piece(caminhoArquivo,caminhoCopiaTrabalho_barra,2),barra,"/")
   
   set sc = ##class(Src2.Item).ObterItem(caminhoArquivo, .tipoItem, .item, , , .InternalName, .itemId)
   if (sc = 1) {
     set sc = ##class(Src2.Item).ObterInfoItemId2(itemId, urlRepositorio, caminhoCopiaTrabalho, , .itemCopiaTrabalho, , .itemRepositorio)
     if (sc '= 1) continue
     set tipoItem2 = $select(tipoItem=1:"rotinas",1:"classes")
     
     set operacao = 1
     if ('##class(%File).Exists(itemCopiaTrabalho)) set operacao = 2
       
     set ^mtempInfoArquivo(codTerm,tipoItem2,itemId) = operacao_"^"_itemCopiaTrabalho_"^^"_itemRepositorio_"^"_InternalName_"^"_item
   }
 }
 
 do file.Close()
 set file=""
 
 set sc = ##class(%File).Delete(arquivo)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterProjetoSistema">
<Description>

Obter Projeto do Sistema

set sc = ##class(Src2.Utils).ObterProjetoSistema("cswutil", .projeto)
set sc = ##class(Src2.Utils).ObterProjetoSistema("especifico", .projeto)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,&projeto:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set projeto = ""
 for {
   set projeto = $order(^Src2Config("projeto",projeto))
   if (projeto = "") quit
   set var = $get(^Src2Config("projeto",projeto))
   
   if ($piece(var,"^",1) = sistema) !(($piece(var,"^",1) = "") & (sistema = "especifico")) quit
 }
 
 if (projeto = "") {
   quit "Nenhum projeto encontrado para o sistema '"_sistema_"'"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarObjetosAplicacaoCSP">
<Description>

Exportar os Objetos para a Aplicacao CSP

set sc = ##class(Src2.Utils).ExportarObjetosAplicacaoCSP("cswutil62", "admin", "admin")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,username:%String="",password:%String="",autenticacao:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoDiff)
 if (msgsc '= $$$OK) quit msgsc
 
 set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual, .versao)
 if (msgsc '= $$$OK) quit msgsc
 
 if (sistema '= "cswutil") {
   quit "Sistema não é de componentes"
 }
 
 set msgsc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb(, , 1, .caminhoAplicWeb)
 quit:msgsc'=1 msgsc
 
 if (##class(Src2.Utils).ObterSistOper() = "windows") {
   set caminhoPaginas = caminhoCopiaTrabalho_"\paginas"
   do $zf(-1,"rd /s /q "_caminhoAplicWeb_"objetos")
 } else {
   set caminhoPaginas = caminhoCopiaTrabalho_"/paginas"
   do $zf(-1,"rm -rf "_caminhoAplicWeb_"objetos")
 }
 
 if (##class(Src2.Utils2).CompararVersao(versao, ">=", "6.4")) {
   set msgsc = ..GerarArquivosAux(caminhoAplicWeb)
   quit:msgsc'=1 msgsc
 }
 
 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "export --force "_caminhoPaginas_" "_caminhoAplicWeb, username, password, autenticacao)
 if (msgsc '= $$$OK) quit msgsc
 
 set sc = ##class(Src2.Utils).ExportarJarsAplicacaoCSP(projeto, autenticacao)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarJarsAplicacaoCSP">
<Description>

Exportar Jars para a Aplicacao CSP

set sc = ##class(Src2.Utils).ExportarJarsAplicacaoCSP("cswutil64")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,autenticacao:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoDiff)
 if (msgsc '= $$$OK) quit msgsc
 
 set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual, .versao)
 if (msgsc '= $$$OK) quit msgsc
 
 if (sistema '= "cswutil") {
   quit "Sistema não é de componentes"
 }
 
 set sc = ##class(Src2.PatchUtils2).ObterEnderecoNexus(.server, .port)
 
 set msgsc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb(, , 1, .caminhoAplicWeb)
 quit:msgsc'=1 msgsc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set caminhoObjetosJava = caminhoAplicWeb_"objetos"_barra_"java"
 
 set repositorio = $piece(urlRepositorio,sistema,1)_sistema
 
 set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versao, .tabTags, .versaoReleaseUltima, autenticacao)
 
 set sc = ##class(Src2.Utils).ObterArquivosVersSistLocal(sistema, "objetos/java", .tabArqVers)
 
 set tipoArquivo = ""
 for {
   set tipoArquivo = $order(tabArqVers(tipoArquivo))
   if (tipoArquivo = "") quit
   
   set sc = ##class(Src2.PatchUtils2).ObterArquivoVersionadoUltimo(sistema, tipoArquivo, .tabTags, .versaoArquivo)
   if (versaoArquivo = "") continue
   
   set sc = ##class(Src2.Utils).ObterEnderecoArquivo(tipoArquivo, .tabArqVers, versaoArquivo, .endereco)
   if $$$ISERR(sc) continue
   
   set nomeArquivo = $get(tabArqVers(tipoArquivo,"nome"))
   if (nomeArquivo = "") continue
   
   set obj = ##class(%Net.HttpRequest).%New()
   set obj.Server = server
   set obj.Port = port
   set obj.Timeout = 10
   
   do obj.Get(endereco)
   if (obj.HttpResponse.StatusCode '= 200) continue
   
   set streamZip = ##class(%FileBinaryStream).%New()
   set streamZip.Filename = caminhoObjetosJava_barra_nomeArquivo
   do streamZip.CopyFrom(obj.HttpResponse.Data)
   do streamZip.Flush()
   do streamZip.SaveStream()
   do streamZip.%Close()
   
   set (obj,streamZip)=""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterArquivosVersSistLocal">
<Description>

Obter Arquivos Versionados por Sistema/Localizacao

set sc = ##class(Src2.Utils).ObterArquivosVersSistLocal("cswutil", "objetos/java", .tabArqVers)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String="",localizacao:%String="",&tabArqVers:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.UtilsXml).ObterArquivosVersionados(.tabArqVers)
 if $$$ISERR(sc) quit sc
 
 set tipo = ""
 for {
   set tipo = $order(tabArqVers(tipo))
   if (tipo = "") quit
   
   // Filtra o Sistema
   if (sistema '= "") & ($get(tabArqVers(tipo,"sistema")) '= sistema) {
     kill tabArqVers(tipo)
     continue
   }
   
   // Filtra o Tipo de Patch
   if (localizacao '= "") & ($get(tabArqVers(tipo,"localizacao")) '= localizacao) {
     kill tabArqVers(tipo)
     continue
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarArquivosAux">
<Description>

Gerar Arquivo Auxiliar
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminhoAplicWeb:%String</FormalSpec>
<Implementation><![CDATA[
 // Gera o aquivo csw1sms.csp
 set arquivo = caminhoAplicWeb_"csw1sms.csp"
 set objFile = ##class(%File).%New(arquivo)
 do objFile.Open("WSN")
 if ('objFile.IsOpen) {
   set objFile = ""
   quit "Erro ao gerar o arquivo "_arquivo_"!"
 }
 set sc = objFile.WriteLine("<csp:include page=""csw1funcoespag.csp"">")
 do objFile.Close()
 
 // Gera o aquivo csw1documentacao.csp
 set arquivo=caminhoAplicWeb_"csw1documentacao.csp"
 set objFile = ##class(%File).%New(arquivo)
 do objFile.Open("WSN")
 if ('objFile.IsOpen) {
   set objFile = ""
   quit "Erro ao gerar o arquivo "_arquivo_"!"
 }
 set sc = objFile.WriteLine("<csp:include page=""csw1funcoespag.csp"">")
 do objFile.Close()
 set objFile=""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarServicoConsistem">
<Description>

Gera o Serviço Consistem para Windows

set sc = ##class(Src2.Utils).GerarServicoConsistem(1)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>flgDisplay:%Boolean=0,autenticacao:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.UtilsXml).ObterArquivosVersionados(.tabArqVers)
 
 set flgBeta = 1
 set versaoJavaJdk = "8u31"
 set versaoWildFly = "8.2.0.Final"
 set versaoYuicompressor = "2.3.6"
 set sc = ##class(Src2.Utils).ObterVersaoCache(, .versaoCache)
 
 if (flgDisplay) write !,"Iniciada a Geração do Serviço Consistem"
 
 set msgsc = ##class(Src2.Utils).UpdateConfigGeralWorkspace()
 if (msgsc '= $$$OK) quit msgsc
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema("csw", .projCsw)
 if (msgsc '= $$$OK) quit msgsc
 
 set sc = ##class(Src2.Utils).ObterProjetoSistema("cswutil", .projCswUtil)
 if (msgsc '= $$$OK) quit msgsc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoDiff)
 if (msgsc '= $$$OK) quit msgsc
 
 set sc = ##class(Src2.PatchUtils2).ObterEnderecoNexus(.server, .port)
 
 set sc = ##class(Src2.Utils).ObterConsistemHome(.consistemHome)
 
 set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projCsw, .caminhoCopiaTrabCsw, , .sistemaCsw, , .versao, , , .repositorio)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versao, .tabTagsCsw, , autenticacao)
 if $$$ISERR(sc) quit sc
 
 set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projCswUtil, .caminhoCopiaTrabCswUtil, , .sistemaCswUtil, , .versao, , , .repositorio)
 if (msgsc '= $$$OK) quit $$$ERROR(10000,msgsc)
 
 set sc = ##class(Src2.PatchUtils).ObterTagsRepositorio(repositorio, versao, .tabTagsCswUtil, , autenticacao)
 if $$$ISERR(sc) quit sc
 
 set caminhoServico = consistemHome_barra_"webservice"_barra_"bin"_barra_"service"_barra_"service.bat"
 set caminhoLog = consistemHome_barra_"log"_barra_"install.log"
 
 // Para o Serviço
 
 if (##class(%File).Exists(caminhoServico)) {
   if (flgDisplay) write !,"Parando o Serviço Consistem"
   set sc = $zf(-1,"set JAVA_HOME="_consistemHome_barra_"java && "_caminhoServico_" stop")
   set sc = $zf(-1,"set JAVA_HOME="_consistemHome_barra_"java && "_caminhoServico_" uninstall")
 }

 if (flgDisplay) write !,"Excluindo "_consistemHome
 
 do $zf(-1,"rd /s /q "_consistemHome)
 
 // Cria Pastas
 
 if (flgDisplay) write !,"Criando as pastas em "_consistemHome
 
 set sc = ##class(Src2.Utils2).CriarPasta(consistemHome_barra_"cswapp")
 set sc = ##class(Src2.Utils2).CriarPasta(consistemHome_barra_"atualizacao")
 set sc = ##class(Src2.Utils2).CriarPasta(consistemHome_barra_"tmp")
 set sc = ##class(Src2.Utils2).CriarPasta(consistemHome_barra_"lib"_barra_"componentes")
 set sc = ##class(Src2.Utils2).CriarPasta(consistemHome_barra_"lib"_barra_"relatorios")
 set sc = ##class(Src2.Utils2).CriarPasta(consistemHome_barra_"lib"_barra_"keystores")
 set sc = ##class(Src2.Utils2).CriarPasta(consistemHome_barra_"log")
 
 set consistemHomeTmp = consistemHome_barra_"tmp"
 set consistemHomeLib = consistemHome_barra_"lib"
 set consistemHomeConfiguration = consistemHome_barra_"webservice"_barra_"standalone"_barra_"configuration"
 
 set obj = ##class(%Net.HttpRequest).%New()
 set obj.Server = server
 set obj.Port = port
 set obj.Timeout = 10
 
 // Download do Java
 
 set sc = ##class(Src2.Utils).ObterEnderecoArquivo("jdk-exe", .tabArqVers, versaoJavaJdk, .enderecoDownload, .nomeArquivo)
 
 if (flgDisplay) write !,"Download do Java - JDK "_versaoJavaJdk
 
 set caminhoJdkExe = consistemHomeTmp_barra_nomeArquivo
 
 do obj.Get(enderecoDownload)
 if (obj.HttpResponse.StatusCode '= 200) quit $$$ERROR(10000,"Não foi possível baixar o arquivo "_enderecoDownload_"!")
 
 set streamZip = ##class(%FileBinaryStream).%New()
 set streamZip.Filename = consistemHomeTmp_barra_nomeArquivo
 do streamZip.CopyFrom(obj.HttpResponse.Data)
 do streamZip.Flush()
 do streamZip.SaveStream()
 do streamZip.%Close()
 
 // Download do Wildfly
 
 set sc = ##class(Src2.Utils).ObterEnderecoArquivo("wildfly-server-zip", .tabArqVers, versaoWildFly, .enderecoDownload, .nomeArquivo)
 
 if (flgDisplay) write !,"Download do Wildfly "_versaoWildFly
 
 set arquivoWildFly = consistemHomeTmp_barra_nomeArquivo
 
 do obj.Get(enderecoDownload)
 if (obj.HttpResponse.StatusCode '= 200) quit $$$ERROR(10000,"Não foi possível baixar o arquivo "_enderecoDownload_"!")
 
 set streamZip = ##class(%FileBinaryStream).%New()
 set streamZip.Filename = arquivoWildFly
 do streamZip.CopyFrom(obj.HttpResponse.Data)
 do streamZip.Flush()
 do streamZip.SaveStream()
 do streamZip.%Close()
 
 // Download do Consistem Server Jar
 
 set sc = ##class(Src2.PatchUtils2).ObterArquivoVersionadoUltimo(sistemaCswUtil, "consistem_server_jar", .tabTagsCswUtil, .versaoArquivo, flgBeta)
 
 set sc = ##class(Src2.Utils).ObterEnderecoArquivo("consistem_server_jar", .tabArqVers, versaoArquivo, .enderecoDownload, .nomeArquivo)
 
 if (flgDisplay) write !,"Download do consistem_server.jar "_versaoArquivo
 
 set consistemServerJar = consistemHomeTmp_barra_nomeArquivo
 
 do obj.Get(enderecoDownload)
 if (obj.HttpResponse.StatusCode '= 200) quit $$$ERROR(10000,"Não foi possível baixar o arquivo "_enderecoDownload_"!")
 
 set streamZip = ##class(%FileBinaryStream).%New()
 set streamZip.Filename = consistemServerJar
 do streamZip.CopyFrom(obj.HttpResponse.Data)
 do streamZip.Flush()
 do streamZip.SaveStream()
 do streamZip.%Close()
 
 // Download do Consistem Webapp
 
 set sc = ##class(Src2.PatchUtils2).ObterArquivoVersionadoUltimo(sistemaCswUtil, "consistem_webapp", .tabTagsCswUtil, .versaoArquivo, flgBeta)
 
 set sc = ##class(Src2.Utils).ObterEnderecoArquivo("consistem_webapp", .tabArqVers, versaoArquivo, .enderecoDownload, .nomeArquivo)
 
 if (flgDisplay) write !,"Download do consistem_webapp.war "_versaoArquivo
 
 do obj.Get(enderecoDownload)
 if (obj.HttpResponse.StatusCode '= 200) quit $$$ERROR(10000,"Não foi possível baixar o arquivo "_enderecoDownload_"!")
 
 set streamZip = ##class(%FileBinaryStream).%New()
 set streamZip.Filename = consistemHome_barra_"tmp"_barra_nomeArquivo
 do streamZip.CopyFrom(obj.HttpResponse.Data)
 do streamZip.Flush()
 do streamZip.SaveStream()
 do streamZip.%Close()
 
 // Download do yuicompressor.jar
 
 set sc = ##class(Src2.Utils).ObterEnderecoArquivo("yuicompressor", .tabArqVers, versaoYuicompressor, .enderecoDownload, .nomeArquivo)
 
 if (flgDisplay) write !,"Download do yuicompressor.jar "_versaoYuicompressor
 
 do obj.Get(enderecoDownload)
 if (obj.HttpResponse.StatusCode '= 200) quit $$$ERROR(10000,"Não foi possível baixar o arquivo "_enderecoDownload_"!")
 
 set streamZip = ##class(%FileBinaryStream).%New()
 set streamZip.Filename = consistemHomeLib_barra_"componentes"_barra_nomeArquivo
 do streamZip.CopyFrom(obj.HttpResponse.Data)
 do streamZip.Flush()
 do streamZip.SaveStream()
 do streamZip.%Close()
 
 // Download do Consistem Geral
 
 set sc = ##class(Src2.PatchUtils2).ObterArquivoVersionadoUltimo(sistemaCsw, "consistem_geral", .tabTagsCsw, .versaoArquivo, flgBeta)
 
 set sc = ##class(Src2.Utils).ObterEnderecoArquivo("consistem_geral", .tabArqVers, versaoArquivo, .enderecoDownload, .nomeArquivo)
 
 if (flgDisplay) write !,"Download do consistem_geral.jar "_versaoArquivo
 
 do obj.Get(enderecoDownload)
 if (obj.HttpResponse.StatusCode '= 200) quit $$$ERROR(10000,"Não foi possível baixar o arquivo "_enderecoDownload_"!")
 
 set streamZip = ##class(%FileBinaryStream).%New()
 set streamZip.Filename = consistemHomeLib_barra_"componentes"_barra_nomeArquivo
 do streamZip.CopyFrom(obj.HttpResponse.Data)
 do streamZip.Flush()
 do streamZip.SaveStream()
 do streamZip.%Close()
 
 // Download do Cachedb
 
 set sc = ##class(Src2.Utils).ObterEnderecoArquivo("cachedb_jboss", .tabArqVers, versaoCache, .enderecoDownload, .nomeArquivo)
 
 if (flgDisplay) write !,"Download do cachedb_jboss.zip "_versaoCache
 
 do obj.Get(enderecoDownload)
 if (obj.HttpResponse.StatusCode '= 200) quit $$$ERROR(10000,"Não foi possível baixar o arquivo "_enderecoDownload_"!")
 
 set cacheDb = consistemHomeTmp_barra_nomeArquivo
 
 set streamZip = ##class(%FileBinaryStream).%New()
 set streamZip.Filename = cacheDb
 do streamZip.CopyFrom(obj.HttpResponse.Data)
 do streamZip.Flush()
 do streamZip.SaveStream()
 do streamZip.%Close()
 
 // Instala o Jdk
 
 if (flgDisplay) write !,"Instalando o Java - JDK "_versaoJavaJdk_" em "_consistemHome_barra_"java"
 
 do $zf(-1,caminhoJdkExe_" /s ADDLOCAL=""ToolsFeature,SourceFeature"" INSTALLDIR="""_consistemHome_barra_"java"" >"_caminhoLog)
 
 // Descompactar o consistem_server.jar
 
 if (flgDisplay) write !,"Descompactando o consistem_server.jar"
 
 do $zf(-1,"c: && cd "_consistemHome_barra_"tmp && "_consistemHome_barra_"java"_barra_"bin"_barra_"jar xf "_consistemServerJar_" >>"_caminhoLog)
 
 set sc = ##class(%File).CopyDir(consistemHomeTmp_barra_"bin", consistemHomeLib_barra_"bin", 1)
 
 set sc = ##Class(%File).CopyFile(consistemHomeTmp_barra_"keystores"_barra_"base64Csw.cer", consistemHomeLib_barra_"keystores"_barra_"base64Csw.cer")
 
 set sc = ##Class(%File).CopyFile(consistemHomeTmp_barra_"keystores"_barra_"base64Csw.key", consistemHomeLib_barra_"keystores"_barra_"base64Csw.key")
 
 set caminhoZip = consistemHomeLib_barra_"bin"_barra
 
 // Descompacta o WildFly
 
 if (flgDisplay) write !,"Descompactando o WildFly"
 
 set sc = $zf(-1,caminhoZip_"7za x -tzip "_arquivoWildFly_" -o"_consistemHomeTmp_barra_" >>"_caminhoLog)
 set status = ##class(%File).CopyDir(consistemHomeTmp_barra_"wildfly-8.2.0.Final", consistemHome_barra_"webservice", 1)
 
 set sc = ##Class(%File).CopyFile(consistemHomeTmp_barra_"service.bat", caminhoServico)
 
 set sc = ##class(Src2.Utils).GerarArquivoMmgmtUsersProperties(consistemHomeConfiguration)
 
 set sc = ##class(Src2.Utils).GerarArquivoMgmtGroupsProperties(consistemHomeConfiguration)
 
 set sc = ##class(Src2.Utils).GerarArquivoStandaloneConf(consistemHome_barra_"webservice"_barra_"bin")
 
 set sc = ##Class(%File).CopyFile(consistemHomeTmp_barra_"standalone.xml", consistemHomeConfiguration_barra_"standalone.xml")
 
 // Descompacta Cachedb
 
 if (flgDisplay) write !,"Descompactando o cachedb_jboss.zip"
 
 set sc = $zf(-1,caminhoZip_"7za x -tzip "_cacheDb_" -o"_consistemHome_barra_"webservice"_barra_"modules >>"_caminhoLog)
 
 // Exporta as keystore
 
 if (flgDisplay) write !,"Exportando as keystore"
 
 set sc = ##Class(%File).CopyFile(caminhoCopiaTrabCsw_barra_"outros"_barra_"server_producao.keystore", consistemHomeLib_barra_"keystores"_barra_"server_producao.keystore")
 
 set sc = ##Class(%File).CopyFile(caminhoCopiaTrabCsw_barra_"outros"_barra_"serasahttp.keystore", consistemHomeLib_barra_"keystores"_barra_"serasahttp.keystore")
 
 // Exporta Relatórios
 
 if (flgDisplay) write !,"Exportando os relatórios"
 
 set sc = ##class(%File).CopyDir(caminhoCopiaTrabCsw_barra_"relatorios", consistemHomeLib_barra_"relatorios", 1)
 
 set sc = ##class(%File).CopyDir(caminhoCopiaTrabCswUtil_barra_"relatorios", consistemHomeLib_barra_"relatorios", 1)
 
 // Instalar Serviço
 
 if (flgDisplay) write !,"Instalando o Serviço Consistem"
 
 set sc = $zf(-1,"set JAVA_HOME="_consistemHome_barra_"java && "_caminhoServico_" install >>"_caminhoLog)
 if (sc '= 0) {
   if (flgDisplay) write !,"Erro ao installar Serviço Consistem - Log: "_caminhoLog
   quit $$$ERROR(10000,"Erro ao installar Serviço Consistem!")
 }
 
 if (flgDisplay) write !,"Iniciando o Serviço Consistem"
 
 set sc = $zf(-1,"set JAVA_HOME="_consistemHome_barra_"java && "_caminhoServico_" start  >>"_caminhoLog)
 
 // Cria os Datasources
 
 // verificar se o wildfly esta no ar
 set sc = 0, tentativas = 0
 while (sc '= 1) && (+$get(tentativas) < 10) {
   set tentativas = $increment(tentativas)
   if (flgDisplay) write !,"Conectando no Serviço Consistem... "_tentativas
   set sc = ##class(Src2.WildFly).ControllTest(caminhoLog)
   if $$$ISERR(sc) {
     if (flgDisplay) write !,"Log de retorno: "_##class(Src2.Utils).ObterMensagemStatusCode(sc)
   }
 }
 if (sc = 1) {
   if (flgDisplay) write !,"Criando Datasources"
   set sc = ##class(Src2.Utils).GerarDataSourcesWildFly(caminhoLog)
   if (flgDisplay) write !,"Efetuando deploy da app!"
   set sc = ##Class(%File).CopyFile(consistemHomeTmp_barra_"consistem_webapp.war", consistemHome_barra_"cswapp"_barra_"consistem_webapp.war")
 } else {
   if (flgDisplay) write !,"Erro ao conectar no Serviço Consistem"
 }
 
 // Mata Pasta Temporária
 
 if (flgDisplay) write !,"Excluindo arquivos temporários"
 
 set sc2 = ##class(%File).RemoveDirectoryTree(consistemHomeTmp)
 
 if (flgDisplay) write !,"Encerrado!"
 
 if (flgDisplay) write !,"ATENÇÃO: Alterar o serviço o tipo de inicialização do 'Csw Server' para 'Automático'"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterPortaCache">
<Description>

Obtem a Porta do Cache

set sc = ##class(Src2.Utils).ObterPortaCache(.porta)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&porta:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set namepace = $znspace
 
 znspace "%sys"
 
 set sc = ##Class(Config.Startup).Get(.Properties)
 
 set porta = Properties("DefaultPort")
 
 znspace namepace
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarArquivoMgmtGroupsProperties">
<Description>

Gera o Arquivo mgmt-groups.properties
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminho:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set objFile = ##class(%File).%New(caminho_barra_"mgmt-groups.properties")
 
 do objFile.Open("WN:/IOTABLE=""UTF8""")
 if ('objFile.IsOpen) {
   quit $$$ERROR(10000,"Não foi possível criar o arquivo de instalação!")
 }
 
 set sc = objFile.Write("admin="_$char(10))
 
 do objFile.Close()
 set objFile = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarArquivoMmgmtUsersProperties">
<Description>

Gera o Arquivo mgmt-groups.properties
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminho:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set objFile = ##class(%File).%New(caminho_barra_"mgmt-users.properties")
 
 do objFile.Open("WN:/IOTABLE=""UTF8""")
 if ('objFile.IsOpen) {
   quit $$$ERROR(10000,"Não foi possível criar o arquivo de instalação!")
 }
 
 set sc = objFile.Write("admin=c68df64ba3eeb1f076364fec52620d7c")
 
 do objFile.Close()
 set objFile = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarArquivoStandaloneConf">
<Description>

Gera o Aquivo standalone.conf.bar
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminho:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set objFile = ##class(%File).%New(caminho_barra_"standalone.conf.bat")
 
 do objFile.Open("WN:/IOTABLE=""UTF8""")
 if ('objFile.IsOpen) {
   quit $$$ERROR(10000,"Não foi possível criar o arquivo de instalação!")
 }
 
 set sc = objFile.WriteLine("set ""JAVA_HOME=c:\consistem\java""")
 set sc = objFile.WriteLine("set ""JAVA_OPTS=-Xms64M -Xmx512M""")
 set sc = objFile.WriteLine("set ""JAVA_OPTS=%JAVA_OPTS% -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false""")
 set sc = objFile.WriteLine("set ""JAVA_OPTS=%JAVA_OPTS% -Djboss.modules.system.pkgs=org.jboss.byteman""")
 
 do objFile.Close()
 set objFile = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarDataSourcesWildFly">
<Description>

Gera os DataSources no WildFly

set sc = ##class(Src2.Utils).GerarDataSourcesWildFly()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminhoLog:%String="",namespaceInf:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterPortaCache(.portaCache)
 
 set sc = ##class(Src2.WildFly).CreateDS("ConsistemDS", $znspace, portaCache, 1, "", caminhoLog)
 
 if (namespaceInf = "") {
   set sc = ##class(Src2.Utils).ObterNamespaces(.tabNamespaces)
   
   set namespace = ""
   for  {
     set namespace = $order(tabNamespaces(namespace))
     if (namespace = "") quit
     set var = $get(tabNamespaces(namespace))
     
     set msgsc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento(namespace, 0, .versao, .complemento)
     if (msgsc = $$$OK) continue
     
     set msgsc = ##class(Src2.Utils).ValidarNamespaceBaseDados(namespace, 0, , .versao, .complemento)
     if (msgsc '= $$$OK) continue
     
     set sc = ##class(Src2.WildFly).CreateDS($zconvert(namespace,"U")_"DS", namespace, portaCache, 0, "", caminhoLog)
   }
 } else {
   set sc = ##class(Src2.WildFly).CreateDS($zconvert(namespaceInf,"U")_"DS", namespaceInf, portaCache, 0, "", caminhoLog)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarArquivoCSWConsistem">
<Description>

Gera as Configurações de Namespace para o Serviço Consistem (Somente para Windows)

set sc = ##class(Src2.Utils).GerarArquivoCSWConsistem("C:\consistem\CSWConsistem_desenvza64.conf", , "desenv63")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivo:%String="",ip:%String="localhost",namespace:%String,porta:%String="1972"</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set objFile = ##class(%File).%New(arquivo)
 do objFile.Open("WSN")
 if ('objFile.IsOpen) {
   set objFile = ""
   quit "Erro ao gerar o arquivo "_arquivo_"!"
 }
 
 set sc = objFile.WriteLine("APLPorta=8090")
 set sc = objFile.WriteLine("APLServidor="_ip)
 set sc = objFile.WriteLine("DBClasseJDBC=com.intersys.jdbc.CacheDriver")
 set sc = objFile.WriteLine("DBNameSpace="_namespace)
 set sc = objFile.WriteLine("DBPorta="_porta)
 set sc = objFile.WriteLine("DBSenha=ccscache")
 set sc = objFile.WriteLine("DBURL=jdbc:Cache://"_ip)
 set sc = objFile.WriteLine("DBUsuario=_SYSTEM")
 set sc = objFile.WriteLine("CMDgs=/usr/bin/gs")
 set sc = objFile.WriteLine("CMDconvert=/usr/local/bin/convert")
 
 do objFile.Close()
 set objFile = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterNamespaces">
<Description>

Retorna uma Tabela de Namespaces

set sc = ##class(Src2.Utils).ObterNamespaces(.tabNamespaces)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabNamespaces:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabNamespaces
 
 set result=##class(%ResultSet).%New("%Library.RoutineMgr:NamespaceList"),countsc=1
 do result.Execute()
 while result.Next() {
   set tabNamespaces(result.Get("Namespace")) = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterNamespacesBaseDados">
<Description>

Retorna uma Tabela de Namespaces Base Dados

set sc = ##class(Src2.Utils).ObterNamespacesBaseDados(.tabNamespaces, .tabContas)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabNamespaces:%String,&tabContas:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabNamespaces, tabContas
 
 set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento($znspace, , .versaoDesenv, .complementoDesenv)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterNamespaces(.tabNamespaces)
 
 set namespace = ""
 for  {
   set namespace = $order(tabNamespaces(namespace))
   if (namespace = "") quit
   
   set msgsc = ##class(Src2.Utils).ValidarNamespaceBaseDados(namespace, 0, .conta, .versao, .complemento)
   if (msgsc = 1) & (versaoDesenv = versao) & (complementoDesenv = complemento) {
     if (conta '= "") set tabContas(conta) = namespace
     continue
   }
   
   kill tabNamespaces(namespace)
 } 
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarNamespaceDesenvolvimento">
<Description>

Validar um Namespace de Desenvolvimento

set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento("DESENV61", , .versao, .complemento)
set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento("DESENV63RF", , .versao, .complemento)
set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento("DESENV63RF1", , .versao, .complemento)
set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento("DESENVRF", , .versao, .complemento)
set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento("DESENVDA61", , .versao, .complemento)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[namespace:%String,flgExiste:%Boolean=1,&versao:%String,&complemento:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (versao, complemento) = ""
 
 if (namespace = "") {
   quit "O namespace não informado"
 }
 
 if ($extract(namespace,1,6) '= "DESENV") {
   quit "O namespace "_namespace_" não é de desenvolvimento"
 }
 
 set var = 6
 for cont = 7:1:$length(namespace) {
   if ($extract(namespace,cont)'?.N) quit
   set var = cont
 }
 
 set versao = $extract(namespace,7,var)
 
 set complemento = $extract(namespace,var+1,$length(namespace))
 
 if (versao = "") {
   set (versao, complemento) = ""
   quit "O namespace "_namespace_" não é de desenvolvimento"
 }
 
 if (flgExiste) {
   set sc = ##class(Src2.Utils).ObterNamespaces(.tabNamespaces)
   if ('$data(tabNamespaces(namespace))) {
    quit "O namespace "_namespace_" não existe"
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarNamespaceBaseDados">
<Description>

Validar um Namespace de Base de Dados

set sc = ##class(Src2.Utils).ValidarNamespaceBaseDados("DESENVDA", , .conta, .versao, .complemento)
set sc = ##class(Src2.Utils).ValidarNamespaceBaseDados("DESENVDA61", , .conta, .versao, .complemento)
set sc = ##class(Src2.Utils).ValidarNamespaceBaseDados("DESENVDA61L", , .conta, .versao, .complemento)
set sc = ##class(Src2.Utils).ValidarNamespaceBaseDados("DESENVDA63RF", , .conta, .versao, .complemento)
set sc = ##class(Src2.Utils).ValidarNamespaceBaseDados("DESENV62", , .conta, .versao, .complemento)
set sc = ##class(Src2.Utils).ValidarNamespaceBaseDados("DESENV62DA", , .conta, .versao, .complemento)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[namespace:%String,flgExiste:%Boolean=1,&conta:%String,&versao:%String,&complemento:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set (conta, versao, complemento) = ""
 
 if (namespace = "") {
   quit "Namespace não informado"
 }
 
 if ($extract(namespace,1,6) '= "DESENV") {
   quit "O namespace "_namespace_" não é de base de dados"
 }
 
 set conta = $extract(namespace,7,8)
 
 if ($extract(conta,1)?.N) {
   set conta = ""
   quit "O namespace "_namespace_" não é de base de dados"
 }
 
 set var = 8
 for cont = 9:1:$length(namespace) {
   if ($extract(namespace,cont)'?.N) quit
   set var = cont
 }
 
 set versao = $extract(namespace,9,var)
 
 set complemento = $extract(namespace,var+1,$length(namespace))
 
 if (conta = "") ! (versao = "") {
   quit "O namespace "_namespace_" não é de base de dados"
 }
 
 if (flgExiste) {
   set sc = ##class(Src2.Utils).ObterNamespaces(.tabNamespaces)
   if ('$data(tabNamespaces(namespace))) {
    quit "O namespace "_namespace_" não existe"
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarArquivoDiversosXml">
<Description>

Gera o Arquivo diversos.xml
OBS: Este método gera o arquivo para que seja utilizado no repositório de utilitários na pasta "outros"
set sc = $system.OBJ.Load("C:\workspacecsw\projetos\6.4\cswutil64\outros\diversos.xml")
set sc = ##class(Src2.Utils).GerarArquivoDiversosXml("C:\workspacecsw\projetos\6.4\cswutil64\outros\diversos.xml")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivo:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set tabItens("%SM.GBL")=""
 set tabItens("%CSUTICSP.INC")=""
 set tabItens("%CSzzz.MAC")=""
 set tabItens("CCCSWzzz.MAC")=""
 set tabItens("%CSW1CSPTabEspecial.GBL")=""
 set tabItens("%CSW1CSPTabNaoValidar.GBL")=""
 set tabItens("%CSW1CSPGENNAOGERAR.GBL")=""
 set tabItens("Cad.DadosIBGED.GBL")=""
 set tabItens("CCUTIINTEGRA.MAC")=""
 
 set sc = $system.OBJ.Export(.tabItens, arquivo, "/diffexport")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarArquivoDiversosBaseXml">
<Description>

Gera o Arquivo diversos.xml
OBS: Este método gera o arquivo para que seja utilizado no repositório de utilitários na pasta "outros"
set sc = $system.OBJ.Load("C:\workspacecsw\projetos\6.4\cswutil64\outros\diversosbase.xml")
set sc = ##class(Src2.Utils).GerarArquivoDiversosBaseXml("C:\workspacecsw\projetos\6.4\cswutil64\outros\diversosbase.xml")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivo:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set tabItens("%SM.GBL")=""
 set tabItens("Cad.DadosIBGED.GBL")=""
 ;set tabItens("%SMConf.GBL")="" - Esta deve ser gerada manualmente utilizando o "do ^%SMConf"
 
 set sc = $system.OBJ.Export(.tabItens, arquivo, "/diffexport")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarArquivoDiversosXml">
<Description>

Importa o Arquivo diversos.xml
OBS: Chamar a partir do namespace de desenvolvimento (DESENV61/DESENV62/...)

set sc = ##class(Src2.Utils).ImportarArquivoDiversosXml("cswutil62")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento($znspace, 0)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, , .sistema)
 quit:sc'=1 sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 if (sistema '= "cswutil") {
   quit "Sistema não é de utilitários"
 }
 
 set caminhoDiversos = caminhoCopiaTrabalho_barra_"outros"_barra_"diversos.xml"
 
 set sc = ##class(Src2.Utils).ImportarArquivoDiversosXml2(caminhoDiversos)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarArquivoDiversosXml2">
<ClassMethod>1</ClassMethod>
<FormalSpec>caminhoDiversos:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = $system.OBJ.Load(caminhoDiversos, "-d")
 
 set objRotina = ##class(%Routine).%New("%CSzzz.MAC")
 set sc = objRotina.Compile("k-d")
 set objRotina = ""
 
 set objRotina = ##class(%Routine).%New("CCCSWzzz.MAC")
 set sc = objRotina.Compile("k-d")
 set objRotina = ""
 
 set objRotina = ##class(%Routine).%New("%CSUTICSP.INC")
 set sc = objRotina.Compile("k-d")
 set objRotina = ""
 
 set objRotina = ##class(%Routine).%New("CCUTIINTEGRA.MAC")
 set sc = objRotina.Compile("k-d")
 set objRotina = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ImportarArquivoDiversosBaseXml">
<Description>

Importa o Arquivo diversos.xml
OBS: Chamar a partir do namespace de desenvolvimento (DESENV61/DESENV62/...)

set sc = ##class(Src2.Utils).ImportarArquivoDiversosXml("cswutil62")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>namespace:%String="",projeto:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento($znspace, 0)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, , .sistema)
 quit:sc'=1 sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 if (sistema '= "cswutil") {
   quit "Sistema não é de utilitários"
 }
 
 set caminhoDiversos = caminhoCopiaTrabalho_barra_"outros"_barra_"diversosbase.xml"
 
 if (namespace = "") set namespace = $znspace
 set namespaceAtual = $znspace
 
 znspace namespace
 
 set sc = $system.OBJ.Load(caminhoDiversos, "-d")
 
 znspace namespaceAtual
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarCSMENCF">
<Description>

Gera a Global ^%CSMENCF - Para namespace de desenvolvimento
OBS: Chamar a partir do namespace de desenvolvimento (DESENV61/DESENV62/...)

set sc = ##class(Src2.Utils).GerarCSMENCF()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento($znspace, 0)
 quit:sc'=1 sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb(, , 1, , .caminhoAplicRed, 0)
 quit:sc'=1 sc
 
 set arquivoTempCsw = caminhoWorkspace_barra_"temp"_barra
 
 set arquivoPDF = caminhoWorkspace_barra_"temp"_barra_"arqpdf.txt"
 
 set arquivoLicenca = caminhoWorkspace_barra_"configgeral"_barra_"csw.key"
 
 set enderecoIntegraWI = "http://localhost/csp/"_$zconvert($znspace,"l")_"/"
 
 // Piece 1 ao 20
 set csmencf = "1^"_arquivoTempCsw_"^arq.txt^1^"_arquivoTempCsw_"^arq.htm^1^798^1^CC^3000^99^2^1^1^1^^1^0^"
 
 // Piece 20 ao 40
 set csmencf = csmencf_"^1^2^0^^^^110^25^pop3.consistem.com.br^smtp.consistem.com.br^60^"_arquivoTempCsw_"^testerotinas@consistem.com.br^@Outro1234^1^1^### Situacao Anormal ##^^^0"
 
 // Piece 40 ao 60
 set csmencf = csmencf_"^^^1^999^^"_caminhoAplicRed_"^"_enderecoIntegraWI_"^"_$znspace_"^0^^1^0^1^^1^"_arquivoLicenca_"^1^"_arquivoPDF_"^1^0"
 
 // Piece 60 ao ...
 set csmencf = csmencf_"^1^"_arquivoTempCsw_"^0^^^ftp.consistem.com.br^consistem^cnovo2009^0^%SYS^1^1^1^^^9999^^^1^^localhost^8090^1"
 
 set ^%CSMENCF =csmencf
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarCSMENCFBase">
<Description>

Gera a Global ^%CSMENCF - Para namespace de base
OBS: Chamar a partir do namespace de desenvolvimento (DESENV61/DESENV62/...)
     Passar por parametro o namespace de base

set sc = ##class(Src2.Utils).GerarCSMENCFBase("DESENVDA61", "DA")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>namespace:%String,conta:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento($znspace, 0)
 quit:sc'=1 sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb(, , 1, , .caminhoAplicRed, 0)
 quit:sc'=1 sc
 
 set arquivoTempCsw = caminhoWorkspace_barra_"temp"_barra
 
 set arquivoPDF = caminhoWorkspace_barra_"temp"_barra_"arqpdf.txt"
 
 set arquivoLicenca = caminhoWorkspace_barra_"configgeral"_barra_"csw.key"
 
 set enderecoIntegraWI = "http://localhost/csp/"_$zconvert($znspace,"l")_"/"
 
 set codEmpresa = $piece($get(^Src2Config("conta",conta)),"^",5)
 if (codEmpresa = "") set codEmpresa = 1
 
 // Piece 1 ao 20
 set csmencf = "1^"_arquivoTempCsw_"^arq.txt^1^"_arquivoTempCsw_"^arq.htm^1^798^"_codEmpresa_"^CC^3000^99^2^1^1^1^^1^0^"
 
 // Piece 20 ao 40
 set csmencf = csmencf_"^1^2^0^^^^110^25^pop3.consistem.com.br^smtp.consistem.com.br^60^"_arquivoTempCsw_"^testerotinas@consistem.com.br^@Outro1234^1^1^### Situacao Anormal ##^^^0"
 
 // Piece 40 ao 60
 set csmencf = csmencf_"^^^1^999^^"_caminhoAplicRed_"^"_enderecoIntegraWI_"^"_$znspace_"^0^^1^0^1^^1^"_arquivoLicenca_"^1^"_arquivoPDF_"^1^0"
 
 // Piece 60 ao ...
 set csmencf = csmencf_"^1^"_arquivoTempCsw_"^0^^^ftp.consistem.com.br^consistem^cnovo2009^0^%SYS^1^1^1^^^9999^^^1^^localhost^8090^1"
 
 if (namespace = "") set namespace = $znspace
 set namespaceAtual = $znspace
 
 znspace namespace
 
 set ^%CSMENCF =csmencf
 
 znspace namespaceAtual
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterCaminhoAplicacaoWeb">
<Description>

Obter o Caminho da Aplicação Web

set sc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb("c:\intersystems\cache\csp\", "/csp/desenv64", , .caminhoAplic, .caminhoServAplic)
set sc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb("c:\intersystems\cache\csp\", "DESENV64", , .caminhoAplic, .caminhoServAplic)
set sc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb(, "DESENV64", , .caminhoAplic, .caminhoServAplic)
set sc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb(, "DESENV64", 1, .caminhoAplic, .caminhoServAplic)
set sc = ##class(Src2.Utils).ObterCaminhoAplicacaoWeb(, , 1, .caminhoAplic, .caminhoServAplic)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[caminhoServAplicInfo:%String="",aplicacao:%String="",flgBarra:%Boolean=0,&caminhoAplic:%String,&caminhoServAplic:%String,flgConsidCSMENCF:%Boolean=1]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 if (caminhoServAplicInfo = "") && (flgConsidCSMENCF) {
   set caminhoServAplicInfo = $piece($get(^%CSMENCF),"^",46)
 }
 
 if (caminhoServAplicInfo = "") {
   set flgServAplicJava = +$piece($get(^WORKSPACE),"^",4)
   
   if (flgServAplicJava) {
     if (##class(Src2.Utils).ObterSistOper() = "windows") {
       set caminhoServAplicInfo = "C:\consistem\cswapp"
     } else {
       set caminhoServAplicInfo = "/consistem/cswapp"
     }
   } else {
     if (##class(Src2.Utils).ObterSistOper() = "windows") {
       set caminhoServAplicInfo = "C:\intersystems\cache\csp"
     } else {
       set caminhoServAplicInfo = "/intersystems/cache/csp"
     }
   }
 }
 
 set caminhoServAplic = ##class(Src2.Utils).AcertarCaminhoArquivo(caminhoServAplicInfo)
 
 if (aplicacao = "") set aplicacao = $znspace
 
 if (aplicacao [ "/csp/") set aplicacao = $piece(aplicacao,"/",3)
 
 set caminhoAplic = caminhoServAplic_barra_$zconvert(aplicacao,"l")
 
 if (flgBarra) {
   set caminhoAplic = caminhoAplic_barra
   set caminhoServAplic = caminhoServAplic_barra
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AnalisarItemProjetos">
<Description>

Exporta o Item

set sc = ##class(Src2.Utils).AnalisarItemProjetos("CCAFC002.mac", "admin", "admin", .tabProjetos)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[InternalName:%String,username:%String="",password:%String="",&tabProjetos:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabProjetos
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp)
 quit:sc'=1 sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 kill ^mtempAnaliseItemProj(codTerm)
 
 set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 
 set sc = ##class(Src2.Item).ObterDadosItem(InternalName, , , .itemCopiaTrabalho, , .itemRepositorio, , , , .projeto)
 quit:sc'=1 sc
 
 set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho, .urlRepositorio, .sistema, .revisaoAtual)
 quit:sc'=1 sc
 
 set dadosItemRepositorio = $piece(itemRepositorio,urlRepositorio,2)
 set dadosItemCopiaTrabalho = $piece(itemCopiaTrabalho,caminhoCopiaTrabalho,2)
 
 set sc = ##class(Src2.UtilsXml).ObterConfigXML(, .tabProjLocais)
 
 set sc = ##class(Src2.UtilsXml).ObterProjetosXML(.tabProjDados)
 
 set projeto = ""
 for  {
   set projeto = $order(tabProjLocais(projeto))
   if (projeto = "") quit
   set var = $get(tabProjDados(projeto))
   
   if ($piece(var,"^",1) '= sistema) continue
   
   set pasta = $piece($get(tabProjLocais(projeto)),"^",2)
   
   set urlRepositorio = $piece(var,"^",2)

   if (pasta '= "") {
     set pasta = pasta_barra
   }
   
   set itemCopiaTrabalho = caminhoWorkspace_barra_"projetos"_barra_pasta_projeto_dadosItemCopiaTrabalho
   
   set itemRepositorio = urlRepositorio_dadosItemRepositorio
   
   set origem = 1
   
   // Verifica se existe o item na cópia de trabalho e está alterado
   if (##class(%File).Exists(itemCopiaTrabalho)) {
     set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "status "_itemCopiaTrabalho, , , autenticacao, arquivoTemp)
     if (sc '= $$$OK) continue
     
     set sc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp, "status")
     if $data(^mtempInfoArquivo(codTerm,"status")) {
       set arquivoItem = itemCopiaTrabalho
       set origem = 2
     }
   }
   
   if (origem = 1) {
     set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "cat "_itemRepositorio, , , autenticacao, arquivoTemp)
     if (sc '= $$$OK) continue
     
     set arquivoItem = arquivoTemp
   }
   
   set sc = ##class(Src2.Item).ObterTabItemArquivo(InternalName, arquivoItem, .tabItem)
   
   set ^mtempAnaliseItemProj(codTerm,projeto) = ""
   merge ^mtempAnaliseItemProj(codTerm,projeto) = tabItem
   
   set tabProjetos(projeto) = (+$order(tabItem(""),-1))_"^"_origem
 }
 
 set sc = ##class(Src2.Utils).AnalisarDiferenca(codTerm, .tabProjetos)
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 kill ^mtempAnaliseItemProj(codTerm)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AnalisarDiferenca">
<Description>
set sc = ##class(Src2.Utils).AnalisarDiferenca(468)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codTerm:%String,&tabProjetos:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set projeto = ""
 for {
   set projeto = $order(^mtempAnaliseItemProj(codTerm,projeto))
   if (projeto = "") quit
   
   if ($order(^mtempAnaliseItemProj(codTerm,projeto,"")) = "") {
     set $piece(tabProjetos(projeto),"^",3) = 0
     set tabRot(0,projeto) = ""
     continue
   }
   
   set codSeq = ""
   for {
     set codSeq = $order(tabRot(codSeq))
     if (codSeq = "") quit
     
     set projeto2 = $order(tabRot(codSeq,""))
     if (projeto2 = "") continue
     
     set (lin, ultLin, dif) = ""
     for {
       set lin = $order(^mtempAnaliseItemProj(codTerm,projeto,lin))
       if (lin = "") quit
     
       if ($get(^mtempAnaliseItemProj(codTerm,projeto,lin)) '= $get(^mtempAnaliseItemProj(codTerm,projeto2,lin))) {
         set dif = 1
         quit
       }
       
       set ultLin = lin
     }
     
     if ('dif) , (ultLin '= "") {
       set lin = ultLin
       for {
         set lin = $order(^mtempAnaliseItemProj(codTerm,projeto2,lin))
         if (lin = "") quit
       
         if ($get(^mtempAnaliseItemProj(codTerm,projeto,lin)) '= $get(^mtempAnaliseItemProj(codTerm,projeto2,lin))) {
           set dif = 1
           quit
         }
       }
     }
     
     if ('dif) quit
   }
   
   if (codSeq = "") set codSeq = $order(tabRot(""),-1) + 1
   
   set tabRot(codSeq,projeto) = ""
 }
 
 set (codSeq, projeto) = ""
 for {
   set codSeq = $order(tabRot(codSeq))
   if (codSeq = "") quit
   
   for {
     set projeto = $order(tabRot(codSeq,projeto))
     if (projeto = "") quit
     set var = $get(tabProjetos(projeto))
     
     set $piece(tabProjetos(projeto),"^",3) = codSeq
     
     if (codSeq = 0) {
       set string = "---(0)"
     } else {
       set string = $translate($justify("",3)," ",$extract("ABCDEFG",codSeq))_"("_$piece(var,"^",1)_")"
     }
     
     if ($piece(var,"^",2) = 2) {
       set string = string_"*"
     }
     
     set $piece(tabProjetos(projeto),"^",4) = string
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarFlagsAposImportFontes">
<Description>

Atualiza as Flags Apos a Importação dos Fontes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,tabFlags:%String,username:%String="",password:%String="",autenticacao:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ($data(tabFlags("flgPaginas"))) {
   write !,"Iniciada a exportação dos objetos do projeto "_projeto_" para a aplicação CSP"
   set sc = ##class(Src2.Utils).ExportarObjetosAplicacaoCSP(projeto, username, password, autenticacao)
   write !,"Iniciado o LoadPages dos utilitários"
   do utilitario^%CSW1LOADPAGES()
 }
 
 if ($data(tabFlags("flgCSUTICSP"))) {
   write !,"Iniciado o cadastro da mensagem padrão 10000"
   do ^%CSUTICSP
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="AtualizarFlagsAntesImportFontes">
<Description>

Atualiza as Flags Antes da Importação dos Fontes
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String,tabFlags:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if ($data(tabFlags("flgDiversos"))) {
   write !,"Iniciada a importação do arquivo diversos.xml do projeto "_projeto
   set sc = ##class(Src2.Utils).ImportarArquivoDiversosXml(projeto)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExportarControleFonteWorkspace">
<Description>

Exporta Fontes do Controle de Fonte para o Workspace

set sc = ##class(Src2.Utils).ExportarControleFonteWorkspace()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivo:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set tabItens("Src2*.cls")=""
 set tabItens("PCATUA*.mac")=""
 
 if (arquivo = "") {
   set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoDiff)
   quit:sc'=1 sc
   
   set barra = ##class(Src2.Utils).ObterBarraSistOper()
   
   set arquivo = caminhoWorkspace_barra_"configgeral"_barra_"Src2.xml"
 }
 
 set sc = $system.OBJ.Export(.tabItens, arquivo, "-d /diffexport")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterConsistemHome">
<Description>

Obter Consistem Home

set sc = ##class(Src2.Utils).ObterConsistemHome(.consistemHome)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>consistemHome:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set consistemHome = $system.Util.GetEnviron("CONSISTEM_HOME")
 
 if (consistemHome = "") {
   if (##class(Src2.Utils).ObterSistOper() = "windows") set consistemHome = "C:\consistem"
   else  set consistemHome = "/consistem"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterEmailUsuario">
<Description>

Retorna os Emails dos Usuario
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>usuario:%String,email:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.UtilsXml).ObterParametrosXML(, .tabUsuarios)
 
 set email = usuario_"@consistem.com.br"
 
 if $data(tabUsuarios(usuario)) {
  set email = $piece($get(tabUsuarios(usuario)),"^",2)
 }
   
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirLog">
<Description>

Exclui Log do Controle de Fonte Depois de 7 Dias

set sc = ##class(Src2.Utils).ExcluirLog()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConfig(, .caminhoWorkspace)
 quit:sc'=1 sc
 
 set dataAtual = +$horolog
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set caminho = caminhoWorkspace_barra_"temp"_barra_"log"
 
 set rs = ##class(%ResultSet).%New("%File:FileSet") 
 do rs.Execute(caminho,"log_"_$zconvert($znspace,"l")_"_*.txt")
 while rs.Next() {
   set arquivo = rs.Get("Name")
   set dataEdt = $translate($piece($piece(arquivo,caminho_barra_"log_"_$zconvert($znspace,"l")_"_",2),".txt",1),"_","-")
   set data = $zdateh(dataEdt,3,,,,,,,"")
   if (data = "") ! ((dataAtual-data) '> 7) continue
   set sc = ##class(%File).Delete(arquivo)
 }
 do rs.%Close()
 set rs = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GeraLog">
<Description>

Gera o Log do Controle de Fonte
tipo = 0 - LOG
       1 - OK
       2 - ERRO
       3 - MERGE
       4 - CONFL (Conflito)

set sc = ##class(Src2.Utils).GeraLog(1, "teste de log")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>tipo:%Integer=0,mensagem:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (mensagem = "") quit $$$OK
 
 set dsTipo = $select(tipo=1:"[OK]",tipo=2:"[ERRO]",tipo=3:"[MERGE]",tipo=4:"[CONFL]",1:"[LOG]")
 
 set sc = ##class(Src2.Utils).ObterConfig(, .caminhoWorkspace)
 quit:sc'=1 sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set caminho = caminhoWorkspace_barra_"temp"_barra_"log"
 
 if ('##class(%File).DirectoryExists(caminho)) {
   do ##class(%File).CreateDirectory(caminho)
   if (##class(Src2.Utils).ObterSistOper() = "linux") {
     do $zf(-1,"chmod -R 777 "_caminho)
   }
 }
 
 set arquivo = caminho_barra_"log_"_$zconvert($znspace,"l")_"_"_$translate($zdate(+$horolog,3),"-","_")_".txt"
 
 set flgExiste = 0
 set string = "WNS:/IOTABLE=""UTF8"""
 if (##class(%File).Exists(arquivo)) {
   set flgExiste = 1
   set string = "RWS:/IOTABLE=""UTF8"""
 }
 
 set objFile = ##class(%File).%New(arquivo)
 do objFile.Open(string)
 if ('objFile.IsOpen) {
   set objFile = ""
   quit "Erro gerar o arquivo de log!"
 }
 
 do objFile.MoveTo(objFile.SizeGet())
 
 set timestampOld = $get(^Src2Config("config","logtimestamp"))
 
 if (flgExiste) {
   set sc = objFile.WriteLine()
 } else {
   set timestampOld = ""
 }
 
 set tempoTotal = "00:00:00.00000"
 set timestamp = $zdatetimeh($ztimestamp,-3)
 
 if (timestampOld '= "") {
   set difTime = $piece(timestamp,",",2)-$piece(timestampOld,",",2)
   if (difTime<0) set difTime = 0
   set tempoTotal = $ztime(difTime,,5)
 }
 
 set sc = objFile.Write("["_$ztime($piece(timestamp,",",2),,0)_"] ["_tempoTotal_"] "_##class(Src2.Utils).Just(dsTipo, 7)_" "_mensagem)
 
 set ^Src2Config("config","logtimestamp") = timestamp
 
 do objFile.Close()
 set objFile = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarSitArqCopiaTrab">
<Description>

Validar a Situação dos Arquivos na Cópia de Trabalho

? - Não versionado
C - Conflito
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[projeto:%String,strSituacoes:%String="?;C",username:%String="",password:%String="",&flgAlteracoes:%Boolean]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set flgAlteracoes = 0
 
 set sc = ##class(Src2.Utils).ConvertStrTab(strSituacoes, .tabSituacoes)
 
 set msgsc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp)
 if (msgsc '= $$$OK) quit msgsc
 
 set msgsc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 if (msgsc '= $$$OK) quit msgsc
 
 set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, .caminhoCopiaTrabalho)
 if (msgsc '= $$$OK) quit msgsc

 set msgsc = ##class(Src2.Utils).Subversion(caminhoSvn, "status "_caminhoCopiaTrabalho, username, password, autenticacao, arquivoTemp)
 
 set msgsc = ##class(Src2.Utils).ObterDadosArquivoSvnCUS(codTerm, arquivoTemp, "status")
 
 if ($order(^mtempInfoArquivo(codTerm,"status","")) '= "") {
   set flgAlteracoes = 1
 }
 
 if ($data(tabSituacoes("C"))) && ($data(^mtempInfoArquivo(codTerm,"status","C"))) {
   quit "O projeto "_projeto_" possui itens com conflito!"
 }
 
 if ($data(tabSituacoes("?"))) && ($data(^mtempInfoArquivo(codTerm,"status","?"))) {
   quit "O projeto "_projeto_" possui itens não versionados!"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirArquivosPastasNaoVersionados">
<Description>

Exclui os Arquivos/Pastas não Versionadas
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set item = ""
 for {
   set item = $order(^mtempInfoArquivo(codTerm,"status","?","rotinas",item))
   if (item = "") quit
   set arquivo = $piece($get(^mtempInfoArquivo(codTerm,"status","?","rotinas",item)),"^",1)
   set sc = ##class(%File).Delete(arquivo)
   write !,"Arquivo excluido: "_arquivo_" "_$select(sc=$$$OK:"[OK]",1:"[ERRO]")
 }
 
 set item = ""
 for {
   set item = $order(^mtempInfoArquivo(codTerm,"status","?","classes",item))
   if (item = "") quit
   set arquivo = $piece($get(^mtempInfoArquivo(codTerm,"status","?","classes",item)),"^",1)
   set sc = ##class(%File).Delete(arquivo)
   write !,"Arquivo excluido: "_arquivo_" "_$select(sc=$$$OK:"[OK]",1:"[ERRO]")
 }
 
 set item = ""
 for {
   set item = $order(^mtempInfoArquivo(codTerm,"status","?","pastaRotinas",item))
   if (item = "") quit
   set pasta = $piece($get(^mtempInfoArquivo(codTerm,"status","?","pastaRotinas",item)),"^",1)
   set sc = ##class(%File).RemoveDirectoryTree(pasta)
   write !,"Pasta excluida: "_pasta_" "_$select(sc=$$$OK:"[OK]",1:"[ERRO]")
 }
 
 set item = ""
 for {
   set item = $order(^mtempInfoArquivo(codTerm,"status","?","pastaClasses",item))
   if (item = "") quit
   set pasta = $piece($get(^mtempInfoArquivo(codTerm,"status","?","pastaClasses",item)),"^",1)
   set sc = ##class(%File).RemoveDirectoryTree(pasta)
   write !,"Pasta excluida: "_arquivo_" "_$select(sc=$$$OK:"[OK]",1:"[ERRO]")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterProjetosSwitch">
<Description>

Obter Projetos para Switch

set sc = ##class(Src2.Utils).ObterProjetosSwitch(.tabProjetosSwitch)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabProjetosSwitch:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabProjetosSwitch
 
 set msgsc = ##class(Src2.Utils).ObterProjetoSistema("cswutil", .projeto)
 
 set projeto = ""
 for  {
   set projeto = $order(^Src2Config("projetorev",projeto))
   if (projeto = "") quit
   
   set msgsc = ##class(Src2.Utils).ObterDadosProjeto(projeto, , , .sistema, , .versao, , , , , , .projetoAtual)
   
   if (projetoAtual '= "") {
     set tabProjetosAtuais(projetoAtual) = ""
   }
   if (sistema '= "") {
     set tabSistemasAtuais(sistema) = versao
   }
 }
 
 set msgsc = ##class(Src2.UtilsXml).ObterProjetosXML(.tabProjetos)
 
 set (projeto)=""
 for  {
   set projeto = $order(tabProjetos(projeto))
   if (projeto = "") quit
   set var = $get(tabProjetos(projeto))
   
   set sistema = $piece(var,"^",1)
   
   if (sistema = "") continue
   
   if ('$data(tabSistemasAtuais(sistema))) continue
   
   if ($data(tabProjetosAtuais(projeto))) continue
   
   set versao = $get(tabSistemasAtuais(sistema))
   
   // Por conta
   if ($piece(var,"^",3) = 1) continue
   
   // Customização
   if ($piece(var,"^",10) = 1) continue
   
   // Ativo
   if ($piece(var,"^",12) '= 1) continue
   
   if ($piece(var,"^",8) '= versao) continue
   
   set tabProjetosSwitch(projeto) = ""
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="Tab">
<Description>

Tab
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>niveis:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[ quit $translate($justify(" ",niveis)," ",$char(9))
]]></Implementation>
</Method>

<Method name="ObterEnderecoArquivo">
<Description>

Obter Endereco do Arquivo Versionado
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[tipoArquivo:%String,&tabArqVers:%String,versao:%String,&endereco:%String,&nomeArquivo:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (endereco, nomeArquivo) = ""
 
 set enderecoPasta = $get(tabArqVers(tipoArquivo,"enderecoPasta"))
 
 set arquivo = $get(tabArqVers(tipoArquivo,"arquivo"))
 
 set nomeArquivo = $get(tabArqVers(tipoArquivo,"nome"))
 
 set endereco = ##class(Src2.Utils).Translate(enderecoPasta_"/"_arquivo, "[VERSAO]", versao)
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Utils2">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="GerarBackupJob">
<Description>
========================================================================================
É criada uma rotina em tempo de execução porque no Caché 5 não é possível chamar métodos
de classe com job
========================================================================================
set sc = ##class(Src2.Utils2).GerarBackupJob("ederson.jantsch")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 job ##class(Src2.Utils2).GerarBackup(username, password)
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarBackup">
<Description>

Realiza o Backup das Rotinas/Classes em Alteração

set sc = ##class(Src2.Utils2).GerarBackup("ederson.jantsch")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>username:%String="",password:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if (##class(Src2.Utils).ObterSistOper() '= "windows") quit $$$OK
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 if $data(^Src2Backup) quit $$$OK
 
 lock +Src2Backup:0
 else  quit $$$OK
 
 set dataHora = $translate($zdatetime($horolog,3),"-: ","___")
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace)
 quit:sc'=1 sc
 
 set caminho = caminhoWorkspace_barra_"backup"
 
 if ($data(^Src2Config("usuarios",username))) {
   set caminho = $piece($get(^Src2Config("usuarios",username)),"^",1)_barra_"backup"
 }
 
 if ('##class(%File).DirectoryExists(caminho)) {
   do ##class(%File).CreateDirectory(caminho)
 }
 
 set projeto = ""
 for {
   set projeto = $order(^Src2Config("projetorev",projeto))
   if (projeto = "") quit
   
   set sc = ##class(Src2.Item).ObterItensAlterados(projeto, username, password, .tabItens)
   
   if ('$data(tabItens)) continue
   
   set sc = ##class(Src2.Utils).ObterDadosProjeto(projeto, , , , , , , .pasta, , , , .projetoAtual)
   
   if (pasta = "") set arquivo = caminho_"\backup_"_dataHora_"_proj_"_projetoAtual_".xml"
   else  set arquivo = caminho_"\backup_"_dataHora_"_proj_"_$translate(pasta,".","")_"_"_projetoAtual_".xml"
   
   set sc = ##class(Src2.ImportExport).ExportarArquivoXml(.tabItens, arquivo)
 }
 
 set sc = ##class(Src2.Utils2).ExcluirBackup(caminho)
 
 lock -Src2Backup
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirBackup">
<Description>

Exclui o Backup Depois de 7 Dias
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>caminho:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set rs = ##class(%ResultSet).%New("%File:FileSet")
 do rs.Execute(caminho,"backup_*.xml")
 while rs.Next() {
   set arquivo = rs.Get("Name")
   
   set var = $piece($piece(arquivo,caminho_"\backup",2),".xml",1)
   
   set dataEdt = $translate($piece(var,"_",2,4),"_","-")
   
   set horaEdt = $translate($piece(var,"_",5,7),"_",":")
   
   set projeto = $piece(var,"_",8)
   
   set dataTime = $zdatetimeh(dataEdt_" "_horaEdt,3,,,,,,,,"")
   
   set dataHoraEdt = $piece(var,"_",2,7)
   
   if (dataTime = "") ! (projeto = "") continue
   
   set tabBackup(projeto, dataHoraEdt) = arquivo
 }
 do rs.%Close()
 set rs = ""
 
 set (projeto, dataHoraEdt) = ""
 for {
   set projeto = $order(tabBackup(projeto))
   if (projeto = "") quit
   set cont = 0
   for {
     set dataHoraEdt = $order(tabBackup(projeto,dataHoraEdt),-1)
     if (dataHoraEdt = "") quit
     set cont = cont + 1
     if (cont > 5) {
       set arquivo = $get(tabBackup(projeto, dataHoraEdt))
       set sc = ##class(%File).Delete(arquivo)
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CriarRotina">
<Description>

Cria uma rotina em tempo de execução para ser chamada via job
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,fonte:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set objRotina = ##class(%Routine).%New(rotina_".INT")
 do objRotina.Write(fonte)
 do objRotina.Save()
 set compila = objRotina.Compile("k-d")
 set objRotina = ""
 
 if (compila '= 1) quit $$$ERROR(10000,"Erro ao compilar a rotina "_rotina_"!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="LockProjeto">
<Description>

Lock de Projeto

set sc = ##class(Src2.Utils2).LockProjeto("csw61")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 lock +^Src2Svn(projeto):0
 else  quit "Projeto "_projeto_" sendo atualizado em outro Studio"
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="UnLockProjeto">
<Description>

UnLock de Projeto
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>projeto:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 lock -^Src2Svn(projeto):0
 quit $$$OK
]]></Implementation>
</Method>

<Method name="Tab">
<Description>

Tag
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>niveis:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[ quit $translate($justify(" ",niveis)," ",$char(9))
]]></Implementation>
</Method>

<Method name="CriarPasta">
<Description>

Criar Pasta
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>pasta:%String,flgChmod:%Boolean=1</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
 set flgRet = ##class(%File).CreateDirectoryChain(pasta)
 if (flgChmod) , (##class(Src2.Utils).ObterSistOper() = "linux") {
   do $zf(-1,"chmod -R 777 "_pasta)
 }
 quit flgRet
]]></Implementation>
</Method>

<Method name="ObterLinhasArquivo">
<Description>

Obter Linhas do Arquivo

set sc = ##class(Src2.Utils2).ObterLinhasArquivo("/usr/tmp/ederson/temp.txt", , .tabLinhas)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[arquivo:%String,nrLinhas:%String=1,&tabLinhas:%String,&ultLinha:%String]]></FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
 kill tabLinhas
 set ultLinha = ""
 
 set cont = 0
 
 set file = ##class(%File).%New(arquivo)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   set cont = $increment(cont)
   set (ultLinha, tabLinhas(cont)) = linhaFile
   if (cont = nrLinhas) quit
 }
 
 do file.Close()
 set file=""
 
 set sc = ##class(%File).Delete(arquivo)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarVersao">
<Description>

Validar Versao/Release

set sc = ##class(Src2.Utils2).ValidarVersao("6.3.3.+", .versao, .versaoRelease, .versaoRelease2, .beta, .release, .identificador)
set sc = ##class(Src2.Utils2).ValidarVersao("6.3.3.45433", .versao, .versaoRelease, .versaoRelease2, .beta, .release, .identificador)
set sc = ##class(Src2.Utils2).ValidarVersao("6.3.3b2.45433", .versao, .versaoRelease, .versaoRelease2, .beta, .release, .identificador)
set sc = ##class(Src2.Utils2).ValidarVersao("v.6.2 r01.7870", .versao, .versaoRelease, .versaoRelease2, .beta, .release, .identificador)
set sc = ##class(Src2.Utils2).ValidarVersao("6.2 r01.7870", .versao, .versaoRelease, .versaoRelease2, .beta, .release, .identificador)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[versaoInf:%String,&versao:%String,&versaoRelease:%String,&versaoRelease2:%String,&beta:%String,&release:%String,&identificador:%String,&flgBeta:%Boolean]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils2).ObterVersao(versaoInf, .versao, .versaoRelease, .versaoRelease2, .beta, .release, .identificador)
 
 if ($translate(versaoRelease2,"0123456789.") '= "") {
   set (versao, versaoRelease, versaoRelease2, beta, release, identificador, flgBeta) = ""
   quit $$$ERROR(10000,"Versão "_versaoInf_" inválida!")
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterVersao">
<Description>

Obter Versao/Release

set sc = ##class(Src2.Utils2).ObterVersao("6.3.3.+", .versao, .versaoRelease, .versaoRelease2, .beta, .release, .identificador, .flgBeta, .revisao)
set sc = ##class(Src2.Utils2).ObterVersao("6.3.3.45433", .versao, .versaoRelease, .versaoRelease2, .beta, .release, .identificador, .flgBeta, .revisao)
set sc = ##class(Src2.Utils2).ObterVersao("6.3.3b2.45433", .versao, .versaoRelease, .versaoRelease2, .beta, .release, .identificador, .flgBeta, .revisao)
set sc = ##class(Src2.Utils2).ObterVersao("v.6.2 r01.7870", .versao, .versaoRelease, .versaoRelease2, .beta, .release, .identificador, .flgBeta, .revisao)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[versaoInf:%String,&versao:%String,&versaoRelease:%String,&versaoRelease2:%String,&beta:%String,&release:%String,&identificador:%String,&flgBeta:%Boolean,&revisao:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set flgBeta = 0
 set (beta, release, revisao) = ""
 set versao = $piece(versaoInf,".",1,2)
 set release = $piece(versaoInf,".",3)
 set revisao = $piece(versaoInf,".",4)
 set (versaoRelease, versaoRelease2) = $piece(versaoInf,".",1,3)
 if ($piece(versaoInf,".",3) [ "b") {
   set beta = $piece($piece(versaoInf,".",3),"b",2)
   set release = $piece($piece(versaoInf,".",3),"b",1)
   set $piece(versaoRelease2,".",3) = release
   set flgBeta = 1
 }
 set identificador = $translate($justify($piece(versao,".",1),3)," ","0")
 set identificador = identificador_$translate($justify($piece(versao,".",2),3)," ","0")
 set identificador = identificador_$translate($justify(+release,5)," ","0")
 set identificador = identificador_$translate($justify($select(beta="":999,1:beta),3)," ","0")
 set identificador = identificador_$translate($justify(+revisao,8)," ","0")
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CompararVersao">
<Description><![CDATA[

Compara Versoes

write ##class(Src2.Utils2).CompararVersao("6.3.2b2.45433", ">", "6.3.3.+")
write ##class(Src2.Utils2).CompararVersao("6.3.2b2.45433", "<", "6.3.2.45433")]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>versao1:%String,operador:%String,versao2:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils2).ObterVersao(versao1, , , , , , .identificador1)
 set sc = ##class(Src2.Utils2).ObterVersao(versao2, , , , , , .identificador2)
 quit @(""""_identificador1_""""_operador_""""_identificador2_"""")
]]></Implementation>
</Method>

<Method name="ValidarVersaoSistema">
<Description><![CDATA[

Validar Versão Sistema

set sc=##class(Src2.Utils2).ValidarVersaoSistema("csw", ">", "6.3.3", .flgRet)
set sc=##class(Src2.Utils2).ValidarVersaoSistema("cswutil", ">", "6.3.3", .flgRet)
set sc=##class(Src2.Utils2).ValidarVersaoSistema("cswutil", "<=", "6.3.5", .flgRet)]]></Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[sistema:%String,operador:%String,versao:%String,&flgRet:%Boolean]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set flgRet = 0
 
 set sc = ##class(Src2.PatchUtils).ObterVersaoProdutoCliente(sistema, .versaoSistema)
 if $$$ISERR(sc) quit sc
 
 set flgRet = ##class(Src2.Utils2).CompararVersao(versaoSistema, operador, versao)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="EnviarEmail">
<Description>

Envia um Log de Erros por Email

set sc = ##class(Src2.Utils2).EnviarEmail()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[titulo:%String,emailDe:%String,&tabEmailPara:%String,&tabMensagem:%String,tipoTexto:%String="",attachfile:%String="",replyTo:%String=""]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set smtpdomain = $piece($get(^%CSMENCF),"^",30)
 
 set smtpport = $piece($get(^%CSMENCF),"^",28)
 
 set userSMTP = $piece($get(^%CSMENCF),"^",33)
 
 set passSMTP = $piece($get(^%CSMENCF),"^",34)
 
 if ((smtpdomain = "") ! (smtpdomain = "") ! (smtpdomain = "") ! (smtpdomain = "")) {
   quit $$$ERROR(10000,"Configurações para envio de e-mail não encontradas!")
 }
 
 set sc = $$EnviarEmail^%CSUTIEM(titulo, .tabMensagem, smtpdomain, smtpport, emailDe, .tabEmailPara, attachfile, , userSMTP, passSMTP, , tipoTexto, , , replyTo)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterCamihoJAR">
<Description>

Obter Caminho arquivo JAR
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>flgAtuCompleta:%Boolean=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sc = ##class(Src2.Utils).ObterConsistemHome(.consistemHome)
 
 set pastaComponentes = ##class(Src2.Utils2).ObterCaminhoComponentes(consistemHome, flgAtuCompleta)
 
 // Memoria para o Java
 set memoria = " -Xms256m -Xmx512m -XX:MaxPermSize=256m"
 
 set endereco=consistemHome_barra_"java"_barra_"bin"_barra_"java"
 set endereco=endereco_memoria_" -cp "_pastaComponentes_barra_"consistem_geral.jar"
 
 quit endereco
]]></Implementation>
</Method>

<Method name="ObterCaminhoComponentes">
<Description>

Obter Caminho dos Componentes

write ##class(Src2.Utils2).ObterCaminhoComponentes()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>consistemHome:%String="",flgAtuCompleta:%Boolean=0</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 if (consistemHome = "") {
   set sc = ##class(Src2.Utils).ObterConsistemHome(.consistemHome)
 }
 
 set caminho = consistemHome_barra_"lib"_barra_"componentes"
 
 if ('flgAtuCompleta) {
   set caminho = consistemHome_barra_"lib"_barra_##class(Src2.Utils2).ObterPastaComponentes()
 }
 
 quit caminho
]]></Implementation>
</Method>

<Method name="ObterPastaComponentes">
<Description>

Obter Pasta dos Componentes

write ##class(Src2.Utils2).ObterPastaComponentes()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set pasta = "componentes"
 
 if ($piece($get(^%CSW1ATUCONF(3,"cswutil")),"^",1) '= "") {
   set sc = ##class(Src2.Utils2).ValidarVersaoSistema("cswutil", "<", "6.4.99", .flag)
   if (flag) { set pasta = "utilitarios" }
 }
 
 quit pasta
]]></Implementation>
</Method>

<Method name="ObterDadosUltimaRevisao">
<Description>

Obter Dados Ultima Revisao
tipo = 0 - Última Revisão
       1 - Penultima Revisão

set sc = ##class(Src2.Utils2).ObterDadosUltimaRevisao("http://192.168.15.10:18080/svn/cswutil/tags/6.3.1", , , , , , .revisao, .autor, .data, .mensagem)
set sc = ##class(Src2.Utils2).ObterDadosUltimaRevisao("http://192.168.15.10:18080/svn/csw/tags/6.3.7", , , , , , .revisao, .autor, .data, .mensagem)
set sc = ##class(Src2.Utils2).ObterDadosUltimaRevisao("http://192.168.15.10:18080/svn/csw/tags/6.3.7", , 1, , , , .revisao, .autor, .data, .mensagem)
set sc = ##class(Src2.Utils2).ObterDadosUltimaRevisao("http://repositorio:18080/svn/cswutil/tags/6.3.1", , , , , , .revisao, .autor, .data, .mensagem)
set sc = ##class(Src2.Utils2).ObterDadosUltimaRevisao("http://192.168.15.10:18080/svn/cswutil/branches/6.2", , , , , , .revisao, .autor, .data, .mensagem)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>urlRepositorio:%String,revisaoInf:%String="head",tipo:%Integer=0,username:%String="",password:%String="",autenticacao:%String="",revisao:%String,autor:%String,data:%String,mensagem:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (revisao, autor, data, mensagem) = ""
 
 set limit = "--limit 1"
 if (tipo = 1) set limit = "--limit 2"
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoDiff)
 if (sc '= 1) quit $$$ERROR(10000,sc)
 
 if (autenticacao = "") {
   set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 }
 
 set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "log --non-interactive --xml --quiet "_limit_" "_urlRepositorio_"@"_revisaoInf, , , autenticacao, arquivoTemp)
 if (sc '= 1) quit $$$ERROR(10000,sc)
 
 if ('##class(%File).Exists(arquivoTemp)) quit $$$ERROR(10000,"Não foi possível acessar os dados do repositório "_urlRepositorio_"@"_revisaoInf_"!")
   
 set sc = ##class(%XML.TextReader).ParseFile(arquivoTemp,.reader)
 if $$$ISERR(sc) {
   set sc = ##class(%File).Delete(arquivoTemp)
   quit $$$ERROR(10000,"Não foi possível acessar os dados do repositório!")
 }
 
 set (path) = ""
 
 while (reader.Read()) {
   if (reader.Path '= "") { set path = reader.Path }
   
   if (reader.NodeType = "element") , (reader.Path = "/log/logentry") {
     if reader.MoveToAttributeName("revision") set revisao = reader.Value
     set (autor, data, mensagem) = ""
   }
   
   if (reader.NodeType = "chars") , (path = "/log/logentry/msg") {
     set mensagem = reader.Value
   }
   
   if (reader.NodeType = "chars") , (path = "/log/logentry/author") {
     set autor = reader.Value
   }
   
   if (reader.NodeType = "chars") , (path = "/log/logentry/date") {
     set data = reader.Value
   }
 }
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterRevisaoDiaAnterior">
<Description>

Obter Dados Ultima Revisao do Dia Anterior a Data de Referencia

set sc = ##class(Src2.Utils2).ObterRevisaoDiaAnterior("http://192.168.15.10:18080/svn/csw/branches/6.2", $horolog-2, , , , .revisao, .autor, .data, .mensagem)
set sc = ##class(Src2.Utils2).ObterRevisaoDiaAnterior("http://192.168.15.10:18080/svn/csw/branches/6.2", , , , , .revisao, .autor, .data, .mensagem)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>urlRepositorio:%String,dataReferencia:%String="",username:%String="",password:%String="",autenticacao:%String="",revisao:%String,autor:%String,data:%String,mensagem:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set (revisao, autor, data, mensagem) = ""
 
 if (dataReferencia = "") set dataReferencia = +$horolog
 
 set dataEdtInicio = $zdate(dataReferencia-6,3)
 set dataEdtFim = $zdate(dataReferencia-1,3)
 
 set sc = ##class(Src2.Utils).ObterConfig(.codTerm, .caminhoWorkspace, .caminhoSvn, .arquivoTemp, .arquivoDiff)
 if (sc '= 1) quit $$$ERROR(10000,sc)
 
 if (autenticacao = "") {
   set sc = ##class(Src2.Utils).ObterStrAutenticacao(username, password, .autenticacao, 0)
 }
 
 set sc = ##class(Src2.Utils).Subversion(caminhoSvn, "log --xml --quiet --revision {"""_dataEdtFim_" 23:59""}:{"""_dataEdtInicio_" 00:00""} --limit 1 "_urlRepositorio, , , autenticacao, arquivoTemp)
 if (sc '= 1) quit $$$ERROR(10000,sc)
 
 if ('##class(%File).Exists(arquivoTemp)) quit $$$ERROR(10000,"Não foi possível acessar os dados do repositório "_urlRepositorio_"@"_revisaoInf_"!")
   
 set sc = ##class(%XML.TextReader).ParseFile(arquivoTemp,.reader)
 if $$$ISERR(sc) {
   set sc = ##class(%File).Delete(arquivoTemp)
   quit $$$ERROR(10000,"Não foi possível acessar os dados do repositório!")
 }
 
 set (path) = ""
 
 while (reader.Read()) {
   if (reader.Path '= "") { set path = reader.Path }
   
   if (reader.NodeType = "element") , (reader.Path = "/log/logentry") {
     if reader.MoveToAttributeName("revision") set revisao = reader.Value
     set (autor, data, mensagem) = ""
   }
   
   if (reader.NodeType = "chars") , (path = "/log/logentry/msg") {
     set mensagem = reader.Value
   }
   
   if (reader.NodeType = "chars") , (path = "/log/logentry/author") {
     set autor = reader.Value
   }
   
   if (reader.NodeType = "chars") , (path = "/log/logentry/date") {
     set data = reader.Value
   }
 }
 
 set sc = ##class(%File).Delete(arquivoTemp)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosContaVersao">
<Description>

Obter Dados Conta/Versao

set sc = ##class(Src2.Utils2).ObterDadosContaVersao("MB", "6.3", .dataBase, .namespace, .dataBaseConta, .dataBaseFonte, .namespaceFonte, .application)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codConta:%String,versao:%String,&dataBase:%String,&namespace:%String,&dataBaseConta:%String,&dataBaseFonte:%String,&namespaceFonte:%String,&application:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento($znspace, , , .complemento)
 
 set dataBaseConta = "DESENV"_codConta
 
 set (dataBaseFonte,namespaceFonte) = "DESENV"_$translate(versao,".","")_complemento
 
 set (dataBase,namespace) = "DESENV"_codConta_$translate(versao,".","")_complemento
 
 set application = "/csp/"_$zconvert(namespace,"l")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CriarAplicacaoContaVersao">
<Description>

Criar Aplicacao por Conta/Versao

set sc = ##class(Src2.Utils2).CriarAplicacaoContaVersao("MB", "6.3")
set sc = ##class(Src2.Utils2).CriarAplicacaoContaVersao("DA", "6.3", "A")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codConta:%String,versao:%String,tag:%String="",flgWrite:%Boolean=1,flgDataSource:%Boolean=1</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sysOper = ##class(Src2.Utils).ObterSistOper()
 
 set msgsc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento($znspace, , , .complemento)
 
 set msgsc = ##class(Src2.Utils2).ObterDiretoriosContaVersao(codConta, versao_$zconvert(complemento,"l"), tag, sysOper, .directoryConta, .directoryContaVersao, .codServerECP)
 if (msgsc '= $$$OK) {
   if (flgWrite) write !,"Source Control: "_msgsc
   if (flgWrite) write !,##class(Src2.Utils).ObterBarra()
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Utils2).ExcluirAplicacaoContaVersao(codConta, versao, flgWrite)
 if (msgsc '= $$$OK) {
   if (flgWrite) write !,"Source Control: "_msgsc
   if (flgWrite) write !,##class(Src2.Utils).ObterBarra()
   quit msgsc
 }
 
 set msgsc = ##class(Src2.Utils2).CriarAplicacao(codConta, versao, directoryConta, directoryContaVersao, codServerECP, flgWrite, flgDataSource)
 if (msgsc '= $$$OK) {
   if (flgWrite) write !,"Source Control: "_msgsc
   if (flgWrite) write !,##class(Src2.Utils).ObterBarra()
   quit msgsc
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CriarAplicacao">
<Description>

Criar Aplicacao

set sc = ##class(Src2.Utils2).CriarAplicacao("MB", "6.3", "/InterSystems/cachedb/desenvmb/", "/InterSystems/cachedb/desenvmb63/")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codConta:%String,versao:%String,directoryConta:%String,directoryContaVersao:%String,codServerECP:%String,flgWrite:%Boolean=1,flgDataSource:%Boolean=1</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 if (flgWrite) write !!,##class(Src2.Utils).ObterBarra("Gerar Base")
 
 set sc = ##class(Src2.Utils2).ObterInformacoesCache(.caminhoCache)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sysOper = ##class(Src2.Utils).ObterSistOper()
 
 set sc = ##class(Src2.Utils2).ObterDadosContaVersao(codConta, versao, .dataBase, .namespace, .dataBaseConta, .dataBaseFonte, .namespaceFonte, .application)
 if (sc '= $$$OK) {
   if (flgWrite) write !,"Source Control: "_sc
   if (flgWrite) write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set flgAuthDelegada = 0
 if (##class(Src2.Utils2).CompararVersao(versao, ">=", "6.3")) {
   set flgAuthDelegada = 1
 }
 
 set nspOrigem = $znspace
 
 try {
 
   znspace "%SYS"
   
   kill tabProperties
   set tabProperties("ClusterMountMode") = 0
   set tabProperties("Directory") = directoryConta
   set tabProperties("MountAtStartup") = 0
   set tabProperties("MountRequired") = 0
   set tabProperties("Server") = codServerECP
   set tabProperties("CPFFile") = caminhoCache_"cache.cpf"
   set tabProperties("Flags") = "4103"
   
   set sc = ##Class(Config.Databases).Create(dataBaseConta,.tabProperties)
   
   if (flgWrite) write !,"Base criada: "_dataBaseConta_" - "_directoryConta
   
   kill tabProperties
   set tabProperties("ClusterMountMode") = 0
   set tabProperties("Directory") = directoryContaVersao
   set tabProperties("MountAtStartup") = 0
   set tabProperties("MountRequired") = 0
   set tabProperties("Server") = codServerECP
   set tabProperties("CPFFile") = caminhoCache_"cache.cpf"
   set tabProperties("Flags") = "4103"
   
   set sc = ##Class(Config.Databases).Create(dataBase,.tabProperties)
   
   if (flgWrite) write !,"Base criada: "_dataBase_" - "_directoryContaVersao
   
   kill tabProperties
   set tabProperties("Globals") = dataBaseConta
   set tabProperties("Library") = "CACHELIB"
   set tabProperties("Routines") = dataBaseFonte
   set tabProperties("SysGlobals") = "CACHESYS"
   set tabProperties("SysRoutines") = "CACHESYS"
   set tabProperties("TempGlobals") = "CACHETEMP"
   
   set sc = ##Class(Config.Namespaces).Create(namespace,.tabProperties)
   
   if (flgWrite) write !,"Namespace criado: "_namespace
   
   kill tabProperties
   set tabProperties("Database") = "CACHELIB"
   
   set sc = ##Class(Config.MapRoutines).Create(namespace,"%CSP*",.tabProperties)
   set sc = ##Class(Config.MapRoutines).Create(namespace,"%CSR*",.tabProperties)
   
   kill tabProperties
   set tabProperties("Database") = dataBaseFonte
   
   set sc = ##Class(Config.MapRoutines).Create(namespace,"%CS*",.tabProperties)
   set sc = ##Class(Config.MapRoutines).Create(namespace,"%SM*",.tabProperties)
   set sc = ##Class(Config.MapRoutines).Create(namespace,"%WW*",.tabProperties)
   set sc = ##Class(Config.MapRoutines).Create(namespace,"%ZS",.tabProperties)
   
   kill tabProperties
   set tabProperties("Database") = dataBase
   
   set sc = ##Class(Config.MapGlobals).Create(namespace,"%CSMENCF",.tabProperties)
   set sc = ##Class(Config.MapGlobals).Create(namespace,"%SM*",.tabProperties)
   
   kill tabProperties
   set tabProperties("Database") = "INFRA"
   
   set sc = ##Class(Config.MapGlobals).Create(namespace,"%CSMENDI",.tabProperties)
   
   kill tabProperties
   set tabProperties("Database") = dataBaseFonte
   
   set sc = ##Class(Config.MapGlobals).Create(namespace,"%CSW1*",.tabProperties)
   if (sysOper = "linux") {
     set sc = ##Class(Config.MapGlobals).Create(namespace,"%CSWINFO*",.tabProperties)
   }
   
   kill tabProperties
   set tabProperties("Database") = dataBaseConta
   
   set sc = ##Class(Config.MapGlobals).Create(namespace,"%CS*",.tabProperties)
   set sc = ##Class(Config.MapGlobals).Create(namespace,"%EMP",.tabProperties)
   
   if (flgWrite) write !,"Mapeamentos de Rotinas/Globais Gerados"
   
   kill tabProperties
   set tabProperties("AutoCompile") = 0
   set tabProperties("ChangePasswordPage") = ""
   set tabProperties("CookiePath") = "/csp/"
   set tabProperties("Description") = ""
   set tabProperties("Enabled") = 1
   set tabProperties("ErrorPage") = "csw1erro.csp"
   set tabProperties("EventClass") = "Utils.CSW1SessionEvents"
   set tabProperties("HyperEvent") = 2
   set tabProperties("LockCSPName") = 0
   set tabProperties("MatchRoles") = ":%All"
   set tabProperties("NameSpace") = namespace
   set tabProperties("Package") = ""
   set tabProperties("Path") = caminhoCache_"csp"_barra_$zconvert(namespaceFonte,"l")_barra
   set tabProperties("Recurse") = 1
   set tabProperties("Resource") = ""
   set tabProperties("ServeFiles") = 1
   set tabProperties("ServeFilesTimeout") = 3600
   set tabProperties("SuperClass") = ""
   set tabProperties("Timeout") = 60
   set tabProperties("Type") = 2
   set tabProperties("UseCookies") = 0
   
   set tabProperties("AutheEnabled") = 64
   set tabProperties("LoginPage") = ""
     
   if (flgAuthDelegada) {
     set tabProperties("AutheEnabled") = 8192
     set tabProperties("LoginPage") = "csw1jsonsql.csp"
   }
   
   set sc = ##Class(Security.Applications).Create(application,.tabProperties)
   
   if (flgWrite) write !,"Aplicação CSP Gerada - "_application
   
   znspace namespace
   
   set ^%SMConf("System","DispTelnet")=""
   set ^%SMConf("System","Indef")=0
   set ^%SMConf("System","Sys")="MSQL"
   set ^%SMConf("System","Ter")=1
   set ^%SMConf("System","TestaNetTerm")=0
   
   kill ^%SMConf("DirInOut")
   set ^%SMConf("DirInOut",1)="%SYS"
   set ^%SMConf("DirInOut",2)="TRABALHO"
   set ^%SMConf("DirInOut",3)=namespace
   
   kill ^%SMConf("DirOutIn")
   set ^%SMConf("DirOutIn","%SYS")=1
   set ^%SMConf("DirOutIn",namespace)=3
   set ^%SMConf("DirOutIn","TRABALHO")=2
   
   // Cria o link para a pasta da aplicação CSP
   
   if (sysOper = "windows") {
     set status = $zf(-1,"mklink /d "_caminhoCache_"csp"_barra_$zconvert(namespace,"l")_" "_caminhoCache_"csp"_barra_$zconvert(nspOrigem,"l"))
     if (status = 0) {
       if (flgWrite) write !,"Criado o link para a pasta da aplicação csp"
     }
   }
   
   if (sysOper = "linux") {
     set status = $zf(-1,"ln -sf "_caminhoCache_"csp"_barra_$zconvert(nspOrigem,"l")_" "_caminhoCache_"csp"_barra_$zconvert(namespace,"l"))
     if (status = 0) {
       if (flgWrite) write !,"Criado o link para a pasta da aplicação csp"
     }
   }
   
   hang 3
   
   do utilitario^%CSW1LOADPAGES()
   
   if (flgWrite) write !,"Executado o LoadPages"
   
   znspace nspOrigem
   
   set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
   
   if (flgWrite) write !,##class(Src2.Utils).ObterBarra("Gerar Base: "_codConta_" | Versão: "_versao_" | Namespace: "_namespace_" | Tempo: "_tempoTotalEdt)
   
   set sc = ##class(Src2.Utils).GeraLog(0, "Gerar Base: "_codConta_" | Versão: "_versao_" | Namespace: "_namespace_" | Tempo: "_tempoTotalEdt)
   
   if (sysOper = "windows") {
     set sc = ##class(Src2.Svn).AtualizarMenuConfig(namespace, flgWrite, flgDataSource)
   }
   
   if (sysOper = "linux") {
     set sc = ##class(Src2.ServidorLinux).AtualizarMenuConfig(namespace, , flgDataSource)
   }
 } catch {
   if (flgWrite) write !,"Erro: "_$zerror
   
   znspace nspOrigem
   
   set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
   
   if (flgWrite) write !,##class(Src2.Utils).ObterBarra("ERRO - Base: "_codConta_" | Versão: "_versao_" | Namespace: "_namespace_" | Tempo: "_tempoTotalEdt)
   
   set sc = ##class(Src2.Utils).GeraLog(2, "Gerar Base: "_codConta_" | Versão: "_versao_" | Namespace: "_namespace_" | Tempo: "_tempoTotalEdt)
   
   set sc = ##class(Src2.Utils2).ExcluirAplicacaoContaVersao(codConta, versao)
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirAplicacaoContaVersao">
<Description>

Excluir Aplicacao por Conta/Versao

set sc = ##class(Src2.Utils2).ExcluirAplicacaoContaVersao("MB", "6.3")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codConta:%String,versao:%String,flgWrite:%Boolean=1</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).IniciarCronometragem(.timestampInicio)
 
 if (flgWrite) write !!,##class(Src2.Utils).ObterBarra("Excluir Base")
 
 set sc = ##class(Src2.Config).AtualizarConfiguracoes()
 
 set sc = ##class(Src2.Utils2).ObterInformacoesCache(.caminhoCache)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set sc = ##class(Src2.Utils2).ObterDadosContaVersao(codConta, versao, .dataBase, .namespace, .dataBaseConta, .dataBaseFonte, .namespaceFonte, .application)
 if (sc '= $$$OK) {
   if (flgWrite) write !,"Source Control: "_sc
   if (flgWrite) write !,##class(Src2.Utils).ObterBarra()
   quit sc
 }
 
 set nspOrigem = $znspace
 
 znspace "%SYS"
 
 set sc = ##Class(Security.Applications).Delete(application)
 
 if (flgWrite) write !,"Aplicação CSP excluida: "_application
 
 set sc = ##Class(Config.Namespaces).Delete(namespace)
 
 if (flgWrite) write !,"Namespace excluido: "_namespace
 
 set sc = ##Class(Config.Databases).Delete(dataBaseConta)
 
 if (flgWrite) write !,"Base excluida: "_dataBaseConta
 
 set sc = ##Class(Config.Databases).Delete(dataBase)
 
 if (flgWrite) write !,"Base excluida: "_dataBase
 
 znspace nspOrigem
 
 // Exclui o link para a pasta da aplicação CSP
 
 if (##class(Src2.Utils).ObterSistOper() = "windows") {
   set status = $zf(-1,"rd "_caminhoCache_"csp"_barra_$zconvert(namespace,"l"))
   if (status = 0) {
     if (flgWrite) write !,"Excluido o link para a pasta da aplicação csp"
   }
 }
 
 if (##class(Src2.Utils).ObterSistOper() = "linux") {
   set status = $zf(-1,"rm -rf "_caminhoCache_"csp"_barra_$zconvert(namespace,"l"))
   if (status = 0) {
     if (flgWrite) write !,"Excluido o link para a pasta da aplicação csp"
   }
 }
 
 set sc = ##class(Src2.Utils).EncerrarCronometragem(timestampInicio, .tempoTotalEdt)
 
 if (flgWrite) write !,##class(Src2.Utils).ObterBarra("Excluir Base: "_codConta_" | Versão: "_versao_" | Namespace: "_namespace_" | Tempo: "_tempoTotalEdt)
 
 set sc = ##class(Src2.Utils).GeraLog(0, "Excluir Base: "_codConta_" | Versão: "_versao_" | Namespace: "_namespace_" | Tempo: "_tempoTotalEdt)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDiretoriosContaVersao">
<Description>

Obter Diretorios da Conta/Versao

set sc = ##class(Src2.Utils2).ObterDiretoriosContaVersao("DA", "6.3", "A", "windows", .directoryConta, .directoryContaVersao, .codServerECP)
set sc = ##class(Src2.Utils2).ObterDiretoriosContaVersao("DA", "6.3", "B", "windows", .directoryConta, .directoryContaVersao, .codServerECP)
set sc = ##class(Src2.Utils2).ObterDiretoriosContaVersao("DA", "6.3", "B", "linux", .directoryConta, .directoryContaVersao, .codServerECP)
set sc = ##class(Src2.Utils2).ObterDiretoriosContaVersao("RS", "6.4", , "windows", .directoryConta, .directoryContaVersao, .codServerECP)
set sc = ##class(Src2.Utils2).ObterDiretoriosContaVersao("RS", "6.4rf", , "windows", .directoryConta, .directoryContaVersao, .codServerECP)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[codConta:%String,versao:%String,tag:%String="",sysOper:%String="",&directoryConta:%String,&directoryContaVersao:%String,&codServerECP:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Config).AtualizarConfiguracoes()
 
 set (directoryConta, directoryContaVersao, codServerECP) = ""
 
 set nspOrigem = $znspace
 
 znspace "%SYS"
 
 set codServerECP2 = ""
 for {
   set codServerECP2 = $order(^CONFIG("ECPServers",codServerECP2))
   if (codServerECP2 = "") quit
   set var = $get(^CONFIG("ECPServers",codServerECP2))
   
   set tabServerECP($piece(var,",",1),$piece(var,",",2)) = codServerECP2
 }
 
 znspace nspOrigem
 
 if ('$data(tabServerECP)) quit "Servidores ECP não configurados no Caché!"
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(, , , , , , , , , .arquivoBases)
 quit:sc'=1 sc
 
 if ('##class(%File).Exists(arquivoBases)) quit "Arquivo 'bases.xml' não encontrado no workspace!"
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoBases,.reader)
 
 while (reader.Read()) {
   if (reader.Path = "/Configuracao/Bases/Base") & (reader.NodeType = "element") {
     set (conta, versao2, ip, porta, diretorio, tag2, sysOper2) = ""
     if reader.MoveToAttributeName("conta") set conta = reader.ValueGet()
     if reader.MoveToAttributeName("versao") set versao2 = reader.ValueGet()
     if reader.MoveToAttributeName("tag") set tag2 = reader.ValueGet()
     if reader.MoveToAttributeName("sysOper") set sysOper2 = reader.ValueGet()
     if reader.MoveToAttributeName("ip") set ip = reader.ValueGet()
     if reader.MoveToAttributeName("porta") set porta = reader.ValueGet()
     if reader.MoveToAttributeName("diretorio") set diretorio = reader.ValueGet()
     
     if ('$data(tabServerECP(ip,porta))) continue
     
     set codServerECP2 = $get(tabServerECP(ip,porta))
     
     if (codConta '= conta) continue
     
     if (versao2 = "") {
       if (tag '= "") & (tag = tag2) {
         set directoryConta = diretorio
         set codServerECP = codServerECP2
       }
       if (tag = "") {
         set directoryConta = diretorio
         set codServerECP = codServerECP2
       }
     }
     
     if (versao = versao2) {
       if (sysOper '= "") & (sysOper = sysOper2) {
         set directoryContaVersao = diretorio
         set codServerECP = codServerECP2
       }
       if (sysOper = "") {
         set directoryContaVersao = diretorio
         set codServerECP = codServerECP2
       }
     }
   }
 }
  
 set reader = ""
 
 if (directoryConta = "") ! (directoryContaVersao = "") quit $$$ERROR(10000,"Diretórios para a conta/versão não encontrados!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ConfigurarBasesAutomaticamente">
<Description>

Configurar Bases Automaticamente

set sc = ##class(Src2.Utils2).ConfigurarBasesAutomaticamente()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>flgCriar:%Boolean=0</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Config).AtualizarConfiguracoes()
 
 set sysOperAtu = ##class(Src2.Utils).ObterSistOper()
 
 set sc = ##class(Src2.UtilsXml).ObterContas(.tabContas)
 
 set sc = ##class(Src2.Utils).ValidarNamespaceDesenvolvimento($znspace, , .versaoNsp)
 
 set sc = ##class(Src2.Utils).ObterNamespaces(.tabNamespaces)
 
 set (directoryConta, directoryContaVersao, codServerECP) = ""
 
 set nspOrigem = $znspace
 
 znspace "%SYS"
 
 set codServerECP2 = ""
 for {
   set codServerECP2 = $order(^CONFIG("ECPServers",codServerECP2))
   if (codServerECP2 = "") quit
   set var = $get(^CONFIG("ECPServers",codServerECP2))
   
   set tabServerECP($piece(var,",",1),$piece(var,",",2)) = codServerECP2
 }
 
 znspace nspOrigem
 
 if ('$data(tabServerECP)) quit "Servidores ECP não configurados no Caché!"
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(, , , , , , , , , .arquivoBases)
 quit:sc'=1 sc
 
 if ('##class(%File).Exists(arquivoBases)) quit "Arquivo 'bases.xml' não encontrado no workspace!"
 
 set flgGerou = 0
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoBases,.reader)
 
 while (reader.Read()) {
   if (reader.Path = "/Configuracao/Bases/Base") & (reader.NodeType = "element") {
     set (codConta, versao, ip, porta, diretorio, tag, sysOper) = ""
     if reader.MoveToAttributeName("conta") set codConta = reader.ValueGet()
     if reader.MoveToAttributeName("versao") set versao = reader.ValueGet()
     if reader.MoveToAttributeName("tag") set tag = reader.ValueGet()
     if reader.MoveToAttributeName("sysOper") set sysOper = reader.ValueGet()
     if reader.MoveToAttributeName("ip") set ip = reader.ValueGet()
     if reader.MoveToAttributeName("porta") set porta = reader.ValueGet()
     if reader.MoveToAttributeName("diretorio") set diretorio = reader.ValueGet()
     
     if ('$data(tabServerECP(ip,porta))) continue
     
     if (codConta = "") continue
     
     if ('$data(tabContas(codConta))) continue
     
     if ($translate(versao,".","") '= versaoNsp) continue
     
     if (sysOperAtu '= sysOper) continue
     
     set sc = ##class(Src2.Utils2).ObterDadosContaVersao(codConta, versao, .dataBase, .namespace, .dataBaseConta, .dataBaseFonte, .namespaceFonte, .application)
     if $$$ISERR(sc) continue
     
     if $data(tabNamespaces(namespace)) continue
     
     if ('flgCriar) {
       write !,"Sera Montado: "_namespace
       continue
     }
     
     set sc = ##class(Src2.Utils2).CriarAplicacaoContaVersao(codConta, versao, , , 0)
     
     set flgGerou = 1
   }
 }
  
 set reader = ""
 
 if (flgGerou) {
   write !!!,"Atualizando Data Sources no Wildfly"
   hang 10
   set sc = ##class(Src2.Utils).GerarDataSourcesWildFly()
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarExecucaoProcedimento">
<Description>

Validar Execução de Procedimento

set sc=##class(Src2.Utils2).ValidarExecucaoProcedimento("CCPVTESTE")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotinaProcedimento:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ($get(rotinaProcedimento) = "") quit $$$ERROR(10000,"Procedimento não informado!")
 
 if $data(^%CSW1ATUCONF(8,$znspace,rotinaProcedimento)) quit $$$ERROR(10000,"Procedimento "_rotinaProcedimento_" já executado no namespace "_$znspace_"!")
 
 set ^%CSW1ATUCONF(8,$znspace,rotinaProcedimento) = $horolog
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInformacoesCache">
<Description>

Obter Informações do Caché

set sc=##class(Src2.Utils2).ObterInformacoesCache(.caminhoCache)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&caminhoCache:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set caminhoCache = $piece($get(^%SYS("bindir")),"bin"_barra)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="CriarArquivoVazio">
<Description>

Cria Arquivo Vazio
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arquivo:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set objFile = ##class(%File).%New(arquivo)
 
 do objFile.Open("WN:/IOTABLE=""UTF8""")
 if ('objFile.IsOpen) {
   quit $$$ERROR(10000,"Não foi possivel criar o arquivo "_arquivo_"!")
 }
 do objFile.Close()
 set objFile = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ValidarServidorOficial">
<Description>

Validar Servidor Oficial

set sc=##class(Src2.Utils2).ValidarServidorOficial()
set sc=##class(Src2.Utils2).ValidarServidorOficial("desenvae64")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>namespace:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set nspOrigem = $znspace
 
 if (namespace '= "") & (nspOrigem '= namespace) znspace namespace
 
 set dadosLicenca = ##class(Src2.PatchUtils).ObterLicenca()
 
 set servTestes = $listget(dadosLicenca,13)
 
 if (servTestes '= "") , (servTestes = 1) {
   if (namespace '= "") & (nspOrigem '= namespace) znspace nspOrigem
   quit $$$ERROR(10000,"Esté é um servidor de testes!")
 }
 
 if (servTestes '= "") , (servTestes = 0) {
   if (namespace '= "") & (nspOrigem '= namespace) znspace nspOrigem
   quit $$$OK
 }
 
 if ($piece($get(^%CSW1ATUCONF(2)),"^",4) = 1) {
   if (namespace '= "") & (nspOrigem '= namespace) znspace nspOrigem
   quit $$$ERROR(10000,"Esté é um servidor de testes!")
 }
 
 set tipoServidor = +$piece($get(^%CSMENCF),"^",79)
 
 if (tipoServidor = 1) {
   if (namespace '= "") & (nspOrigem '= namespace) znspace nspOrigem
   quit $$$ERROR(10000,"Esté é um servidor de testes!")
 }
 
 set macAddressCfg = $piece($get(^%CSMENCF),"^",80)
 
 if (macAddressCfg = "") {
   if (namespace '= "") & (nspOrigem '= namespace) znspace nspOrigem
   quit $$$OK
 }
 
 set sc = ##class(Src2.Utils2).ObterDadosServidor(.macAddress)
 
 if (macAddressCfg '= macAddress) {
   if (namespace '= "") & (nspOrigem '= namespace) znspace nspOrigem
   quit $$$ERROR(10000,"Esté é um servidor de testes!")
 }
 
 if (namespace '= "") & (nspOrigem '= namespace) znspace nspOrigem
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterDadosServidor">
<Description>

Obter Dados Servidor

set sc=##class(Src2.Utils2).ObterDadosServidor(.macAddress, .hostname)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&macAddress:%String,&hostname:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set hostname = $zutil(54,0)
 
 set macAddress = ##Class(%SYSTEM.INetInfo).EthernetAddress(0)
 
 if (macAddress = "") {
   set macAddress = hostname
   ;try {
   ;  do ##Class(%SYSTEM.INetInfo).EthernetAddress(2,"em1")
   ;  set macAddress = ##Class(%SYSTEM.INetInfo).EthernetAddress(0)
   ;} catch {
   ;  // Caso não consiga pegar o macAddress, utiliza o hostname
   ;  set macAddress = hostname
   ;}
 }
 
 ;if (macAddress = "") && (##class(Src2.Utils).ObterSistOper() = "linux") {
 ;  set macAddress = ##class(Src2.Utils2).ObterMacAdressLinux()
 ;}
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterAnoSemana">
<Description>

Obter Ano/Semana

write ##class(Src2.Utils2).ObterAnoSemana()</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>horolog:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (horolog = "") set horolog = +$horolog
 quit $piece($zdate(horolog,3),"-",1)_"-"_$translate($justify($zdate(horolog,14)\7,2)," ","0")
]]></Implementation>
</Method>

<Method name="ObterMacAdressLinux">
<Description>

Obter MacAdress Linux

set sc=##class(Src2.Utils2).ObterMacAdressLinux()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set arqtemp = "/usr/tmp/macadress.log"
 set cmd = "interface=$(/sbin/route | awk '/default/ {print $8}') && ifconfig `echo $interface` | awk '/Link/ {print $5}' > "_arqtemp
 set sc = $zf(-1, cmd)
 set stream=##class(%FileBinaryStream).%New()
 set stream.Filename = arqtemp
 set macadd = stream.Read(17)
 do stream.%Close()
 quit $translate(macadd,":","")
]]></Implementation>
</Method>

<Method name="ValidarUsuarioRoot">
<Description>

Converte um arquivo em tabela

set sc = ##class(Src2.Utils2).ValidarUsuarioRoot()</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 if (##class(Src2.Utils).ObterSistOper() '= "linux") {
   quit "Sistema operacional deve ser linux!"
 }
 
 set arquivoTmp = "/usr/tmp/"_$ztimestamp_".log"
 
 set sc = $zf(-1,"echo $EUID > "_arquivoTmp)
 if (sc '= 0) {
   quit "Usuário logado no sistema operacional não é root!"
 }
 
 set sc = ##class(Src2.Utils2).ConverteArquivoTabela(arquivoTmp, .tabDetalhes)
 
 set sc = ##class(%File).Delete(arquivoTmp)
 
 if ($get(tabDetalhes(1)) '= 0) {
   quit "Usuário logado no sistema operacional não é root!"
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ConverteArquivoTabela">
<Description>

Converte um Arquivo em Tabela

set sc = ##class(Src2.Utils2).ConverteArquivoTabela("C:\workspacecsw\configgeral\atualizacao.xml", .tabLinhas)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[arquivo:%String,&tabLinhas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabLinhas
 
 set file = ##class(%File).%New(arquivo)
 do file.Open("R")
 
 for {
   set tam = 32000
   set linhaFile = file.Read(.tam)
   if (tam = -1) quit
   set tabLinhas($increment(tabLinhas)) = ##class(Src2.Utils).ConverterStringUTF8(linhaFile)
 }
 
 do file.Close()
 set file = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ConverteTabelaArquivo">
<Description>

Converte uma Tabela em Arquivo
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[arquivo:%String,&tabLinhas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set objFile = ##class(%File).%New(arquivo)
 
 do objFile.Open("WN:/IOTABLE=""UTF8""")
 if ('objFile.IsOpen) {
   set objFile = ""
   quit $$$ERROR(10000,"Não foi possível criar o arquivo "_arquivo_"!")
 }
 
 set codSeqUlt = $order(tabLinhas(""),-1)
 
 set codSeq = ""
 for  {
   set codSeq = $order(tabLinhas(codSeq))
   if (codSeq = "") quit
   if (codSeqUlt '= codSeq) {
     set sc = objFile.Write($get(tabLinhas(codSeq))_$char(10))
   } else {
     set sc = objFile.Write($get(tabLinhas(codSeq)))
   }
 }
 
 do objFile.Close()
 set objFile = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarRotinaZZZ">
<Description>

Gerar a Rotina ZZZ
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>rotina:%String,versaoRelease:%String="",revisao:%String="",autor:%String="",data:%String="",urlRepositorio:%String=""</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set objRotina = ##class(%Routine).%New(rotina_".MAC")
 
 set versaoEdt = ""
 
 if (versaoRelease '= "") {
   set versaoEdt = "v."_versaoRelease
   if (revisao '= "") set versaoEdt = versaoEdt_"."_revisao
 } else {
   set versaoEdt = "rev."_revisao
 }
 
 do objRotina.WriteLine(rotina_"	; VERSAO DO PRODUTO")
 do objRotina.WriteLine("	;")
 if (urlRepositorio '= "") {
   do objRotina.WriteLine("	; Repositorio: "_urlRepositorio)
 }
 if (revisao '= "") {
   do objRotina.WriteLine("	; Revisao: "_revisao)
 }
 if (autor '= "") {
   do objRotina.WriteLine("	; Gerado por: "_autor)
 }
 if (data '= "") {
   do objRotina.WriteLine("	; Data: "_data)
 }
 do objRotina.WriteLine("	; Rotina de Versao Atualizada em: "_$zdatetime($horolog,4))
 do objRotina.WriteLine("	;")
 do objRotina.WriteLine("VERSAO()	quit """_versaoEdt_"""")
 do objRotina.WriteLine("	;")
 do objRotina.WriteLine("ver()	quit $$VERSAO")
 do objRotina.WriteLine("	;")
 do objRotina.WriteLine("versao()	quit $$VERSAO")
 do objRotina.WriteLine("	;")
 do objRotina.WriteLine("vergui()	quit $$VERSAO")
 do objRotina.WriteLine("	;")
 do objRotina.WriteLine("ObterVersaoRelease()	quit """_versaoRelease_"""")
 do objRotina.WriteLine("	;")
 do objRotina.WriteLine("	; csw:csp:naogerar")
 
 do objRotina.Save()
 
 set sc = objRotina.Compile("k-d")
 
 set objRotina = ""
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.UtilsXml">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>61727,0</TimeCreated>

<Method name="ObterConfigXML">
<Description>

Obtem as Configurações de um Arquivo XML

set sc = ##class(Src2.UtilsXml).ObterConfigXML("DESENV61", .tabProjLocais)
set sc = ##class(Src2.UtilsXml).ObterConfigXML(, .tabProjLocais)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[namespaceInf:%String="",&tabProjLocais:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabProjLocais
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(, , , , , .arquivoConfig)
 quit:sc'=1 sc
 
 if ('##class(%File).Exists(arquivoConfig)) quit "Arquivo 'config.xml' não encontrado no workspace!"
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoConfig,.reader)
 
 while (reader.Read()) {
   if (reader.Path = "/Configuracao/Projetos/Projeto") & (reader.NodeType = "element") {
     set (idProjeto, namespace, pasta) = ""
     if reader.MoveToAttributeName("id") set idProjeto = reader.ValueGet()
     if reader.MoveToAttributeName("namespace") set namespace = reader.ValueGet()
     if reader.MoveToAttributeName("pasta") set pasta = reader.ValueGet()
     if (idProjeto = "") continue
     if (namespaceInf '= "") & (namespaceInf '= namespace) continue
     set tabProjLocais(idProjeto) = namespace_"^"_pasta
   }
 }
  
 set reader = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterProjetosXML">
<Description>

Obtem os Projetos de um Arquivo XML

set sc = ##class(Src2.UtilsXml).ObterProjetosXML(.tabProjetos)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabProjetos:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabProjetos
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(.arquivoProjetos)
 quit:sc'=1 sc
 
 if ('##class(%File).Exists(arquivoProjetos)) quit "Arquivo 'projetos.xml' não encontrado no workspace!"
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoProjetos,.reader)
 
 while (reader.Read()) {
   if (reader.Path = "/Projetos/Projeto") & (reader.NodeType = "element") {
     set (idProjeto, idSistema, urlRepositorio, porConta, geraLog, idVersaoGercon, origem, versao, idParcGercon, customizacao, revInicioLog, ativo) = ""
     if reader.MoveToAttributeName("id") set idProjeto = reader.ValueGet()
     if reader.MoveToAttributeName("idSistema") set idSistema = reader.ValueGet()
     if reader.MoveToAttributeName("urlRepositorio") set urlRepositorio = reader.ValueGet()
     if reader.MoveToAttributeName("porConta") set porConta = reader.ValueGet()
     if reader.MoveToAttributeName("geraLog") set geraLog = reader.ValueGet()
     if reader.MoveToAttributeName("revInicioLog") set revInicioLog = reader.ValueGet()
     if reader.MoveToAttributeName("idVersaoGercon") set idVersaoGercon = reader.ValueGet()
     if reader.MoveToAttributeName("origem") set origem = reader.ValueGet()
     if reader.MoveToAttributeName("versao") set versao = reader.ValueGet()
     if reader.MoveToAttributeName("idParcGercon") set idParcGercon = reader.ValueGet()
     if reader.MoveToAttributeName("customizacao") set customizacao = reader.ValueGet()
     if reader.MoveToAttributeName("ativo") set ativo = reader.ValueGet()
     if (idProjeto '= "") {
       set tabProjetos(idProjeto) = idSistema_"^"_urlRepositorio_"^"_porConta_"^"_geraLog_"^"_idVersaoGercon_"^"_origem_"^^"_versao_"^"_idParcGercon_"^"_customizacao_"^"_revInicioLog_"^"_ativo
     }
   }
 }
 
 set reader = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterSistemasXML">
<Description>

Obtem os Sistemas de um Arquivo XML

set sc = ##class(Src2.UtilsXml).ObterSistemasXML(.tabSistemas)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabSistemas:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabSistemas
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(, .arquivoSistemas)
 quit:sc'=1 sc
 
 if ('##class(%File).Exists(arquivoSistemas)) quit "Arquivo 'sistemas.xml' não encontrado no workspace!"
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoSistemas,.reader)
 
 set idSistema = ""
 
 while (reader.Read()) {
   if (reader.Path = "/Sistemas/Sistema") & (reader.NodeType = "element") { 
     set (idSistema, porConta) = ""
     if reader.MoveToAttributeName("id") set idSistema = reader.ValueGet()
     if reader.MoveToAttributeName("porConta") set porConta = reader.ValueGet()
     if (idSistema '= "") { set tabSistemas(idSistema) = porConta }
   }
   
   if (idSistema = "") continue
   
   if (reader.Path = "/Sistemas/Sistema/GruposRotinas/GrupoRotina") & (reader.NodeType = "element") {
     set (nome, situacao, sigla, descricao) = ""
     if reader.MoveToAttributeName("nome") set nome = reader.ValueGet()
     if reader.MoveToAttributeName("situacao") set situacao = reader.ValueGet()
     if reader.MoveToAttributeName("sigla") set sigla = reader.ValueGet()
     if reader.MoveToAttributeName("descricao") set descricao = reader.ValueGet()
     if (nome '= "") { set tabSistemas(idSistema,1,nome) = situacao_"^"_sigla_"^"_descricao }
   }
   
   if (reader.Path = "/Sistemas/Sistema/GruposClasses/GrupoClasse") & (reader.NodeType = "element") {
     set (nome, situacao, sigla, descricao) = ""
     if reader.MoveToAttributeName("nome") set nome = reader.ValueGet()
     if reader.MoveToAttributeName("situacao") set situacao = reader.ValueGet()
     if reader.MoveToAttributeName("sigla") set sigla = reader.ValueGet()
     if reader.MoveToAttributeName("descricao") set descricao = reader.ValueGet()
     if (nome '= "") { set tabSistemas(idSistema,2,nome) = situacao_"^"_sigla_"^"_descricao }
   }
   
   if (reader.Path = "/Sistemas/Sistema/GruposClassesSemControle/GrupoClasse") & (reader.NodeType = "element") {
     set (nome, flgItem, flgSubItens, flgSubPastas) = ""
     if reader.MoveToAttributeName("nome") set nome = reader.ValueGet()
     if reader.MoveToAttributeName("flgItem") set flgItem = reader.ValueGet()
     if reader.MoveToAttributeName("flgSubItens") set flgSubItens = reader.ValueGet()
     if reader.MoveToAttributeName("flgSubPastas") set flgSubPastas = reader.ValueGet()
     if (nome '= "") { set tabSistemas(idSistema,4,nome) = flgItem_"^"_flgSubItens_"^"_flgSubPastas }
   }
   
   if (reader.Path = "/Sistemas/Sistema/GruposRotinasControladas/GrupoRotina") & (reader.NodeType = "element") {
     set nome = ""
     if reader.MoveToAttributeName("nome") set nome = reader.ValueGet()
     if (nome '= "") { set tabSistemas(idSistema,3,nome) = "" }
   }
   
   if (reader.Path = "/Sistemas/Sistema/GruposRotinasOutrasSiglas/GrupoRotina") & (reader.NodeType = "element") {
     set (nome, sigla) = ""
     if reader.MoveToAttributeName("nome") set nome = reader.ValueGet()
     if reader.MoveToAttributeName("sigla") set sigla = reader.ValueGet()
     if (nome '= "") & (sigla '= "") { set tabSistemas(idSistema,5,nome) = sigla }
   }
 }
 
 set reader = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterContas">
<Description>

Obter Contas

set sc = ##class(Src2.UtilsXml).ObterContas(.tabContas)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabContas:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabContas
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(, , , .arquivoContas)
 quit:sc'=1 sc
 
 if ('##class(%File).Exists(arquivoContas)) quit "Arquivo 'contas.xml' não encontrado!"
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoContas,.reader)
 if $$$ISERR(sc) quit sc
 
 while (reader.Read()) {
   set (codigo, codigo2, descricao, rotinasEspecificas, desenv) = ""
   set (empresaPadrao, versaoRelacionada, situacaoLog, horaLog) = ""
   if (reader.Path = "/Contas/Conta") & (reader.NodeType = "element") {
     if reader.MoveToAttributeName("codigo") set codigo = reader.ValueGet()
     if reader.MoveToAttributeName("codigo2") set codigo2 = reader.ValueGet()
     if reader.MoveToAttributeName("descricao") set descricao = reader.ValueGet()
     if reader.MoveToAttributeName("rotinasEspecificas") set rotinasEspecificas = reader.ValueGet()
     if reader.MoveToAttributeName("desenv") set desenv = reader.ValueGet()
     if reader.MoveToAttributeName("empresaPadrao") set empresaPadrao = reader.ValueGet()
     if reader.MoveToAttributeName("versao") set versaoRelacionada = reader.ValueGet()
     if reader.MoveToAttributeName("situacaoLog") set situacaoLog = reader.ValueGet()
     if reader.MoveToAttributeName("horaLog") set horaLog = reader.ValueGet()
     if (codigo '= "") {
       set tabContas(codigo) = descricao_"^"_rotinasEspecificas_"^"_versaoRelacionada_"^"_desenv_"^"_empresaPadrao_"^"_codigo2_"^"_situacaoLog_"^"_horaLog
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterParametrosXML">
<Description>

Obtem as Configurações de um Arquivo XML

set sc = ##class(Src2.UtilsXml).ObterParametrosXML(.tabParametros, .tabUsuarios)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabParametros:%String,&tabUsuarios:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabParametros, tabUsuarios
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(, , , , , , .arquivoParametros)
 quit:sc'=1 sc
 
 if ('##class(%File).Exists(arquivoParametros)) quit "Arquivo 'parametros.xml' não encontrado no workspace!"
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoParametros,.reader)
 
 set path = ""
 
 while (reader.Read()) {
   if (reader.Path '= "") {
     set path = reader.Path
   }
   if (path = "/Parametros/SourceControlVersion") & (reader.NodeType="chars") {
     set tabParametros("SourceControlVersion") = reader.ValueGet()
   }
   set (usuario, email, pastaBackup, ipMaquina) = ""
   if (reader.Path = "/Parametros/Usuarios/Usuario") & (reader.NodeType = "element") {
     if reader.MoveToAttributeName("usuario") set usuario = reader.ValueGet()
     if reader.MoveToAttributeName("email") set email = reader.ValueGet()
     if reader.MoveToAttributeName("pastaBackup") set pastaBackup = reader.ValueGet()
     if reader.MoveToAttributeName("ipMaquina") set ipMaquina = reader.ValueGet()
     if (usuario '= "") {
       set tabUsuarios(usuario) = pastaBackup_"^"_email_"^"_ipMaquina
     }
   }
 }
  
 set reader = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterSourceCheck">
<Description>

Obter Dados do Arquivo SourceCheck 

set sc = ##class(Src2.UtilsXml).ObterSourceCheck(.tabPalavras, .tabPalavrasInv, .tabUtilitarios)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabPalavras:%String,&tabPalavrasInv:%String,&tabUtilitarios:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabPalavras, tabPalavrasInv, tabUtilitarios
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(, , .arquivoSourcecheck)
 quit:sc'=1 sc
 
 if ('##class(%File).Exists(arquivoSourcecheck)) quit $$$ERROR(10000,"Arquivo 'sourcecheck.xml' não encontrado!")
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoSourcecheck,.reader)
 if $$$ISERR(sc) quit sc
 
 while (reader.Read()) {
   if (reader.Path = "/Configuracao/PalavrasValidas/Palavra") {
     if reader.MoveToAttributeName("nome") set tabPalavras($zconvert(reader.ValueGet(),"U")) = ""
   }
   
   if (reader.Path = "/Configuracao/PalavrasInvalidas/Palavra") {
     if reader.MoveToAttributeName("nome") set tabPalavrasInv($zconvert(reader.ValueGet(),"U")) = ""
   }
   
   if (reader.Path = "/Configuracao/Utilitarios/Utilitario") {
     if reader.MoveToAttributeName("nome") set tabUtilitarios(reader.ValueGet()) = ""
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterAtualizacaoXML">
<Description>

Obtem as Configurações de um Arquivo XML

set msgsc = ##class(Src2.UtilsXml).ObterAtualizacaoXML(.tabSistemas)
set msgsc = ##class(Src2.UtilsXml).ObterAtualizacaoXML(.tabSistemas, .caminhoPatch, .tabItensLiberados, .tabItensBloqueados, .flgAtuBloq, .tabItensLimitados)
set msgsc = ##class(Src2.UtilsXml).ObterAtualizacaoXML(, , , , , .tabItensLimitados)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabSistemas:%String,&caminhoPatch:%String,&tabItensLiberados:%String,&tabItensBloqueados:%String,&flgAtuBloq:%String,&tabItensLimitados:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabSistemas, tabItensLiberados, tabItensBloqueados, tabItensLimitados
 
 set caminhoPatch = ""
 set flgAtuBloq = 0
 
 set sisOper = ##class(Src2.Utils).ObterSistOper()
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(, , , , , , , .arquivoAtualizacao)
 quit:sc'=1 sc
 
 if ('##class(%File).Exists(arquivoAtualizacao)) quit "Arquivo 'atualizacao.xml' não encontrado no workspace!"
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoAtualizacao,.reader)
 
 set (path, sistema, versaoItensBloq, versaoAfetada, versaoItensLimit, releaseItensLimit, sisOper2) = ""
 
 while (reader.Read()) {
   if (reader.Path '= "") {
     set path = reader.Path
   }
   
   // Itens Caminhos
   
   if (reader.Path = "/Parametros/CaminhoPatch") & (reader.NodeType = "element") {
     set sisOper2 = ""
     if reader.MoveToAttributeName("sisOper") set sisOper2 = reader.ValueGet()
   }
   if (path = "/Parametros/CaminhoPatch") & (reader.NodeType="chars") {
     if (sisOper = sisOper2) {
       set caminhoPatch = reader.ValueGet()
     }
   }
   
   // Bloqueio Geral
   
   if (path = "/Parametros/Bloqueada") & (reader.NodeType="chars") {
     set flgAtuBloq = reader.ValueGet()
   }
   
   // Sistemas
   
   if (reader.Path = "/Parametros/Sistemas/Sistema") & (reader.NodeType = "element") {
     set (urlRepositorio, rotinaVersao, bloqueada, tag, idRedmine, descricao, versaoAfetada, bloqSnapshot) = ""
     if reader.MoveToAttributeName("id") set sistema = reader.ValueGet()
     if reader.MoveToAttributeName("urlRepositorio") set urlRepositorio = reader.ValueGet()
     if reader.MoveToAttributeName("rotinaVersao") set rotinaVersao = reader.ValueGet()
     if reader.MoveToAttributeName("bloqueada") set bloqueada = reader.ValueGet()
     if reader.MoveToAttributeName("bloqSnapshot") set bloqSnapshot = reader.ValueGet()
     if reader.MoveToAttributeName("tag") set tag = reader.ValueGet()
     if reader.MoveToAttributeName("idRedmine") set idRedmine = reader.ValueGet()
     if reader.MoveToAttributeName("descricao") set descricao = reader.ValueGet()
     if (sistema '= "") {
       set tabSistemas(sistema) = urlRepositorio_"^"_bloqueada_"^"_rotinaVersao_"^"_tag_"^^"_idRedmine_"^"_descricao_"^"_bloqSnapshot
     }
   }
   
   // Versões Bloqueadas para Atualização Automatica pelo Cliente
   
   if (path = "/Parametros/Sistemas/Sistema/VersoesBloqueadas/Versao") & (reader.NodeType="chars") {
     if (sistema '= "") , (reader.ValueGet() '= "") {
       set tabSistemas(sistema,1,reader.ValueGet()) = ""
     }
   }
   
   // Pré-Requisitos
   
   if (path = "/Parametros/Sistemas/Sistema/VersoesPreRequisitos/VersaoAfetada") & (reader.NodeType = "element") {
     set versaoAfetada = ""
     if reader.MoveToAttributeName("idVersao") set versaoAfetada = reader.ValueGet()
   }
   if (path = "/Parametros/Sistemas/Sistema/VersoesPreRequisitos/VersaoAfetada/VersaoPreRequisito") & (reader.NodeType = "element") {
     set (sistemaPreRequisito, versaoPreReuisito) = ""
     if reader.MoveToAttributeName("idSistema") set sistemaPreRequisito = reader.ValueGet()
     if reader.MoveToAttributeName("idVersao") set versaoPreRequisito = reader.ValueGet()
     if (versaoAfetada '= "") & (sistemaPreRequisito '= "") & (versaoPreRequisito '= "") {
       set tabSistemas(sistema,2,versaoAfetada,sistemaPreRequisito,versaoPreRequisito) = ""
     }
   }
   
   // Último Release Liberado
   
   if (path = "/Parametros/Sistemas/Sistema/Versoes/Versao") & (reader.NodeType = "element") {
     set (versao, ultimaReleaseLib) = ""
     if reader.MoveToAttributeName("versao") set versao = reader.ValueGet()
     if reader.MoveToAttributeName("ultimaReleaseLib") set ultimaReleaseLib = reader.ValueGet()
     if (sistema '= "") , (versao '= "") , (ultimaReleaseLib '= "") {
       set tabSistemas(sistema,3,versao) = ultimaReleaseLib
     }
   }
   
   // Itens Liberados
   
   if (path = "/Parametros/ItensLiberados/GrupoRotina") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") {
       set tabItensLiberados(1,reader.ValueGet()) = ""
     }
   }
   
   // Itens Bloqueados
   
   if (reader.Path = "/Parametros/ItensBloqueados/Versao") & (reader.NodeType = "element") {
     if reader.MoveToAttributeName("versao") set versaoItensBloq = reader.ValueGet()
   }
   if (path = "/Parametros/ItensBloqueados/GrupoRotina") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") {
       set tabItensBloqueados(1,1,reader.ValueGet()) = ""
     }
   }
   if (path = "/Parametros/ItensBloqueados/GrupoClasse") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") {
       set tabItensBloqueados(1,2,reader.ValueGet()) = ""
     }
   }
   if (path = "/Parametros/ItensBloqueados/Versao/GrupoRotina") & (reader.NodeType="chars") {
     if (versaoItensBloq '= "") , (reader.ValueGet() '= "") {
       set tabItensBloqueados(2,versaoItensBloq,1,reader.ValueGet()) = ""
     }
   }
   if (path = "/Parametros/ItensBloqueados/Versao/GrupoClasse") & (reader.NodeType="chars") {
     if (versaoItensBloq '= "") , (reader.ValueGet() '= "") {
       set tabItensBloqueados(2,versaoItensBloq,2,reader.ValueGet()) = ""
     }
   }
   
   // Itens Limitados
   
   if (reader.Path = "/Parametros/ItensLimitados/Versao") & (reader.NodeType = "element") {
     if reader.MoveToAttributeName("versao") set versaoItensLimit = reader.ValueGet()
     if reader.MoveToAttributeName("release") set releaseItensLimit = reader.ValueGet()
     kill tabContaExcessao
   }
   if (path = "/Parametros/ItensLimitados/Versao/ContaExcessao") & (reader.NodeType="chars") {
     if (reader.ValueGet() '= "") {
       set tabContaExcessao(reader.ValueGet()) = ""
     }
   }
   if (path = "/Parametros/ItensLimitados/Versao/GrupoRotina") & (reader.NodeType="chars") {
     set grupoRotina = reader.ValueGet()
     if (versaoItensLimit '= "") & (releaseItensLimit '= "") & (grupoRotina '= "") {
       if ('$data(tabItensLimitados(versaoItensLimit,1,grupoRotina))) {
         set tabItensLimitados(versaoItensLimit,1,grupoRotina) = releaseItensLimit
         merge tabItensLimitados(versaoItensLimit,1,grupoRotina,1) = tabContaExcessao
       }
     }
   }
   if (path = "/Parametros/ItensLimitados/Versao/GrupoClasse") & (reader.NodeType="chars") {
     set grupoClasse = reader.ValueGet()
     if (versaoItensLimit '= "") & (releaseItensLimit '= "") & (grupoClasse '= "") {
       if ('$data(tabItensLimitados(versaoItensLimit,2,grupoClasse))) {
         set tabItensLimitados(versaoItensLimit,2,grupoClasse) = releaseItensLimit
         merge tabItensLimitados(versaoItensLimit,2,grupoClasse,1) = tabContaExcessao
       }
     }
   }
   
 }
  
 set reader = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterTabInterfaceAux">
<Description>

Obter Rotinas de Interface Auxiliar

set sc = ##class(Src2.UtilsXml).ObterTabInterfaceAux("aa")</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>codTerm:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill ^mtempSrc2InterfaceAux(codTerm)
 
 set caminhoPatch = ""
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(, , , , , , , , .arquivoIntAux)
 quit:sc'=1 sc
 
 if ('##class(%File).Exists(arquivoIntAux)) quit "Arquivo 'interfaceAuxiliar.xml' não encontrado no workspace!"
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoIntAux,.reader)
 
 set (path, rotinaPrincipal) = ""
 
 while (reader.Read()) {
   if (reader.Path '= "") {
     set path = reader.Path
   }
   if (reader.Path = "/Rotinas/RotinaPrincipal") & (reader.NodeType = "element") {
     set rotinaPrincipal = ""
     if reader.MoveToAttributeName("nome") set rotinaPrincipal = reader.ValueGet()
   }
   if (path = "/Rotinas/RotinaPrincipal/RotinaAuxiliar") & (reader.NodeType="chars") {
     set rotinaAux = reader.ValueGet()
     if (rotinaPrincipal '= "") , (rotinaAux '= "") {
       set ^mtempSrc2InterfaceAux(codTerm, 1, rotinaPrincipal, rotinaAux) = ""
       set ^mtempSrc2InterfaceAux(codTerm, 1, rotinaPrincipal, rotinaPrincipal) = ""
       set ^mtempSrc2InterfaceAux(codTerm, 2, rotinaPrincipal) = rotinaPrincipal
       set ^mtempSrc2InterfaceAux(codTerm, 2, rotinaAux) = rotinaPrincipal
     }
   }
 }
  
 set reader = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterConfCertificados">
<Description>
set sc = ##class(Src2.UtilsXml).ObterConfCertificados(.tabSenhas)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabSenhas:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabSenhas
 
 set sc = ##class(Src2.Config).ObterOutrosArquivosConfig(.arquivoConfigCert)
 quit:sc'=1 sc
 
 if ('##class(%File).Exists(arquivoConfigCert)) quit $$$ERROR(10000,"Arquivo 'configcert.xml' não encontrado!")
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoConfigCert,.reader)
 if $$$ISERR(sc) quit sc
 
 while (reader.Read()) {
   if (reader.Path = "/Configuracoes/Senhas/Senha") & (reader.NodeType = "element")  {
     set (conta, empresa, senhaNFe, senhaCTe) = ""
     if reader.MoveToAttributeName("conta") set conta = reader.ValueGet()
     if reader.MoveToAttributeName("empresa") set empresa = reader.ValueGet()
     if reader.MoveToAttributeName("senhaNFe") set senhaNFe = reader.ValueGet()
     if reader.MoveToAttributeName("senhaCTe") set senhaCTe = reader.ValueGet()
     if (conta '= "") & (empresa '= "") {
       set tabSenhas(conta,empresa) = senhaNFe_"^"_senhaCTe
     }
   }
 }
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterProcedimentos">
<Description>

Obtem as Procedimentos

set sc = ##class(Src2.UtilsXml).ObterProcedimentos("C:\workspacecsw\projetos\6.4\csw64\outros\procedimentos.xml", .versao, .tabProcedimentos)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[arquivo:%String,&versao:%String,&tabProcedimentos:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabProcedimentos
 
 if ('##class(%File).Exists(arquivo)) quit $$$ERROR(10000,"Arquivo de procedimentos não encontrado!")
 
 set (versao, idProcedimento) = ""
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivo,.reader)
 
 set path = ""
 
 while (reader.Read()) {
   if (reader.Path '= "") {
     set path = reader.Path
   }
   if (path = "/Dados/Versao") & (reader.NodeType="chars") {
     set versao = reader.ValueGet()
   }
   if (reader.Path = "/Dados/Procedimentos/Procedimento") & (reader.NodeType = "element")  {
     set (idProcedimento, descricao) = ""
     if reader.MoveToAttributeName("id") set idProcedimento = reader.ValueGet()
     if reader.MoveToAttributeName("descricao") set descricao = reader.ValueGet()
     if (idProcedimento '= "") & (descricao '= "") {
       set tabProcedimentos(idProcedimento,1) = descricao
     }
   }
   if (path = "/Dados/Procedimentos/Procedimento/Comando") & (reader.NodeType="chars") {
     set comando = reader.ValueGet()
     if (idProcedimento '= "") & (comando '= "") {
       set tabProcedimentos(idProcedimento,2) = comando
     }
   }
   if (path = "/Dados/Procedimentos/Procedimento/TrocarRotina/Origem") & (reader.NodeType="chars") {
     set rotinaOrigem = reader.ValueGet()
     if (idProcedimento '= "") & (rotinaOrigem '= "") {
       set $piece(tabProcedimentos(idProcedimento,3),"^",1) = rotinaOrigem
     }
   }
   if (path = "/Dados/Procedimentos/Procedimento/TrocarRotina/Destino") & (reader.NodeType="chars") {
     set rotinaDestino = reader.ValueGet()
     if (idProcedimento '= "") & (rotinaDestino '= "") {
       set $piece(tabProcedimentos(idProcedimento,3),"^",2) = rotinaDestino
     }
   }
   if (path = "/Dados/Procedimentos/Procedimento/TiposNamespaces/TipoNamespace") & (reader.NodeType="chars") {
     set namespace = reader.ValueGet()
     if (idProcedimento '= "") & (namespace '= "") {
       set tabProcedimentos(idProcedimento,4,namespace) = ""
     }
   }
 }
  
 set reader = ""
 
 if (versao = "") quit $$$ERROR(10000,"Versão dos procedimentos não encontrada!")
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterClassesArquivo">
<Description>

Obtem as Classes

set sc = ##class(Src2.UtilsXml).ObterClassesArquivo("C:\workspacecsw\temp\patchs\CC-2012-08-11-11-14-59-CSW-T1-6-3-2\outros\Src2.xml", .tabItens)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[arquivo:%String,&tabItens:%String]]></FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 kill tabItens
 
 if ('##class(%File).Exists(arquivo)) quit $$$ERROR(10000,"Arquivo de classes não encontrado!")
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivo,.reader)
 
 while (reader.Read()) {
   if (reader.Path = "/Export/Class") & (reader.NodeType = "element")  {
     set name = ""
     if reader.MoveToAttributeName("name") set name = reader.ValueGet()
     if (name '= "") {
       set tabItens(name_".cls") = ""
     }
   }
   if (reader.Path = "/Export/Routine") & (reader.NodeType = "element")  {
     set (name, type) = ""
     if reader.MoveToAttributeName("name") set name = reader.ValueGet()
     if reader.MoveToAttributeName("type") set type = reader.ValueGet()
     if (name '= "") & (type = "MAC") {
       set tabItens(name_".MAC") = ""
     }
   }
 }
 
 set reader = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterSwitchXML">
<Description>

Obtem os Dados do Arquivo switch.xml

set sc = ##class(Src2.UtilsXml).ObterSwitchXML(.tabSwitch)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabSwitch:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabSwitch
 
 set sc = ##class(Src2.Utils).ObterConfig(, .caminhoWorkspace)
 quit:sc'=1 sc
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set arquivoSwitch = caminhoWorkspace_barra_"configgeral"_barra_"switch.xml"
 
 if ('##class(%File).Exists(arquivoSwitch)) quit "Arquivo 'switch.xml' não encontrado no workspace!"
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoSwitch,.reader)
 
 set path = ""
 
 while (reader.Read()) {
   if (reader.Path '= "") {
     set path = reader.Path
   }
   if (reader.Path = "/Switch/Projetos/Projeto") & (reader.NodeType = "element") {
     set (projeto, urlOrigem, revisaoMinima, revisaoMaxima, urlDestino, revisaoDestino) = ""
     if reader.MoveToAttributeName("id") set projeto = reader.ValueGet()
     if reader.MoveToAttributeName("urlOrigem") set urlOrigem = reader.ValueGet()
     if reader.MoveToAttributeName("revisaoMinima") set revisaoMinima = reader.ValueGet()
     if reader.MoveToAttributeName("revisaoMaxima") set revisaoMaxima = reader.ValueGet()
     if reader.MoveToAttributeName("urlDestino") set urlDestino = reader.ValueGet()
     if reader.MoveToAttributeName("revisaoDestino") set revisaoDestino = reader.ValueGet()
     if (projeto '= "") {
       set tabSwitch(projeto) = urlOrigem_"^"_revisaoMinima_"^"_revisaoMaxima_"^"_urlDestino_"^"_revisaoDestino
     }
   }
 }
  
 set reader = ""
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterArquivosVersionados">
<Description>

Obtem os Arquivos Versionados

set sc = ##class(Src2.UtilsXml).ObterArquivosVersionados(.tabArqVers)</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec><![CDATA[&tabArqVers:%String]]></FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 kill tabArqVers
 
 set sc = ##class(Src2.Config).ObterArquivosConfig(, , , , , , , , , , .arquivoVersionado)
 quit:sc'=1 sc
 
 if ('##class(%File).Exists(arquivoVersionado)) quit "Arquivo 'arquivos_versionados.xml' não encontrado no workspace!"
 
 set sc = ##class(%XML.TextReader).ParseFile(arquivoVersionado,.reader)
 
 set (path, codSeq) = ""
 
 while (reader.Read()) {
   if (reader.Path '= "") {
     set path = reader.Path
   }
   
   if (path = "/ArquivosVersionados/Arquivos/Arquivo") & (reader.NodeType="element") {
     set codSeq = $order(tabTemp(""),-1) + 1
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo") & (reader.NodeType="endelement") {
     set codSeq = ""
   }
   
   if (codSeq = "") continue
   
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/Descricao") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"descricao") = reader.ValueGet()
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/Observacao") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"observacao") = reader.ValueGet()
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/Tipo") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"tipo") = reader.ValueGet()
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/Tipo") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"tipo") = reader.ValueGet()
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/Nome") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"nome") = reader.ValueGet()
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/Localizacao") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"localizacao") = reader.ValueGet()
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/Sistema") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"sistema") = reader.ValueGet()
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/TiposPatch") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"tiposPatch") = reader.ValueGet()
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/EnderecoPasta") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"enderecoPasta") = reader.ValueGet()
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/Arquivo") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"arquivo") = reader.ValueGet()
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/Siglas") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"siglas") = reader.ValueGet()
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/Conta") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"conta") = reader.ValueGet()
   }
   if (path = "/ArquivosVersionados/Arquivos/Arquivo/RotinaProcedimento") & (reader.NodeType="chars") {
     set tabTemp(codSeq,"rotinaProcedimento") = reader.ValueGet()
   }
 }
 
 set reader = ""
 
 set codSeq = ""
 for {
   set codSeq = $order(tabTemp(codSeq))
   if (codSeq = "") quit
   
   set tipo = $get(tabTemp(codSeq,"tipo"))
   if (tipo = "") continue
   
   kill tabTemp(codSeq,"tipo")
   
   set tiposPatch = $get(tabTemp(codSeq,"tiposPatch"))
   set sc = ##class(Src2.Utils).ConvertStrTab(tiposPatch, .tabTiposPatch)
   kill tabTemp(codSeq,"tiposPatch")
   
   set siglas = $get(tabTemp(codSeq,"siglas"))
   set sc = ##class(Src2.Utils).ConvertStrTab(siglas, .tabSiglas)
   kill tabTemp(codSeq,"siglas")
   
   
   merge tabArqVers(tipo) = tabTemp(codSeq)
   merge tabArqVers(tipo,"tiposPatch") = tabTiposPatch
   merge tabArqVers(tipo,"siglas") = tabSiglas
 }
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Web.Cliente.AcessoUsuarioConsistemSoap">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%SOAP.WebClient</Super>
<TimeCreated>61727,0</TimeCreated>

<Parameter name="LOCATION">
<Description>
This is the URL used to access the web service.</Description>
<Default>http://gercon.consistem.com.br/csp/sistemas/br.com.consistem.gercon.service.AcessoUsuarioConsistem.cls</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Description>
This is the namespace used by the Service</Description>
<Default>http://consistem.com.br</Default>
</Parameter>

<Parameter name="OUTPUTTYPEATTRIBUTE">
<Description>
Use xsi:type attribute for literal types.</Description>
<Default>1</Default>
</Parameter>

<Parameter name="SERVICENAME">
<Description>
This is the name of the Service</Description>
<Default>AcessoUsuarioConsistem</Default>
</Parameter>

<Parameter name="SOAPVERSION">
<Description>
This is the SOAP version supported by the service.</Description>
<Default>1.1</Default>
</Parameter>

<Method name="%OnNew">
<FormalSpec>initvalue:%CacheString</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils).ObterEnderecosWebServices(, , .usuario, .senha, .location)
 
 set ..Location = location_".AcessoUsuarioConsistem.cls"
 
 set usertoken = ##class(%SOAP.Security.UsernameToken).Create(usuario, senha)
 
 do ..SecurityOut.AddToken(usertoken)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="Login">
<Final>1</Final>
<FormalSpec>conta:%String,login:%String,senhaCliente:%String,geraLog:%Boolean</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%Boolean</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("Login").Invoke($this,"http://consistem.com.br/br.com.consistem.gercon.service.AcessoUsuarioConsistem.Login",.conta,.login,.senhaCliente,.geraLog)
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Web.Cliente.ClienteGerconSoap">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%SOAP.WebClient</Super>
<TimeCreated>61727,0</TimeCreated>

<Parameter name="LOCATION">
<Description>
This is the URL used to access the web service.</Description>
<Default>http://gercon.consistem.com.br/csp/sistemas/br.com.consistem.gercon.service.Cliente.cls</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Description>
This is the namespace used by the Service</Description>
<Default>http://consistem.com.br</Default>
</Parameter>

<Parameter name="OUTPUTTYPEATTRIBUTE">
<Description>
Use xsi:type attribute for literal types.</Description>
<Default>1</Default>
</Parameter>

<Parameter name="SERVICENAME">
<Description>
This is the name of the Service</Description>
<Default>ClienteGercon</Default>
</Parameter>

<Parameter name="SOAPVERSION">
<Description>
This is the SOAP version supported by the service.</Description>
<Default>1.1</Default>
</Parameter>

<Method name="%OnNew">
<FormalSpec>initvalue:%CacheString</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils).ObterEnderecosWebServices(, , .usuario, .senha, .location)
 
 set ..Location = location_".Cliente.cls"
 
 set usertoken = ##class(%SOAP.Security.UsernameToken).Create(usuario, senha)
 
 do ..SecurityOut.AddToken(usertoken)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GravarDadosCliente">
<Final>1</Final>
<FormalSpec>dadosCliente:Src2.Inf.DadosCliente</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%xsd.base64Binary</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("GravarDadosCliente").Invoke(##this,"http://consistem.com.br/br.com.consistem.gercon.service.Cliente.GravarDadosCliente",.dadosCliente)
]]></Implementation>
</Method>

<Method name="ObterVersaoComponentes">
<Final>1</Final>
<FormalSpec>grupoKayako:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%String</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ObterVersaoComponentes").Invoke(##this,"http://consistem.com.br/br.com.consistem.gercon.service.Cliente.ObterVersaoComponentes",.grupoKayako)
]]></Implementation>
</Method>

<Method name="ObterVersaoProduto">
<Final>1</Final>
<FormalSpec>grupoKayako:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%String</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ObterVersaoProduto").Invoke(##this,"http://consistem.com.br/br.com.consistem.gercon.service.Cliente.ObterVersaoProduto",.grupoKayako)
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Web.Cliente.ConsistemLogSoap">
<ProcedureBlock>1</ProcedureBlock>
<Super>%SOAP.WebClient</Super>
<TimeCreated>63432,46688.547174</TimeCreated>

<Parameter name="LOCATION">
<Description>
This is the URL used to access the web service.</Description>
<Default>http://gercon.consistem.com.br/csp/sistemas/br.com.consistem.gercon.service.ConsistemLog.cls</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Description>
This is the namespace used by the Service</Description>
<Default>http://consistem.com.br</Default>
</Parameter>

<Parameter name="OUTPUTTYPEATTRIBUTE">
<Description>
Use xsi:type attribute for literal types.</Description>
<Default>1</Default>
</Parameter>

<Parameter name="SERVICENAME">
<Description>
This is the name of the Service</Description>
<Default>ConsistemLog</Default>
</Parameter>

<Parameter name="SOAPVERSION">
<Description>
This is the SOAP version supported by the service.</Description>
<Default>1.1</Default>
</Parameter>

<Method name="%OnNew">
<FormalSpec>initvalue:%CacheString</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils).ObterEnderecosWebServices(, , .usuario, .senha, .location)
 
 set ..Location = location_".ConsistemLog.cls"

 set usertoken = ##class(%SOAP.Security.UsernameToken).Create(usuario, senha)
 
 do ..SecurityOut.AddToken(usertoken)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterInfo">
<Final>1</Final>
<FormalSpec>codConta:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>Src2.Log.Config</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ObterInfo").Invoke($this,"http://consistem.com.br/br.com.consistem.gercon.service.ConsistemLog.ObterInfo",.codConta)
]]></Implementation>
</Method>

<Method name="TransferirLog">
<Final>1</Final>
<FormalSpec>dados:Src2.Log.Dados</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%xsd.base64Binary</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("TransferirLog").Invoke($this,"http://consistem.com.br/br.com.consistem.gercon.service.ConsistemLog.TransferirLog",.dados)
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Web.Cliente.LicencaClienteSoap">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%SOAP.WebClient</Super>
<TimeCreated>61727,0</TimeCreated>

<Parameter name="LOCATION">
<Description>
This is the URL used to access the web service.</Description>
<Default>http://gercon.consistem.com.br/csp/sistemas/br.com.consistem.gercon.service.LicencaCliente.cls</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Description>
This is the namespace used by the Service</Description>
<Default>http://consistem.com.br</Default>
</Parameter>

<Parameter name="OUTPUTTYPEATTRIBUTE">
<Description>
Use xsi:type attribute for literal types.</Description>
<Default>1</Default>
</Parameter>

<Parameter name="SERVICENAME">
<Description>
This is the name of the Service</Description>
<Default>LicencaCliente</Default>
</Parameter>

<Parameter name="SOAPVERSION">
<Description>
This is the SOAP version supported by the service.</Description>
<Default>1.1</Default>
</Parameter>

<Method name="%OnNew">
<FormalSpec>initvalue:%CacheString</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils).ObterEnderecosWebServices(, , .usuario, .senha, .location)
 
 set ..Location = location_".LicencaCliente.cls"
 
 set usertoken = ##class(%SOAP.Security.UsernameToken).Create(usuario, senha)
 do ..SecurityOut.AddToken(usertoken)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ObterChaveLicencaCliente">
<Final>1</Final>
<FormalSpec>cnpjEmpresa:%String,dataRef:%Date</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%String</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ObterChaveLicencaCliente").Invoke(##this,"http://consistem.com.br/br.com.consistem.gercon.service.LicencaCliente.ObterChaveLicencaCliente",.cnpjEmpresa,.dataRef)
]]></Implementation>
</Method>

<Method name="ObterLicencaCliente">
<Final>1</Final>
<FormalSpec>cnpjEmpresa:%String,macAddress:%String,dataRef:%Date</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%String</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ObterLicencaCliente").Invoke(##this,"http://consistem.com.br/br.com.consistem.gercon.service.LicencaCliente.ObterLicencaCliente",.cnpjEmpresa,.macAddress,.dataRef)
]]></Implementation>
</Method>

<Method name="ObterLicencaNoCliente">
<Final>1</Final>
<FormalSpec>cnpjEmpresa:%String,licenca:%String,chaveLicenca:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%xsd.base64Binary</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ObterLicencaNoCliente").Invoke($this,"http://consistem.com.br/br.com.consistem.gercon.service.LicencaCliente.ObterLicencaNoCliente",.cnpjEmpresa,.licenca,.chaveLicenca)
]]></Implementation>
</Method>

<Method name="ObterContaAjuda">
<Final>1</Final>
<FormalSpec>cnpjEmpresa:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%String</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ObterContaAjuda").Invoke(##this,"http://consistem.com.br/br.com.consistem.gercon.service.LicencaCliente.ObterContaAjuda",.cnpjEmpresa)
]]></Implementation>
</Method>

<Method name="ObterSenhaAjuda">
<Final>1</Final>
<FormalSpec>cnpjEmpresa:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%String</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ObterSenhaAjuda").Invoke(##this,"http://consistem.com.br/br.com.consistem.gercon.service.LicencaCliente.ObterSenhaAjuda",.cnpjEmpresa)
]]></Implementation>
</Method>

<Method name="ObterServidorAjuda">
<Final>1</Final>
<FormalSpec>cnpjEmpresa:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%String</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ObterServidorAjuda").Invoke($this,"http://consistem.com.br/br.com.consistem.gercon.service.LicencaCliente.ObterServidorAjuda",.cnpjEmpresa)
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Web.Cliente.Patch2Soap">
<ProcedureBlock>1</ProcedureBlock>
<Super>%SOAP.WebClient</Super>
<TimeCreated>63450,72726.463233</TimeCreated>

<Parameter name="LOCATION">
<Description>
This is the URL used to access the web service.</Description>
<Default>http://localhost/csp/desenv64/Src2.Web.Service.Patch.cls</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Description>
This is the namespace used by the Service</Description>
<Default>http://localhost</Default>
</Parameter>

<Parameter name="OUTPUTTYPEATTRIBUTE">
<Description>
Use xsi:type attribute for literal types.</Description>
<Default>1</Default>
</Parameter>

<Parameter name="SERVICENAME">
<Description>
This is the name of the Service</Description>
<Default>Patch</Default>
</Parameter>

<Parameter name="SOAPVERSION">
<Description>
This is the SOAP version supported by the service.</Description>
<Default>1.1</Default>
</Parameter>

<Method name="PrepararItensPatchTemp">
<Final>1</Final>
<FormalSpec>strIntens:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>Src2.Patch.Itens</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("PrepararItensPatchTemp").Invoke($this,"http://localhost/Src2.Web.Service.Patch.PrepararItensPatchTemp",.strIntens)
]]></Implementation>
</Method>

<Method name="ExcluirItensPatchTemp">
<Final>1</Final>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%Status</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ExcluirItensPatchTemp").Invoke($this,"http://localhost/Src2.Web.Service.Patch.ExcluirItensPatchTemp")
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Web.Cliente.PatchSoap">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%SOAP.WebClient</Super>
<TimeCreated>63450,45508.939936</TimeCreated>

<Parameter name="LOCATION">
<Description>
This is the URL used to access the web service.</Description>
<Default>http://gercon.consistem.com.br/csp/sistemas/br.com.consistem.gercon.service.Patch.cls</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Description>
This is the namespace used by the Service</Description>
<Default>http://consistem.com.br</Default>
</Parameter>

<Parameter name="OUTPUTTYPEATTRIBUTE">
<Description>
Use xsi:type attribute for literal types.</Description>
<Default>1</Default>
</Parameter>

<Parameter name="SERVICENAME">
<Description>
This is the name of the Service</Description>
<Default>Patch</Default>
</Parameter>

<Parameter name="SOAPVERSION">
<Description>
This is the SOAP version supported by the service.</Description>
<Default>1.1</Default>
</Parameter>

<Method name="%OnNew">
<FormalSpec>initvalue:%CacheString</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.PatchUtils).ObterEnderecosWebServices(, , .usuario, .senha, .location)
 
 set ..Location = location_".Patch.cls"
 
 set usertoken = ##class(%SOAP.Security.UsernameToken).Create(usuario, senha)
 do ..SecurityOut.AddToken(usertoken)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="ExcluirPatch">
<Final>1</Final>
<FormalSpec>idPatch:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%xsd.base64Binary</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ExcluirPatch").Invoke(##this,"http://consistem.com.br/br.com.consistem.gercon.service.Patch.ExcluirPatch",.idPatch)
]]></Implementation>
</Method>

<Method name="ExportarPatch">
<Final>1</Final>
<FormalSpec>codConta:%String,produto:%String,versao:%String,email:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%xsd.base64Binary</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ExportarPatch").Invoke(##this,"http://consistem.com.br/br.com.consistem.gercon.service.Patch.ExportarPatch",.codConta,.produto,.versao,.email)
]]></Implementation>
</Method>

<Method name="ListarRemessasServidor">
<Final>1</Final>
<FormalSpec>conta:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%String</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ListarRemessasServidor").Invoke(##this,"http://consistem.com.br/br.com.consistem.gercon.service.Patch.ListarRemessasServidor",.conta)
]]></Implementation>
</Method>

<Method name="ObterDadosPatch">
<Final>1</Final>
<FormalSpec>conta:%String,idPatch:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%String</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ObterDadosPatch").Invoke(##this,"http://consistem.com.br/br.com.consistem.gercon.service.Patch.ObterDadosPatch",.conta,.idPatch)
]]></Implementation>
</Method>

<Method name="ObterVersoesSistemas">
<Final>1</Final>
<FormalSpec>versaoOrigem:%String,strSistemasVersoes:%String</FormalSpec>
<ProcedureBlock>1</ProcedureBlock>
<ReturnType>%String</ReturnType>
<WebMethod>1</WebMethod>
<SoapBindingStyle>document</SoapBindingStyle>
<SoapBodyUse>literal</SoapBodyUse>
<Implementation><![CDATA[ Quit ..WebMethod("ObterVersoesSistemas").Invoke(##this,"http://consistem.com.br/br.com.consistem.gercon.service.Patch.ObterVersoesSistemas",.versaoOrigem,.strSistemasVersoes)
]]></Implementation>
</Method>
</Class>


<Class name="Src2.Web.Service.Patch">
<ProcedureBlock>1</ProcedureBlock>
<Super>%SOAP.WebService</Super>
<TimeCreated>63450,64910.337215</TimeCreated>

<Parameter name="SERVICENAME">
<Description>
Nome do Serviço Web.</Description>
<Default>Patch</Default>
</Parameter>

<Parameter name="NAMESPACE">
<Description>
FALTANDO FAZER: alterar isso para o namespace SOAP real.
Namespace SOAP para o serviço Web</Description>
<Default>http://localhost</Default>
</Parameter>

<Parameter name="USECLASSNAMESPACES">
<Description>
Os namespaces das classes referenciadas serão usados no WSDL.</Description>
<Default>1</Default>
</Parameter>

<Method name="PrepararItensPatchTemp">
<Description>

Preparar Itens para Patch do Tipo Temporário
</Description>
<FormalSpec>strIntens:%String</FormalSpec>
<ReturnType>Src2.Patch.Itens</ReturnType>
<WebMethod>1</WebMethod>
<Implementation><![CDATA[
 set destino = "C:\InterSystems\Cache\CSP\patchstmp\"
 
 set itens = ##class(%ListOfObjects).%New()
 
 for cont = 1:1:$length(strIntens,";") {
   set grupo = $piece(strIntens,";",cont)
   set sc = ##class(Src2.Item).ValidarItem(grupo, , , .tabItens, .tipo)
   
   set internalName = ""
   for {
     set internalName = $order(tabItens(internalName))
     if (internalName = "") quit
     
     set msgsc = ##class(Src2.Item).ObterDadosItem(internalName, .item, , .itemCopiaTrabalho, , , , , .pasta, , , .sistema, .arquivo, .itemId)
     
     set package = ""
     
     if (tipo = 1) {
       set msgsc = ##class(Src2.Classe).ObterInfoClasseId(itemId, , , , .package)
       if (msgsc '= $$$OK) continue
     }
     
     if ('##class(%File).DirectoryExists(destino_pasta)) {
       set sc = ##class(%File).CreateDirectoryChain(destino_pasta)
     }
     
     set sc = ##Class(%File).CopyFile(itemCopiaTrabalho, destino_pasta_"\"_arquivo)
     
     set objItem = ##Class(Src2.Patch.Item).%New()
     set objItem.tipo = tipo
     set objItem.item = item
     set objItem.itemId = itemId
     set objItem.internalName = internalName
     set objItem.sistema = sistema
     set objItem.pasta = pasta
     set objItem.arquivo = arquivo
     set objItem.package = package
     
     set sc = itens.Insert(objItem)
   }
 }
 
 set objItens = ##Class(Src2.Patch.Itens).%New()
 set objItens.itens = itens
 
 quit objItens
]]></Implementation>
</Method>

<Method name="ExcluirItensPatchTemp">
<Description>

Excluir Itens para Patch do Tipo Temporário
</Description>
<ReturnType>%Status</ReturnType>
<WebMethod>1</WebMethod>
<Implementation><![CDATA[
 set status = ##class(%File).RemoveDirectoryTree("C:\InterSystems\Cache\CSP\patchstmp\")
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>


<Class name="Src2.WildFly">
<ClassType/>
<ProcedureBlock>1</ProcedureBlock>
<Super>%RegisteredObject</Super>
<TimeCreated>63782,74407.324341</TimeCreated>

<Method name="ConnectionString">
<Description>

Connection String
</Description>
<ClassMethod>1</ClassMethod>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConsistemHome(.consistemHome)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set exec = "jboss-cli.sh"
 
 if ($zversion [ "Windows") set exec = "jboss-cli.bat"
 
 set command = "set NOPAUSE=true&set JAVA_HOME="_consistemHome_barra_"java&"
 
 if ($zversion '[ "Windows") {
   set command = "source /etc/profile.d/consistem_profile.sh && if [ ""$JAVA_HOME""=="""" ] ; then JAVA_HOME="_consistemHome_barra_"java; fi; "
 }
 
 set command = command_consistemHome_barra_"webservice"_barra_"bin"_barra_exec_" "
 set command = command_"-c --controller=localhost:9995 --user=admin --password=123consistem@4 --command="""
 
 quit command
]]></Implementation>
</Method>

<Method name="Deploy">
<Description>

Deploy
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arqLog:%String,appName:%String="",namespace:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConsistemHome(.consistemHome)
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 if (appName = "") set appName = "consistem_webapp"
 
 set sc = ##class(Src2.WildFly).Reconfigure(appName, namespace)
 
 set appName = appName_".war"
 
 set command = ##class(Src2.WildFly).ConnectionString()
 set command = command_"deploy "_consistemHome_barra_"cswapp"_barra_appName_" --name="_appName_" "
 set command = command_"--runtime-name="_appName_" --server-groups=consistem_service"""
 
 if ($get(arqLog) '= "") set command = command_" > "_arqLog_" 2>&1"
 
 set sc = $zf(-1,command)
 
 quit sc
]]></Implementation>
</Method>

<Method name="Undeploy">
<Description>

Undeploy
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arqLog:%String,appName:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set command = ##class(Src2.WildFly).ConnectionString()
 
 if ($get(appName) = "") set appName = "consistem_webapp"
 
 set appName = appName_".war"
 
 set command = command_"undeploy "_appName_" --server-groups=consistem_service"""
 
 if ($get(arqLog) '= "") set command = command_" > "_arqLog_" 2>&1"
 
 set sc = $zf(-1,command)
 
 quit sc
]]></Implementation>
</Method>

<Method name="CreateDS">
<Description>

Cria o DataSource
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>dsname:%String,namespace:%String,port:%String,mimPool:%String,maxPool:%String,arqLog:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 if ($get(namespace) = "") set namespace = $znspace
 if ($get(port) = "") set port = 1972
 if ($get(mimPool) = "") set mimPool = "2"
 if ($get(maxPool) = "") set maxPool = "5"
 if ($get(dsname) = "") set dsname = $zconvert(namespace,"U")_"DS"
 
 if (dsname = "SISTEMASDS") quit $$$OK
 
 set sc = ##class(Src2.WildFly).RemoveDS(dsname, arqLog)
 
 set command = ##class(Src2.WildFly).ConnectionString()
 set command = command_"data-source add --profile=full --name="_dsname_" --jndi-name=java:jboss/datasources/"_dsname_" --driver-name=CacheDB "
 set command = command_"--connection-url=jdbc:Cache://127.0.0.1:"_port_"/"_namespace_" "
 set command = command_"--min-pool-size="_mimPool_" --max-pool-size="_maxPool_" --security-domain=ConsistemDS-Encripted"""
 
 if (arqLog '= "") set command = command_" >> "_arqLog_" 2>&1"
 
 set sc = $zf(-1,command)
 
 quit sc
]]></Implementation>
</Method>

<Method name="RemoveDS">
<Description>

Remove o DataSource
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>dsname:%String,arqLog:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set namespace = $znspace
 
 if ($get(dsname) = "") set dsname=$zconvert(namespace,"U")_"DS"
 
 set command = ##class(Src2.WildFly).ConnectionString()
 set command = command_"data-source remove --profile=full --name="_dsname_""""
 
 if (arqLog '= "") set command = command_" > "_arqLog_" 2>&1"
 
 set sc = $zf(-1,command)
 quit sc
]]></Implementation>
</Method>

<Method name="ControllTest">
<Description>

ControllTest
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>arqLog:%String</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 open "|TCP|9995":"127.0.0.1":5
 
 set sc = $test
 if (sc = 0) quit $$$ERROR(10000,"Não foi possível acessar a porta 9995!")
 
 set command = ##class(Src2.WildFly).ConnectionString()
 set command = command_"read-attribute release-version"""
 if ($get(arqLog) = "") set command = command_" > /dev/null 2>&1"
 else  set command = command_" > "_arqLog_".log 2>&1"
 
 set sc = $zf(-1,command)
 if (sc '= 0) hang 4
 if (sc '= 0) quit $$$ERROR(10000,"Não foi possível ao executar o comando!")
 
 set return = $$$OK
 
 if ($get(arqLog) '= "") {	
   set return = $$$ERROR(10000,"Serviço não iniciado!")
   set stream = ##class(%FileCharacterStream).%New()
   set stream.Filename = arqLog_".log"
   while ('stream.AtEnd) {
     set line = stream.ReadLine()
     if (line = "8.2.0.Final") {
       set return = $$$OK
       quit
     }
   }
   if $$$ISERR(return) hang 4
 }
 
 quit return
]]></Implementation>
</Method>

<Method name="Reconfigure">
<Description>

Reconfigure
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>appName:%String="",namespace:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConsistemHome(.consistemHome)
 
 if (appName = "") set appName = "consistem_webapp"
 
 set sc = ##class(Src2.WildFly).GerarArquivo(appName, .fileconfigure, namespace)
 if $$$ISERR(sc) quit sc
 
 set appName = appName_".war"
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set appFile = consistemHome_barra_"cswapp"_barra_appName
 set workdir = consistemHome_barra_"tmp"
 
 set command = "cd "_workdir_" && "_consistemHome_barra_"lib"_barra_"bin"_barra_"7za -tzip u "_appFile_" -up1q0r2x1y2z1w2 *"
 set command = command_" >> /dev/null 2>&1"
 
 set sc = $zf(-1,command)
 
 set sc = ##class(%File).RemoveDirectoryTree(workdir)
 
 quit $$$OK
]]></Implementation>
</Method>

<Method name="GerarArquivo">
<Description>

Gera o Arquivo de Configuração
</Description>
<ClassMethod>1</ClassMethod>
<FormalSpec>appName:%String,file:%String,namespace:%String=""</FormalSpec>
<ReturnType>%Status</ReturnType>
<Implementation><![CDATA[
 set sc = ##class(Src2.Utils).ObterConsistemHome(.consistemHome)
 
 if (namespace = "") set namespace = $znspace
 
 set barra = ##class(Src2.Utils).ObterBarraSistOper()
 
 set folder = consistemHome_barra_"tmp"_barra_"configure"
 
 set sc = ##class(%File).CreateDirectoryChain(folder)
 
 set file = folder_barra_"configure.js"
 
 set stream = ##class(%FileBinaryStream).%New()
 
 set stream.Filename = file
 do stream.WriteLine("global = {")
 do stream.WriteLine("    rest_point : 'webservice/"_$piece(appName,"csw_",2)_"',")
 do stream.WriteLine("    dbNameSpace : '"_namespace_"',")
 do stream.WriteLine("};")
 do stream.Flush()
 do stream.SaveStream()
 
 set stream = ""
 
 if ('##class(%File).Exists(file)) quit $$$ERROR(10000,"Arquivo de configuração não encontrado!")
 
 quit $$$OK
]]></Implementation>
</Method>
</Class>
</Export>
