Árvore de páginas


01. DADOS GERAIS

Produto:

TOTVS Prestadores de Serviços Terceirização

Linha de Produto:

Linha Protheus

Segmento:

Serviços

Módulo:

TOTVS 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



Observaçã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.

03. SOLUÇÃO

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.

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.


Atençã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.

#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
// 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
//-----------------------------------------------------------------------------------------
/*/{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

Observaçã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.

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

05. ASSUNTOS RELACIONADOS