Neste documento procuramos apresentar e justificar as escolhas técnicas realizadas durante a implementação da rotina SCANCREF. As escolhas podem ser agrupadas da seguinte maneira:
A decisão de utilizar a Orientação a Objetos em detrimento da programação estruturada é provavelmente a mudança mais significativa empregada no desenvolvimento desta rotina.
Não chega a ser uma novidade na Squad a existência de rotinas utilizando este modelo, porém o que torna a nossa abordagem um tanto mais inovadora é o uso de padrões de arquitetura e recursos avançados da linguagem que potencializam o poder de abstração da orientação a objetos.
A escolha do paradigma foi orientada pelas vantagens que o mesmo traz para o desenvolvimento:
Todas estas vantagens foram exploradas com maior ou menor intensidade durante o desenvolvimento. Ao final deste documento deixamos a documentação no padrão Protheus Doc com a descrição das classes e métodos criados. |
Desenvolvemos a rotina SCANCREF utilizando dois modelos arquiteturais:
O primeiro deles é um modelo em camadas. É importante lembrar que nesta parte da aplicação não há necessidade de persistência de dados, logo não foi necessário se preocupar com uma interface gráfica para entrada de informações por parte do usuário. As camadas criadas são resumidas abaixo:
Escolhemos essa abordagem visando os seguintes motivos:
Aqui foram desenvolvidas as tabelas e as respectivas telas para entrada de informações, utilizando as funções MVC disponibilizadas pelo Framework.
FISA310
Escolhemos essa abordagem devido ao domínio do time sobre a tecnologia.
Embora não seja mandatória em relação às escolhas de paradigma e arquitetura – inclusive, cronologicamente, a escolha da linguagem foi anterior a estas últimas –, optamos pelo uso do TLPP.
As justificativas são:
Rotina para cadastro e geração do arquivo SCANC REF.
FISA309()
Função responsável por gerar o menu
MenuDef()
Função que criará o modelo do tree para cadastro de quadros do SCANC REF
ModelDef()
Função que monta a view da rotina
ViewDef()
Função que cria tree com as rotinas disponíveis do SCANC
MontaTree()
Adiciona ações para cada nó do Tree
FChgTree()
Browser para cada nó que selecionar
FBrowseMon()
Função que identifica a opção selecionada pelo usuário e abre a rotina pertinente a opção selecionada.
FSA309FUNC()
Chamada de geração do arquivo SCANC REF Anexo VI
FISA309AR()
Verifica se o diretório de destino para exportação do TXT existe.
FISA309Vld()
Função para implementar a classe do arquivo e gerar o arquivo magnético
FISA309PROC(cMesAno,cUfDest,cDestArq,cNomeArq,aFil)
Nome | Tipo | Uso | Descrição |
---|---|---|---|
cMesAno | character | Obrigatório | param_description |
cUfDest | character | Obrigatório | param_description |
cDestArq | character | Obrigatório | param_description |
cNomeArq | character | Obrigatório | param_description |
aFil | array | Obrigatório | param_description |
Tipo | Descrição |
---|---|
variant | return_description |
Rotina para cadastro de valores dos quadros do Anexo 6 do SCANC REF
FISA310()
Funcao responsável por gerar o menu.
MenuDef()
Função que criará o modelo do cadastro de quadros do SCANC REF
ModelDef()
Função que monta a view da rotina
ViewDef()
Função que trata informações especificas por quadros do SCANC
A310Active()
Controle edição do campo, somente quando o campo CJO_TPCHV for Fornecedor/Cliente
WhenCliFor()
Controle edição do campo, somente quando o campo CJO_TPCHV for Filial
WhenCodFil()
Função responsável por informar a consulta padrão
A310ChgF3()
Remove campo de acordo com o quadro posicionado
A310Remove()
Função para consulta padrão F3 do campo CJO_CODEMP.
FISA310F3()
Função que trabalha em conjunto com a função FISA310F3 para consulta padrão.
FS310EmpF3()
Validação de campos
ValidCpo()
Validação de campos caso estejam vazios (Tudo OK).
AutorDelleon FernandesDesde16/02/2023Versão12.1.2210
FISA310POS()
Classe genérica com métodos e propriedades comuns à todos os registros do SCANC Refinaria
FieldOfScanRef()
Retorna o registro no formato Character
FieldOfScanRef():toString()
Tipo | Descrição |
---|---|
Character | Retorna o registro no formato Character |
Classe modelo para o registro de cabeçalho do arquivo SCANC Refinaria
RegA6HD()
Classe modelo para o registro QUADRO 3 - OPERAÇÕES REALIZADAS PELO EMITENTE DO RELATÓRIO
RegA6Q3()
QUADRO 1 - Anexo VI Quadro 1 - VALOR DEVIDO POR OPERAÇÕES COM IMPOSTO RETIDO
RegA6Q1()
QUADRO 2 - APURAÇÃO DO ICMS PROVISIONADO
RegA6Q2()
QUADRO 4.1 - REPASSE POR OPERAÇÕES REALIZADAS POR DISTRIBUIDORAS/TRR (Transportador Revendedor Retalhista de Combustível)
RegA6Q41()
QUADRO 4.2 - OPERAÇÕES COM IMPOSTO RETIDO POR OUTROS CONTRIBUINTES
RegA6Q42()
QUADRO 4.3 - RELATÓRIOS EXTEMPORÂNEOS
RegA6Q43()
QUADRO 5 - REPASSE POR OPERAÇÕES REALIZADAS POR IMPORTADORES
RegA6Q5()
QUADRO 6 - REPASSE POR REMESSA DE AEAC (Álcool etílico anidro combustível) OU DE B100 (Biodisel) PARA OUTRAS UF
RegA6Q6()
QUADRO 6.1 - OPERAÇÕES COM IMPOSTO RETIDO POR ESTABELECIMENTO DO EMITENTE
RegA6Q61()
QUADRO 6.2 - OPERAÇÕES COM IMPOSTO RETIDO POR OUTROS CONTRIBUINTES
RegA6Q62()
QUADRO 6.3 - RELATÓRIOS EXTEMPORÂNEOS
RegA6Q63()
QUADRO 7.1 - OPERAÇÕES COM IMPOSTO RETIDO POR ESTABELECIMENTO DO EMITENTE
RegA6Q71()
QUADRO 7.2 - OPERAÇÕES COM IMPOSTO RETIDO POR OUTROS CONTRIBUINTES
RegA6Q72()
QUADRO 7.3 - RELATÓRIOS EXTEMPORÂNEOS
RegA6Q73()
QUADRO 8 - DEDUÇÃO POR OPERAÇÕES REALIZADAS POR IMPORTADORES
RegA6Q8()
QUADRO 9.1 - OPERAÇÕES COM IMPOSTO RETIDO POR ESTABELECIMENTO DO EMITENTE
RegA6Q91()
QUADRO 9.2 - OPERAÇÕES COM IMPOSTO RETIDO POR OUTROS CONTRIBUINTES
RegA6Q92()
QUADRO 9.3 - RELATÓRIOS EXTEMPORÂNEOS
RegA6Q93()
QUADRO 10 - DEDUÇÃO POR RESSARCIMENTO EFETUADO A DISTRIBUIDORAS
RegA6Q10()
QUADRO 11 - DEDUÇÃO POR RESSARCIMENTO EFETUADO A TRR
RegA6Q11()
QUADRO 12 - DEDUÇÃO POR RESSARCIMENTO EFETUADO A IMPORTADORES
RegA6Q12()
QUADRO 13 - DEDUÇÃO POR RESSARCIMENTO EFETUADO A OUTROS CONTRIBUINTES
RegA6Q13()
QUADRO 14 - DEDUÇÃO TRANSFERIDA DE OUTRO ESTABELECIMENTO DO SUJEITO PASSIVO POR SUBSTITUIÇÃO
RegA6Q14()
QUADRO 15 - DEDUÇÃO TRANSFERIDA PARA OUTRO ESTABELECIMENTO DO SUJEITO PASSIVO POR SUBSTITUIÇÃO
RegA6Q15()
Classe responsável por obter os dados dos registros do SCANC Refinaria
ScancRefService()
Método responsável por buscar os registros da tabela CJO com os dados dos quadros preenchidos pelo usuário
ScancRefService():QryCJO()
Tipo | Descrição |
---|---|
Character | com o alias da query para uso |
Método responsável por traduzir o tipo, sendo o cliente, fornecedor ou filial
ScancRefService():DefCliFor()
Tipo | Descrição |
---|---|
Array | com os dados da base |
Método responsável por fornecer o registro de cabeçalho do SCANC Refinaria
ScancRefService():getRegA6HD()
Tipo | Descrição |
---|---|
Object | retorna um objeto do tipo RegA6HD |
QUADRO 1 - Anexo VI Quadro 1 - VALOR DEVIDO POR OPERAÇÕES COM IMPOSTO RETIDO
ScancRefService():getRegA6Q1()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q1 |
QUADRO 2 - APURAÇÃO DO ICMS PROVISIONADO
ScancRefService():getRegA6Q2()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q2 |
Método responsável por fornecer o QUADRO 3 - OPERAÇÕES REALIZADAS PELO EMITENTE DO RELATÓRIO
ScancRefService():getRegA6Q3()
Tipo | Descrição |
---|---|
Array | retorna um array de objetos do tipo RegA6Q3 |
QUADRO 4.1 - OPERAÇÕES COM IMPOSTO RETIDO POR ESTABELECIMENTO DO EMITENTE
ScancRefService():getRegA6Q41()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q41 |
QUADRO 4.2 - OPERAÇÕES COM IMPOSTO RETIDO POR OUTROS CONTRIBUINTES
ScancRefService():getRegA6Q42()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q42 |
QUADRO 4.3 - RELATÓRIOS EXTEMPORÂNEOS
ScancRefService():getRegA6Q43()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q43 |
QUADRO 5 - REPASSE POR OPERAÇÕES REALIZADAS POR IMPORTADORES
ScancRefService():getRegA6Q5()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q5 |
QUADRO 6 - REPASSE POR REMESSA DE AEAC (Álcool etílico anidro combustível) OU DE B100 (Biodisel) PARA OUTRAS UF
ScancRefService():getRegA6Q6()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q6 |
QUADRO 6.1 - OPERAÇÕES COM IMPOSTO RETIDO POR ESTABELECIMENTO DO EMITENTE
ScancRefService():getRegA6Q61()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q61 |
QUADRO 6.2 - OPERAÇÕES COM IMPOSTO RETIDO POR OUTROS CONTRIBUINTES
ScancRefService():getRegA6Q62()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q62 |
QUADRO 6.3 - RELATÓRIOS EXTEMPORÂNEOS
ScancRefService():getRegA6Q63()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q63 |
QUADRO 7.1 - OPERAÇÕES COM IMPOSTO RETIDO POR ESTABELECIMENTO DO EMITENTE
ScancRefService():getRegA6Q71()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q71 |
QUADRO 7.2 - OPERAÇÕES COM IMPOSTO RETIDO POR OUTROS CONTRIBUINTES
ScancRefService():getRegA6Q72()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q72 |
QUADRO 7.3 - RELATÓRIOS EXTEMPORÂNEOS
ScancRefService():getRegA6Q73()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q73 |
QUADRO 8 - DEDUÇÃO POR OPERAÇÕES REALIZADAS POR IMPORTADORES
ScancRefService():getRegA6Q8()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q8 |
QUADRO 9.1 - OPERAÇÕES COM IMPOSTO RETIDO POR ESTABELECIMENTO DO EMITENTE
ScancRefService():getRegA6Q91()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q91 |
QUADRO 9.2 - OPERAÇÕES COM IMPOSTO RETIDO POR OUTROS CONTRIBUINTES
ScancRefService():getRegA6Q92()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q92 |
QUADRO 9.3 - RELATÓRIOS EXTEMPORÂNEOS
ScancRefService():getRegA6Q93()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q93 |
QUADRO 10 - DEDUÇÃO POR RESSARCIMENTO EFETUADO A DISTRIBUIDORAS
ScancRefService():getRegA6Q10()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q10 |
QUADRO 11 - DEDUÇÃO POR RESSARCIMENTO EFETUADO A TRR
ScancRefService():getRegA6Q11()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q11 |
QUADRO 12 - DEDUÇÃO POR RESSARCIMENTO EFETUADO A IMPORTADORES
ScancRefService():getRegA6Q12()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q12 |
QUADRO 13 - DEDUÇÃO POR RESSARCIMENTO EFETUADO A OUTROS CONTRIBUINTES
ScancRefService():getRegA6Q13()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q13 |
QUADRO 14 - DEDUÇÃO TRANSFERIDA DE OUTRO ESTABELECIMENTO DO SUJEITO PASSIVO POR SUBSTITUIÇÃO
ScancRefService():getRegA6Q14()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q14 |
QUADRO 15 - DEDUÇÃO TRANSFERIDA PARA OUTRO ESTABELECIMENTO DO SUJEITO PASSIVO POR SUBSTITUIÇÃO
ScancRefService():getRegA6Q15()
Tipo | Descrição |
---|---|
Object | objeto com dados do registro A6Q15 |
Classe modelo para o arquivo SCANC Refinaria
ScancRef()
Método responsável por montar os registros do arquivo
ScancRef():makeRecords(cIdGrupo,cMesAno,cUfDest,_cFilial)
Nome | Tipo | Uso | Descrição |
---|---|---|---|
cIdGrupo | character | Obrigatório | Identificador do grupo |
cMesAno | character | Obrigatório | Identificador do período |
cUfDest | character | Obrigatório | Unidade federativa do arquivo |
_cFilial | character | Obrigatório | Filial para a qual o arquivo será gerado |
Método responsável por escrever o arquivo texto
ScancRef():writeRecords(oWriter)
Nome | Tipo | Uso | Descrição |
---|---|---|---|
oWriter | object | Obrigatório | Objeto da classe FWFileWriter responsável pela escrita no arquivo texto |
RODAPÉ - gera os totais de linhas de todos os registros do arquvo
ScancRef():writeCounters()
RODAPÉ - gera os totais de linhas de todos os registros do arquivo
ScancTotais()
Classe no padrão Singleton que fornece um objeto e métodos estáticos para manipulação de annotations
AnnotationHelper()
Organiza as annotations de um objeto em um objeto HashMap de acordo com a chave de pesquisa informada
AnnotationHelper():getDataAnnotation(oObj,cAnnotationName,cKey)
Nome | Tipo | Uso | Descrição |
---|---|---|---|
oObj | Object | Obrigatório | o objeto para o qual se quer obter os dados de annotation |
cAnnotationName | Character | Obrigatório | o nome da annotation a ser obtida |
cKey | Character | Obrigatório | o índice de pesquisa para o HashMap (deve ser uma propriedade da annotation) |
Tipo | Descrição |
---|---|
Object | retorna um objeto HashMap |
Cria uma instância (se não houver) e a fornece
AnnotationHelper():getInstance()
Tipo | Descrição |
---|---|
Object | retorna um objeto oAnnotationHelper |