Professional Documents
Culture Documents
FINA713
FINA713
ch"
#INCLUDE "FINA713.ch"
#INCLUDE "FILEIO.CH"
/*/{Protheus.doc} FINA713
Job para transmiss�o de boletos e envio de e-mail
@type function
@version 12.1.33
@author renato.ito
@since 14/04/2021
/*/
Function FINA713()
Local cLockName As Character
cLockName := cEmpAnt + ' - FINA713'
If F713VldUso()
If LockByName(cLockName, .T./*lEmpresa*/, .F./*lFilial*/ ) // uma execu��o
por vez
F713Transf() // Transmite os boletos
F713Mail() // envia os boletos por e-mail
UnLockByName(cLockName, .T./*lEmpresa*/, .F./*lFilial*/ )
EndIf
EndIf
Return
/*/{Protheus.doc} F713VldUso
Verifica se o sistema est� preparado para uso da api de bancos
@type function
@version 12.1.33
@author renato.ito
@since 08/04/2021
@return logical, true para o ambiente configurado
/*/
Function F713VldUso() As Logical
Local lRet As Logical
lRet := .F.
If cPaisloc <> 'BRA' .Or. GetRPORelease() < '12.1.027'
lRet := .F.
Else
lRet := SA6->(FieldPos("A6_CFGBOL")) > 0 .And. SA6->(FieldPos("A6_CFGAPI"))
> 0;
.And. SEA->(FieldPos("EA_BORAPI")) > 0 .And. SEA-
>(FieldPos("EA_APIMSG")) > 0 .And. SEA->(FieldPos("EA_APILOG")) > 0 .And. SEA-
>(FieldPos("EA_APIMAIL")) > 0 .AND. SEA->(FieldPos('EA_SUBCTA')) > 0 .AND. SEA-
>(FieldPos('EA_ESPECIE')) > 0;
.And. AI0->(FieldPos("AI0_RECBOL")) > 0 .And. AI0-
>(FieldPos("AI0_EMABOL")) > 0;
.And. AliasInDic("F77")
EndIf
Return lRet
/*/{Protheus.doc} F713VldBco
Verifica se o banco est� configurado para api de bancos
@type function
@version 12.1.33
@author renato.ito
@since 08/04/2021
@param cFilBco, character, Filial do banco
@param cCodigo, character, C�digo fo banco
@param cAgencia, character, Ag�ncia do banco
@param cConta, character, Conta do banco
@param cCodFeb, character, C�digo do Banco na Febraban
@return logical, .T. se estiver configurado e .F. se n�o.
/*/
Function F713VldBco(cFilBco As Character, cCodigo As Character, cAgencia As
Character, cConta As Character, cCodFeb As Character, lVldBcoApi As Logical) As
Logical
Local lRet As Logical
Local aArea As Array
Local aAreaSA6 As Array
aArea := GetArea()
aAreaSA6 := SA6->(GetArea())
lRet := .F.
lVldBcoApi := .F.
If !Empty(cCodigo) .And. !Empty(cAgencia) .And. !Empty(cConta)
If SA6->(DbSeek(cFilBco + cCodigo + cAgencia + cConta))
If SA6->A6_CFGAPI $ '1|3' .AND. !Empty(SA6->A6_BCOOFI)
FWMsgRun(, {|| F714Carga() }, STR0015, STR0016)
cCodFeb := SA6->A6_BCOOFI
lRet := .T.
lVldBcoApi := .T.
If cCodFeb == '341'
VldVerItau(SA6->A6_CFGBOL)
Endif
EndIf
EndIf
EndIf
RestArea(aAreaSA6)
RestArea(aArea)
Return lRet
cQuery := "SELECT COUNT(EA_NUM) AS TOTAL FROM " + RetSqlName("SEA") + " SEA "
cQuery += " WHERE "
cQuery += " SEA.EA_FILIAL = '" + cFilBor + "'"
cQuery += " AND SEA.EA_NUMBOR = '" + cNumBor + "'"
cQuery += " AND SEA.EA_CART = 'R' "
cQuery += " AND SEA.EA_BORAPI ='S' "
cQuery += " AND SEA.EA_TRANSF = 'S' "
cQuery += " AND SEA.D_E_L_E_T_ = ' ' "
/*/{Protheus.doc} F713VldTit
Verifica se o t�tulo foi transmitido por api de bancos
@type function
@version 12.1.33
@author renato.ito
@since 08/04/2021
@param lYesNo, logical, Exibe confirma��o quando estiver transmitido para
alterar o retorno.
@param cFilTit, character, Filial do t�tulo
@param cPrefix, character, Prefixo do t�tulo
@param cNum, character, N�mero do t�tulo
@param cParcel, character, Parcela do t�tulo
@param cTipo, character, Tipo do t�tulo
@param cNumbor, character, border�
@return logical, .T. se estiver transmitido .F. se n�o.
/*/
Function F713VldTit(lYesNo As Logical, cFilTit As Character, cPrefix As Character,
cNum As Character, cParcel As Character, cTipo As Character, cNumbor As Character)
As Logical
Local cQuery As Character
Local lRet As Logical
cQuery := "SELECT COUNT(EA_NUM) AS TOTAL FROM " + RetSqlName("SEA") + " SEA "
cQuery += " WHERE "
cQuery += " SEA.EA_FILORIG = '" + cFilTit + "'"
cQuery += " AND SEA.EA_NUMBOR = '" + cNumBor + "'"
cQuery += " AND SEA.EA_PREFIXO = '" + cPrefix + "'"
cQuery += " AND SEA.EA_NUM = '" + cNum + "'"
cQuery += " AND SEA.EA_PARCELA = '" + cParcel + "'"
cQuery += " AND SEA.EA_TIPO = '" + cTipo + "'"
cQuery += " AND SEA.EA_CART = 'R' "
cQuery += " AND SEA.EA_BORAPI ='S' "
cQuery += " AND SEA.EA_TRANSF = 'S' "
cQuery += " AND SEA.D_E_L_E_T_ = ' ' "
/*/{Protheus.doc} F713YesNo
Confirma��o quando existir t�tulos transmitidos
@type function
@version 12.1.33
@author renato.ito
@since 08/04/2021
@param nMsg, numeric, 1 para singular, 2 para plural
@return logical, true se continua com o processo
/*/
Function F713YesNo(nMsg AS Numeric) As Logical
Local cMsg As Character
If nMsg > 1
cMsg := STR0001
Else
cMsg := STR0002
Endif
Return MSGYESNO(cMsg, STR0003)
/*/{Protheus.doc} F713VldEmB
Verifica se os e-mails digitados s�o v�lidos
@type function
@version 12.1.33
@author alison.kaique
@since 23/04/2021
lRet := .T.
lRet := .F.
ElseIf !(Empty(cEmails))
aEmails := StrTokArr2(cEmails, ";")
For nI := 01 To Len(aEmails)
// verifica se o e-mail � v�lido
cEmailAt := AllTrim(aEmails[nI])
If !(IsEmail(cEmailAt))
Help("", 1, "AI0_EMABOL", , STR0006 + cEmailAt, 1,; // #"E-
mail inv�lido: "
,,,,,, {STR0007}) // #"Informe e-mail v�lido."
lRet := .F.
Exit
EndIf
Next nI
EndIf
EndIf
Return lRet
/*/{Protheus.doc} F713Transf
Transmite os boletos
@type function
@version 12.1.33
@author renato.ito
@since 14/04/2021
/*/
Function F713Transf()
Local oLayAux As Json
Local cBolAlias As Character
Local cBorFil As Character
Local cBorBco As Character
Local cBorAge As Character
Local cBorCnt As Character
Local cLayout As Character
Local cNumBor As Character
Local cApiMsg As Character
Local cFebrabran As Character
Local cCodBar As Character
Local cCodDig As Character
Local cURLBol As Character
Local cFilAux As Character
Local cTpRazao As Character
Local cNmCpfCnpj As Character
Local oLayout As Object
Local oApiMsg As Object
Local oResult As Object
Local oBills As Object
Local oLog As Object
Local oLogSEA As Object
Local lRet As Logical
Local nEaSaldo As Numeric
Local aArea As Array
Local aAreaSA6 As Array
Local aAreaSEA As Array
Local aAreaSE1 As Array
Local aAreaSA1 As Array
Local aAreaAI0 As Array
Local aAreaSEE As Array
Local aAreaF77 As Array
Local oError := Errorblock( { |e| F713LayErr(e, 'layout')})
// abre as tabelas
DbSelectArea('SA6')
DbSetOrder(1) // A6_FILIAL, A6_COD, A6_AGENCIA, A6_NUMCON, R_E_C_N_O_,
D_E_L_E_T_
DbSelectArea('SEA')
DbSetOrder(2) //EA_FILIAL, EA_NUMBOR, EA_CART, EA_PREFIXO, EA_NUM,
EA_PARCELA, EA_TIPO, EA_FORNECE, EA_LOJA, R_E_C_N_O_, D_E_L_E_T_
DbSelectArea('SE1')
DbSetOrder(1) // E1_FILIAL, E1_PREFIXO, E1_NUM, E1_PARCELA, E1_TIPO,
R_E_C_N_O_, D_E_L_E_T_
DbSelectArea('SA1')
DbSetOrder(1) // A1_FILIAL, A1_COD, A1_LOJA, R_E_C_N_O_, D_E_L_E_T_
DbSelectArea('AI0')
DbSetOrder(1) // AI0_FILIAL, AI0_CODCLI, AI0_LOJA, R_E_C_N_O_, D_E_L_E_T_
DbSelectArea('SEE')
DbSetOrder(1) // EE_FILIAL, EE_CODIGO, EE_AGENCIA, EE_CONTA, EE_SUBCTA,
R_E_C_N_O_, D_E_L_E_T_
DbSelectArea('F77')
DbSetOrder(1) // F77_FILIAL, F77_BANCO, F77_ESPECI, R_E_C_N_O_, D_E_L_E_T_
If (cBolAlias)->(!EOF())
oBills := &("gfin.job.bills.bills():new()")
oLog := JsonObject():new()
oLogSEA := JsonObject():new()
oLayout := JsonObject():new()
oLayAux := JsonObject():new()
While (cBolAlias)->(!EOF())
oResult := JsonObject():new()
oApiMsg := JsonObject():new()
cApiMsg := ''
cResult := ''
cTpRazao := ''
cNmCpfCnpj := ''
lRet := .T.
cCodBar := ''
cCodDig := ''
cURLBol := ''
_cErrorLay := ''
// Posiciona as tabelas
If F713DbArea((cBolAlias)->EA_FILIAL, (cBolAlias)->EA_NUMBOR,
(cBolAlias)->EA_PREFIXO, (cBolAlias)->EA_NUM, (cBolAlias)->EA_PARCELA, (cBolAlias)-
>EA_TIPO)
// verifica se mudou de banco para pegar o layout
If cBorFil <> (cBolAlias)->EA_FILIAL .Or. cBorBco <> (cBolAlias)-
>EA_PORTADO .Or. cBorAge <> (cBolAlias)->EA_AGEDEP .Or. cBorCnt <> (cBolAlias)-
>EA_NUMCON
lRet := .F.
cLayout := ''
If SA6->A6_CFGAPI $ '1|3'
cLayout := SA6->A6_CFGBOL
If !Empty(oLayout:FromJson(cLayout))
lRet := .F.
cApiMsg := STR0008 //"Problema na configura��o do
layout na conta (A6_CFGBOL)."
Else
lRet := .T.
// configura as credenciais do banco
If oLayout:Hasproperty('credentials')
oBills:setCredentials(oLayout['credentials']:ToJSON())
EndIf
// C�digo febraban do banco
cFebrabran := SA6->A6_BCOOFI
oBills:setFebraban(cFebrabran)
cBorFil := (cBolAlias)->EA_FILIAL
cBorBco := (cBolAlias)->EA_PORTADO
cBorAge := (cBolAlias)->EA_AGEDEP
cBorCnt := (cBolAlias)->EA_NUMCON
EndIf
EndIf
EndIf
Else
(cBolAlias)->(DbSkip())
Loop
EndIf
If Empty(Alltrim(SA1->A1_CGC))
lRet := .F.
_cErrorLay := STR0057 // "Cadastro do cliente desatualizado.
Campo CNPJ/CPF n�o preenchido. Verifique o campo A1_CGC"
Endif
If lRet
oLayAux:FromJSON(oLayout['layout']:ToJSON())
If cFebrabran $ "237|341|104"
If oLayout:Hasproperty('beneficiarioFilial')
oLayAux['beneficiarioFilial'] :=
oLayout['beneficiarioFilial'] // Antes do envio esse campo � retirado do layout
EndIf
EndIf
BEGIN SEQUENCE
Do Case
Case cFebrabran == '001'
If VldJsonBB()
jsonBB(@oLayAux)
Else
_cErrorLay := STR0056 //"O conte�do do Nosso N�mero
deve ser limitado a 10 Caracteres. Verificar o campo EE_FAXATU em Par�metros de
Banco (FINA130)"
Endif
Case cFebrabran == '341'
oBills:layout341(@oLayAux)
Case cFebrabran == '237'
oBills:layout237(@oLayAux)
Case cFebrabran == '104'
oBills:layout104(@oLayAux)
cTpRazao := oLayAux['TpRazao']
cNmCpfCnpj := oLayAux['nrcpfcnpj']
oLayAux:delName('TpRazao')
oLayAux:delName('nrcpfcnpj')
Case cFebrabran == '033'
oLayAux['credentials'] := oLayout['credentials']
oBills:layout033(@oLayAux)
EndCase
END SEQUENCE
// Restaura o code block de tratamento de erro original
ErrorBlock( oError )
If cFebrabran $ '237|104'
// apenas para remover os campos vazios
F713LProc(oLayAux, .F.)
EndIf
Endif
If Empty(_cErrorLay)
oBills:setBody(oLayAux)
If oBills:send()
oResult:FromJSON(oBills:getResult())
lRet := .T.
cCodBar := oBills:getCodBar()
cCodDig := oBills:getCodDig()
cURLBol := oBills:getURLBol()
cApiMsg := STR0009 // "Boleto registrado com sucesso!"
Else
oResult:FromJSON(oBills:getResult())
cApiMsg := oBills:getError()
lRet := .F.
EndIf
Else
cApiMsg := _cErrorLay
lRet := .F.
EndIf
EndIf
oLogSEA['log'] := {oLog}
oApiMsg['banco'] := cFebrabran
oApiMsg['especie'] := F77->F77_SIGLA
oApiMsg['boleto'] := oLayAux
oApiMsg['URLBoleto']:= cURLBol
oApiMsg['transmitted'] := IIF(lRet,'S','N') // Determinar se o
response cont�m os dados da transmiss�o ou erro.
If oLayout:Hasproperty('beneficiarioFilial') // Filial do beneficiario
oApiMsg['beneficiarioFilial'] := oLayout['beneficiarioFilial']
EndIf
If cFebrabran =='001'
nEaSaldo := oLayAux['valorOriginal']
ElseIf cFebrabran =='341' .And. lRet
If oLayout['credentials']['version'] == "v2"
oApiMsg['version'] := oLayout['credentials']['version']
nEaSaldo := Val(oLayAux['data']['dado_boleto']
['valor_total_titulo']) / 100
Else
nEaSaldo := Val(oLayAux['valor_cobrado']) / 100
EndIf
EndIf
If !Empty(cTpRazao)
oApiMsg['TpRazao'] := cTpRazao
EndIf
If !Empty(cNmCpfCnpj)
oApiMsg['nrcpfcnpj'] := cNmCpfCnpj
EndIf
// Atualiza a SEA
RecLock('SEA', .F.)
SEA->EA_APIMSG := oApiMsg:ToJSON()
SEA->EA_TRANSF := If(lRet, 'S', 'F')
SEA->EA_APILOG := oLogSEA:ToJSON()
SEA->EA_APIMAIL := If(lRet, cApiMail, '3')
If lRet
SEA->EA_SALDO := nEaSaldo
EndIf
SEA->(MsUnlock())
SA6->(RestArea(aAreaSA6))
SEA->(RestArea(aAreaSEA))
SE1->(RestArea(aAreaSE1))
SA1->(RestArea(aAreaSA1))
AI0->(RestArea(aAreaAI0))
SEE->(RestArea(aAreaSEE))
F77->(RestArea(aAreaF77))
RestArea(aArea)
FwFreeArray(aAreaSA6)
FwFreeArray(aAreaSEA)
FwFreeArray(aAreaSE1)
FwFreeArray(aAreaSA1)
FwFreeArray(aAreaAI0)
FwFreeArray(aAreaSEE)
FwFreeArray(aAreaF77)
FwFreeArray(aArea)
Return
/*/{Protheus.doc} jsonBB
Prepara o Json para o Banco do Brasil
@type function
@version 1.0
@author luiz.nai
@since 25/06/2021
/*/
Function jsonBB(oLayout As Json)
oLayout['numeroConvenio'] := Alltrim(SEE->EE_CODEMP)
oLayout['numeroCarteira'] := Alltrim(SEE->EE_CODCART)
oLayout['numeroVariacaoCarteira'] := Alltrim(SEE->EE_VARCART)
oLayout['dataEmissao'] := dateFormat(SE1->E1_EMISSAO,
"dd.mm.yyyy")
oLayout['quantidadeDiasProtesto'] := IIF(Empty(SEE->EE_DIASPRT),
0, SEE->EE_DIASPRT)
oLayout['quantidadeDiasNegativacao'] := Nil
oLayout['orgaoNegativador'] := Nil
oLayout['indicadorAceiteTituloVencido'] := "N"
oLayout['numeroDiasLimiteRecebimento'] := SEE->EE_DIASREC
oLayout['codigoAceite'] := "A"
oLayout['codigoTipoTitulo'] := SEA->EA_ESPECIE
oLayout['numeroTituloCliente'] := "000" + PadL(AllTrim(SEE-
>EE_CODEMP), 7, "0") + strZero(Val(NossoNum()), 10)
oLayout['indicadorPermissaoRecebimentoParcial'] := "N"
oLayout['numeroTituloBeneficiario'] := SE1->E1_NUM
oLayout['indicadorPix'] := "N"
oLayout['campoUtilizacaoBeneficiario'] := SE1->E1_IDCNAB
oLayout['mensagemBloquetoOcorrencia'] := SubStr(If(Empty(&(SEE-
>EE_FORMEN1)), '', &(SEE->EE_FORMEN1)), 1, 165)
If oLayout:hasProperty('aceite')
oLayout['indicadorAceiteTituloVencido'] := Iif(oLayout['aceite'] == 1 ,
"S", "N")
oLayout:DelName('aceite')
Endif
Return
/*/{Protheus.doc} F713Mail
Envia os boletos por e-mail ao cliente
@type function
@version 12.1.33
@author renato.ito
@since 14/04/2021
@param cFilSEA, character, e1_filorig do t�tulo
@param cPrefix, character, prefixo do t�tulo
@param cNumber, character, numero do t�tulo
@param cParcel, character, parcela do t�tulo
@param cType , character, tipo do t�tulo
/*/
Function F713Mail(cFilSEA As Character, cPrefix As Character, cNumber As Character,
cParcel As Character, cType As Character)
Local cCliFil As Character
Local cCliCod As Character
Local cCliLoja As Character
Local cCliMail As Character
Local cApiError As Character
Local cDataBol As Character
Local lRet As Logical
Local lServOK As Logical
Local aBoletos As Array
Local aErros As Array
Local oServMail As Object
Local cFilBkp As Character
Local aArea As Array
Local aAreaAI0 As Array
Local aAreaSEA As Array
Local lRecBol As Logical
Local lBolAPI As Logical
aBoletos := {}
aErros := {}
lRet := .T.
lServOK := .T.
lBolAPI := .F.
cApiError := ''
cCliFil := ''
cCliCod := ''
cCliLoja := ''
cDataBol := ''
cFilBkp := cFilAnt
oAPIMSG := JsonObject():new()
aArea := GetArea()
aAreaAI0 := AI0->(GetArea())
aAreaSEA := SEA->(GetArea())
If (cMailAlias)->(!EOF())
// Macro execu��o para compila��o na release 17
oServMail := &("gfin.job.bills.email.BillsEMail():new()")
// Verifica se deu erro ao criar a classe
If !oServMail:lOk
lServOK := .F.
cApiError := oServMail:getError()
EndIf
EndIf
If lRet
If Empty(cCliMail)
lRet := .F.
AADD(aErros, {SEA->(RECNO()), STR0011, '2'}) //"Endere�o de
e-mail do cliente n�o est� preenchido (AI0_EMABOL)."
Else
If lBolAPI
If !formatMail(oAPIMSG, @cDataBol)
AADD(aErros, {SEA->(RECNO()), STR0012, '2'}) //
"Problema ao formatar o e-mail para envio."
Else
AADD(aBoletos, {cDataBol, SEA->(RECNO())})
EndIf
Endif
EndIf
EndIf
(cMailAlias)->(DbSkip())
EndDo
cFilAnt := cFilBkp
FreeObj(oAPIMSG)
FreeObj(oServMail)
FwFreeArray(aBoletos)
FwFreeArray(aErros)
AI0->(RestArea(aAreaAI0))
SEA->(RestArea(aAreaSEA))
RestArea(aArea)
FwFreeArray(aAreaAI0)
FwFreeArray(aAreaSEA)
FwFreeArray(aArea)
Return
/*/{Protheus.doc} SendMail
Dispara os e-mails e atualiza a SEA
@type function
@version 12.1.33
@author renato.ito
@since 14/04/2021
@param aBoletos , array , {character (json), SEA->RECNO }
@param cEmail , character, endere�o do destinat�rio
@param oServMail, ojjeto , classe de envio de e-mail
/*/
Static Function SendMail(aBoletos, cEmail, oServMail, cPDFName)
Local nBol As Numeric
Local cApiMail As Character
Local cApiMsg As Character
Local oLog As Object
Local oLogSEA As Object
Local aArea As Array
Local aAreaSEA As Array
aArea := GetArea()
aAreaSEA := GetArea('SEA')
oLog := JsonObject():new()
oLogSEA := JsonObject():new()
cApiMsg := ''
cApiMail := '0' // 0=Aguardando envio;1=Enviado;2=Falha;3=N�o envia
RecLock('SEA', .F.)
SEA->EA_APILOG := oLogSEA:ToJSON()
SEA->EA_APIMAIL := cApiMail
SEA->(MsUnlock())
Next
FreeObj(oLog)
FreeObj(oLogSEA)
RestArea(aAreaSEA)
RestArea(aArea)
FwFreeArray(aAreaSEA)
FwFreeArray(aArea)
Return
/*/{Protheus.doc} setErrors
Atualiza a SEA com o erro ao enviar e-mail
@type function
@version 12.1.33
@author renato.ito
@since 14/04/2021
@param aErros, array , {Recno SEA, Mensagem do erro, 0=Aguardando
envio;1=Enviado;2=Falha;3=N�o envia}
/*/
Static Function setErrors(aErros As Array)
Local nBol As Numeric
Local oLog As Object
Local oLogSEA As Object
Local aArea As Array
Local aAreaSEA As Array
aArea := GetArea()
aAreaSEA := GetArea('SEA')
oLog := JsonObject():new()
oLogSEA := JsonObject():new()
/*/{Protheus.doc} F713QryBol
query para listar os t�tulos aguardando transmiss�o
@type function
@version 12.1.33
@author renato.ito
@since 09/04/2021
@return character, query
/*/
Static Function F713QryBol() As Character
Local cQuery As Character
/*/{Protheus.doc} F713QryMai
query para listar os t�tulos aguardando transmiss�o de e-mail
@type function
@version 12.1.33
@author renato.ito
@since 09/04/2021
If !__lEmaBOL
cQuery += " AND SEA.EA_BORAPI = 'S' "
cQuery += " AND SEA.EA_TRANSF = 'S' "
Endif
// filtros
If (!(cFilSEA == Nil) .AND. !(cPrefix == Nil) .AND. !(cNumber == Nil) .AND. !
(cParcel == Nil) .AND. !(cType == Nil))
cQuery += " AND EA_FILIAL = '" + cFilSEA + "'"
cQuery += " AND EA_PREFIXO = '" + cPrefix + "'"
cQuery += " AND EA_NUM = '" + cNumber + "'"
cQuery += " AND EA_PARCELA = '" + cParcel + "'"
cQuery += " AND EA_TIPO = '" + cType + "'"
EndIf
Return ChangeQuery(cQuery)
/*/{Protheus.doc} F713DbArea
Posiciona as tabelas do t�tulo e gera o IDCNAB
@type function
@version 12.1.33
@author renato.ito
@since 14/04/2021
@param cSEAFil, character, EA_FILIAL
@param cSEANumBor, character, EA_NUMBOR
@param cSEAPref, character, EA_PREFIXO
@param cSEANum, character, EA_NUM
@param cSEAParc, character, EA_PARCELA
@param cSEATipo, character, EA_TIPO
@return logical, True se conseguiu posicionar em todas as tabelas
/*/
Static Function F713DbArea(cSEAFil As Character, cSEANumBor As Character, cSEAPref
As Character, cSEANum As Character, cSEAParc As Character, cSEATipo As Character)
As Logical
Local lRet As Logical
cApiMail := '3'
lRet := .T.
//EA_FILIAL, EA_NUMBOR, EA_CART, EA_PREFIXO, EA_NUM, EA_PARCELA, EA_TIPO,
EA_FORNECE, EA_LOJA, R_E_C_N_O_, D_E_L_E_T_
If lRet .And. (SEA->(DbSeek(cSEAFil + cSEANumBor + 'R' + cSEAPref + cSEANum +
cSEAParc + cSEATipo)))
cFilAnt := SEA->EA_FILORIG
Else
lRet := .F.
Endif
Return lRet
/*/{Protheus.doc} F713LProc
Substitui os campos e fun��es por valores
@type function
@version 12.1.33
@author renato.ito
@since 14/04/2021
@param oLayTit, Json, layout
@param lExecute, logical, macroexecuta a instru��o?
@return Json, layout com os valores carregados
/*/
Static Function F713LProc(oLayTit As Json, lExecute As Logical) As Json
Local aNames As Array
Local nItem As Numeric
local nSubItem As Numeric
Local cType As Character
Local oError := Errorblock( { |e| F713LayErr(e, oLayTit[aNames[nItem]])})
aNames := oLayTit:GetNames()
Begin Sequence
For nItem := 1 to Len(aNames)
cType := ValType(oLayTit[aNames[nItem]])
If (lExecute)
If cType == "C"
oLayTit[aNames[nItem]] := &(oLayTit[aNames[nItem]])
ElseIf cType == "N"
oLayTit[aNames[nItem]] := oLayTit[aNames[nItem]]
ElseIf cType == "J"
oLayTit[aNames[nItem]] := F713LProc(oLayTit[aNames[nItem]],
lExecute)
ElseIf cType == "A"
For nSubItem := 1 to Len(oLayTit[aNames[nItem]])
oLayTit[aNames[nItem]][nSubItem] :=
F713LProc(oLayTit[aNames[nItem]][nSubItem], lExecute)
Next nSubItem
EndIf
cType := ValType(oLayTit[aNames[nItem]])
/*/{Protheus.doc} dateFormat
formata a data conforme layout
@type function
@version 12.1.33
@author renato.ito
@since 13/04/2021
@param dData, date, data
@param cFormat, character, formato sen dd para dia, mm para m�s, MMM para m�s
por extenso, yy para ano 2 digitos e yyyy ano 4 dias
@return character, data formatada o se informar um formato inv�lido o mesmo n�o
ser� substitu�do
/*/
Function dateFormat( dData As Date, cFormat As Character) As Character
Local cDay As Character
Local cMonth As Character
Local cMonthTxt As Character
Local cYear As Character
cDay := StrZero(Day(dData), 2)
cMonth := StrZero(Month(dData), 2)
cYear := cValToChar(Year(dData))
cMonthTxt := MesExtenso(dData)
cQuery := "SELECT COUNT(E1_IDCNAB) IDCNAB FROM " + RetSQLName('SE1') + " SE1 "
cQuery += " WHERE "
cQuery += " SE1.D_E_L_E_T_ =' ' "
cQuery += " AND SE1.E1_IDCNAB ='"
cQuery := changeQuery(cQuery)
While .T.
cIDCNAB := GetSxENum("SE1", "E1_IDCNAB","E1_IDCNAB" + cEmpAnt, 19)
ConfirmSX8()
If !MpSysExecScalar(cQuery + cIDCNAB + "'", 'IDCNAB') > 0
Exit
EndIf
EndDo
Return cIDCNAB
/*/{Protheus.doc} formatValue
Formata valor passado por par�metro.
@type function
@version 12.1.33
@author luiz.nai
@since 18/08/2021
/*/
If(!Empty(cGetValue))
nMulti := Val(PADR("1", nDecimal + 1, "0"))
cValue := cGetValue
nValue := round(int(val(cValue))/nMulti,2)
cValue := AllTrim(Transform(nValue, cPicture))
ENDIF
Return cValue
/*/{Protheus.doc} discountMsg
Gera mensagem de desconto.
@type function
@version 12.1.33
@author luiz.nai
@since 29/07/2021
/*/
Function discountMsg(oDiscount As Json, bco As Character, cVersion As Character)
Local cMessage As Character
cMessage := ''
If(ValType(oDiscount) == 'J')
If(bco=='001')
If(oDiscount['tipo'] == 1)
//"At� o vencimento, desconto de R$"
/*/{Protheus.doc} feeMsg
Gera mensagem de juros.
@type function
@version 12.1.33
@author luiz.nai
@since 29/07/2021
/*/
Function feeMsg(oFee As Json, bco As Character, cVersion As Character)
Local cMessage As Character
cMessage := ''
If(ValType(oFee) == 'J')
If(bco=='001')
If(oFee['tipo'] == 1)
// "Ap�s o vencimento, cobrar R$ "
/*/{Protheus.doc} fineMsg
Gera mensagem de multa.
@type function
@version 12.1.33
@author luiz.nai
@since 29/07/2021
/*/
Function fineMsg(oFine As Json, bco As Character, cVersion as Character)
Local cMessage As Character
cMessage := ''
If(ValType(oFine) == 'J')
If(bco=='001')
If(oFine['tipo'] == 1)
// "Ap�s o vencimento, cobrar R$ "
/*/{Protheus.doc} formatMail
Carrega as informa��es no objeto do e-mail
@type function
@version 12.1.33
@author renato.ito
@since 14/04/2021
@param oAPIMSG, Json, boleto transmitido ao banco
@param cDataBol, Character, cari�vel para retornar as informa��es do boleto
@return character, JSON com as informa��es do boleto
/*/
Function formatMail(oAPIMSG As Json, cDataBol As Character) As Logical
Local lRet As Logical
Local cBanco As Character
Local oDataEMail As Object
Local cMarkCNPJ As Character
Local aFilAtu As Array
Local cEndereco As Character
If oAPIMSG:Hasproperty('beneficiarioFilial')
aFilAtu :=
FWArrFilAtu(cEmpAnt,PadR(oAPIMSG['beneficiarioFilial'],FWSizeFilial(),' '))
Else
aFilAtu := FWArrFilAtu()
EndIf
Do Case
// Dados para o Boleto do Banco do Brasil
Case cBanco == '001'
oDataEMail['pagador']['nome'] := oAPIMSG['boleto', 'pagador',
'nome']
If oAPIMSG['boleto', 'pagador', 'tipoInscricao'] == '1'
cMaskCGC := '@R 999.999.999-99'
Else
cMaskCGC := cMarkCNPJ
EndIf
oDataEMail['pagador']['cnpj/cpf'] :=
AllTrim(Transform(oAPIMSG['boleto', 'pagador', 'numeroInscricao'], cMaskCGC))
// Endere�o do pagador
cEndereco := Iif(!Empty(oAPIMSG['boleto', 'pagador', 'endereco']),
oAPIMSG['boleto', 'pagador', 'endereco'], "") + ;
Iif(!Empty(oAPIMSG['boleto', 'pagador', 'cidade']), + ' - ' +
oAPIMSG['boleto', 'pagador', 'cidade'], "") + ;
Iif(!Empty(oAPIMSG['boleto', 'pagador', 'uf']), + ' - ' +
oAPIMSG['boleto', 'pagador', 'uf'], "") + ;
Iif(!Empty(oAPIMSG['boleto', 'pagador', 'cep']), + ' - ' +
cValToChar(oAPIMSG['boleto', 'pagador', 'cep']), "")
oDataEMail['pagador']['endereco'] :=
Iif(Empty(Alltrim(StrTran(cEndereco, "-", ""))), "", cEndereco)
oDataEMail['beneficiario']['banco'] := '001-9'
oDataEMail['beneficiario']['agencia'] :=
cValtoChar(oAPIMSG['response', 'beneficiario', 'agencia'])
oDataEMail['beneficiario']['conta'] :=
cValToChar(oAPIMSG['response', 'beneficiario', 'contaCorrente'])
oDataEMail['beneficiario']['cnpj'] :=
AllTrim(Transform(aFilAtu[18], cMarkCNPJ))
oDataEMail['beneficiario']['nome'] := AllTrim(aFilAtu[17])
// Endere�o do beneficiario
cEndereco := Iif(!Empty(oAPIMSG['response', 'beneficiario',
'logradouro']), oAPIMSG['response', 'beneficiario', 'logradouro'], "") + ;
Iif(!Empty(oAPIMSG['response', 'beneficiario', 'cidade']), + ' - ' +
oAPIMSG['response', 'beneficiario', 'cidade'], "") + ;
Iif(!Empty(oAPIMSG['response', 'beneficiario', 'uf']), + ' - ' +
oAPIMSG['response', 'beneficiario', 'uf'], "") + ;
Iif(!Empty(oAPIMSG['response', 'beneficiario', 'cep']), + ' - CEP.: ' +
cValToChar(oAPIMSG['response', 'beneficiario', 'cep']), "")
oDataEMail['beneficiario']['endereco'] :=
Iif(Empty(Alltrim(StrTran(cEndereco, "-", ""))), "", cEndereco)
oDataEMail['boleto']['nossoNumero'] := oAPIMSG['boleto',
'numeroTituloCliente']
oDataEMail['boleto']['numeroDocumento']:= oAPIMSG['boleto',
'numeroTituloBeneficiario']
oDataEMail['boleto']['linhaDigitavel'] :=
AllTrim(Transform(oAPIMSG['response', 'linhaDigitavel'], "@R 99999.99999
99999.999999 99999.999999 9 99999999999999"))
oDataEMail['boleto']['codigoBarras'] := oAPIMSG['response',
'codigoBarraNumerico']
oDataEMail['boleto']['vencimento'] := strtran(oAPIMSG['boleto',
'dataVencimento'], '.' , '/')
oDataEMail['boleto']['emissao'] := strtran(oAPIMSG['boleto',
'dataEmissao'] , '.' , '/')
oDataEMail['boleto']['processamento'] := strtran(oAPIMSG['boleto',
'dataEmissao'] , '.' , '/')
oDataEMail['boleto']['valor'] :=
AllTrim(Transform(oAPIMSG['boleto', 'valorOriginal'], "@E 9,999,999,999,999.99"))
oDataEMail['boleto']['especie'] := 'R$'
oDataEMail['boleto']['especieDoc'] := AllTrim(oAPIMSG['especie'])
oDataEMail['boleto']['carteira'] :=
cValToChar(oAPIMSG['response', 'numeroCarteira'])
oDataEMail['boleto']['mensagem'] := oAPIMSG['boleto',
'mensagemBloquetoOcorrencia']
oDataEMail['boleto']['localPagamento'] := STR0014 // "Pag�vel em
qualquer banco"
oDataEMail['boleto']['aceite'] := oAPIMSG['boleto',
'indicadorAceiteTituloVencido']
oDataEMail['boleto']['msgJuros'] := feeMsg(oAPIMSG['boleto']
['jurosMora'], cBanco)
oDataEMail['boleto']['msgDesconto'] := discountMsg(oAPIMSG['boleto']
['desconto'], cBanco)
oDataEmail['boleto']['msgMulta'] := fineMsg(oAPIMSG['boleto']['multa'],
cBanco)
/*/{Protheus.doc} SchedDef
Execucao da rotina via Schedule.
@return aParam
/*/
Static Function SchedDef()
Local aParam := {}
/*/{Protheus.doc} F713LayErr
Carrega o erro da macroexecu��o do layout
@type function
@version 12.1.33
@author renato.ito
@since 18/05/2021
@param e , Object , objeto do erro
@param cErr, Character, mensagem de erro
/*/
Static Function F713LayErr(e As Object, cErr As Character)
_cErrorLay := (e:DESCRIPTION + ' - ' + cErr)
Break
Return
/*/{Protheus.doc} VldVerItau
Apresenta uma tela informando sobre a nova vers�o de registro de boletos
@type Function
@author francisco.carmo
@since 27/01/2022
@version 1.0
@param cExpirFunc, caracter, nome da rotina que deve ser descontinuada
@param cDescrFunc, caracter, descricaod a rotina e nome da rotina que
substitui a rotina descontinuada
@param cExpiraData, caracter, data de experira??o a ser informada deve estar
no formato AAAAMMDD
/*/
lVersionV2 := .F.
oLayout := JsonObject():new()
If Empty(oLayout:FromJson(JsonSA6))
lVersionV2 := oLayout['credentials']:hasProperty('version') .And.
oLayout['credentials']['version'] == 'v2'
If !lVersionV2
// numero de dias que pode ser desabilitada a mensagem
nPauseDays := 7
dDate := Date()
oProfile := FwProFile():New()
oProfile:SetTask("ItauVersion") //Nome da sess�o
oProfile:SetType("FINA710") //Rotina
aLoad := oProfile:Load()
If Empty(aLoad)
cShow := "00000000"
Else
cShow := aLoad[1]
Endif
If cShow == "00000000"
lCheck := DlgExpRot(nPauseDays)
If lCheck
cShow := dtos(date())
oProfile:SetProfile({cShow})
oProfile:Save()
Else
cShow := dtos(date() - (nPauseDays + 1))
oProfile:SetProfile({cShow})
oProfile:Save()
aLoad := {}
EndIf
EndIf
oProfile:Destroy()
oProfile := nil
FWFReeArray(aLoad)
Endif
Endif
RETURN
/*/{Protheus.doc} DlgExpRot
Apresenta uma tela informando sobre a nova vers�o de registro de boletos
@type Function
@author francisco.carmo
@since 27/01/2022
@version 1.0
@param cExpiraData, caracter, data de experira��o a ser informada deve estar
no formato AAAAMMDD
@param nPauseDays, numeric, numero de dias que a mensagem pode ser ocultada
@param cDescrFunc, caracter, descricaod a rotina e nome da rotina que
substitui a rotina descontinuada
@return lCheck, logico, Verdadeiro se foi escolhido para desabilitar a
mensagem por 7 dias
/*/
cEndWeb := "https://tdn.totvs.com/pages/viewpage.action?pageId=661325519"
cMsg3 := ""
oModal := FWDialogModal():New()
oModal:SetCloseButton( .F. )
oModal:SetEscClose( .F. )
oModal:setTitle(STR0042) // "Existe vers�o atualizada para registro de
boleto"
oModal:createDialog()
oSay3 := TSay():New(50,10,{||cMsg3},oContainer,,,,,,.T.,,,220,20,,,,,,.T.)
oSay3:bLClicked := {|| MsgRun( STR0048, "URL",{||
ShellExecute("open",cEndWeb,"","",1) } ) } // "Abrindo o link... Aguarde..."
lCheck := .F.
oCheck1 := TCheckBox():New(100,10,i18n(STR0046,{strzero(nPauseDays,2)}) ,{|x|
If(Pcount()==0,lCheck,lCheck:=x)},oContainer,220,21,,,,,,,,.T.,,,) // "N�o mostrar
essa tela nos pr�ximos 07 dias"
oModal:Activate()
Return lCheck
/*/{Protheus.doc} VldBanB001
Realiza a valida��o dos campos EE_VARCART, EE_CODEMP e EE_FAXATU quando for
banco do BRASIL
@type Function
@author francisco.carmo
@since 15/08/2022
@version 1.0
@param caracter,
@return lRet, logico, Verdadeiro se foi validado todas as condi��es do
prenchimento dos campos
/*/
cTemp := GetNextAlias()
cRet := ""
lRet := .T.
cQuery := changeQuery(cQuery)
If (cTemp)->A6_BCOOFI == '001'
While (cTemp)->(!Eof())
If Empty((cTemp)->EE_VARCART)
cRet += CHR(10) + CHR(10) + STR0051 // "Necess�rio preenchimento do
campo Varia��o de Conta (EE_VARCART)."
Endif
If Empty((cTemp)->EE_CODEMP)
cRet += CHR(10) + CHR(10) + STR0052 // "Necess�rio preenchimento do
campo C�digo da Empresa (EE_CODEMP)."
Endif
lRet := VldJsonBB(cTemp)
If !lRet
cRet += CHR(10) + CHR(10) + STR0053 //" O campo Faixa Atual dever�
conter o tamanho m�ximo de 10 caracteres (EE_FAXATU)."
ElseIf Empty((cTemp)->EE_FAXATU)
cRet += CHR(10) + CHR(10) + STR0054 //" O campo Faixa Atual dever�
conter valor para controle do Nosso N�mero (EE_FAXATU)."
Endif
(cTemp)->(DbSkip())
Enddo
Endif
If !Empty(cRet)
Help("", 1, "SEE_VALBB001", , cRet, 1,,,,,,, { STR0055 }) //"Revisar o(s)
campo(s) assinalado(s)."
lRet := .F.
Endif
(cTemp)->(DBCloseArea())
Return lRet
/*/{Protheus.doc} VldJsonBB
Realiza a valida��o do campo EE_FAXATU quando for banco do BRASIL
@type Function
@author francisco.carmo
@since 15/08/2022
@version 1.0
@param caracter,
@return lRet, logico, Verdadeiro se foi validado todas as condi��es do
prenchimento dos campos
/*/
lRet := .F.
nFaix := 0
If nFaixa == 0
lRet := .T.
Else
lRet := Iif(nFaixa > 0 .And. Len(cValToChar(nFaixa)) <= 10 , .T. , .F. )
Endif
Return lRet