Função que retorna o total do pedido de vendas (com impostos) em AdvPL

Função que retorna o total do pedido de vendas (com impostos) em AdvPL

Olá pessoal…

Hoje vou mostrar uma função que desenvolvi que retorna o valor total do pedido de venda com impostos em AdvPL.


Primeiramente quero agradecer ao meu amigo Rafael Almeida por ter me ajudado na montagem da rotina.

Como exemplo, iremos criar um campo Virtual na SC5, chamado de C5_X_TOTAL, com a propriedade de visualizar, e iremos alterar o Ini Padrão e o Ini Browse, ficando dessa forma:

Ini Padrão e Ini Browse
Ini Padrão e Ini Browse

No Uso, deixe o Browse (caso queira que seja mostrado o total na grid de pedidos) e o Usado (caso queira que mostre um campo para o usuário visualizar).

Se quiser, altere também a ordem, para que ele apareça nos primeiros campos.

Será necessário ter também o Ponto de Entrada M410LIOK (caso você deixe o campo como Usado).

#Include "Protheus.ch"

/*------------------------------------------------------------------------------------------------------*
 | P.E.:  M410LIOK                                                                                      |
 | Autor: Daniel Atilio                                                                                 |
 | Data:  25/08/2016                                                                                    |
 | Desc:  Validação da linha do Pedido de Venda                                                         |
 | Links: http://tdn.totvs.com/pages/releaseview.action?pageId=6784149                                  |
 *------------------------------------------------------------------------------------------------------*/

User Function M410LIOK()
	Local lRet := .T.

	//Atualiza o total
	M->C5_X_TOTAL := u_zTotPed(M->C5_NUM, 2)
	GetDRefresh()
Return lRet

Abaixo um exemplo da tela de pedidos de venda mostrando o total.

Total do Pedido de Venda no Browse
Total do Pedido de Venda no Browse

Abaixo o código fonte completo (A função recebe dois parâmetros, o primeiro é o pedido, e o segundo, é se está fora da tela de alteração do pedido [1] ou dentro dela [2]).

//Bibliotecas
#Include "Protheus.ch"
#Include "TopConn.ch"

/*/{Protheus.doc} zTotPed
Função que retorna o valor total do pedido com os impostos
@author Atilio
@since 25/08/2016
@version undefined
@param cNumPed, characters, Número do Pedido
@param nTipo, numérico, 1 == Browse da SC5, 2 == Dentro da tela do Pedido
@type function
/*/

User Function zTotPed(cNumPed, nTipo)
	Local aArea     := GetArea()
	Local aAreaC5   := SC5->(GetArea())
	Local aAreaB1   := SC6->(GetArea())
	Local aAreaC6   := SB1->(GetArea())
	Local cQryIte   := ""
	Local nValPed   := 0
	Local nNritem   := 0
	Local nAtu
	Default cNumPed := SC5->C5_NUM
	Default nTipo   := 1
	
	//Se for no Browse, já traz o valor total
	If nTipo == 1
		//Seleciona agora os itens do pedido
		cQryIte := " SELECT "
		cQryIte += "    C6_ITEM, "
		cQryIte += "    C6_PRODUTO "
		cQryIte += " FROM "
		cQryIte += "    "+RetSQLName('SC6')+" SC6 "
		cQryIte += "    LEFT JOIN "+RetSQLName('SB1')+" SB1 ON ( "
		cQryIte += "        B1_FILIAL = '"+FWxFilial('SB1')+"' "
		cQryIte += "        AND B1_COD = SC6.C6_PRODUTO "
		cQryIte += "        AND SB1.D_E_L_E_T_ = ' ' "
		cQryIte += "    ) "
		cQryIte += " WHERE "
		cQryIte += "    C6_FILIAL = '"+FWxFilial('SC6')+"' "
		cQryIte += "    AND C6_NUM = '"+cNumPed+"' "
		cQryIte += "    AND SC6.D_E_L_E_T_ = ' ' "
		cQryIte += " ORDER BY "
		cQryIte += "    C6_ITEM "
		cQryIte := ChangeQuery(cQryIte)
		TCQuery cQryIte New Alias "QRY_ITE"
		
		DbSelectArea('SC5')
		SC5->(DbSetOrder(1))
		SC5->(DbSeek(FWxFilial('SC5') + cNumPed))
		MaFisIni(SC5->C5_CLIENTE,;					// 1-Codigo Cliente/Fornecedor
			SC5->C5_LOJACLI,;			        // 2-Loja do Cliente/Fornecedor
			If(SC5->C5_TIPO$'DB',"F","C"),;       	    // 3-C:Cliente , F:Fornecedor
			SC5->C5_TIPO,;			                    // 4-Tipo da NF
			SC5->C5_TIPOCLI,;           				// 5-Tipo do Cliente/Fornecedor
			MaFisRelImp("MT100",{"SF2","SD2"}),;		// 6-Relacao de Impostos que suportados no arquivo
			,;						   					// 7-Tipo de complemento
			,;											// 8-Permite Incluir Impostos no Rodape .T./.F.
			"SB1",;					    				// 9-Alias do Cadastro de Produtos - ("SBI" P/ Front Loja)
			"MATA461")									// 10-Nome da rotina que esta utilizando a funcao
		
		//Pega o total de itens
		QRY_ITE->(DbGoTop())
		While ! QRY_ITE->(EoF())
			nNritem++
			QRY_ITE->(DbSkip())
		EndDo
		
		//Preenchendo o valor total
		QRY_ITE->(DbGoTop())
		nTotIPI := 0
		While ! QRY_ITE->(EoF())
			//Pega os tratamentos de impostos
			SB1->(DbSeek(FWxFilial("SB1")+QRY_ITE->C6_PRODUTO))
			SC6->(DbSeek(FWxFilial("SC6")+cNumPed+QRY_ITE->C6_ITEM))
			
			MaFisAdd(	SC6->C6_PRODUTO,;                 	// 1-Codigo do Produto 				( Obrigatorio )
						SC6->C6_TES,;                     	// 2-Codigo do TES 					( Opcional )
						SC6->C6_QTDVEN,;		          	// 3-Quantidade 					( Obrigatorio )
						SC6->C6_PRCVEN,;	              	// 4-Preco Unitario 				( Obrigatorio )
						SC6->C6_VALDESC,;					// 5 desconto
						SC6->C6_NFORI,;                     // 6-Numero da NF Original 			( Devolucao/Benef )
						SC6->C6_SERIORI,;		            // 7-Serie da NF Original 			( Devolucao/Benef )
						0,;			                        // 8-RecNo da NF Original no arq SD1/SD2
						SC5->C5_FRETE/nNritem,;            	// 9-Valor do Frete do Item 		( Opcional )
						SC5->C5_DESPESA/nNritem,;	        // 10-Valor da Despesa do item	 	( Opcional )
						SC5->C5_SEGURO/nNritem,;	        // 11-Valor do Seguro do item 		( Opcional )
						0,;							        // 12-Valor do Frete Autonomo 		( Opcional )
						SC6->C6_VALOR,;                     // 13-Valor da Mercadoria 			( Obrigatorio )
						0,;							        // 14-Valor da Embalagem 			( Opcional )
						0,;		     				        // 15-RecNo do SB1
						0) 							        // 16-RecNo do SF4
			
			//nItem++
			QRY_ITE->(DbSkip())
		EndDo
		
		//Pegando totais
		nTotIPI   := MaFisRet(,'NF_VALIPI')
		nTotICM   := MaFisRet(,'NF_VALICM')
		nTotNF    := MaFisRet(,'NF_TOTAL')
		nTotFrete := MaFisRet(,'NF_FRETE')
		nTotISS   := MaFisRet(,'NF_VALISS')
		
		QRY_ITE->(DbCloseArea())
		MaFisEnd()
	Else
		MaFisIni(M->C5_CLIENTE,;					// 1-Codigo Cliente/Fornecedor
			M->C5_LOJACLI,;			        // 2-Loja do Cliente/Fornecedor
			If(M->C5_TIPO$'DB',"F","C"),;       	    // 3-C:Cliente , F:Fornecedor
			M->C5_TIPO,;			                    // 4-Tipo da NF
			M->C5_TIPOCLI,;           				// 5-Tipo do Cliente/Fornecedor
			MaFisRelImp("MT100",{"SF2","SD2"}),;		// 6-Relacao de Impostos que suportados no arquivo
			,;						   					// 7-Tipo de complemento
			,;											// 8-Permite Incluir Impostos no Rodape .T./.F.
			"SB1",;					    				// 9-Alias do Cadastro de Produtos - ("SBI" P/ Front Loja)
			"MATA461")									// 10-Nome da rotina que esta utilizando a funcao
		
		
		nNritem := Len(aCols)
		
		//Preenchendo o valor total
		nTotIPI := 0
		For nAtu := 1 To Len(aCols)
			//Pega os tratamentos de impostos
			SB1->(DbSeek(FWxFilial("SB1")+aCols[nAtu][GDFieldPos("C6_PRODUTO")]))
			
			MaFisAdd(	aCols[nAtu][GDFieldPos("C6_PRODUTO")],;                 	// 1-Codigo do Produto 				( Obrigatorio )
						aCols[nAtu][GDFieldPos("C6_TES")],;                     	// 2-Codigo do TES 					( Opcional )
						aCols[nAtu][GDFieldPos("C6_QTDVEN")],;		          	// 3-Quantidade 					( Obrigatorio )
						aCols[nAtu][GDFieldPos("C6_PRCVEN")],;	              	// 4-Preco Unitario 				( Obrigatorio )
						aCols[nAtu][GDFieldPos("C6_VALDESC")],;					// 5 desconto
						aCols[nAtu][GDFieldPos("C6_NFORI")],;                     // 6-Numero da NF Original 			( Devolucao/Benef )
						aCols[nAtu][GDFieldPos("C6_SERIORI")],;		            // 7-Serie da NF Original 			( Devolucao/Benef )
						0,;			                        // 8-RecNo da NF Original no arq SD1/SD2
						M->C5_FRETE/nNritem,;            	// 9-Valor do Frete do Item 		( Opcional )
						M->C5_DESPESA/nNritem,;	        // 10-Valor da Despesa do item	 	( Opcional )
						M->C5_SEGURO/nNritem,;	        // 11-Valor do Seguro do item 		( Opcional )
						0,;							        // 12-Valor do Frete Autonomo 		( Opcional )
						aCols[nAtu][GDFieldPos("C6_VALOR")],;                     // 13-Valor da Mercadoria 			( Obrigatorio )
						0,;							        // 14-Valor da Embalagem 			( Opcional )
						0,;		     				        // 15-RecNo do SB1
						0) 							        // 16-RecNo do SF4
			
		Next
		
		//Pegando totais
		nTotIPI   := MaFisRet(,'NF_VALIPI')
		nTotICM   := MaFisRet(,'NF_VALICM')
		nTotNF    := MaFisRet(,'NF_TOTAL')
		nTotFrete := MaFisRet(,'NF_FRETE')
		nTotISS   := MaFisRet(,'NF_VALISS')
		
		MaFisEnd()
	EndIf
	
	//Atualiza o retorno
	nValPed := nTotNF + nTotIPI + nTotFrete + nTotISS
	
	RestArea(aAreaC6)
	RestArea(aAreaB1)
	RestArea(aAreaC5)
	RestArea(aArea)
Return nValPed

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/AdvPL.
Caso queira uma customização específica para sua empresa, saiba mais em nossa Loja.

Update 07/02/2018

Como muitas pessoas me perguntavam sobre cálculos no pedido de venda, segue abaixo um exemplo de fonte para pegar os impostos corretamente, e um fonte bem simples em que você pode tratar os dados.

	//Posicionar na SC5 com DbSeek antes desse trecho
	
	MaFisIni(SC5->C5_CLIENTE,;                   // 01 - Codigo Cliente/Fornecedor
		SC5->C5_LOJACLI,;                        // 02 - Loja do Cliente/Fornecedor
		Iif(SC5->C5_TIPO $ "D;B", "F", "C"),;    // 03 - C:Cliente , F:Fornecedor
		SC5->C5_TIPO,;                           // 04 - Tipo da NF
		SC5->C5_TIPOCLI,;                        // 05 - Tipo do Cliente/Fornecedor
		MaFisRelImp("MT100", {"SF2", "SD2"}),;   // 06 - Relacao de Impostos que suportados no arquivo
		,;                                       // 07 - Tipo de complemento
		,;                                       // 08 - Permite Incluir Impostos no Rodape .T./.F.
		"SB1",;                                  // 09 - Alias do Cadastro de Produtos - ("SBI" P/ Front Loja)
		"MATA461")                               // 10 - Nome da rotina que esta utilizando a funcao
			
	//Enquanto houver itens
	SC6->(DbSeek(FWxFilial('SC6') + SC5->C5_NUM))
	While ! SC6->(EoF()) .And. SC6->C6_NUM == SC5->C5_NUM
		
		//Adiciona o item nos tratamentos de impostos
		SB1->(DbSeek(FWxFilial("SB1")+SC6->C6_PRODUTO))
		MaFisAdd(SC6->C6_PRODUTO,;    // 01 - Codigo do Produto                    ( Obrigatorio )
			SC6->C6_TES,;             // 02 - Codigo do TES                        ( Opcional )
			SC6->C6_QTDVEN,;          // 03 - Quantidade                           ( Obrigatorio )
			SC6->C6_PRCVEN,;          // 04 - Preco Unitario                       ( Obrigatorio )
			SC6->C6_VALDESC,;         // 05 - Desconto
			SC6->C6_NFORI,;           // 06 - Numero da NF Original                ( Devolucao/Benef )
			SC6->C6_SERIORI,;         // 07 - Serie da NF Original                 ( Devolucao/Benef )
			0,;                       // 08 - RecNo da NF Original no arq SD1/SD2
			0,;                       // 09 - Valor do Frete do Item               ( Opcional )
			0,;                       // 10 - Valor da Despesa do item             ( Opcional )
			0,;                       // 11 - Valor do Seguro do item              ( Opcional )
			0,;                       // 12 - Valor do Frete Autonomo              ( Opcional )
			SC6->C6_VALOR,;           // 13 - Valor da Mercadoria                  ( Obrigatorio )
			0,;                       // 14 - Valor da Embalagem                   ( Opcional )
			SB1->(RecNo()),;          // 15 - RecNo do SB1
			0)                        // 16 - RecNo do SF4
		
		MaFisLoad("IT_VALMERC", SC6->C6_VALOR, nItAtu)				
		MaFisAlt("IT_PESO", nQtdPeso, nItAtu)
		
		SC6->(DbSkip())
	EndDo
			
	//Altera dados do cabeçalho
	MaFisAlt("NF_FRETE", SC5->C5_FRETE)
	MaFisAlt("NF_SEGURO", SC5->C5_SEGURO)
	MaFisAlt("NF_DESPESA", SC5->C5_DESPESA) 
	MaFisAlt("NF_AUTONOMO", SC5->C5_FRETAUT)
	If SC5->C5_DESCONT > 0
		MaFisAlt("NF_DESCONTO", Min(MaFisRet(, "NF_VALMERC")-0.01, SC5->C5_DESCONT+MaFisRet(, "NF_DESCONTO")) )
	EndIf
	If SC5->C5_PDESCAB > 0
		MaFisAlt("NF_DESCONTO", A410Arred(MaFisRet(, "NF_VALMERC")*SC5->C5_PDESCAB/100, "C6_VALOR") + MaFisRet(, "NF_DESCONTO"))
	EndIf
	
	//Agora reposiciona nos itens para poder pegar os dados
	SC6->(DbGoTop())
	SC6->(DbSeek(FWxFilial('SC6') + SC5->C5_NUM))
	While ! SC6->(EoF()) .And. SC6->C6_NUM == SC5->C5_NUM				
		//Pega os valores
		nBasICM    := MaFisRet(nItAtu, "IT_BASEICM")
		nValICM    := MaFisRet(nItAtu, "IT_VALICM")
		nValIPI    := MaFisRet(nItAtu, "IT_VALIPI")
		nAlqICM    := MaFisRet(nItAtu, "IT_ALIQICM")
		nAlqIPI    := MaFisRet(nItAtu, "IT_ALIQIPI")
		nValSol    := (MaFisRet(nItAtu, "IT_VALSOL") / SC6->C6_QTDVEN) 
		nBasSol    := MaFisRet(nItAtu, "IT_BASESOL")
		nPrcUniSol := SC6->C6_PRCVEN + nValSol
		nTotSol    := nPrcUniSol * SC6->C6_QTDVEN
		nTotalST   += MaFisRet(nItAtu, "IT_VALSOL")
		nTotIPI    += nValIPI
		nValorTot  += SC6->C6_VALOR
		
		SC6->(DbSkip())
	EndDo
	nTotFrete := MaFisRet(, "NF_FRETE")
	nTotVal := MaFisRet(, "NF_TOTAL")
	MaFisEnd()
	
	Alert(nTotIPI)

Bom pessoal, por hoje é só.
Abraços e até a próxima.

About Dan_Atilio

Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

8 comentários em “Função que retorna o total do pedido de vendas (com impostos) em AdvPL

  1. Ola, Dan_atilio, como vai?
    Estou ha horas tentando resolver como faço para pegar o IPI do pedido de vendas sem ter que calcular impostos. Depois de varias tentativas sem sucesso, encontrei seu post. Usei seu codigo, mas recebo o mesmo erro…. quando executo a MAFISINI, o sistema cai com error.log com a seguinte mensagem: variable is not array – Type [U] on MAFISINI(MATXFIS.PRX). Consultando o log encontro a array ARELIMP(A) vazia na MATFISINI. Voce chegou a passar por isso? Como contornou?
    Bem, deixe explicar, estou chamando seu programa a partir do ponto de entrada MTA440C9 (liberação de pedido), na tela de pedido de vendas, fazendo uma alteração ou na liberação de pedidos. Ele tem a finalidade de enviar um email para o gerente financeiro liberar o pedido por credito, caso ele esteja bloqueado por credito.
    Se puder me ajudar, agradeço imensamente.
    Regina

    1. Boa noite Regina, tudo bem?
      Comigo sempre deu certo, segue abaixo um trecho limpo de um código que utilizo na impressão do pedido de venda, veja a variável nTotIPI:

      	//Posicionar na SC5 com DbSeek antes desse trecho
      	
      	MaFisIni(SC5->C5_CLIENTE,;                   // 01 - Codigo Cliente/Fornecedor
      		SC5->C5_LOJACLI,;                        // 02 - Loja do Cliente/Fornecedor
      		Iif(SC5->C5_TIPO $ "D;B", "F", "C"),;    // 03 - C:Cliente , F:Fornecedor
      		SC5->C5_TIPO,;                           // 04 - Tipo da NF
      		SC5->C5_TIPOCLI,;                        // 05 - Tipo do Cliente/Fornecedor
      		MaFisRelImp("MT100", {"SF2", "SD2"}),;   // 06 - Relacao de Impostos que suportados no arquivo
      		,;                                       // 07 - Tipo de complemento
      		,;                                       // 08 - Permite Incluir Impostos no Rodape .T./.F.
      		"SB1",;                                  // 09 - Alias do Cadastro de Produtos - ("SBI" P/ Front Loja)
      		"MATA461")                               // 10 - Nome da rotina que esta utilizando a funcao
      			
      	//Enquanto houver itens
      	SC6->(DbSeek(FWxFilial('SC6') + SC5->C5_NUM))
      	While ! SC6->(EoF()) .And. SC6->C6_NUM == SC5->C5_NUM
      		
      		//Adiciona o item nos tratamentos de impostos
      		SB1->(DbSeek(FWxFilial("SB1")+SC6->C6_PRODUTO))
      		MaFisAdd(SC6->C6_PRODUTO,;    // 01 - Codigo do Produto                    ( Obrigatorio )
      			SC6->C6_TES,;             // 02 - Codigo do TES                        ( Opcional )
      			SC6->C6_QTDVEN,;          // 03 - Quantidade                           ( Obrigatorio )
      			SC6->C6_PRCVEN,;          // 04 - Preco Unitario                       ( Obrigatorio )
      			SC6->C6_VALDESC,;         // 05 - Desconto
      			SC6->C6_NFORI,;           // 06 - Numero da NF Original                ( Devolucao/Benef )
      			SC6->C6_SERIORI,;         // 07 - Serie da NF Original                 ( Devolucao/Benef )
      			0,;                       // 08 - RecNo da NF Original no arq SD1/SD2
      			0,;                       // 09 - Valor do Frete do Item               ( Opcional )
      			0,;                       // 10 - Valor da Despesa do item             ( Opcional )
      			0,;                       // 11 - Valor do Seguro do item              ( Opcional )
      			0,;                       // 12 - Valor do Frete Autonomo              ( Opcional )
      			SC6->C6_VALOR,;           // 13 - Valor da Mercadoria                  ( Obrigatorio )
      			0,;                       // 14 - Valor da Embalagem                   ( Opcional )
      			SB1->(RecNo()),;          // 15 - RecNo do SB1
      			0)                        // 16 - RecNo do SF4
      		
      		MaFisLoad("IT_VALMERC", SC6->C6_VALOR, nItAtu)				
      		MaFisAlt("IT_PESO", nQtdPeso, nItAtu)
      		
      		SC6->(DbSkip())
      	EndDo
      			
      	//Altera dados do cabeçalho
      	MaFisAlt("NF_FRETE", SC5->C5_FRETE)
      	MaFisAlt("NF_SEGURO", SC5->C5_SEGURO)
      	MaFisAlt("NF_DESPESA", SC5->C5_DESPESA) 
      	MaFisAlt("NF_AUTONOMO", SC5->C5_FRETAUT)
      	If SC5->C5_DESCONT > 0
      		MaFisAlt("NF_DESCONTO", Min(MaFisRet(, "NF_VALMERC")-0.01, SC5->C5_DESCONT+MaFisRet(, "NF_DESCONTO")) )
      	EndIf
      	If SC5->C5_PDESCAB > 0
      		MaFisAlt("NF_DESCONTO", A410Arred(MaFisRet(, "NF_VALMERC")*SC5->C5_PDESCAB/100, "C6_VALOR") + MaFisRet(, "NF_DESCONTO"))
      	EndIf
      	
      	//Agora reposiciona nos itens para poder pegar os dados
      	SC6->(DbGoTop())
      	SC6->(DbSeek(FWxFilial('SC6') + SC5->C5_NUM))
      	While ! SC6->(EoF()) .And. SC6->C6_NUM == SC5->C5_NUM				
      		//Pega os valores
      		nBasICM    := MaFisRet(nItAtu, "IT_BASEICM")
      		nValICM    := MaFisRet(nItAtu, "IT_VALICM")
      		nValIPI    := MaFisRet(nItAtu, "IT_VALIPI")
      		nAlqICM    := MaFisRet(nItAtu, "IT_ALIQICM")
      		nAlqIPI    := MaFisRet(nItAtu, "IT_ALIQIPI")
      		nValSol    := (MaFisRet(nItAtu, "IT_VALSOL") / SC6->C6_QTDVEN) 
      		nBasSol    := MaFisRet(nItAtu, "IT_BASESOL")
      		nPrcUniSol := SC6->C6_PRCVEN + nValSol
      		nTotSol    := nPrcUniSol * SC6->C6_QTDVEN
      		nTotalST   += MaFisRet(nItAtu, "IT_VALSOL")
      		nTotIPI    += nValIPI
      		nValorTot  += SC6->C6_VALOR
      		
      		SC6->(DbSkip())
      	EndDo
      	nTotFrete := MaFisRet(, "NF_FRETE")
      	nTotVal := MaFisRet(, "NF_TOTAL")
      	MaFisEnd()
      	
      	Alert(nTotIPI)
      
  2. Entao, nao vai mesmo, ele da erro na MAFISINI ao carregar. Estou acreditando que algo deveria ser feito antes e é a posição 6 do array MaFisRelImp(“MT100”, {“SF2”, “SD2”}).
    Voce sabe me dizer qula deveria ser o conteudo dela, o que a MAFISRELIMP deveria retornar para popular a MAFISINI, por exemplo, “IT_VALIPI”, “NF_VALIPI”, etc. Se souber, vou tentar de novo, senao, o jeito sera calcular na mao mesmo…..
    Obrigada

    1. Boa noite.
      Entendi, então realmente não sei o que pode ser que esteja impactando, o exemplo que mandei funciona perfeitamente.
      Tente ver se não é a alguma atualização do Protheus.

  3. Realmente nao consegui, mas esta empresa esta com release 12.1.14, preciso atualizar e testar novamente. Muito obrigada pela atenção!

Deixe uma resposta

%d blogueiros gostam disto: