;** NF_NSE01 *******************************************************************
;*  Gera‡Æo arquivo TecnoSpeed nota fiscal srvi‡o eletronica - Divinopolis/MG  *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido  em: 15/05/2018 por Anivel Augusto Rodrigues
;Ultima Alteracao: 25/05/2018 por Anivel Augusto Rodrigues                            
;Motivo Alteracao: ajuste e 1 autorizacao  NFSe
;Ultima Alteracao: 06/06/2018 por Anivel Augusto Rodrigues                            
;Motivo Alteracao: ajuste Vise
;Ultima Alteracao: 12/06/2018 por Anivel Augusto Rodrigues                            
;Motivo Alteracao: ajuste Vise
;Ultima Alteracao: 19/07/2018 por Anivel Augusto Rodrigues                            
;Motivo Alteracao: ajuste          
;Ultima Alteracao: 23/07/2018 por Anivel Augusto Rodrigues                            
;Motivo Alteracao: ajuste itens/cnae    
;Ultima Alteracao: 15/08/2018 por Anivel Augusto Rodrigues                            
;Motivo Alteracao: ajuste 0121          
;Ultima Alteracao: 16/08/2018 por Anivel Augusto Rodrigues                            
;Motivo Alteracao: ajuste obs, venctos 
;Ultima Alteracao: 16/08/2018 por Bruno Carvalho                           
;Motivo Alteracao: Ajustes ao buscar o e-mail do tipo NF-e, alterando o separador ";" para "," 
;Ultima Alteracao: 17/08/2018 por Anivel Augusto Rodrigues                            
;Motivo Alteracao: ajuste obs          
;Ultima Alteracao: 21/08/2018 por Bruno Carvalho                            
;Motivo Alteracao: Ajustes p/ buscar parƒmetros da NFS-e na tabela "Emprnfse" -> Acessada pelo DESTEMP
;Ultima Alteracao: 30/08/2018 por Bruno Carvalho                            
;Motivo Alteracao: Ajustes GetRecord "Emprnfse"
;Ultima Alteracao: 25/10/2018 por Anivel Augusto Rodrigues                            
;Motivo Alteracao: ajuste desconto item
;Ultima Alteracao: 08/11/2018 por Anivel Augusto Rodrigues                            
;Motivo Alteracao: ajuste CNAE em branco no cadastro de servicos
;Ultima Alteracao: 06/12/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes Tira_CharNFE(s) 166,167
;Ultima Alteracao: 05/08/2020 por Bruno Carvalho
;Motivo Alteracao: Movido NF_NSE01 -> BIB_VEND **NFE_GravaCampo,NFE_GravarCampoMemo,NFE_PegaEndereco,NFE_Tira_CharNFE,NFE_CalcChaveAcesso

;*******************************************************************************
;* Gera Arquivo NF-e TecnoSpeed                                                *
;*******************************************************************************
Proc GeraNFSE()
Private i,EMAILDESTINATARIO,
        AliquotaISS,CodigoCnae,MunicipioIncidencia,TipoTributacao,
        DiscriminacaoServico,CodigoItemListaServico,OptanteSimplesNacional,
        IncentivadorCultural, RegimeEspecialTributacao, NaturezaTributacao, IncentivoFiscal,
        CodigoTributacaoMunicipio, ExigibilidadeISS, Operacao, IssRetido,

        CodigoCnaeAnterior,AliquotaISSAnterior,TipoTributacaoAnterior,reglservic, itemOk, wcv

;--- Itens ---------------------------------------------------------------------
AliquotaISS            =0
CodigoCnae             =""
MunicipioIncidencia    =""
TipoTributacao         =""

DiscriminacaoServico   =""

ContItem               =0

Moveto "FaturaI"
Moveto [Numero da OF]
Locate regfaturac["Numero da OF"]
While [Numero da OF]=regfaturac["Numero da OF"]

	CopyToArray regfi
	
  GetRecord "\\Sistemas\\Estoque\\Itens" regfi["Codigo do Item"] To regitens         
  If Not RetVal
     Then msg="Item nÆo Cadastrado !//"
          msg=msg+regfi["Codigo do Item"]+"/"+regfi["Descricao do Item"]
          Mensagem(msg)
          Return False
  EndIf
  GetRecord "\\Sistemas\\Estoque\\LServic" regfi["Codigo_Servico"] To reglservic  
  If Not RetVal
     Then msg="Item sem C¢digo de Servi‡o no cadastro !//"
          msg=msg+regfi["Codigo do Item"]+"/"+regfi["Descricao do Item"]
          Mensagem(msg)
          Return False
     else if isblank(reglservic["CodigoCNAE"])
             then
                  msg="C¢digo de Servi‡o sem CNAE no cadastro !//"
                  msg=msg+strval(reglservic["Codigo_Servico"])+"/"+rtrim(substr(reglservic["Descricao_Servico"],1,30))+".."
                  Mensagem(msg)
                  Return False
          endif
  EndIf

	ContItem=ContItem+1
	itemOk  =true

  switch
    case [Tributacao de ISSQN]="D" : TipoTributacao=6 ; tributavel dentro do municipio
    case [Tributacao de ISSQN]="N" : TipoTributacao=4
   ;case [Tributacao de ISSQN]="S" : TipoTributacao=
   ;case [Tributacao de ISSQN]="R" : TipoTributacao=
    otherwise                      : TipoTributacao=1 ;Isenta de ISS
  endswitch

  DiscriminacaoServico   = DiscriminacaoServico+
                           Format("W11",regfi["Codigo do Item"])+
                           regfi["Descricao do Item"]+" "+ 
                           ltrim(format("W04,AR",   regfi["Quantidade"            ]))+"x"+ 
                           ltrim(format("W11.2,EIC",regfi["Preco Unitario"        ]))+" = "+     
                           ltrim(format("W11.2,EIC",regfi["Preco Total"           ]))+" "+     
                           regfi["Informacoes_Adicionais"]+"; "

  CodigoCnae             =reglservic["CodigoCNAE"]

  CodigoItemListaServico=regfi["Codigo_Servico"         ]
  AliquotaISS           =regfi["Aliquota de ISSQN"      ] 
  MunicipioIncidencia   =regfi["ISSQN_Municipio"        ]
  
  if ContItem=1
     then
          CodigoCnaeAnterior    =CodigoCnae
          AliquotaISSAnterior   =AliquotaISS
          TipoTributacaoAnterior=TipoTributacao
     else
          if CodigoCnae<>CodigoCnaeAnterior 
             then msg="Existe Item com CNAE diferente,//todos itens devem ter o mesmo CNAE. //Verificar !//"
                  Mensagem(msg)
               	  itemOk  =false
          endif     	 
          if AliquotaISS<>AliquotaISSAnterior 
             then msg="Existe Item com %ISSQN diferente,//todos itens devem ter o mesma %ISSQN. //Verificar !//"
                  Mensagem(msg)
            	    itemOk  =false
          endif     	 
          if TipoTributacao<>TipoTributacaoAnterior 
             then msg="Existe Item com CST ISSQN diferente,//todos itens devem ter o mesmo CST ISSQN. //Verificar !//"
                  Mensagem(msg)
                	itemOk  =false
          endif     
          
          if not itemOk
             then return itemOk
          endif
  endif   

  Skip
  If EOT() Then QuitLoop EndIf
EndWhile

if not isblank([FaturaC->Observacao na Nota Fiscal])
   then DiscriminacaoServico=DiscriminacaoServico+" - Obs: "+[FaturaC->Observacao na Nota Fiscal]
endif   

wcv=0
Moveto "FaturaV"
Moveto [Numero da OF]
Locate regfaturac["Numero da OF"]
While [Numero da OF]=regfaturac["Numero da OF"]

  if [Data]>regfaturac["Data de Emissao"]
     Then 
          wcv=wcv+1
          if wcv=1 then DiscriminacaoServico=DiscriminacaoServico+" - Vencimentos: " endif
          DiscriminacaoServico=DiscriminacaoServico+format("D13",[Data])+" "+ltrim(format("W11.2,EIC",[Valor]))+"; "
  endif   
  
  Skip
  If EOT() Then QuitLoop EndIf
EndWhile

Moveto "FaturaC"

;--- Configura‡äes temporarios por cliente -------------------------------------
GetRecord "\\Sistemas\\Cadastro\\Emprnfse" [FaturaC->Codigo da Empresa] To REG_EMPRNFSE
If RetVal
   Then IncentivadorCultural     = NumVal(REG_EMPRNFSE["IncentivadorCultural"])     ;NÆo
        RegimeEspecialTributacao = NumVal(REG_EMPRNFSE["RegimeEspecialTributacao"]) ;Microempresario e empresa de pequeno porte(ME EPP)
        NaturezaTributacao       = NumVal(REG_EMPRNFSE["NaturezaTributacao"])       ;Simples Nacional
        IncentivoFiscal          = NumVal(REG_EMPRNFSE["IncentivoFiscal"])          ;NÆo
        CodigoTributacaoMunicipio= REG_EMPRNFSE["CodigoTributacaoMunicipio"]
        ExigibilidadeISS         = NumVal(REG_EMPRNFSE["ExigibilidadeISS"])         ;Exigivel
        Operacao                 = REG_EMPRNFSE["Operacao"]                         ;Sem Dedu‡Æo
        IssRetido                = NumVal(REG_EMPRNFSE["IssRetido"])                ;NÆo
   Else Mensagem("NÆo foi localizado os parƒmetros da nota fiscal de servi‡o!")
        Return False
EndIf

;--- Inicio --------------------------------------------------------------------
If PARAM_VISUALIZAR_DANFE Then NFE_GravaCampo("PREVERDANFE","S","S","1")  EndIf
NFE_GravaCampo("","","","Formato=tx2")
NFE_GravaCampo("","","","padrao=TEcnoNFSe")
NFE_GravaCampo("nomecidade","S","S",NFSeCIDADE)
NFE_GravaCampo("","","","")

NFE_GravaCampo("","","","INCLUIR")
NFE_GravaCampo("NumeroLote"   ,"S","S",NOTAFISC)
NFE_GravaCampo("QuantidadeRPS","I","S",0)
NFE_GravaCampo("Transacao"    ,"S","S","true")
NFE_GravaCampo("MetodoEnvio"  ,"S","S","WS")

;--- Remetente------------------------------------------------------------------
NFE_GravaCampo("","","","")
NFE_GravaCampo("CpfCnpjRemetente"           ,"SN","S",regemitente["CGC"])
NFE_GravaCampo("InscricaoMunicipalRemetente","SN","S",regemitente["IM"])
NFE_GravaCampo("RazaoSocialRemetente"       ,"S" ,"S",regemitente["Razao Social"])
NFE_GravaCampo("CodigoCidadeRemetente"      ,"I" ,"S",regcidadesemitente["Codigo_Cidade"])
NFE_GravaCampo("DataInicio"                 ,"D" ,"S",regfaturac["Data de Emissao"])     
NFE_GravaCampo("DataFim"                    ,"D" ,"S",regfaturac["Data de Emissao"])     
NFE_GravaCampo("ValorTotalServicos"         ,"$" ,"S",regfaturac["Valor Nota Fiscal"])
NFE_GravaCampo("ValorTotalDeducoes"         ,"$" ,"S",0)
NFE_GravaCampo("ValorTotalBaseCalculo"      ,"$" ,"S",regfaturac["Valor BCISSQN"    ])
NFE_GravaCampo("","","","SALVAR")
NFE_GravaCampo("","","","")


Switch
  Case TPEMPR="SIMPLES NACIONAL"  : OptanteSimplesNacional=1
  Case TPEMPR="SIMPLES NAC. ESRB" : OptanteSimplesNacional=1
  OtherWise                       : OptanteSimplesNacional=2
EndSwitch
ExigibilidadeISS=1

NFE_GravaCampo("","","","INCLUIRRPS")
NFE_GravaCampo("IdRps"                      ,"S" ,"S","")
NFE_GravaCampo("SituacaoNota"               ,"I" ,"S",1)
NFE_GravaCampo("TipoRps"                    ,"S" ,"S","1")
NFE_GravaCampo("SerieRps"                   ,"S" ,"S",SERIEFISC)
NFE_GravaCampo("NumeroRps"                  ,"SI","S",NOTAFISC)
NFE_GravaCampo("DataEmissao"                ,"DH","S",regfaturac["Data de Emissao"])
NFE_GravaCampo("Competencia"                ,"D" ,"S",regfaturac["Data de Emissao"])     

NFE_GravaCampo("CpfCnpjPrestador"           ,"SN","S",regemitente["CGC"])
NFE_GravaCampo("InscricaoMunicipalPrestador","SN","S",regemitente["IM"])
NFE_GravaCampo("RazaoSocialPrestador"       ,"S" ,"S",regemitente["Razao Social"])
NFE_GravaCampo("CodigoCidadePrestacao"      ,"I" ,"S",regcidadesemitente["Codigo_Cidade"])
NFE_GravaCampo("DescricaoCidadePrestacao"   ,"S" ,"S",regcidadesemitente["Cidade"])


;-- 1 Item apenas---------------------------------------------------------------
;;;NFE_GravaCampo("DiscriminacaoServico"       ,"S" ,"S",DiscriminacaoServico)
NFE_GravarCampoMemo("DiscriminacaoServico",DiscriminacaoServico,69)

NFE_GravaCampo("OptanteSimplesNacional   ","I" ,"S",OptanteSimplesNacional)
NFE_GravaCampo("IncentivadorCultural     ","I" ,"S",IncentivadorCultural)
NFE_GravaCampo("RegimeEspecialTributacao ","I" ,"S",RegimeEspecialTributacao)
NFE_GravaCampo("NaturezaTributacao       ","I" ,"S",NaturezaTributacao)
NFE_GravaCampo("IncentivoFiscal          ","I" ,"S",IncentivoFiscal)
;-------------------------------------------------------------------------------


;--- Tomador -------------------------------------------------------------------
NFE_GravaCampo("CpfCnpjTomador           ","SN","S",regfaturac["CGC"])
NFE_GravaCampo("RazaoSocialTomador       ","S" ,"S",regfaturac["Razao Social"])
NFE_GravaCampo("InscricaoEstadualTomador ","SN","S",regfaturac["IE"])
NFE_GravaCampo("TipoLogradouroTomador    ","S" ,"S","")
NFE_PegaEndereco(regfaturac["Endereco"])
NFE_GravaCampo("EnderecoTomador          ","S" ,"S",End_Logradouro)
NFE_GravaCampo("NumeroTomador            ","S" ,"S",End_Numero)
NFE_GravaCampo("ComplementoTomador       ","S" ,"S",End_Complemento)
NFE_GravaCampo("TipoBairroTomador        ","S" ,"S","")
NFE_GravaCampo("BairroTomador            ","S" ,"S",regfaturac["Bairro"])
NFE_GravaCampo("CodigoCidadeTomador      ","S" ,"S",regcidadesDestinatario["Codigo_Cidade"])
NFE_GravaCampo("DescricaoCidadeTomador   ","S" ,"S",regfaturac["Cidade"])
NFE_GravaCampo("UfTomador                ","S" ,"S",regfaturac["UF"])
NFE_GravaCampo("CepTomador               ","SN","S",regfaturac["CEP"])
NFE_GravaCampo("PaisTomador              ","S" ,"S",regcidadesDestinatario["Codigo_Pais"])
NFE_GravaCampo("DDDTomador               ","S" ,"S","")
NFE_GravaCampo("TelefoneTomador          ","SN","S",regfaturac["Telefone"])

EMAILDESTINATARIO =regdestinatario["Endereco_Eletronico"]
GetRecord "\\Sistemas\\Cadastro\\Destmail" regfaturac["Codigo"],"N" To regdestmail
If RetVal
   then if not isblank(regdestmail["Email"])
           then EMAILDESTINATARIO=regdestmail["Email"]
                ;Alterando o separador ";" para ","
                PosI=Search(";",EMAILDESTINATARIO)
                If PosI>0
                   Then While PosI>0
                          EMAILDESTINATARIO = SubStr(EMAILDESTINATARIO,1,PosI-1)+","+SubStr(EMAILDESTINATARIO,PosI+1,Len(EMAILDESTINATARIO))
                          PosI=Search(";",EMAILDESTINATARIO)
                          If PosI = 0 Then QuitLoop EndIf
                        EndWhile 
                EndIf
                Release Vars PosI
        endif
endif           
NFE_GravaCampo("EmailTomador             ","S" ,"S",EMAILDESTINATARIO)
;-------------------------------------------------------------------------------

NFE_GravaCampo("CodigoItemListaServico   ","S" ,"S",CodigoItemListaServico)
NFE_GravaCampo("CodigoTributacaoMunicipio","SN","S",CodigoTributacaoMunicipio)
NFE_GravaCampo("CodigoCnae               ","SN","S",CodigoCnae)
NFE_GravaCampo("TipoTributacao           ","S" ,"S",TipoTributacao)
NFE_GravaCampo("ExigibilidadeISS         ","I" ,"S",ExigibilidadeISS)
NFE_GravaCampo("Operacao                 ","S" ,"S",Operacao)
NFE_GravaCampo("MunicipioIncidencia      ","S" ,"S",MunicipioIncidencia)

;--- Totalizador ---------------------------------------------------------------
NFE_GravaCampo("ValorServicos            ","$" ,"S",regfaturac["Valor Servico"  ])
NFE_GravaCampo("AliquotaPIS              ","$" ,"N",0)
NFE_GravaCampo("AliquotaCOFINS           ","$" ,"N",0)
NFE_GravaCampo("AliquotaINSS             ","$" ,"N",0)
NFE_GravaCampo("AliquotaIR               ","$" ,"N",0)
NFE_GravaCampo("AliquotaCSLL             ","$" ,"N",0)
NFE_GravaCampo("ValorPIS                 ","$" ,"S",regfaturac["Valor PIS"   ])
NFE_GravaCampo("ValorCOFINS              ","$" ,"S",regfaturac["Valor COFINS"])
NFE_GravaCampo("ValorINSS                ","$" ,"S",0)
NFE_GravaCampo("ValorIR                  ","$" ,"S",0)
NFE_GravaCampo("ValorCSLL                ","$" ,"S",0)
NFE_GravaCampo("OutrasRetencoes          ","$" ,"S",0)
NFE_GravaCampo("DescontoIncondicionado   ","$" ,"S",regfaturac["Valor Desconto Servico"])
NFE_GravaCampo("DescontoCondicionado     ","$" ,"S",0)
NFE_GravaCampo("ValorDeducoes            ","$" ,"S",0)                    
NFE_GravaCampo("BaseCalculo              ","$" ,"S",regfaturac["Valor BCISSQN" ])
NFE_GravaCampo("AliquotaISS              ","N4","S",AliquotaISS)                             
NFE_GravaCampo("ValorISS                 ","$" ,"S",regfaturac["Valor ISSQN"   ])
NFE_GravaCampo("IssRetido                ","I" ,"S",IssRetido)
NFE_GravaCampo("ValorISSRetido           ","$" ,"S",0)
NFE_GravaCampo("ValorLiquidoNfse         ","$" ,"S",regfaturac["Valor Nota Fiscal"])

NFE_GravaCampo("","","","")
NFE_GravaCampo("","","","SALVARRPS")

Moveto "FaturaC"

Close Printer

return True
EndProc

;*******************************************************************************
;* Rotina carrega dados tabela relacionadas                                    *
;*******************************************************************************
Proc GetTabelasPrincipais()

Moveto "FaturaC"
copytoarray regfaturac

GetRecord "\\Sistemas\\Cadastro\\Destinat" regfaturac["Codigo da Empresa"] To regemitente
If not RetVal
   Then Mensagem("Erro cadastro empresa: "+regfaturac["Codigo da Empresa"]+" [Destinat] !")
        Return False
Endif   

GetRecord "\\Sistemas\\Cadastro\\Cidades" regemitente["Cidade"],regemitente["UF"] To regcidadesemitente    
If not RetVal
   Then Mensagem("Erro cadastro cidades: "+regemitente["Cidade"]+"/"+regemitente["UF"]+" [Cidades] !")
        Return False
Endif   

GetRecord "\\Sistemas\\Vendas\\Destin" regfaturac["Codigo da Destinacao"] To regdestin 
If not RetVal
   Then Mensagem("Erro cadastro destina‡äes: "+regfaturac["Codigo da Destinacao"]+" [Destin] !")
        Return False
Endif   

GetRecord "\\Sistemas\\Cadastro\\Destinat" regfaturac["Codigo"] To regdestinatario
If Not RetVal
   Then Mensagem("Erro cadastro pessoa: "+regfaturac["Codigo"]+" [Destinat] !")
        Return False
Endif   

GetRecord "\\Sistemas\\Cadastro\\Cidades" regdestinatario["Cidade"],regdestinatario["UF"] To regcidadesdestinatario    
If not RetVal
   Then Mensagem("Erro cadastro cidades: "+regdestinatario["Cidade"]+"/"+regdestinatario["UF"]+" [Cidades] !")
        Return False
Endif   

return true
endProc

;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************

If Not IsAssigned(PARAM_VISUALIZAR_DANFE) Then PARAM_VISUALIZAR_DANFE=False EndIf

If NFE_CalcChaveAcesso("") 
   Then If Not PARAM_VISUALIZAR_DANFE
           Then 
                Moveto "FaturaC"
                Switch
                  Case ModoNFe="Normal"   : [Sistema Gerador]="n" 
                  Case ModoNFe="SVCAN"    : [Sistema Gerador]="s" 
                EndSwitch
                UnLockRecord
            
           Else UnLockRecord
        EndIf      
          
        Moveto "FaturaC"
    
        ModeloReportRTM=""
    
        If PARAM_VISUALIZAR_DANFE
           Then AGUARDE("Gerando Pre-visualiza‡Æo OF -> "+NOTAFISC)
           Else AGUARDE("Gerando NFS-e -> "+NOTAFISC)
        EndIf
        
        ARQTX2=PrivDir()+"nfse.tx2"
        FileWrite ARQTX2 From ""
    
        NFEJA_AUTORIZADA=False
        
        If Not GeraNFSE()
           Then 
                Mensagem("NFS-e nÆo foi concluida, verificar erros !")
           Else 
                Switch
                  Case PARAM_GRUPO_EDOC<>"": AGUARDE("Enviando arquivo ao eDOC NFS-e -> "+NOTAFISC)
                  OtherWise                : AGUARDE("Enviando arquivo ao eDOC NFS-e -> "+NOTAFISC)
                EndSwitch
           
                FileWrite        PrivDir()+"funcao5.txt" From "COP|"+ARQTX2+"|"+ARQNFE_Envia+"\n"
                ExecVise(PrivDir()+"funcao5.txt")
       EndIf
EndIf

If not PARAM_VISUALIZAR_DANFE
   Then LIMPAGUARDE()
EndIf

Release Vars End_Logradouro, End_Numero, Endd_Complemento, PastaNfeManager, PastaNfeManagerMonitorar,
             ArqNFE, ArqNFE_Envia, ArqNFE_Reenviar, ArqTX2, 
             ModeloReportRTM, ContItem, conteudodoarquivo

Release Vars regdestin, regestados, regdestinat,
             regitens,   
             regemitente, regcidadesemitente, regdestinatario, regcidadesdestinatario, 
             regdestmail, regfaturacc, regdestinatRTM, regfi
             
Release Procs Grava_Item,GeraNFSE, GetTabelasPrincipais 
              
