Árvore de páginas

Versões comparadas

Chave

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

...

  1. Visão Geral
  2. Exemplo de utilização
  3. Operações
  4. Principais Campos
  5. Pré condições para utilização da rotina
  6. Parâmetros do sistema
  7. Pontos de entrada
  8. Adapter EAI
  9. MILE
  10. M-messenger
  11. Tabelas utilizadas
  12. Processos relacionados
  13. Perguntas e respostas mais frequentes (FAQ)

...

  • Histórico das transferências.
  • Alçada de aprovação de documentos.
  • Transferência transferência entre filiais e armazéns em um mesmo documento.

...

O processo que envolve o Solicitação de Transferência transferência de Materiais contempla as seguintes etapas:

...

A rotina Produtos permite onde as operações podem ser utilizadas em suas customizações conforme exemplos abaixo:


Bloco de código
languagejs
themeConfluence
titleIncluir uma solicitação de transferência
linenumberstrue
collapsetrue
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
#INCLUDE "TBICONN.CH"

/*
Exemplo de inclusão de ums solicitacao de transferenciatransferência via rotina automatica
*/
User Function M311Inc()

Local oModel
Local aLog
Local cMensLog
Local nX

PREPARE ENVIRONMENT EMPRESA '99' FILIAL '01' USER 'admin' PASSWORD '' MODULO "EST"

oModel := FWLoadModel("MATA311") //Carrega o modelo

oModel:SetOperation(MODEL_OPERATION_INSERT) // Seta operação de inclusão
oModel:Activate() // Ativa o Modelo

//Cabeçalho da solicitacao
oModel:SetValue( 'NNSMASTER', 'NNS_CLASS', '1' )
oModel:SetValue( 'NNSMASTER', 'NNS_ESPECI', ' ' )

//Itens da solicitacao

// produto e local de origem
oModel:SetValue( 'NNTDETAIL', 'NNT_FILORI', '01' )
oModel:SetValue( 'NNTDETAIL', 'NNT_PROD', 'PRO001' )
oModel:SetValue( 'NNTDETAIL', 'NNT_LOCAL', '0A' )

oModel:SetValue( 'NNTDETAIL', 'NNT_QUANT', 1 )

// produto e local de destino
oModel:SetValue( 'NNTDETAIL', 'NNT_FILDES', '01' )
oModel:SetValue( 'NNTDETAIL', 'NNT_PRODD', 'PRO001' )
oModel:SetValue( 'NNTDETAIL', 'NNT_LOCLD', '0B' )

If oModel:VldData() //Validação do modelo
oModel:CommitData() // Gravação do Modelo
Else
aLog := oModel:GetErrorMessage() //Recupera o erro do model quando nao passou no VldData
cMensLog := ''
//laco para gravar em string cLog conteudo do array aLog
For nX := 1 Caso seja transferencia de filiais os campos de TES de entrada e saida são obrigatorios
//oModel:SetValue( 'NNTDETAIL', 'NNT_TS', '549' )
//oModel:SetValue( 'NNTDETAIL', 'NNT_TE', '072' )

If oModel:VldData() //Validação do modelo
oModel:CommitData() // Gravação do Modelo
Else
aLog := oModel:GetErrorMessage() //Recupera o erro do model quando nao passou no VldData
cMensLog := ''
//laco para gravar em string cLog conteudo do array aLog
For nX := 1 to Len(aLog)
If !Empty(aLog[nX])
cMensLog += Alltrim(aLog[nX]) + CHR(13)+CHR(10)
EndIf
Next nX

lMsErroAuto := .T. //seta variavel private como erro
AutoGRLog(cMensLog) //grava log para exibir com funcao mostraerro
MostraErro()
EndIf

oModel:DeActivate() //desativa modelo

Return NIL

Bloco de código
languagejs
titleCopiar uma solicitação de transfência
linenumberstrue
collapsetrue
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
#INCLUDE "TBICONN.CH"

/*
Exemplo de Copia de ums solicitacao de transferenciatransferência via rotina automatica
*/
User Function m311Copy()
Local oModel
Local nX
Local cCodDoc

Private cOpId311		:= "004" // DECLARACAO PARA O REALIZAR A COPIA DA SOLICITACAO

PREPARE ENVIRONMENT EMPRESA '99' FILIAL '01' USER 'admin' PASSWORD '' MODULO "EST"

cCodDoc := "0000000001" // codigo do documento de solicitação de transferenciatransferência a ser copiado

//Posiciona registro
dbSelectArea("NNS")
NNS->(DbSetOrder(1))
If NNS->(DbSeek(xFilial("NNS") + cCodDoc))

   //carrega o model
   oModel	:= FWLoadModel( "MATA311" )

   //Define operação do modelo
   oModel:SetOperation( MODEL_OPERATION_INSERT )

   //Ativação do modelo
   oModel:Activate( .T. )

  	//-- Preenchimento dos campos da NNT da 1a linha
   oModel:SetValue( "NNTDETAIL","NNT_QUANT",3)

   If oModel:VldData() //Validação do modelo
      oModel:CommitData() // Gravação do Modelo
   Else
      aLog := oModel:GetErrorMessage() //Recupera o erro do model quando nao passou no VldData
      cMensLog := ''
      //laco para gravar em string cLog conteudo do array aLog
      For nX := 1 to Len(aLog)
         If !Empty(aLog[nX])
            cMensLog += Alltrim(aLog[nX]) + CHR(13)+CHR(10)
         EndIf
      Next nX

      lMsErroAuto := .T. //seta variavel private como erro
      AutoGRLog(cMensLog) //grava log para exibir com funcao mostraerro
      MostraErro()
   EndIf

ELSE
   conout("Documento de Solicitação de transferenciatransferência não encontrado")
ENDIF

Return NIL

Bloco de código
languagejs
titleAlterar uma solicitação de transferencia
linenumberstrue
collapsetrue
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
#INCLUDE "TBICONN.CH"

/*
Exemplo de alteracao de ums solicitacao de transferenciatransferência via rotina automatica
*/
User Function m311Alt()
Local oModel
Local nX
Local cCodDoc

Private cOpId311		:= "004" // DECLARACAO PARA O REALIZAR A ALTERACAO DA SOLICITACAO

PREPARE ENVIRONMENT EMPRESA '99' FILIAL '01' USER 'admin' PASSWORD '' MODULO "EST"

cCodDoc := "0000000001" // codigo do documento de solicitaзгo de transferenciatransferência a ser alterado

//Posiciona registro
dbSelectArea("NNS")
NNS->(DbSetOrder(1))
If NNS->(DbSeek(xFilial("NNS") + cCodDoc))

   //carrega o model
   oModel	:= FWLoadModel( "MATA311" )

   //Define operaзгo do modelo
   oModel:SetOperation( MODEL_OPERATION_UPDATE )

   //Ativaзгo do modelo
   oModel:Activate()

  	//-- Preenchimento dos campos da NNT da 1a linha
   oModel:SetValue( "NNTDETAIL","NNT_QUANT",4)

   If oModel:VldData() //Validaзгo do modelo
      oModel:CommitData() // Gravaзгo do Modelo
   Else
      aLog := oModel:GetErrorMessage() //Recupera o erro do model quando nao passou no VldData
      cMensLog := ''
      //laco para gravar em string cLog conteudo do array aLog
      For nX := 1 to Len(aLog)
         If !Empty(aLog[nX])
            cMensLog += Alltrim(aLog[nX]) + CHR(13)+CHR(10)
         EndIf
      Next nX

      lMsErroAuto := .T. //seta variavel private como erro
      AutoGRLog(cMensLog) //grava log para exibir com funcao mostraerro
      MostraErro()
   EndIf

ELSE
   conout("Documento de Solicitaзгo de transferenciatransferência nгo encontrado")
ENDIF

Return NIL
Bloco de código
languagejs
title Efetivar uma solicitação de transferencia
linenumberstrue
collapsetrue
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
#INCLUDE "TBICONN.CH"
 
/*
Exemplo de Efetivar uma solicitacao de transferenciatransferência via rotina automatica
*/
User Function m311efet()
Local oModel
Local nX
Local cCodDoc
 
Local oModelNNT  
Private cOpId311		        := "011" // DECLARACAO PARA O REALIZAR A EFETIVACAO DA SOLICITACAO
 
PREPARE ENVIRONMENT EMPRESA '99' FILIAL '01' USER 'admin' PASSWORD '' MODULO "EST"
 
	    cCodDoc := "0000000001" // codigo do documento de solicitaçãoo de transferenciatransferência a ser efetivado
 
	    //Posiciona registro
	    dbSelectArea("NNS")
	    NNS->(DbSetOrder(1))
	    If NNS->(DbSeek(xFilial("NNS") + cCodDoc))

		 
        //carrega o model
		        oModel    := FWLoadModel( "MATA311" )
		        //Define operação do modelo
		        oModel:SetOperation( MODEL_OPERATION_UPDATE )

		 
        //Ativação do modelo
		        oModel:Activate()

		 
        //-- Preenchimento dos campos da NNS
		        oModel:SetValue( 'NNSMASTER' , 'NNS_STATUS' , '2' )
		        oModel:SetValue( 'NNSMASTER' , 'NNS_ESPECI' , "NF" )
 
		If oModel:VldData() //Valida??o do modelo
			oModel:CommitData() // Grava??o do Modelo
		Else
			aLog oModelNNT := oModel:GetErrorMessageGetModel("NNTDETAIL")
 //Recupera o erro do model quando nao passou no VldData
			cMensLogFor nX := ''
			//laco para gravar em string cLog conteudo do array aLog
			For nX := 1 to Len(aLog)
				If !Empty(aLog[nX])
					cMensLog += Alltrim(aLog[nX]) + CHR(13)+CHR(10)
				EndIf
			Next nX

			lMsErroAuto := .T. //seta variavel private como erro
			AutoGRLog(cMensLog) //grava log para exibir com funcao mostraerro
			MostraErro()
		EndIf

		oModel:DeActivate() //desativa modelo
	ELSE
	   conout("Documento de Solicitação de transferencia não encontrado")
	ENDIF

Return NIL

Bloco de código
titleExcluir uma solicitação de transferencia
linenumberstrue
collapsetrue
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
#INCLUDE "TBICONN.CH"

/*
Exemplo de Excluir uma solicitacao de transferencia via rotina automatica
*/
User Function m311Exc()
Local oModel
Local nX
Local cCodDoc

PREPARE ENVIRONMENT EMPRESA '99' FILIAL '01' USER 'admin' PASSWORD '' MODULO "EST"

	cCodDoc := "0000000002" // codigo do documento de solicitação de transferencia a ser excluida

	//Posiciona registro
	dbSelectArea("NNS")
	NNS->(DbSetOrder(1))
	If NNS->(DbSeek(xFilial("NNS") + cCodDoc))

		//carrega o model
		oModel    := FWLoadModel( "MATA311" )
		//Define operação do modelo
		oModel:SetOperation( MODEL_OPERATION_DELETE )

		//Ativação do modelo
		oModel:Activate()

		If oModel:VldData() //Validação do modelo
			oModel:CommitData() // Gravação do Modelo
		Else
			aLog := oModel:GetErrorMessage() //Recupera o erro do model quando nao passou no VldData
			cMensLog := ''
			//laco para gravar em string cLog conteudo do array aLog
			For nX := 1 to Len(aLog)
				If !Empty(aLog[nX])
					1 To oModelNNT:Length()
            oModelNNT:GoLine( nX )
            oModel:SetValue( 'NNTDETAIL' , 'NNT_SERIE' , "001" )// Informe a série desejada
        Next nx
        If oModel:VldData() //Valida??o do modelo
            oModel:CommitData() // Grava??o do Modelo
        Else
            aLog := oModel:GetErrorMessage() //Recupera o erro do model quando nao passou no VldData
            cMensLog := ''
            //laco para gravar em string cLog conteudo do array aLog
            For nX := 1 to Len(aLog)
                If !Empty(aLog[nX])
                    cMensLog += Alltrim(aLog[nX]) + CHR(13)+CHR(10)
				EndIf
			Next nX

			lMsErroAuto := .T. //seta variavel private como erro
			AutoGRLog(cMensLog) //grava log para exibir com funcao mostraerro
			MostraErro()
		EndIf

		oModel:DeActivate() //desativa modelo
	ELSE
	   conout("Documento de Solicitaão de transferencia n?o encontrado")
	ENDIF

Return NIL

03. OPERAÇÕES

                EndIf
            Next nX
 
            lMsErroAuto := .T. //seta variavel private como erro
            AutoGRLog(cMensLog) //grava log para exibir com funcao mostraerro
            MostraErro()
        EndIf
 
        oModel:DeActivate() //desativa modelo
    ELSE
       conout("Documento de Solicitação de transferência não encontrado")
    ENDIF
 
Return NIL


Bloco de código
languagejs
titleExcluir uma solicitação de transferencia
linenumberstrue
collapsetrue
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
#INCLUDE "TBICONN.CH"

/*
Exemplo de Excluir uma solicitacao de transferência via rotina automatica
*/
User Function m311Exc()
Local oModel
Local nX
Local cCodDoc

PREPARE ENVIRONMENT EMPRESA '99' FILIAL '01' USER 'admin' PASSWORD '' MODULO "EST"

	cCodDoc := "0000000002" // codigo do documento de solicitação de transferência a ser excluida

	//Posiciona registro
	dbSelectArea("NNS")
	NNS->(DbSetOrder(1))
	If NNS->(DbSeek(xFilial("NNS") + cCodDoc))

		//carrega o model
		oModel    := FWLoadModel( "MATA311" )
		//Define operação do modelo
		oModel:SetOperation( MODEL_OPERATION_DELETE )

		//Ativação do modelo
		oModel:Activate()

		If oModel:VldData() //Validação do modelo
			oModel:CommitData() // Gravação do Modelo
		Else
			aLog := oModel:GetErrorMessage() //Recupera o erro do model quando nao passou no VldData
			cMensLog := ''
			//laco para gravar em string cLog conteudo do array aLog
			For nX := 1 to Len(aLog)
				If !Empty(aLog[nX])
					cMensLog += Alltrim(aLog[nX]) + CHR(13)+CHR(10)
				EndIf
			Next nX

			lMsErroAuto := .T. //seta variavel private como erro
			AutoGRLog(cMensLog) //grava log para exibir com funcao mostraerro
			MostraErro()
		EndIf

		oModel:DeActivate() //desativa modelo
	ELSE
	   conout("Documento de Solicitaão de transferência n?o encontrado")
	ENDIF

Return NIL
Informações
titleObservações

Na execução automatica da rotina, não devem ser informados os campos:

  • NNT_FILIAL, NNS_FILIAL e NNS_FILORI, pois estes são preenchidos de acordo com a filial logada
  • NNT_COD e NNS_COD, pois são preenchidos automaticamente pela rotina


03. OPERAÇÕES

Na página Na página principal da rotina, estão disponíveis as opções:


fade
Deck of Cards
effectDuration0.5
historyfalse
idsamples
effectTypefade
effectDuration0.5
historyfalse
idsamples
effectType
Card
defaulttrue
id1
labelIncluir

Permite a inclusão de informações da solicitação de transferência.

As informações devem ser preenchidas de acordo com as orientações descritas em Principais Campos.

Após preencher as informações desejadas e clique em Confirmar.

Aviso
titleBloqueio de Campos

Não é permitida a alteração dos campos código, data e solicitante em Documento de transferência, sendo gerado automaticamente, conforme usuario logado e ddatabase.


Card
defaulttrue
id12
labelIncluirAlterar

Permite a

inclusão

alteração de informações

de um produto

da solicitação selecionado.

As informações devem ser

preenchidas

ajustadas de acordo com as orientações descritas em Principais Campos.

Após preencher alterar as informações desejadas e clique em Confirmar.


Aviso
titleBloqueio de Campos

Não é permitida a alteração dos campos código, data e solicitante em Documento de Transferencia, sendo gerado automaticamente, conforme usuario logado e ddatabase.

Card
defaulttrue
id2
labelAlterar

e solicitante em Documento de transferência.

Card
id3
labelVisualizar

Permite a visualização de informações da solicitação.

Após visualizar as informações desejadas e clique em Confirmar.


Card
id4
labelExcluir

Permite a exclusão da solicitação de transferência.

Confira as informações disponíveis e clique em Confirmar.


Permite a visualização de informações da solicitação.

Após visualizar as informações desejadas e clique em Confirmar.

Card
id5
labelEfetivar

Permite a visualização de informações da solicitação e somente editando dos campos Tp.Doc Entr, Especie NF e Just. Rejeic em Documento de transferência. Em Dados de transferência será somente possivel navegar nas informações.

Após visualizar

Permite a alteração de informações da solicitação selecionado.

As informações devem ser ajustadas de acordo com as orientações descritas em Principais Campos.

Após alterar as informações desejadas e clique em Confirmar.

Aviso
titleBloqueio de Campos

Não é permitida a alteração dos campos código, data e solicitante em Documento de Transferencia.

Card
id3
labelVisualizar

.


Card
id6
labelCopia

Facilita a inclusão de solicitação de transferência de materiais. O sistema faz uma copia da solicitação selecionada atualizando o codigo, data e solicitante , possibilitando a edição e a gravação do o cadastro de um novo produto.



Procedimentos

Para cadastrar uma solicitação de transferência utilizando a opção Copiar:

  1. Em Solicitação de transferência de Materiais, posicione o cursor sobre o solicitação a ser copiado.
  2. Clique em Copiar.
  3. É exibida a tela de inclusão apresentando todos os campos preenchidos da mesma forma como foram preenchidos para a solicitação selecionado.
  4. Se necessário altere/preencha os campos que desejar.
  5. Confira os dados e confirme a inclusão
Card
id4
labelExcluir

Permite a exclusão da solicitação de transferencia.

Confira as informações disponíveis e clique em Confirmar
  1. .

Permite a visualização de informações da solicitação e somente editando dos campos Tp.Doc Entr, Especie NF e Just. Rejeic em Documento de Transferencia. Em Dados de Transferencia será somente possivel navegar nas informações.

Após visualizar as informações desejadas e clique em Confirmar.

Card
id57
labelEfetivar
Card
id6
labelCopia
Replicar TES

Nas operações de Inclusão, Alteração e Cópia é disponibilizada a opção Replicar TES no botão Outras Ações da Rotina. A rotina facilita o preenchimento da solicitação de transferência, pois permite alterar a TES de entrada e de saída de uma ou mais linhas do documento por vez.

Para utilizar a função, informe os campos:

  • 01 - Filial Destino ?: Permite filtrar quais linhas serão alteradas na solicitação de transferência. Por exemplo, ao informar filial "02", somente as linhas com o campo Filial Destino "02" serão alteradas. Caso o campo seja deixado em branco, todas as linhas serão alteradas.
  • 02 - TES de Saída ?: Informe a TES que será usada no documento de saída
  • 03 - TES de Entrada ?: Informe a TES que será usada no documento de entrada. As opções de TES apresentadas dependem de qual Filial Destino foi informada na pergunta 01, exceto para o caso em que a Filial Destino seja deixada em branco, onde será apresentado o cadastro de TES da filial corrente.

Após informar os parâmetros, confirme a execução. Será atribuida a TES de entrada e saída nas linhas conforme configurado. Caso alguma linha não possa ser gravada (por exemplo, a TES de entrada informada não existe na filial de destino), o processo será interrompido e uma mensagem será apresentada

Facilita a inclusão de solicitação de transferencia de materiais. O sistema faz uma copia da solicitação selecionada atualizando o codigo, data e solicitante , possibilitando a edição e a gravação do o cadastro de um novo produto.

Procedimentos

Para cadastrar uma solicitação de transferência utilizando a opção Copiar:

  • Em Solicitação de Transferencia de Materiais, posicione o cursor sobre o solicitação a ser copiado.
  • Clique em Copiar.
  • É exibida a tela de inclusão apresentando todos os campos preenchidos da mesma forma como foram preenchidos para a solicitação selecionado.
  • Se necessário altere/preencha os campos que desejar.
  • Confira os dados e confirme a inclusão

    .


    04. Principais Campos

    Âncora
    #principaiscampos
    #principaiscampos

    ...

    05. PRÉ CONDIÇÕES PARA UTILIZAÇÃO DA ROTINA


    06. PARÂMETROS DO SISTEMA

    NomePropósitoLink da documentação

    MV_TPCUSST 

    define o custo do produto que deve ser considerado no registro de transferência. Apresenta as opções 1=Lista de Preço; 2=Custo Standard; 3=Último preço de Compra e 4=Custo Unitário.


    MV_APROVTR

    indica se o controle de transferência de produto deve ser submetido para alçada de aprovação. A opção padrão é F.


    MV_STAPROV

    Com o parametro MV_APROVTR ativo, que submete para alçada de aprovação configurada, este parametro fixa qual grupo de aprovação será submetido.  A opção padrão é vazio, em branco.


    MV_CUSFILindica se o recalculo do custo médio deverá calcular o custo aglutinando por Filial (F), por Empresa (E) ou por Armazém (A). A opção padrão é A.  
    MV_AGCUSTOindica se deve aglutinar o custo on-line (por Filial ou Empresa). Respeita a definição do parâmetro MV_CUSFIL. A opção padrão é F.
    MV_MTNLOTEmantém o número do sub-lote para as transferências entre o mesmo produto e o mesmo lote. A opção padrão é N.
    MV_ESTNEGindica se o Sistema permite que os saldos em
    estoque dos produtos fiquem negativos por meio de movimentações
    estoque dos produtos fiquem negativos por meio de movimentações. A opção padrão é S.
    MV_LIBTRFindica se o sistema assume a liberação de credito nos pedidos de transferência de filiais. A opção padrão é desativado .F. 
    S.

    07. PONTOS DE ENTRADA


    NomePropósitoEquivalente em MVCLink da documentação

    MT311ROT

    possa manipular os botões existentes e adicionar novos botões na rotina Solicitação
    de Transferência.
    de transferência.Não alteradoPEST07671_PONTO_DE_ENTRADA_MT311ROT

    M311FILIAL

    Validação para inclusão ou alteração do ProdutoNão alteradoDT PE M311FILIAL - Permite definição de filiais destino na solicitação de transferência

    MT311Leg

    Permite limpar o conteúdo dos campos de complemento de produtoNão alterado
    PEST07671
    PEST07666_
    PONTO
    MT311LEG_
    DE_ENTRADA_MT311ROT

    M311FILIAL

    Validação para inclusão ou alteração do ProdutoNão alteradoDT PE M311FILIAL - Permite definição de filiais destino na solicitação de transferência

    MT311Leg

    Permite limpar o conteúdo dos campos de complemento de produtoNão alteradoPEST07666_MT311LEG_ADICIONA_LEGENDA

    08. ADAPTER EAI

    Não se aplica a esta rotina

    Saiba mais em: A camada do EAI

    09. MILE

    ...


    08. ADAPTER EAI

    Não se aplica a esta rotina

    Saiba mais em: A camada do EAI

    09. MILE

    Configurar o layout conforme necessidade da importação dos dados. Pontos de atenção:

    • Tipo Adapter: MVC
    • Adapter: MATA311
    • Criar dois canais:
      1. Principal com ID saída NNTMASTER e ocorrência 1-Única
      2. Secundário com ID saída NNSDETAIL com ocorrência N-Várias
    • Não informar os campos:

    NNT_FILIAL

    NNS_FILIAL

    NNS_FILORI

    NNT_COD

    e NNS_COD.

    Vide observações no item 02.

    • A rotina utiliza a configuração padrão de máximo permitido para linhas na grid de um modelo MVC (990) 

    Saiba mais: MILE - Model Integrator Layout Engine

    ...

    12. PROCESSOS RELACIONADOS

    13. PERGUNTAS E RESPOSTAS MAIS FREQUENTES(FAQ)

    ...


    HTML
    <!-- esconder o menu --> 
    
    
    <style>
    div.theme-default .ia-splitter #main {
        margin-left: 0px;
    }
    .ia-fixed-sidebar, .ia-splitter-left {
        display: none;
    }
    #main {
        padding-left: 10px;
        padding-right: 10px;
        overflow-x: hidden;
    }
    
    .aui-header-primary .aui-nav,  .aui-page-panel {
        margin-left: 0px !important;
    }
    .aui-header-primary .aui-nav {
        margin-left: 0px !important;
    }
    </style>