Árvore de páginas

Versões comparadas

Chave

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

...

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
languagedelphitext
#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

//-------------------------------------------------
/*/{Protheus.doc}
Bloco de código
languagetext
// MoveAgenda - Atualzar Agebndas/*/
//-------------------------------------------------
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      := "NãoNao foram encotradosencontrados agendas de atendentes em aberto para o OrçamentoOrcamento/Contrato/Posto/Recursos HumanoHumanos 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_FILIAL+TFJ_CODIGO
If TFJ->TFJ->(DbSeek(xFilial("TFJ")+cCodTFJ))

	// Pesquisar Orcamento/Contrato Origem
    cContrt := TFJ->TFJ_CONTRT
    cConRev := TFJ->TFJ_CONREV
    cOriTFJ := TFJ->TFJ_XCODOR
	  BeginSql Alias cAliasABQ
		SELECT
			    SELECT
      TFF.TFF_COD,
			 TFF.TFF_XCODOR,
			 ABQ.ABQ_CONTRT,
			 ABQ.ABQ_ITEM,
			 ABQ.ABQ_ORIGEM,
			 ABQ.ABQ_TOTAL,
			 ABQ.ABQ_SALDO
		FROM     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 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
			    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
		// Realiza atuacao da agenda do atendente
		For nX := 1 To LEN(aInfo)
			cIn2 += " '" +  .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         cIn2 += ","
			EndIf
		      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        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())
			// Reservar dataa inicial e final
			nPosTec oSay:= aScan(aCodTec, {|x| x[1] == SetText("Agenda - Atendente: "+(cAliasABB)->ABB_CODTEC})
			If nPosTec == 0
				aAdd(aCodTec,{(cAliasABB)->ABB_CODTEC, StoD((+" - Data: "+(cAliasABB)->ABB_DTINI), StoD((cAliasABB)->ABB_DTINI)})
			Else
				aCodTec[nPosTec, 3] := StoD((cAliasABB)->ABB_DTINI)
			EndIf
			 // Encontrar registro substituido
			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] // Atualizar IDCFAL
				ABB->(MsUnlock())
				nTotal++
			EndIf
			(cAliasABB)->(DbSkip())
		EndDo
		(cAliasABB)->(DbCloseArea())

		If Empty(cContrt) .OR. At740Recor(cContrt)
			For nI := 1 To Len(aInfo)
				// Atualizar Saldos
				ABQ->(DbSetOrder(1)) //ABQ_FILIAL + ABQ_CONTRT + ABQ_ITEM + ABQ_ORIGEM
				If ABQ->(DbSeek(xFilial("ABQ")+aInfo[nI][2]))
					RecLock("ABQ", .F.)
					ABQ->ABQ_SALDO := ABQ->ABQ_TOTAL - aInfo[nI][3] // Desconta o que ja foi consumido na configuracao anterior
					MsUnlock()
				EndIf
			Next nI
		EndIf

		// Atualizar informacao da gestao de escalas
		aCodTFF := At870CodTFF(cOriTFJ)
		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
							// Realiza a atualizacao das configuracoes do efetivo TGY
							dbSelectArea("TGY")
							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)
								If aCampos[nX] == "TGY_CODTFF"
									TGY->TGY_CODTFF := aCodTFF[nPosTFF, 2]
								ElseIf aCampos[nX] == "TGY_DTINI" .And. !Empty(dDtIni)
									TGY->TGY_DTINI := dDtIni
								ElseIf aCampos[nX] $ "TGY_DTFIM|TGY_ULTALO" .And. !Empty(dDtFin)
									TGY->TGY_DTFIM := dDtFin
								ElseIf FWSX3Util():GetFieldType( aCampos[nX] ) == "D"
									TGY->&(aCampos[nX]) := SToD((cAliasTGY)->&(aCampos[nX]))
								Else
									TGY->&(aCampos[nX]) := (cAliasTGY)->&(aCampos[nX])
								EndIf
							Next nX
							TGY->(MsUnlock())
						EndIf
						
      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
					          EndDo
          (cAliasTGY)->(DbCloseArea())
				EndIf
			EndIf
		EndIf
		        EndIf
      EndIf
    EndIf
    If nTotal == 0
			      cMsg := "NãoNao foram encontradas Agendas."
		Else
			    Else
      cMsg := "Foram processados " + cValToChar(nTotal) + " Agendas."
		EndIf
	  Else
		    cMsg := "NãoNao foi informado nenhum OrçamentoOrcamento/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
		  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
		  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

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.

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

Cloak
idupddistr

Criação dos campos específicos:

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

Criação das Consultas específicas:

ConsultaTipoSeq.ColunaDescriçãoConteúdo
TFLORI101DBLocais 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()

...