Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Produto:

Solucoes_totvs
SolucaoTOTVS Prestadores de Serviços Terceirização

Linha de Produto:

Linhas_totvs
LinhaLinha Protheus

Segmento:

Segmentos_totvs
SegmentoServiços

Módulo:

Modulos_cross_segmentos
ModulosCrossSegmentosTOTVS Backoffice (Linha Protheus) - Gestão de serviços (SIGATEC)

Função:

TECA870.PRW

País:Brasil
Ticket:Não há.
Requisito/Story/Issue (informe o requisito relacionado) :DSERSGS-19235
Aviso
titleObservação

Estas informações são somente uma sugestão para criação de processo específico do ambiente do cliente portanto não será dado manutenção e devendo ser usado e alterado conforme a necessidade específica de cada cliente.

02. SITUAÇÃO/REQUISITO

Necessidade de importar as agendas de atendentes de Orçamentos/Contratos para outros Orçamentos/Contratos através de funções/rotinas específicas.

...

Documentação contendo os detalhes para configurar ambiente e funções/rotinas específicas para permitir importar as agendas de atendentes de Orçamentos/Contratos para outros Orçamentos/Contratos.

04. DEMAIS INFORMAÇÕES

Necessário a criação dos campos específicos conforme abaixo para permitir a inclusão de um Orçamento e informar os códigos de Orçamento, Locais e Recursos Humanos que serão usados para importação das agendas dos Atendentes para este novo Orçamento/Contrato.


Informações
titleAtenção

Necessário uso do ponto de entrada AT870NWMNU como sugestão para criação de opção no menu Ações Relacionadas na Gestão de Contratos, onde será disparado a importação das agendas dos Atendentes do Contrato conforme Orçamento, Locais e Recursos Humanos informados  neste Contrato posicionado.

Bloco de código
languagetext
#INCLUDE "PROTHEUS.CH"

//----------------------------------------------
/*/{Protheus.doc} Ponto de Entrada AT870NWMNU/*/
//----------------------------------------------
User Function AT870NWMNU()
Local aRetMenu := {}
Local nC   := 0
Local nTam := 0

If ValType(PARAMIXB) == "A"
    nTam := Len(PARAMIXB)
    For nC := 1 To nTam
        aAdd(aRetMenu, aClone(PARAMIXB[nC]))
    Next nC
EndIf

aAdd(aRetMenu, {"Importar Agendas", {|| FwMsgRun(Nil,{|oSay| u_MoveAgenda(oSay)}, Nil, "Atualizando...")}, 2})

Return aRetMenu
Bloco de código
languagetext
// MoveAgenda - Atualizar Agendas

User Function MoveAgenda(oSay)
Local aInfo     := {}
Local aAux      := {}
Local aCodTFF   := {}
Local aCodTec   := {}
Local aCampos   := {}
Local cAliasABQ	:= GetNextAlias()
Local cAliasABB := GetNextAlias()
Local cAliasTGY := GetNextAlias()
Local cAliasP   := "MNTPRO"
Local cCodTFJ   := (cAliasP)->TFJ_CODIGO
Local cContrt   := ""
Local cConRev   := ""
Local cOriTFJ   := ""
Local cIn2      := ""
Local cSqlTFF   := ""
Local cField    := ""
Local cMsg      := "Nao foram encontrados agendas de atendentes em aberto para o Orcamento/Contrato/Posto/Recursos Humanos informado."
Local dDtIni    := Stod("")
Local dDtFin    := Stod("")
Local lFound    := .F.
Local nPosTFF   := 0
Local nPosTec   := 0
Local nTotal    := 0
Local nPos      := 0
Local nI        := 0
Local nX        := 0

BEGIN TRANSACTION

TFJ->(DbSetOrder(1))
If TFJ->(DbSeek(xFilial("TFJ")+cCodTFJ))
  cContrt := TFJ->TFJ_CONTRT
  cConRev := TFJ->TFJ_CONREV
  cOriTFJ := TFJ->TFJ_XCODOR
  BeginSql Alias cAliasABQ
    SELECT
      TFF.TFF_COD, TFF.TFF_XCODOR, ABQ.ABQ_CONTRT, ABQ.ABQ_ITEM, ABQ.ABQ_ORIGEM, ABQ.ABQ_TOTAL, ABQ.ABQ_SALDO
    FROM %table:ABQ% ABQ
    INNER JOIN %table:TFJ% TFJ ON
      TFJ.TFJ_FILIAL = %xFilial:TFJ% AND
      TFJ.TFJ_CODIGO = %Exp:cOriTFJ% AND
      TFJ.TFJ_STATUS = '1' AND TFJ.%notdel%
    INNER JOIN %table:TFL% TFL ON
      TFL.TFL_FILIAL = %xFilial:TFL%  AND
      TFL.TFL_CODPAI = TFJ.TFJ_CODIGO AND TFL.%notdel%
    INNER JOIN %table:TFF% TFF ON
      TFF.TFF_FILIAL = %xFilial:TFF%  AND
      TFF.TFF_FILIAL = ABQ.ABQ_FILTFF AND
      TFF.TFF_COD    = ABQ.ABQ_CODTFF AND
      TFF.TFF_CODPAI = TFL.TFL_CODIGO AND TFF.%notdel%
    WHERE
      ABQ.ABQ_FILIAL = %xFilial:ABQ% AND ABQ.%notdel%
  EndSql
  While (cAliasABQ)->(!EOF())
    aAux := Array(3)
    aAux[1] := (cAliasABQ)->ABQ_CONTRT+(cAliasABQ)->ABQ_ITEM+(cAliasABQ)->ABQ_ORIGEM // Contrato Origem
    aAux[2] := cContrt+(cAliasABQ)->ABQ_ITEM+(cAliasABQ)->ABQ_ORIGEM // Contrato Destino
    aAux[3] := (cAliasABQ)->ABQ_TOTAL-(cAliasABQ)->ABQ_SALDO // Consumido da configuracao original
    aAdd(aInfo, aAux)
    (cAliasABQ)->(DbSkip())
  EndDo
  (cAliasABQ)->(DbCloseArea())

  If Len(aInfo) > 0 .And. MsgYesNo("Confirma a importacao das Agendas dos Atendentes do Orcamento "+cOriTFJ+" para o Orcamento "+cCodTFJ+"?")
    // Realiza atualizacao da agenda do atendente
    For nX := 1 To LEN(aInfo)
      cIn2 += " '" + aInfo[nX][1] + "' "
      If nX <> LEN(aInfo)
        cIn2 += ","
      EndIf
    Next nX
    cIn2 := "% IN ("+cIn2+") %"

    BeginSQL Alias cAliasABB
      SELECT ABB_IDCFAL, ABB_CODTEC, ABB_DTINI, ABB_HRINI, ABB_DTFIM, ABB.R_E_C_N_O_ AS REGISTRO
      FROM %Table:ABB% ABB
      WHERE ABB.ABB_FILIAL = %xFilial:ABB%
        AND ABB.ABB_CHEGOU <> "S" AND ABB.ABB_ATENDE <> "1" AND ABB.%NotDel%
        AND ABB.ABB_IDCFAL %Exp:cIn2%
      ORDER BY 1, 2, 3
    EndSQL

    While (cAliasABB)->(!EOF())
      oSay:SetText("Agenda - Atendente: "+(cAliasABB)->ABB_CODTEC+" - Data: "+(cAliasABB)->ABB_DTINI)
      ProcessMessages()
      // Controle data inicial final
      nPosTec := aScan(aCodTec)
      If nPosTec == 0
        aAdd(aCodTec,{(cAliasABB)->ABB_CODTEC,SToD((cAliasABB)->ABB_DTINI),SToD((cAliasABB)->ABB_DTINI)})
      Else
        aCodTec[nPosTec, 3] := StoD((cAliasABB)->ABB_DTINI)
      EndIf
      // Encontrar substit
      nPos := aScan(aInfo, {|x| x[1] == (cAliasABB)->ABB_IDCFAL})
      If nPos > 0 
        ABB->(DbGoTo((cAliasABB)->REGISTRO))
        RecLock("ABB", .F.)
        ABB->ABB_IDCFAL := aInfo[nPos][2]
        ABB->(MsUnlock())
        nTotal++
      EndIf
      (cAliasABB)->(DbSkip())
    EndDo
    If Empty(cContrt) .OR. At740Recor(cContrt)
      For nI := 1 To Len(aInfo)
        // Atualizar Saldos
        ABQ->(DbSetOrder(1))
        If ABQ->(DbSeek(xFilial("ABQ")+aInfo[nI][2]))
          RecLock("ABQ", .F.)
          ABQ->ABQ_SALDO := ABQ->ABQ_TOTAL-aInfo[nI][3] // Desconta consumido na config anterior
          MsUnlock()
        EndIf
      Next nI
    EndIf
    // Atualizar gestao de escalas
    aCodTFF := At870CodTFF(cCodTFJ)
    If Len(aCodTFF) > 0
      cSqlTFF := "%("
      For nI:=1 To Len(aCodTFF)
        cSqlTFF += "'" + aCodTFF[nI, 1] + "'"
        If (nI+1) <= Len(aCodTFF)
          cSqlTFF += ","
        EndIf
      Next nI
      cSqlTFF += ")%"
      // Verificar as configuracoes dos efetivos
      BeginSql Alias cAliasTGY
        SELECT TGY.*
        FROM %table:TGY% TGY
        WHERE
          TGY.TGY_FILIAL = %xFilial:TGY% AND
          TGY.TGY_ULTALO <> ' ' AND TGY.%notDel% AND
          TGY.TGY_CODTFF IN %Exp:cSqlTFF%
        EndSQL

        If (cAliasTGY)->(!Eof())
          aCampos := FWSX3Util():GetAllFields("TGY",.F.)
          If Len(aCampos) > 0
            While (cAliasTGY)->(!Eof())
              // Pesquisar datas Inicial e Final
              nPosTFF := aScan(aCodTFF, {|x|x[1]==(cAliasTGY)->TGY_CODTFF})
              If nPosTFF > 0
                nPosTec := aScan(aCodTec, {|x|x[1]==(cAliasTGY)->TGY_ATEND})
                dDtIni := StoD("")
                dDtFin := StoD("")
                If nPosTec > 0
                  dDtIni := aCodTec[nPosTec, 2]
                  dDtFin := aCodTec[nPosTec, 3]
                EndIf
                // Atualizacao configuracoes
                dbSelectArea("TGY")
                TGY->(DbSetOrder(1))
                lFound := TGY->(DbSeek(xFilial("TGY")+(cAliasTGY)->TGY_ESCALA+(cAliasTGY)->TGY_CODTDX+aCodTFF[nPosTFF, 2]+(cAliasTGY)->TGY_ITEM))
                RecLock("TGY", !lFound)
                For nX := 1 to Len(aCampos)
                  cField := AllTrim(aCampos[nX])
                  If cField == "TGY_CODTFF"
                    TGY->TGY_CODTFF := aCodTFF[nPosTFF, 2]
                  ElseIf cField == "TGY_DTINI" .And. !Empty(dDtIni)
                    TGY->TGY_DTINI := dDtIni
                  ElseIf cField == "TGY_DTFIM" .And. !Empty(dDtFin)
                    TGY->TGY_DTFIM := dDtFin
                  ElseIf cField == "TGY_ULTALO" .And. !Empty(dDtFin)
                    TGY->TGY_ULTALO := dDtFin
                  ElseIf FWSX3Util():GetFieldType(cField) == "D"
                    TGY->&(cField) := SToD((cAliasTGY)->&(cField))
                  Else
                    TGY->&(cField) := (cAliasTGY)->&(cField)
                  EndIf
                Next nX
              TGY->(MsUnlock())
            EndIf
            (cAliasTGY)->(DbSkip())
          EndDo
          (cAliasTGY)->(DbCloseArea())
        EndIf
      EndIf
    EndIf
    If nTotal == 0
      cMsg := "Nao foram encontradas Agendas."
    Else
      cMsg := "Foram processados " + cValToChar(nTotal) + " Agendas."
	EndIf
  Else
    cMsg := "Nao foi informado nenhum Orcamento/Contrato/Posto/Recursos Humano para este Contrato."
  EndIf
EndIf

END TRANSACTION

MsgAlert(cMsg)
Return Nil
Bloco de código
languagetext
//-----------------------------------------------------------------------------------------
/*/{Protheus.doc} At870CodTFF - retornar o codigo do recurso humano dentro do orcamento /*/
//-----------------------------------------------------------------------------------------
Static Function At870CodTFF(cCodTFJ)
Local aRet      := {}
Local cAliasTFJ := GetNextAlias()

BeginSql Alias cAliasTFJ
	SELECT
		TFF.TFF_COD, TFF.TFF_XCODOR
	FROM
		%table:TFJ% TFJ
	INNER JOIN %table:TFL% TFL ON
		TFL.TFL_FILIAL = %xFilial:TFL%  AND
		TFL.TFL_CODPAI = TFJ.TFJ_CODIGO AND TFL.%notDel%
	INNER JOIN %table:TFF% TFF ON
		TFF.TFF_FILIAL = %xFilial:TFF%  AND
		TFF.TFF_CODPAI = TFL.TFL_CODIGO AND TFF.%notDel%
	WHERE
		TFJ.TFJ_FILIAL = %xFilial:TFJ% AND
		TFJ.TFJ_CODIGO = %Exp:cCodTFJ% AND TFJ.%notDel%
	GROUP BY
		TFF.TFF_COD, TFF.TFF_XCODOR
EndSql

While (cAliasTFJ)->(!Eof())
	aAdd(aRet,{(cAliasTFJ)->TFF_COD, (cAliasTFJ)->TFF_XCODOR})
	(cAliasTFJ)->(DbSkip())
EndDo

(cAliasTFJ)->(dbCloseArea())
Return(aRet)

//-------------------------------------------------------------
/*/{Protheus.doc} ConsLocOri - Consulta F3 campo TFL_XCODOR /*/
//-------------------------------------------------------------
User Function ConsLocOri()
Local cFiltro  := ""
Local oModel  := FwModelActive()
Local oMdlTFJ := oModel:GetModel("TFJ_REFER")
Local oMdlTFL := oModel:GetModel("TFL_LOC")

If oMdlTFL:Length() > 0
  cFiltro := "TFL->TFL_LOCAL == '" + oMdlTFL:GetValue("TFL_LOCAL") + "' .AND. TFL->TFL_CONTRT <> ' ' .AND. TFL->TFL_CODPAI == '" + oMdlTFJ:GetValue("TFJ_XCODOR") + "'"
  cFiltro := "@#" + cFiltro + "@#"
EndIf

Return cFiltro

//------------------------------------------------------------
/*/{Protheus.doc} ConsRHOri - Consulta F3 campo TFF_XCODOR /*/
//------------------------------------------------------------
User Function ConsRHOri()
Local cFiltro := ""
Local oModel  := FwModelActive()
Local oMdlTFL := oModel:GetModel("TFL_LOC")
Local oMdlTFF := oModel:GetModel("TFF_RH")

If oMdlTFF:Length() > 0
  cFiltro := "TFF->TFF_PRODUT == '" + oMdlTFF:GetValue("TFF_PRODUT") + "' .AND. TFF->TFF_CONTRT <> ' ' .AND. TFF->TFF_CODPAI == '" + oMdlTFL:GetValue("TFL_XCODOR") + "'"
  cFiltro := "@#" + cFiltro + "@#"
EndIf

Return cFiltro

//---------------------------------------------------------
/*/{Protheus.doc} ValLocOri - Valid do campo TFL_XCODOR /*/
//---------------------------------------------------------
User Function ValLocOri()
Local lRet    := .F.
Local oModel  := FwModelActive()
Local oMdlTFJ := oModel:GetModel("TFJ_REFER")
Local oMdlTFL := oModel:GetModel("TFL_LOC")
Local cAlias  := GetNextAlias()

BeginSql Alias cAlias
  SELECT 1
  FROM %table:TFL% TFL
  WHERE
    TFL.TFL_FILIAL = %xFilial:TFL% AND
    TFL.TFL_CODIGO = %Exp:oMdlTFL:GetValue("TFL_XCODOR")% AND
    TFL.TFL_CODPAI = %Exp:oMdlTFJ:GetValue("TFJ_XCODOR")% AND
    TFL.TFL_LOCAL  = %Exp:oMdlTFL:GetValue("TFL_LOCAL")%  AND
    TFL.TFL_CONTRT <> ' ' AND TFL.%notDel%
EndSql

If (cAlias)->(!Eof())
  lRet := .T.
EndIf

(cAlias)->(dbCloseArea())

Return lRet

//--------------------------------------------------------
/*/{Protheus.doc} ValRHOri - Valid do campo TFF_XCODOR /*/
//--------------------------------------------------------
User Function ValRHOri()
Local lRet    := .F.
Local oModel  := FwModelActive()
Local oMdlTFL := oModel:GetModel("TFL_LOC")
Local oMdlTFF := oModel:GetModel("TFF_RH")
Local cAlias  := GetNextAlias()

BeginSql Alias cAlias
  SELECT 1
  FROM %table:TFF% TFF
  WHERE
    TFF.TFF_FILIAL = %xFilial:TFF% AND
    TFF.TFF_COD    = %Exp:oMdlTFF:GetValue("TFF_XCODOR")% AND
    TFF.TFF_PRODUT = %Exp:oMdlTFF:GetValue("TFF_PRODUT")% AND
    TFF.TFF_LOCAL  = %Exp:oMdlTFL:GetValue("TFL_LOCAL")%  AND
    TFF.TFF_CONTRT <> ' ' AND TFF.%notDel%
EndSql

If (cAlias)->(!Eof())
  lRet := .T.
EndIf

(cAlias)->(dbCloseArea())

Return lRet

04. DEMAIS INFORMAÇÕES

Alterado consulta padrão:

Aviso
titleObservação

Esta funcionalidade depende da criação dos campos e consultas específicas usados no Cadastro de Orçamentos Simplif. para permitir relacionar os Postos/Recursos Humanos com Orçamentos;Contratos vigentes, conforme exemplos abaixo

Aviso
titleObservação

A melhoria depende da aplicação da atualização liberada no pacote de expedição do módulo RH a partir de 17/06/2024 e da execução do UPDDISTR com o dicionário diferencial para os releases iguais ou superiores à versão 12.1.33.

Toggle Cloak
idupddistr
Clique aqui para exibir ou esconder as alterações de dicionário.

Chave
Cloak
idupddistr

Criação dos campos específicos:

CampoTipoTamanhoTítuloDescriçãoMascaraValidaçãoConsulta F3ContextoModo
TFJ_CODORIXCODORC11Orç. Orig. Orçamento Origem@!
TFJRealAlterar
TFL_CODORIXCODORC6Local Orig,   Local Origem@!U_ValLocOri()TFLORIRealAlterar
TFF_CODORIXCODORC6Posto Orig. Posto Origem@!U_ValRHOri()TFFORIRealAlterar

Foram alterados os índicesCriação das Consultas específicas:

IndiceOrdem
ConsultaTipoSeq.ColunaDescriçãoConteúdo
TCW
TFLORI1
TCW_FILIAL+TCW_CODIGO+TCW_REVISACódigo + Revisão
TCX1TCX_FILIAL+TCX_CODIGO+TCX_REVISACódigo + Revisão
TDZ1TDZ_FILIAL+TDZ_CODIGO+TDZ_REVISACódigo + Revisão
TEX1TEX_FILIAL+TEX_CODIGO+TEX_REVISACódigo + Revisão
TXN1TXN_FILIAL+TXN_CODIGO+TXN_REVISACódigo + Revisão
TXO1TXO_FILIAL+TXO_COD+TXO_REVISACódigo + Revisão
AliasTipoSequenciaColunaDescriçãoConteúdo
TCW40104RevisãoTCW_REVISA
TCW601TCW->TCW_ULTIMA<>"2"

...

01DBLocais OrigemTFL
TFLORI20101Codigo
TFLORI40101CodigoTFL_CODIGO
TFLORI40102Local Atend.TFL_LOCAL
TFLORI40103Nr. ContratoTFL_CONTRT
TFLORI501

TFL->TFL_CODIGO
TFLORI601

@#U_ConsLocOri()
ConsultaTipoSeq.ColunaDescriçãoConteúdo
TFFORI101DBPostos OrigemTFF
TFFORI20101Codigo
TFFORI40101CodigoTFF_COD
TFFORI40102ProdutoTFF_PRODUT
TFFORI40103Local Atend.TFF_LOCAL
TFFORI40104Nr. ContratoTFF_CONTRT
TFFORI501

TFF->TFF_COD
TFFORI601

@#U_ConsRHOri()

05. ASSUNTOS RELACIONADOS