PHP Classes

PHP Nota Fiscal Serviço de Comunicação Mod. 21 e Telecomunicação Mod. 22: Generate tax invoice for services in Brazil

Recommend this page to a friend!
     
  Info   Example   View files Files   Install with Composer Install with Composer   Download Download   Reputation   Support forum   Blog    
Ratings Unique User Downloads Download Rankings
Not yet rated by the usersTotal: 112 All time: 9,612 This week: 74Up
Version License PHP version Categories
nfsc21 1.0.3Custom (specified...5XML, PHP 5, Files and Folders, Finances
Collaborate with this project 

Author

Nfsc21 - github.com

Description
This package is specific mainly for applications used in Brazil Brazil .

This package can generate tax invoice for services in Brazil.

It can take details of a communication company, client, and telecommunication services that they have hired.

The class can generate generate XML files for the tax invoiced of the hired services.

The invoice layout in PHPJasper is available on this github repository -> https://github.com/deepcell/Nfsc21/blob/master/Layout/PHPJasperXML.7z


In Portuguese:

Essa classe deve ser usada unica e exclusivamente para gerar Nota Fiscal de Serviço de Comunicação e Telecomunicação, modelo 21 e 22, para empresas prestadoras de serviços de internet, telefonia e TV a cabo.

Innovation Award
PHP Programming Innovation award nominee
July 2017
Number 6
Many companies need to generate and send invoices to their customers, so they can get paid.

This class can generate invoices for services compliant the Brazilian law.

Manuel Lemos
Picture of Fernando
  Performance   Level  
Name: Fernando is available for providing paid consulting. Contact Fernando .
Classes: 3 packages by
Country: Brazil Brazil
Age: ???
All time rank: 3531277 in Brazil Brazil
Week rank: 180 Up12 in Brazil Brazil Up
Innovation award
Innovation award
Nominee: 3x

Winner: 1x

Example

<?php
/*
* @Title: Consulta de Dados para gerar arquivos das NfSC Mod. 21 e NFST Mod. 22.
* @Description: o script faz a consulta dos dados para alimentar os arquivos da NfSC Mod. 21 e NFST Mod. 22.
* @Update: 2017-05-16, 2019-02-15
* @Class: Nfsc_21
* @Observation: A classe foi nomeado como Nfsc_21, no entanto ela tambem vai gerar os arquivos para o NFST Mod. 22.
*
*/

# record time execution - start
$time_start = microtime(true);

require
'config.php';
require
'class/nfsc.21.class.php';



/***************************************************************************************************
 * variaveis em comum
 *
 * URL para emissao de modelo 21
 * URL/?di=2019-02-01&df=2019-02-07&nf=0&ri=1&da=1902&de=20190207&mo=21&tu=4
 * URL para emissao de modelo 22
 * URL/?di=2019-02-01&df=2019-02-07&nf=0&ri=1&da=1902&de=20190207&mo=22&tu=1
 *
 ***************************************************************************************************/
$dtini = $_GET['di']; # "2017-01-01"; # periodo inicial para a consulta
$dtfim = $_GET['df']; # "2017-01-31"; # periodo final para a consulta
$nf_numero = $_GET['nf']; # 0; # inicia em ZERO como padrao, sera incrementado na iteracao do loop
$nf_ref_item = $_GET['ri']; # 1;
$data_apuracao = $_GET['da']; # 1701; #date("ym"); # formato "AAMM"
$data_emissao = $_GET['de']; # 20170120; #date("Ymd"); # formato AAAAMMDD
$modelo = $_GET['mo']; # modelo (21 ou 22) modelo 06 - Energia Eletrica ainda nao foi implementado.
$tipo_utilizacao = $_GET['tu']; # cliente tipo utilizacao (mod. 21: internet(4) parametro opicional | mod. 22: telefonia(1), tv assinatura(3), outros(6) parametro requerido)
$csv = $_GET['csv']; # exportar dados para arquivo CSV.
$nfsc = new Nfsc_21;



/***************************************************************************************************
 * validar e sanitizar(pendente) dados de entrada
 ***************************************************************************************************/
$expdi = explode("-",$dtini);
$expdf = explode("-",$dtfim);
if (
checkdate($expdi[1] , $expdi[2] , $expdi[0]) == 1 and checkdate($expdf[1] , $expdf[2] , $expdf[0]) == 1)
{
   
/***************************************************************************************************
     * Dados da empresa ativa.
     ***************************************************************************************************/
   
$dados_empresa = $database->select("empresa", "*", array("id[=]" => 2));
   
#print "<pre>EMPRESA <br>"; print_r($dados_empresa); print "</pre>";



    /***************************************************************************************************
     * @Query : Arquivo MESTRE (UF9999999999999921U 1902N01M.001)
     * `@InvoiceItemTotal` deve conter apenas o valor total dos items que compoem a NF, porem
     * nao sera listado todos os items nessa consulta para o arquivo MESTRE. Todos os items
     * serao listados na consulta para o arquivo ITEM.
     ***************************************************************************************************/
   
$sql1 = "SELECT
                cli.id as `@ClientID`, cli.nome as `@ClientName`, cli.insc_uf as `@ClientIE`,
                cli.cpf as `@ClientCPF`, cli.cnpj as `@ClientCNPJ`, cli.endereco as `@ClientAddress`,
                cli.numero as `@ClientAddressNumber`, cli.complemento as `@ClientAddressComp`,
                cli.bairro as `@ClientAddressSuburb`, cli.cep as `@ClientAddressZipcode`,
                cli.estado as `@ClientState`, cli.cidade as `@ClientCity`, cli.tel1 as `@ClientPhone1`,
                con.id as `@ContractID`, con.tipo_assin,
                plan.id as `@PlanID`, plan.titulo as `@PlanTitle`, plan.valor as `@PlanAmount`,
                cid.nome as `@CityName`,
                inv.id as `@InvoiceID`, inv.due_date as `@InvoiceDueDate`, inv.paid_date as `@InvoicePaidDate`,
                inv.serv1rate as `@InvoiceAmount`, inv.subtotal as `@InvoiceSubtotal`,
                inv.misc as `@InvoiceDiscount`, inv.total as `@InvoiceTotal`, inv.referencia as `@InvoiceReference`,
                SUM(inv.total) as `@InvoiceItemTotal`,
                cfop.cfop as `@CfopCode`, cfop.descricao as `@CfopDescription`
            FROM
                cliente cli
            INNER JOIN
                contratos con ON con.idcliente = cli.id
            INNER JOIN
                planos plan ON plan.id = con.idplanos
            INNER JOIN
                cfop ON cfop.cfop = con.cfop
            INNER JOIN
                invoices inv ON inv.clientid = cli.id
            INNER JOIN
                tb_cidades cid ON cid.id = cli.cidade
            WHERE
                cli.ativo = 1 and
                con.ativo=1 and
                con.nf=1 and
                (
                    inv.referencia='PA' or inv.referencia='AD' or inv.referencia='RE' or
                    inv.referencia='PD' or inv.referencia='EX' or inv.referencia='SA'
                ) and
                (
                    inv.status='paid' or inv.status='pending' or inv.status='renegociado'
                ) and
                (
                    inv.due_date BETWEEN '
$dtini' AND '$dtfim'
                )
            GROUP BY
                con.id
            ORDER BY
                con.id ASC
            "
;
   
$data1 = $database->query($sql1)->fetchAll();
   
//print "<pre>MESTRE QUERY " . $sql1 . "</pre>";
    //print "<pre>MESTRE ARRAY <br>"; print_r($data1); print $count; print "</pre>";
   
$arrayMESTRE = $data1;



   
/***************************************************************************************************
     * CONSULTA PARA PEGAR O NUMERO DE ITEMS NA NOTA.
     * COM O RESULTADO RODAR UM FOREACH COM O ARRAY E COMPARAR O ID DO CONTRARO PARA
     * INCREMENTAR O CONTADOR.
     ***************************************************************************************************/
    
$sql1_1 = "SELECT
                    con.id as `@ContractID`,
                    inv.id as `@InvoiceID`,
                    COUNT(con.id) as `@TotalItemsPerNF`
                FROM
                    cliente cli
                INNER JOIN
                    contratos con ON con.idcliente = cli.id
                INNER JOIN
                    planos plan ON plan.id = con.idplanos
                INNER JOIN
                    cfop ON cfop.cfop = con.cfop
                INNER JOIN
                    invoices inv ON inv.clientid = cli.id
                INNER JOIN
                    tb_cidades cid ON cid.id = cli.cidade
                WHERE
                    cli.ativo = 1 and
                    con.ativo=1 and
                    con.nf=1 and
                    (
                        inv.referencia='PA' or inv.referencia='AD' or inv.referencia='RE' or
                        inv.referencia='PD' or inv.referencia='EX' or inv.referencia='SA'
                    ) and
                    (
                        inv.status='paid' or inv.status='pending' or inv.status='renegociado'
                    ) and
                    (
                        inv.due_date BETWEEN '
$dtini' AND '$dtfim'
                    )
                GROUP BY
                    con.id
                ORDER BY
                    con.id ASC
                "
;
   
$data1_1 = $database->query($sql1_1)->fetchAll();
   
//print "<pre>COUNT ITEMS PER NF " . $sql1_1 . "</pre>";
    //print "<pre>COUNT ITEMS PER NF ARRAY <br>"; print_r($data1_1); print "</pre>";


   
try
    {
       
$response_mestre = $nfsc->Mestre($arrayMESTRE, $data1_1, $nf_numero=0, $nf_ref_item, $data_apuracao, $data_emissao, $dados_empresa, $modelo, $tipo_utilizacao, $database);
        echo
$response_mestre['0']['msg']; // display return message
   
}
    catch (
Exception $e)
    {
        echo
"<pre><b>Caught exception:</b> ", $e->getMessage(), "\n</pre>";
    }
   
//print "<pre>"; print_r($response_mestre); print "</pre>";



    /***************************************************************************************************
     * @Query : Arquivo ITEM (UF9999999999999921U 1902N01I.001)
     * Remover group by e SUM para pegar todos os items de cada contrato do cliente.
     ***************************************************************************************************/
   
$sql2 = "SELECT
                cli.id as `@ClientID`, cli.nome as `@ClientName`, cli.insc_uf as `@ClientIE`,
                cli.cpf as `@ClientCPF`, cli.cnpj as `@ClientCNPJ`, cli.endereco as `@ClientAddress`,
                cli.numero as `@ClientAddressNumber`, cli.complemento as `@ClientAddressComp`,
                cli.bairro as `@ClientAddressSuburb`, cli.cep as `@ClientAddressZipcode`,
                cli.estado as `@ClientState`, cli.cidade as `@ClientCity`, cli.tel1 as `@ClientPhone1`,
                con.id as `@ContractID`, con.tipo_assin,
                plan.id as `@PlanID`, plan.titulo as `@PlanTitle`, plan.valor as `@PlanAmount`,
                plan.teto_download as `@PlanDownload`, plan.teto_upload as `@PlanUpload`,
                cid.nome as `@CityName`,
                inv.id as `@InvoiceID`, inv.due_date as `@InvoiceDueDate`, inv.paid_date as `@InvoicePaidDate`,
                inv.serv1rate as `@InvoiceAmount`, inv.subtotal as `@InvoiceSubtotal`,
                inv.misc as `@InvoiceDiscount`, inv.total as `@InvoiceTotal`, inv.referencia as `@InvoiceReference`,
                cfop.cfop as `@CfopCode`, cfop.descricao as `@CfopDescription`
            FROM
                cliente cli
            INNER JOIN
                contratos con ON con.idcliente = cli.id
            INNER JOIN
                planos plan ON plan.id = con.idplanos
            INNER JOIN
                cfop ON cfop.cfop = con.cfop
            INNER JOIN
                invoices inv ON inv.clientid = cli.id
            INNER JOIN
                tb_cidades cid ON cid.id = cli.cidade
            WHERE
                cli.ativo = 1 and
                con.ativo=1 and
                con.nf=1 and
                (
                    inv.referencia='PA' or inv.referencia='AD' or inv.referencia='RE' or
                    inv.referencia='PD' or inv.referencia='EX' or inv.referencia='SA'
                ) and
                (
                    inv.status='paid' or inv.status='pending' or inv.status='renegociado'
                ) and
                (
                    inv.due_date BETWEEN '
$dtini' AND '$dtfim'
                )
            ORDER BY
                con.id ASC
            "
;
   
$data2 = $database->query($sql2)->fetchAll();
   
//echo "<pre>ITEM QUERY <br>" . $sql2 . "</pre>";

   
$arrayITEM = $data2;
   
//print "<pre>ITEM ARRAY <br>"; print_r($arrayITEM); print count($data2); print "</pre>";

   
try
    {
       
// Esse metodo recebe o array $response_mestre como parametro, esse array contem o valor total dos item do documento fiscal.
       
echo $nfsc->Item($response_mestre, $arrayITEM, $nf_numero=1, $nf_ref_item, $data_apuracao, $data_emissao, $dados_empresa, $modelo, $tipo_utilizacao, $database);
    }
    catch (
Exception $e)
    {
        echo
"<pre><b>Caught exception:</b> ", $e->getMessage(), "\n</pre>";
    }



   
/***************************************************************************************************
     * @Query : Arquivo CADASTRO (UF9999999999999921U 1902N01D.001)
     * IMPORTANTE: Usamos os mesmos dados da consulta do arquivo MESTRE. Pois o array ja esta formado
     * e nao existe a necessidade de uma nova consulta.
     ***************************************************************************************************/
   
try
    {
        echo
$nfsc->Cadastro($arrayMESTRE, $nf_numero=0, $nf_ref_item, $data_apuracao, $data_emissao, $dados_empresa, $modelo, $database);
    }
    catch (
Exception $e)
    {
        echo
"<pre><b>Caught exception:</b> ", $e->getMessage(), "\n</pre>";
    }



   
/***************************************************************************************************
     * Exportar dados para CSV
     * $csv = 1 significa para gerar --- $csv = 0 significa para nao gerar o csv.
     ***************************************************************************************************/
   
try
    {
       
$nfsc->ExportCSV($arrayMESTRE, $arrayITEM, $nf_numero, $dtini, $dtfim, $data_apuracao, $data_emissao, $dados_empresa, $csv);
    }
    catch (
Exception $e)
    {
        echo
"<pre><b>Caught exception:</b> ", $e->getMessage(), "\n</pre>";
    }

}
else
{
    echo
"erro: dados de entrada n&atilde;o foram devidamente validados.";
}



// record time execution - end
$time_end = microtime(true);

//dividing by 60 will give the execution time in minutes otherwise seconds
$execution_time = ($time_end - $time_start);
$hours = (int)($execution_time/60/60);
$minutes = (int)($execution_time/60)-$hours*60;
$seconds = (int)$execution_time-$hours*60*60-$minutes*60;
print
'<pre>this script was executed @'.date("Y-m-d H:i:s").'</pre>';
print
"
    <pre>execution time:
        microseconds: "
.$execution_time."
        seconds: "
.$seconds."
        minutes: "
.$minutes."
        hours: "
.$hours."
    </pre>
"
;


Details

Nota Fiscal de Serviço de Comunicação e Telecomunicação, modelo 21 e 22.

Essa classe deve ser usada unica e exclusivamente para gerar Nota Fiscal de Serviço de Comunicação, modelo 21, para empresas prestadoras de serviços de internet, tais como provedores de internet. Com um pouco de adaptação a classe pode ser usada tambem para empresas do setor de fornecimento de energia elétrica.

Com a intenção de ajudar as pequenas empresas do setor de comunicação (prestadoras de serviços de internet) a se enquadrarem no novo modelo de emissão de nota fiscal exijido pelo governo brasileiro, essa classe esta sendo disponibilizada como código aberto para a comunidade.

AMBIENTE TESTADO

Servidor Web: - Linux Debian x86_64_(Jessie) PHP version 5.5 - nginx/1.1.19 - MySQL 5.5 - Linux 4.14.98-1-MANJARO - PHP 7.3.1 nginx/1.14.2 - mysql Ver 15.1 Distrib 10.3.12-MariaDB

Nota: O script foi testado em diversas versões do PHP: 5.3, 5.4, 5.5. Em versões anteriores a 5.3 precisa fazer alguns ajustes no script para funcionar corretamente.

INSTALAÇÃO

Existem duas maneiras de usar esse script, com ou sem banco de dados, se desejar gravar os dados dos arquivos no banco de dados, então será necessário criar as tabelas abaixo no base de dados do contribuinte.

Veja que esse projeto não cobre instalação e uso de banco de dados, então presumo que o contribuinte já esta com o seu banco de dados instalado. Veja: BANCO DE DADOS - TABELAS.

COMO USAR

Para executar o script, aponte o seu browser para o seguinte endereço ou use o form (nfsc.21.form.php) disponivel:

  • URL para emissao de modelo 21 `<SERVER>:<PORT>/nfsc.21.query.select.data.php?di=2019-02-01&df=2019-02-07&nf=0&ri=1&da=1902&de=20190207&mo=21&tu=4&csv=0`
  • URL para emissao de modelo 22 `<SERVER>:<PORT>/nfsc.21.query.select.data.php?di=2019-02-01&df=2019-02-07&nf=0&ri=1&da=1902&de=20190207&mo=22&tu=1&csv=1`

Onde os parametros passados na URL são: * di = data inicial (formato AAAA-MM-DD) * df = data final (formato AAAA-MM-DD) * nf = numeração inicial da NF (obrigatoriamente precisa ser iniciado em ZERO(0)) * ri = referência do item do registro fiscal (obrigatoriamente precisa ser iniciado em UM(1)) * da = data da apuração (formato AAMM) * de = data da emissão (formato AAAAMMDD) * mo = modelo (21 ou 22) modelo 06 - Energia Eletrica ainda nao foi implementado. * tu = tipo utilizacao (mod. 21: internet(4) parametro opicional | mod. 22: telefonia(1), tv assinatura(3), outros(6) parametro requerido) * csv = exportar dados para arquivo CSV (0 = omitir, 1 = gerar).

Nota de Uso: O programa de validação pede um arquivo com a extensao .INI, vai ser necessário cadastrar esses dados inicialmente e então o programa da nota fiscal deve gerar esse arquivo .INI (guarde ele para próximo uso), no cadastro preencha as informações que o programa pede com os mesmos dados de empresa que estiver registrado aqui -> https://github.com/deepcell/Nfsc21/blob/master/nfsc.21.array.php (A partir da linha 38: coloque os dados da sua empresa nesse script e repita no cadastro do programa).

PERMISSÕES

  • Set o diretório raiz com as permissões: chmod -R 756 NFSC21/
  • Set o diretorio /001 com as seguintes permissoes: chmod -R 756 001/
  • Set permissão para o grupo poder servir o arquivo: chmod g+s NFSC21/
  • Set permissão para o grupo poder escrever o arquivo: chmod g+w NFSC21/

BANCO DE DADOS - TABELAS

Executando o script abaixo, as seguintes tabelas serão criadas no banco de dados do contribuinte:

  • `tb_municipios_ibge` (Incluir no INSERT todas as cidades que a empresa possui clientes.)
  • `Nfsc_21_Mestre` (Arquivo tipo MESTRE DE DOCUMENTO FISCAL)
  • `Nfsc_21_Item` (Arquivo tipo ITEM DE DOCUMENTO FISCAL)
  • `Nfsc_21_Cadastro` (DADOS CADASTRAIS DO DESTINATÁRIO DO DOCUMENTO FISCAL)

Rodar o script script_db_update_0.1.sql localizado no mesmo diretorio desse arquivo.

user@hostname:/$ mysql -u <username> -p databasename < /tmp/script_db_update_0.1.sql

Informacoes adicionais sobre a estrutura de cada tabela da Nota Fiscal de Serviço de Comunicação, modelo 21.

TABELA MESTRE
+----+---------------------------------------------------------+------+--------+-----+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Nº | CONTEUDO                                                | TAM. | INICIO | FIM | FORMATO | OBS
+----+---------------------------------------------------------+------+--------+-----+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 01 | CNPJ ou CPF                                             | 14   | 1      | 14  | N       | pessoa não obrigada à inscrição no CNPJ ou CPF, preencher o campo com zeros;
| 02 | IE                                                      | 14   | 15     | 28  | X       | pessoa não obrigada à inscrição estadual, preencher o campo com a expressão "ISENTO";
| 03 | Razão Social ou nome do cliente                         | 35   | 29     | 63  | X       |
| 04 | UF                                                      | 2    | 64     | 65  | X       | UF da localização do consumidor - Para o exterior preencher o campo com EX
| 05 | Classe de Consumo                                       | 1    | 66     | 66  | N       | IMPORTANTE: preencher com zeros para NF de comunicacao;
| 06 | Fase ou Tipo de Utilização                              | 1    | 67     | 67  | N       | tipo de utilização, conforme tabela 1;
| 07 | Grupo de Tensão                                         | 2    | 68     | 69  | N       | informar apenas para conta de energia eletrica, Nos demais caso deverá ser preenchido com 00;
| 08 | Código de Identificação do consumidor ou assinante      | 12   | 70     | 81  | X       | ID do cliente no sistema de processamento de dados da empresa.
| 09 | Data de emissão                                         | 8    | 82     | 89  | N       | data de emissão do documento fiscal no formato AAAAMMDD;
| 10 | Modelo                                                  | 2    | 90     | 91  | N       | Conta de Energia Elétrica, modelo 6, Serviço de Telecomunicações, modelo 22  ou  Serviço de Comunicação, modelo 21
| 11 | Série                                                   | 3    | 92     | 94  | X       | no mínimo, uma letra não acentuada, ou um algarismo de 1 a 9 e ter seu preenchimento iniciado a partir da esquerda (exemplo: "A ", e não " A") Hifen e espacos em branco sao aceitos. utilizar a letra "U" para indicar a série única.
| 12 | Número                                                  | 9    | 95     | 103 | N       | número seqüencial atribuído pelo sistema eletrônico de processamento de dados ao documento fiscal (ver item 1). O campo deverá ser alinhado à direita com as posições não significativas preenchidas com zeros;
| 13 | Código de Autenticação Digital do documento fiscal      | 32   | 104    | 135 | X       | Criar um hash MD5() na cadeia de caracteres formada pelos campos 01, 12, 14, 15, 16, 09 e 27, nessa ordem, respeitando o tamanho previsto do campo, assim como os brancos e zeros de preenchimento.
| 14 | Valor Total (com 2 decimais)                            | 12   | 136    | 147 | N       | Informar o Valor Total do documento fiscal, com 2 decimais;
| 15 | BC ICMS (com 2 decimais)                                | 12   | 148    | 159 | N       | Informar a Base de Cálculo do ICMS destacado no documento fiscal, com 2 decimais;
| 16 | ICMS destacado (com 2 decimais)                         | 12   | 160    | 171 | N       | Informar o valor do ICMS destacado no documento fiscal, com 2 decimais;
| 17 | Operações isentas ou não tributadas (com 2 decimais)    | 12   | 172    | 183 | N       | Informar o valor das operações ou serviços isentos ou não tributados pelo ICMS, com 2 decimais;
| 18 | Outros valores (com 2 decimais)                         | 12   | 184    | 195 | N       | ver item 2.
| 19 | Situação do documento                                   | 1    | 196    | 196 | X       | ver item 3.
| 20 | Ano e Mês de referência de apuração                     | 4    | 197    | 200 | N       | Informar o ano e mês de referência de apuração do ICMS do documento fiscal, utilizando o formato "AAMM";
| 21 | Referência ao item da NF                                | 9    | 201    | 209 | N       | Informar o número do registro do arquivo ITEM DO DOCUMENTO FISCAL, onde se encontra o primeiro item do documento fiscal;
| 22 | Número do terminal telefônico ou da unidade consumidora | 12   | 210    | 221 | X       | ver item 4 (Nao esta claro qual numero telefonico precisa ser)
| 23 | Indicação do tipo de informação contida no campo 1      | 1    | 222    | 222 | N       | ver item 5.
| 24 | Tipo de cliente                                         | 2    | 223    | 224 | N       | ver tabela 2.
| 25 | Subclasse de consumo                                    | 2    | 225    | 226 | N       | Em se tratando de Nota Fiscal de Serviço de Comunicação, modelo 21, ou Nota Fiscal de Serviço de Telecomunicação, modelo 22, preencher com zeros.
| 26 | Número do terminal telefônico principal                 | 12   | 227    | 238 | X       | Para planos individuais e nota fiscal modelo 6, o campo deve ser preenchido com brancos. (Nao esta claro qual numero telefonico precisa ser)
| 27 | CNPJ do emitente                                        | 14   | 239    | 252 | N       | CNPJ da empresa que emite o documento fiscal.
| 28 | Número ou código da fatura comercial                    | 20   | 253    | 272 | X       | atribuído pelo sistema de faturamento do emitente.
| 29 | Valor total da fatura comercial                         | 12   | 273    | 284 | N       | 2 decimais.
| 30 | Data de leitura anterior                                | 8    | 285    | 292 | N       | Em se tratando de nota fiscal modelo 6, informar a data da leitura anterior, no formato AAAAMMDD. Nos demais casos, preencher com zeros;
| 31 | Data de leitura atual                                   | 8    | 293    | 300 | N       | Em se tratando de nota fiscal modelo 6, informar a data de leitura atual, no formato AAAAMMDD. Nos demais casos, preencher com zeros;
| 32 | Brancos - reservado para uso futuro                     | 50   | 301    | 350 | X       | Informar a chave de acesso do documento fiscal eletrônico (CV115-e). Nas unidades federadas em que tal documento não tiver sido implementado, preencher com brancos;
| 33 | Brancos - reservado para uso futuro                     | 8    | 351    | 358 | N       | Informar a data da autorização de emissão do documento fiscal eletrônico (CV115-e),  no  formato  AAAAMMDD.  Nas  unidades  federadas  em  que  tal  documento  não  tiver  sido implementado, preencher com zeros;
| 34 | Informações adicionais                                  | 30   | 359    | 388 | X       | ver item 6.
| 35 | Brancos - reservado para uso futuro                     | 5    | 389    | 393 | X       | Preencher com espaços em branco;
| 36 | Código de Autenticação Digital do registro              | 32   | 394    | 425 | X       | Criar um hash MD5() na cadeia de caracteres formada pelos campos 01 a 35;
+----+---------------------------------------------------------+------+--------+-----+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|    | TOTAL                                                   | 425  |        |     |
+----+---------------------------------------------------------+------+--------+-----+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Tabela 2 - Nfsc_21_Item

TABELA ITEM
+----+---------------------------------------------------------+------+--------+-----+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  Nº | CONTEUDO                                                | TAM. | INICIO | FIM | FORMATO | OBS
+----+---------------------------------------------------------+------+--------+-----+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 01 | CNPJ ou CPF                                             | 14   | 1      | 14  | N       | |
| 02 | UF                                                      | 2    | 15     | 16  | X       | |
| 03 | Classe do Consumo                                       | 1    | 17     | 17  | N       | |
| 04 | Fase ou Tipo de Utilização                              | 1    | 18     | 18  | N       | |
| 05 | Grupo de Tensão                                         | 2    | 19     | 20  | N       | |
| 06 | Data de Emissão                                         | 8    | 21     | 28  | N       | |
| 07 | Modelo                                                  | 2    | 29     | 30  | N       | |
| 08 | Série                                                   | 3    | 31     | 33  | X       | |
| 09 | Número                                                  | 9    | 34     | 42  | N       | |
| 10 | CFOP                                                    | 4    | 43     | 46  | N       | |
| 11 | Nº de ordem do Item                                     | 3    | 47     | 49  | N       | |
| 12 | Código do item                                          | 10   | 50     | 59  | X       | |
| 13 | Descrição do item                                       | 40   | 60     | 99  | X       | |
| 14 | Código de classificação do item                         | 4    | 100    | 103 | N       | |
| 15 | Unidade                                                 | 6    | 104    | 109 | X       | |
| 16 | Quantidade contratada (com 3 decimais)                  | 12   | 110    | 121 | N       | |
| 17 | Quantidade medida (com 3 decimais)                      | 12   | 122    | 133 | N       | |
| 18 | Total (com 2 decimais)                                  | 11   | 134    | 144 | N       | |
| 19 | Desconto / Redutores (com 2 decimais)                   | 11   | 145    | 155 | N       | |
| 20 | Acréscimos e Despesas Acessórias (com 2 decimais)       | 11   | 156    | 166 | N       | |
| 21 | BC ICMS (com 2 decimais)                                | 11   | 167    | 177 | N       | |
| 22 | ICMS (com 2 decimais)                                   | 11   | 178    | 188 | N       | |
| 23 | Operações Isentas ou não tributadas (com 2 decimais)    | 11   | 189    | 199 | N       | |
| 24 | Outros valores (com 2 decimais)                         | 11   | 200    | 210 | N       | |
| 25 | Alíquota do ICMS (com 2 decimais)                       | 4    | 211    | 214 | N       | |
| 26 | Situação                                                | 1    | 215    | 215 | X       | |
| 27 | Ano e Mês de referência de apuração                     | 4    | 216    | 219 | X       | |
| 28 | Número do Contrato                                      | 15   | 220    | 234 | X       | |
| 29 | Quantidade faturada (com 3 decimais)                    | 12   | 235    | 246 | N       | |
| 30 | Tarifa Aplicada / Preço Médio Efetivo (com 6 decimais)  | 11   | 247    | 257 | N       | |
| 31 | Alíquota PIS/PASEP (com 4 decimais)                     | 6    | 258    | 263 | N       | |
| 32 | PIS/PASEP (com 2 decimais)                              | 11   | 264    | 274 | N       | |
| 33 | Alíquota COFINS (com 4 decimais)                        | 6    | 275    | 280 | N       | |
| 34 | COFINS (com 2 decimais)                                 | 11   | 281    | 291 | N       | |
| 35 | Indicador de Desconto Judicial                          | 1    | 292    | 292 | X       | |
| 36 | Tipo de Isenção/Redução de Base de Cálculo              | 2    | 293    | 294 | N       | Em se tratando de Nota Fiscal de Serviço de Comunicação, modelo 21, ou Nota Fiscal de Serviço de Telecomunicação, modelo 22, preencher conforme tabela 11.10. Se não houver isenção ou redução de base de cálculo, preencher com zeros. |
| 37 | Brancos - reservado para uso futuro                     | 5    | 295    | 299 | X       | |
| 38 | Código de Autenticação Digital do registro              | 32   | 300    | 331 | X       | |
+----+---------------------------------------------------------+------+--------+-----+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|    | TOTAL                                                   | 331  |        |     |         |
+----+---------------------------------------------------------+------+--------+-----+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Tabela 3 - Nfsc_21_Cadastro

TABELA CADASTRO
+----+---------------------------------------------------------+------+--------+-----+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Nº | CONTEUDO                                                | TAM. | INICIO | FIM | FORMATO | OBS                                                                                                                                                                                                                                     |
+----+---------------------------------------------------------+------+--------+-----+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 01 | CNPJ ou CPF                                             | 14   | 1      | 14  | N       | Informar  o  CNPJ  ou  CPF.  SE  pessoa  não  obrigada  à inscrição no CNPJ ou CPF, preencher o campo com zeros;       |
| 02 | IE                                                      | 14   | 15     | 28  | X       | Informar a Inscrição Estadua. SE pessoa não obrigada à inscrição estadual, preencher o campo com a expressão "ISENTO"; |
| 03 | Razão Social                                            | 35   | 29     | 63  | X       | Informar a razão social, denominação ou nome; |
| 04 | Logradouro                                              | 45   | 64     | 108 | X       | Informar o Logradouro do endereco. |
| 05 | Número                                                  | 5    | 109    | 113 | N       | Informar o Número do endereço; |
| 06 | Complemento                                             | 15   | 114    | 128 | X       | Informar o Complemento do endereço; |
| 07 | CEP                                                     | 8    | 129    | 136 | N       | Informar o CEP do endereço; |
| 08 | Bairro                                                  | 15   | 137    | 151 | X       | Informar o Bairro do endereço;|
| 09 | Município                                               | 30   | 152    | 181 | X       | Informar o nome do Município do endereço, de acordo com a tabela de municípios elaborada pelo Instituto Brasileiro de Geografia e Estatística - IBGE. |
| 10 | UF                                                      | 2    | 182    | 183 | X       | Informar a sigla da UF do endereço. Para exterior, preencher o campo com a expressão "EX";|
| 11 | Telefone de contato                                     | 12   | 184    | 195 | X       | Informar a localidade de registro e o número do telefone de contato no formato "LLNNNNNNNN". No caso do telefone conter 9 (nove) dígitos, usar o formato "LLNNNNNNNNN". |
| 12 | Código de identificação do consumidor ou assinante      | 12   | 196    | 207 | X       | Informar o código de identificação do consumidor ou assinante utilizado pelo contribuinte. |
| 13 | Número do terminal telefônico ou da unidade consumidora | 12   | 208    | 219 | X       | ver item 4 (Nao esta claro qual numero telefonico precisa ser) |
| 14 | UF de habilitação do terminal telefônico                | 2    | 220    | 221 | X       | Informar a sigla da UF de habilitação do terminal/aparelho telefônico, deixando em branco nos demais casos; |
| 15 | Data de emissão                                         | 8    | 222    | 229 | N       | Informar a data de emissão do documento fiscal no formato AAAAMMDD; |
| 16 | Modelo                                                  | 2    | 230    | 231 | N       | Conta de Energia Elétrica, modelo 6, Serviço de Telecomunicações, modelo 22  ou  Serviço de Comunicação, modelo 21. |
| 17 | Série                                                   | 3    | 232    | 234 | X       | no mínimo, uma letra não acentuada, ou um algarismo de 1 a 9 e ter seu preenchimento iniciado a partir da esquerda (exemplo: "A ", e não " A") Hifen e espacos em branco sao aceitos. utilizar a letra "U" para indicar a série única. |
| 18 | Número                                                  | 9    | 235    | 243 | N       | número seqüencial atribuído pelo sistema eletrônico de processamento de dados ao documento fiscal (ver item 1). O campo deverá ser alinhado à direita com as posições não significativas preenchidas com zeros; |
| 19 | Código do Município                                     | 7    | 244    | 250 | N       | Informar o código do município de acordo com a tabela de municípios elaborada pelo Instituto Brasileiro de Geografia e Estatística - IBGE; |
| 20 | Brancos - reservado para uso futuro                     | 5    | 251    | 255 | X       | Preencher com espaços em branco; |
| 21 | Código de Autenticação Digital do registro              | 32   | 256    | 287 | X       | gerar hash MD5() na cadeia de caracteres formada pelos campos 01 a 20. |
+----+---------------------------------------------------------+------+--------+-----+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|    | TOTAL                                                   | 287  |        |     |
+----+---------------------------------------------------------+------+--------+-----+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ */

TODO LIST

  • [x] passar dados via query SQL.
  • [x] passar dados via array PHP.
  • [ ] passar dados via JSON.
  • [ ] passar dados via XML.
  • [ ] permitir o cancelamento de uma nota fiscal.

:star2: Marque com uma estrela este repositório para acompanhar o seu desenvolvimento e torná-lo popular.


  Files folder image Files (42)  
File Role Description
Files folder imageclass (2 files)
Files folder imagedb (11 files)
Files folder imagedocumentacao (14 files)
Files folder imageLayout (5 files)
Files folder imageValidacao (4 files)
Plain text file config.php Example Example script
Plain text file LICENSE Lic. License text
Plain text file nfsc.21.array.php Example Example script
Plain text file nfsc.21.form.php Aux. Auxiliary script
Plain text file nfsc.21.query.select.data.php Example Example script
Plain text file README.md Doc. Documentation

  Files folder image Files (42)  /  class  
File Role Description
  Plain text file medoo.php Class Class source
  Plain text file nfsc.21.class.php Class Class source

  Files folder image Files (42)  /  db  
File Role Description
  Plain text file dados_teste_basico.sql Data Auxiliary data
  Plain text file script_db_update_0.2.sql Data Auxiliary data
  Plain text file SPED_Tabela_de_Mun...BGE_tb1325_v_11.txt Doc. Documentation
  Plain text file __basic_synnet_scheme.sql Data Auxiliary data
  Plain text file __exp__cfop.sql Data Auxiliary data
  Plain text file __exp__cliente.sql Data Auxiliary data
  Plain text file __exp__contratos.sql Data Auxiliary data
  Plain text file __exp__invoices.sql Data Auxiliary data
  Plain text file __exp__planos.sql Data Auxiliary data
  Plain text file __exp__tb_cidades.sql Data Auxiliary data
  Plain text file __exp__tb_municipios_ibge.sql Data Auxiliary data

  Files folder image Files (42)  /  documentacao  
File Role Description
  Image file CADASTRO_campos_11...erico__revisado.png Data Auxiliary data
  Image file formato_campos_alf...cos_X__revisado.png Data Auxiliary data
  Image file formato_campos_numericos_N__revisado.png Data Auxiliary data
  Image file ITEM_campos_10-14__revisado.png Data Auxiliary data
  Image file ITEM_campo_7_MOD.22__revisado.png Data Auxiliary data
  Image file MESTRE_campos_9-12_MOD.22__revisado.png Data Auxiliary data
  Image file MESTRE_campo_22_MOD.22__revisado.png Data Auxiliary data
  Image file MESTRE_campo_6_MOD.22__revisado.png Data Auxiliary data
  Plain text file portaria_CAT-79_20...acao-Slides-PPS.pdf Data Auxiliary data
  Image file processo_transmissao.png Data Auxiliary data
  Image file processo_transmissao_2.png Data Auxiliary data
  Plain text file README.md Doc. Documentation
  Plain text file TabErros__v_3_00a.pdf Data Auxiliary data
  Image file validador_SP_para_todas_UF.png Data Auxiliary data

  Files folder image Files (42)  /  Layout  
File Role Description
  Plain text file 45d6cddf.svg Data Auxiliary data
  Image file background1.jpg Data Auxiliary data
  Plain text file Layout-Servico-Com...Multimidia-Item.tpl Data Auxiliary data
  Plain text file Layout-Servico-Com...acao-Multimidia.php Example Example script
  Plain text file Layout-Servico-Com...acao-Multimidia.tpl Data Auxiliary data

  Files folder image Files (42)  /  Validacao  
File Role Description
  Image file 201706_Arquivos-Controle-Identificao.png Data Auxiliary data
  Image file 201706_validacao-arquivos-MID-II.png Data Auxiliary data
  Image file 201706_validacao-arquivos-MID.png Data Auxiliary data
  Plain text file README.md Doc. Documentation

The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page.
Install with Composer Install with Composer
 Version Control Unique User Downloads Download Rankings  
 100%
Total:112
This week:0
All time:9,612
This week:74Up