...
Produto: | Solucoes_totvs |
---|
Solucao | TOTVS Prestadores de Serviços Terceirização |
---|
|
|
---|
Linha de Produto: | |
---|
Segmento: | |
---|
Módulo: | Modulos_cross_segmentos |
---|
ModulosCrossSegmentos | 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 |
---|
Aviso |
---|
|
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 |
---|
|
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 |
---|
|
#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 |
---|
|
// 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 |
---|
|
//-----------------------------------------------------------------------------------------
/*/{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
Aviso |
---|
|
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 |
---|
|
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. Clique aqui para exibir ou esconder as alterações de dicionário. Cloak |
---|
| Criação dos campos específicos: Campo | Tipo | Tamanho | Título | Descrição | Mascara | Validação | Consulta F3 | Contexto | Modo |
---|
TFJ_CODORIXCODOR | C | 11 | Orç. Orig. | Orçamento Origem | @! |
| TFJ | Real | Alterar | TFL_CODORIXCODOR | C | 6 | Local Orig, | Local Origem | @! | U_ValLocOri() | TFLORI | Real | Alterar | TFF_CODORIXCODOR | C | 6 | Posto Orig. | Posto Origem | @! | U_ValRHOri() | TFFORI | Real | Alterar |
Foram alterados os índicesCriação das Consultas específicas: | Indice | Ordem | ChaveConsulta | Tipo | Seq. | Coluna | Descrição | Conteúdo |
---|
TCWTCW_FILIAL+TCW_CODIGO+TCW_REVISA | Código + Revisão |
---|
TCX | 1 | TCX_FILIAL+TCX_CODIGO+TCX_REVISA | Código + Revisão | TDZ | 1 | TDZ_FILIAL+TDZ_CODIGO+TDZ_REVISA | Código + Revisão | TEX | 1 | TEX_FILIAL+TEX_CODIGO+TEX_REVISA | Código + Revisão | TXN | 1 | TXN_FILIAL+TXN_CODIGO+TXN_REVISA | Código + Revisão | TXO | 1 | TXO_FILIAL+TXO_COD+TXO_REVISA | Código + Revisão | Alterado consulta padrão: Alias | Tipo | Sequencia | Coluna | Descrição | Conteúdo |
---|
TCW | 4 | 01 | 04 | Revisão | TCW_REVISA | TCW | 6 | 01 | TCW->TCW_ULTIMA<>"2" |
|
...
| 01 | DB | Locais Origem | TFL | TFLORI | 2 | 01 | 01 | Codigo |
| TFLORI | 4 | 01 | 01 | Codigo | TFL_CODIGO | TFLORI | 4 | 01 | 02 | Local Atend. | TFL_LOCAL | TFLORI | 4 | 01 | 03 | Nr. Contrato | TFL_CONTRT | TFLORI | 5 | 01 |
|
| TFL->TFL_CODIGO | TFLORI | 6 | 01 |
|
| @#U_ConsLocOri() |
Consulta | Tipo | Seq. | Coluna | Descrição | Conteúdo |
---|
TFFORI | 1 | 01 | DB | Postos Origem | TFF | TFFORI | 2 | 01 | 01 | Codigo |
| TFFORI | 4 | 01 | 01 | Codigo | TFF_COD | TFFORI | 4 | 01 | 02 | Produto | TFF_PRODUT | TFFORI | 4 | 01 | 03 | Local Atend. | TFF_LOCAL | TFFORI | 4 | 01 | 04 | Nr. Contrato | TFF_CONTRT | TFFORI | 5 | 01 |
|
| TFF->TFF_COD | TFFORI | 6 | 01 |
|
| @#U_ConsRHOri() |
|
|
05. ASSUNTOS RELACIONADOS