Histórico da Página
FT600IMP - Impressão Customizada da Proposta Comercial
Características do Requisito
Linha de Produto: | Microsiga Protheus® | ||||
Segmento: | Serviços | ||||
Módulo: | Faturamento | ||||
Rotina: |
|
Descrição
Ponto de Entrada que realiza a impressão customizada da proposta comercial.
Sem a utilização deste PE é utiliza a rotina padrão FATR600.
Ponto de Entrada
Descrição: |
Informe o Menu em que estará localizada a rotina
Localização:
FT600IMP - Impressão customizada da Proposta Comercial |
Eventos: |
Impressão |
Programa Fonte: |
FATN600.PRW |
Função: |
Informe o Nome do(s) produto(s) a ser utilizado ou “Todos”
Retorno:
Nome | Tipo | Descrição | Obrigatório |
|
|
|
|
|
|
|
|
|
|
|
Exemplo:
#Include 'Protheus.ch'
User Function CN120ALT()
Local aCab:= PARAMIXB[1]
Local cTipo:= PARAMIXB[2]
If cTipo == '1'
aCab[4][2]:= 'NF' //Validações do usuário
EndIf
Return aCabA600Impr() |
Bloco de código | ||||
---|---|---|---|---|
| ||||
#INCLUDE "PROTHEUS.CH"
//-------------------------------------------------------------------------------------
/*/{Protheus.doc} FT600IMP
RDMAKE para Impressao Customizada da Proposta Comercial
@author TOTVS SP
@version P12
@since 13/09/2016
@return Nil
/*/
//-------------------------------------------------------------------------------------
User Function FT600IMP()
Private cNomeFile := 'PROPOSTA-COMERCIAL.dot'
Private cPath := GetTempPath(.T.)
Private cFullPath := cPath + cNomeFile
Private cSrvPath := alltrim(GetNewPar("MV_DOCAR","\system\modelos\"))
Private cSrvFull := cSrvPath + cNomeFile
Processa( {|| U_VlMoPrp() })
Return
//-------------------------------------------------------------------------------------
/*/{Protheus.doc} VlMoPrp
RDMAKE para Impressao Customizada da Proposta Comercial
@author TOTVS SP
@version P12
@since 13/09/2016
@return Nil
/*/
//-------------------------------------------------------------------------------------
User Function VlMoPrp()
If U_CpDotPrp()
U_GrDocPrp()
Else
MsgStop('Erro na execução da copia do arquivo Modelo do Microsoft Word para a estação de trabalho')
EndIf
Return
//-------------------------------------------------------------------------------------
/*/{Protheus.doc} CpDotPrp
Funcao responsavel por promover a copia do arquivo DOT da impressao de orcamentos
do servidor Protheus para a Estacao de Trabalho do Usuario. Arquivo fica armazenado no diretorio
TEMP da estacao local. Sempre apaga o arquivo caso ele exista na estacao
@author TOTVS SP
@version P12
@since 13/09/2016
@return Lógico
/*/
//-------------------------------------------------------------------------------------
User Function CpDotPrp()
Local nTry := 5
Local nI := 1
Local lOk := .T.
//Verifica se o arquivo existe. Se existe, apaga ele.
If File(cNomeFile)
For nI := 1 to nTry
If FErase(cFile) <> -1
lOk := .T.
exit
Else
lOk := .F.
Sleep(1000)
EndIf
Next nT
EndIf
//Copia o Arquivo para a estacao
If lOk
lOk := CpyS2T(cSrvFull,cPath,.T.)
EndIf
Return lOk
//-------------------------------------------------------------------------------------
/*/{Protheus.doc} GrDocPrp
RDMAKE para Impressao Customizada da Proposta Comercial
@author TOTVS SP
@version P12
@since 13/09/2016
@return Nil
/*/
//-------------------------------------------------------------------------------------
User Function GrDocPrp(cPath,cNomeFile)
Local aArea := GetArea() //Armazena area atual
Local hWord := Nil //Objeto usado para preenchimento
Local cProposta := Space(TamSX3("ADY_PROPOS")[1]) //Numero da proposta comercial
Local cDtEmissao := Space(TamSX3("CJ_EMISSAO")[1]) //Data de emissao
Local cCodigo := Space(TamSX3("A1_COD")[1]) //Codigo da entidade (cliente ou prospect)
Local cLoja := Space(TamSX3("A1_LOJA")[1]) //Loja
Local cNome := Space(TamSX3("A1_NOME")[1]) //Nome
Local cEndereco := Space(TamSX3("A1_END")[1]) //Endereco
Local cBairro := Space(TamSX3("A1_BAIRRO")[1]) //Bairro
Local cCidade := Space(TamSX3("A1_MUN")[1]) //Cidade
Local cUF := Space(TamSX3("A1_ESTADO")[1]) //Estado (UF)
Local cPRevisa := ' ' //Revisao dos itens da proposta comercial gravado na tabela ADZ
Local aTipo09 := {} //Array que armazena o tipo de pagamento 9
Local aCronoFin := {} //Array que armazena o cronograma financeiro
Local cRevisao := ' ' //Controla a revisao do documento
Local nTotProsp := 0 //Total da proposta comercial
Local nI := 0 //Usado no laco do While
Local nX := 0 //Usado no laco do For
Local nY := 0 //Usado no laco do While
Local nCount := 0 //Incremento para utilizar no itens de cond. pagto.
//Monta a conexao com o arquivo WORD
hWord := OLE_CreateLink()
OLE_NewFile(hWord, cFullPath)
cProposta := ADY->ADY_PROPOS
cPRevisa := ADY->ADY_PREVIS
cDescEnt := Space(30)
cDtEmissao := Dtoc(ADY->ADY_DATA)
aTipo09 := Ft600Tip09(cProposta,cPRevisa)
aCronoFin := Ft600CroFin(cProposta,cPRevisa,aTipo09)
//Busca dados do cliente
If ADY->ADY_ENTIDA == "1"
dbSelectArea("SA1")
dbSetOrder(1)
If dbSeek(xFilial("SA1")+ADY->ADY_CODIGO+ADY->ADY_LOJA)
cCodigo := ADY->ADY_CODIGO
cLoja := ADY->ADY_LOJA
cNome := Replace(alltrim(SA1->A1_NOME)," "," ")
cEndereco := alltrim(SA1->A1_END)
cBairro := alltrim(SA1->A1_BAIRRO)
cCidade := alltrim(SA1->A1_MUN)
cUF := alltrim(SA1->A1_EST)
cDescEnt := alltrim(SA1->A1_NREDUZ)
Endif
Else
dbSelectArea("SUS")
dbSetOrder(1)
If dbSeek(xFilial("SUS")+ADY->ADY_CODIGO+ADY->ADY_LOJA)
cCodigo := ADY->ADY_CODIGO
cLoja := ADY->ADY_LOJA
cNome := alltrim(SUS->US_NOME)
cEndereco := alltrim(SUS->US_END)
cBairro := alltrim(SUS->US_BAIRRO)
cCidade := alltrim(SUS->US_MUN)
cUF := alltrim(SUS->US_EST)
cDescEnt := alltrim(SUS->US_NREDUZ)
Endif
Endif
cNomeWord := ''
cNomeWord := 'P'+cProposta
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Descricao da Oportunidade de Venda ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
OLE_SetDocumentVar(hWord,'cRevisao' ,cPRevisa)
OLE_SetDocumentVar(hWord,'cDesOport',Capital(POSICIONE("AD1",1,xFilial("AD1")+ADY->ADY_OPORTU,"AD1_DESCRI")))
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Atualiza variaveis do cabecalho - Variaveis³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
OLE_SetDocumentVar(hWord,'cCabec' ,'Teste')
OLE_SetDocumentVar(hWord,'cProposta' ,cProposta)
OLE_SetDocumentVar(hWord,'cDtEmissao' ,cDtEmissao)
OLE_SetDocumentVar(hWord,'cCodigo' ,cCodigo)
OLE_SetDocumentVar(hWord,'cNome' ,cNome)
OLE_SetDocumentVar(hWord,'cEndereco' ,cEndereco)
OLE_SetDocumentVar(hWord,'cBairro' ,cBairro)
OLE_SetDocumentVar(hWord,'cCidade' ,cCidade)
OLE_SetDocumentVar(hWord,'cUF' ,cUF)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Atualiza tabela de itens da proposta³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
DbSelectArea("ADZ")
DbSetOrder(3)
If dbSeek(xFilial("ADZ")+cProposta+cPRevisa)
While ADZ->(!Eof()) .and. xFilial("ADZ") == ADZ->ADZ_FILIAL .AND. cProposta == ADZ->ADZ_PROPOS
nI++
OLE_SetDocumentVar(hWord,"cProd"+Alltrim(str(nI)) ,Alltrim( Posicione("SB1",1,xFilial("SB1")+ADZ->ADZ_PRODUT,"B1_DESC") ) )
OLE_SetDocumentVar(hWord,"nQuant"+Alltrim(str(nI)) ,Transform(ADZ->ADZ_QTDVEN,"999,999,999.99"))
OLE_SetDocumentVar(hWord,"nValUni"+Alltrim(str(nI)),Transform(ADZ->ADZ_PRCVEN,"@E 999,999,999.99"))
OLE_SetDocumentVar(hWord,"nTotal"+Alltrim(str(nI)) ,Transform(ADZ->ADZ_TOTAL,"@E 999,999,999.99"))
nTotProsp += ADZ->ADZ_TOTAL
ADZ->(dbSkip())
Enddo
OLE_SetDocumentVar(hWord,'nTotProsp',Transform(nTotProsp,"@E 999,999,999.99"))
Endif
If nI > 0
//Executa a macro para atualizar os itens
OLE_SetDocumentVar(hWord,'nItens_Proposta',alltrim(Str(nI)))
OLE_ExecuteMacro(hWord,"Itens_Proposta")
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Proposta de Servicos ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
DbSelectArea("AF1")
DbSetOrder(4)
If DbSeek(xFilial("AF1")+cProposta)
DbSelectArea("AF5")
DbSetOrder(1)
If DbSeek(xFilial("AF5")+AF1->AF1_ORCAME)
OLE_SetDocumentVar(hWord,"cLine",AllTrim(AF5->AF5_DESCRI))
While AF5->(!EOF()) .AND. xFilial("AF5")+ AF1->AF1_ORCAME == AF5_FILIAL + AF5_ORCAME
nY++
If AF5->AF5_STATUS <> '2'
If Len(AF5_EDT) == 2
OLE_SetDocumentVar(hWord,"cLine"+Alltrim(str(nY)),AllTrim(AF5->AF5_DESCRI))
End
If Len(AF5_EDT) > 2
OLE_SetDocumentVar(hWord,"cLine"+Alltrim(str(nY)),AllTrim(AF5->AF5_DESCRI))
DbSelectArea("AF2")
DbSetOrder(2)
If DbSeek(xFilial("AF2")+AF5->AF5_ORCAME+AF5->AF5_EDT)
While AF2->(!EOF()) .AND. xFilial("AF2")+ AF5->AF5_ORCAME + AF5->AF5_EDT == AF2_FILIAL + AF2_ORCAME + AF2_EDTPAI
nY++
OLE_SetDocumentVar(hWord,"cLine"+Alltrim(str(nY)),Space(2)+AllTrim(AF2->AF2_DESCRI))
AF2->(DbSkip())
End
EndIf
EndIf
EndIf
AF5->(DbSkip())
End
EndIf
EndIf
If nY > 0
OLE_SetDocumentVar(hWord,'nItens_PServico',alltrim(Str(nY)))
OLE_ExecuteMacro(hWord,"Itens_PServico")
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Atualiza a condicoes de pagamento ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
For nX := 1 To Len(aCronoFin)
OLE_SetDocumentVar(hWord,"cParcela"+Alltrim(str(nX)),aCronoFin[nX][1])
OLE_SetDocumentVar(hWord,"dVencto"+Alltrim(str(nX)) ,aCronoFin[nX][2])
OLE_SetDocumentVar(hWord,"nValor"+Alltrim(str(nX)) ,Transform(aCronoFin[nX][3],"@E 999,999,999.99"))
nCount++
Next nX
If nCount > 0
OLE_SetDocumentVar(hWord,'nItens_Cond_Pgto',alltrim(Str(nCount)))
OLE_ExecuteMacro(hWord,"Cond_Pgto")
Endif
//Atualiza todos os campos do documento DOT (Refresh)
OLE_UpDateFields(hWord)
//Trava o Protheus enquanto o Word Estiver Aberto
While .T.
If OLE_WordIsOk(hWord)
Sleep(1000)
Else
OLE_CloseLink(hWord)
exit
EndIf
EndDo
RestArea(aARea)
Return
//-------------------------------------------------------------------------------------
/*/{Protheus.doc} Ft600Rev
Cria revisao do documento.
@author TOTVS SP
@version P12
@since 13/09/2016
@return Caracter
/*/
//-------------------------------------------------------------------------------------
Static Function Ft600Rev(cProposta)
Local cLocRev := '' //Localiza a se existe docs de revisao no servidor
Local cRevisao := '' //Revisao do documento
Local cNomeWord := "P"+cProposta //P+Numero da Proposta
Local nCount := 1 //Incremento
DbSelectArea("ACB")
DbSetOrder(2)
If !DbSeek(xFilial("ACB")+Upper(cNomeWord+'.doc'))
cRevisao := cNomeWord
Return(cRevisao)
Else
While ACB->(!Eof())
cLocRev := ' - R'+cValToChar(nCount)
If !DbSeek(xFilial("ACB")+Upper(cNomeWord+cLocRev+'.doc'))
cRevisao := cNomeWord+cLocRev
Exit
EndIf
nCount++
ACB->(DbSkip())
End
EndIf
Return(cRevisao)
//-------------------------------------------------------------------------------------
/*/{Protheus.doc} Ft600Tip09
Inicializa o vetor aTipo09 com as parcelas previamente salvas.
@author TOTVS SP
@version P12
@since 13/09/2016
@return Array
/*/
//-------------------------------------------------------------------------------------
Static Function Ft600Tip09(cProposta,cPRevisa)
Local aArea := GetArea()
Local aAreaSCJ := SCJ->(GetArea())
Local aAreaSCK := SCK->(GetArea())
Local aProdutos := {}
Local aTipo09 := {}
Local nIt := 0
Local nNumParc := SuperGetMv("MV_NUMPARC")
Local cProxParc := ""
Local dDtVenc := Nil
Local nVlParc := 0
Local nPc := 0
dbSelectArea("SE4")
dbSetOrder(1)
DbSelectarea("SCJ")
DbSetOrder(1)
DbSelectArea("SCK")
DbSetOrder(1)
DbSelectArea("ADZ")
DbSetOrder(3)
If dbSeek(xFilial("ADZ")+cProposta+cPRevisa)
While ADZ->(!EOF()) .AND. ADZ_FILIAL == xFilial("ADZ") .AND. ADZ_PROPOS == cProposta
aAdd(aProdutos,{ADZ_PRODUT,ADZ_ORCAME,ADZ_ITEMOR,ADZ_ITEM})
ADZ->(DbSkip())
End
EndIf
For nIt := 1 to Len(aProdutos)
If SCK->(DbSeek(xFilial("SCK") + aProdutos[nIt][02] + aProdutos[nIt][03] + aProdutos[nIt][01]))
SCJ->(DbSeek(xFilial("SCJ") + SCK->CK_NUM + SCK->CK_CLIENTE + SCK->CK_LOJA ))
SE4->(DbSeek(xFilial("SE4") + SCJ->CJ_CONDPAG))
If SE4->E4_TIPO == "9"
cProxParc := "0"
For nPc:=1 To nNumParc
cProxParc := Soma1(cProxParc)
dDtVenc := &("SCJ->CJ_DATA"+cProxParc)
nVlParc := &("SCJ->CJ_PARC"+cProxParc)
If nVlParc > 0
aadd( aTipo09,{SCK->CK_PRODUTO, dDtVenc , nVlParc ,SCJ->CJ_CONDPAG, aProdutos[nIt][04] } )
Endif
Next
Endif
EndIf
Next nIt
RestArea(aAreaSCJ)
RestArea(aAreaSCK)
RestArea(aArea)
Return(aTipo09)
//-------------------------------------------------------------------------------------
/*/{Protheus.doc} Ft600CroFin
Monta o Cronograma Financeiro.
@author TOTVS SP
@version P12
@since 13/09/2016
@return Array
/*/
//-------------------------------------------------------------------------------------
Static Function Ft600CroFin(cProposta,cPRevisa,aTipo09)
Local aArea := GetArea()
Local aVencto := {}
Local aCronoAtu := {}
Local nC := 0
Local nA := 0
Local nI := 0
Local nPosData := 0
Local cTipoPar := SuperGetMv("MV_1DUP")
Local cSequencia := " "
Local aProdutos := {}
Local aCronoFin := {}
DbSelectArea("ADZ")
DbSetOrder(3)
If dbSeek(xFilial("ADZ")+cProposta+cPRevisa)
While ADZ->(!EOF()) .AND. ADZ_FILIAL == xFilial("ADZ") .AND. ADZ_PROPOS == cProposta
aAdd(aProdutos,{ADZ_PRODUT,ADZ_TOTAL,ADZ_CONDPG,ADZ_DT1VEN})
ADZ->(DbSkip())
End
EndIf
For nI:=1 To Len(aProdutos)
dbSelectArea("SE4")
dbSetOrder(1)
IF dbSeek(xFilial("SE4")+aProdutos[nI][03])
If E4_TIPO <> "9"
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Atualiza cronograma financeiro para condicao diferente do tipo 9³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
aVencto := Condicao(aProdutos[nI][02],aProdutos[nI][03],0,dDatabase,0)
For nA:=1 To Len(aVencto)
If !Empty(aProdutos[nI][04]) .AND. aProdutos[nI][04] <> dDataBase .AND. nA == 1
aVencto[nA,1] := aProdutos[nI][04]
Endif
nPosData := aScan( aCronoAtu, { |x| x[1] == aVencto[nA,1] } )
If nPosData == 0
aadd(aCronoAtu,{aVencto[nA,1],aVencto[nA,2]})
Else
aCronoAtu[nPosData,2] += aVencto[nA,2]
Endif
Next nA
Endif
Endif
Next nI
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Atualiza cronograma financeiro para condicao de pagamento tipo 9³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If Len(aTipo09)>0
For nA:=1 To Len(aTipo09)
If Len(aCronoAtu)>0
nPosData := aScan( aCronoAtu, { |x| x[1] == aTipo09[nA,2] } )
Else
nPosData := 0
Endif
If nPosData == 0
aadd(aCronoAtu,{aTipo09[nA,2],aTipo09[nA,3]})
Else
aCronoAtu[nPosData,2] += aTipo09[nA,3]
Endif
Next nA
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Trata o iniciador da parcela inicial ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If cTipoPar == "A"
cSequencia := "9"
Else
cSequencia := "0"
Endif
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Ordena as parcelas pela data de vencimento ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
aCronoAtu := ASort(aCronoAtu,,,{|parc1,parc2|parc1[1]<parc2[1]})
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Atualiza cronograma financeiro ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
For nC:=1 To Len(aCronoAtu)
cSequencia := Soma1(cSequencia)
If nC == 1
aadd(aCronoFin,{"",CtoD(Space(8)),0})
aCronoFin[nC,1] := cSequencia
aCronoFin[nC,2] := aCronoAtu[nC,1]
aCronoFin[nC,3] := aCronoAtu[nC,2]
Else
AAdd(aCronoFin,{cSequencia,aCronoAtu[nC,1],aCronoAtu[nC,2] })
Endif
Next nC
RestArea(aArea)
Return(aCronoFin) |
Visão Geral
Import HTML Content
Conteúdo das Ferramentas
Tarefas