O Projeto se trata de um módulo de integração com o sistema de notas da Prefeitura de São Paulo (Nota do Milhão), possibilitando a automatização de serviços como emissão e consulta de Notas e outros serviços relacionados.
- Soap
- openssl
- Na hora de emitir uma nota o campo de Cidade do Tomador é preenchido com o código do IBGE para a mesma, e ele pode ser consultado no site https://cidades.ibge.gov.br/brasil/sp/sao-paulo
Para instanciar a classe é necessário informar o CNPJ, o Certificado do Emissor e a senha do mesmo. No caso do caminho do Certificado pode ser utilizado o arquivo '.pfx' ou '.pem'
// Instanciando a Classe
$nfSP = new NotaFiscalSP([
'cnpj' => '00000000000000',
'certificate' => 'path/to/certificate.pfx',
'certificatePass' => '000000'
]);
Ao instanciar a Lib ela faz uma requisiçao para obter a Inscrição Municipal(IM), porém a mesma pode ser passada como parametro.
// Instanciando a Classe
$nfSP = new NotaFiscalSP([
'cnpj' => '00000000000000',
'certificate' => 'path/to/certificate.pfx',
'certificatePass' => '000000',
'im' => '1225'
]);
Esse método retorna a Inscrição Municipal relacionada ao CNPJ e um booleano indicando se o mesmo pode emitir NFe
// Consulta seu próprio CNPJ para verificar a Inscrição Municipal
$response = $nfSP->cnpjInfo();
// Consulta um CNPJ para verificar a inscrição municipal e a situação referente a emissão
$response = $nfSP->cnpjInfo('111.222.333-44');
Retorna apeas informações básicas como horário de envio do lote
$response = $nfSP->informacaoLote();
Retorna Informaçes detalhadas de uma ou mais Notas (Limite 50 Notas por Requisição)
// Utilize o numero da nota
$response = $nfSP->consultarNf('00056');
*Para maiores detalhes sobre a consulta de várias notas simultaneamente veja o Wiki
Retorna Notas recebidas em um periodo especifico (50 Notas por Pagina)
$period = new Period();
$period->setDtInicio('2019-08-05');
$period->setDtFim('2019-08-10');
$period->setPagina(2);
$response = $nfSP->notasRecebidas($period);
- Caso não insira a data Final, serão retornados somente registros da data inicial
- Caso não seja informado o numero da página o valor padrão é 1
Retorna Notas emitidas em um periodo especifico (50 Notas por Pagina)
$period = new Period();
$period->setDtInicio('2019-08-05');
$period->setDtFim('2019-08-10');
$period->setPagina(2);
$response = $nfSP->notasEmitidas($period);
- Caso não insira a data Final, serão retornados somente registros da data inicial
- Caso não seja informado o numero da página o valor padrão é 1
Retorna Informações detalhadas de um lote especifico
// Utilize o numero do Lote
$response = $nfSP->consultarLote(356);
*Para mais detalhes da utilizaço acesse o Wiki
Cancela uma ou mais Notas (Limite 50 Notas por Requisição)
$response = $nfSP->cancelarNota('00568');
$rps = new Rps();
$rps->setNumeroRps('00000000');
$rps->setTipoRps(RPSType::RECIBO_PROVENIENTE_DE_NOTA_CONJUGADA);
$rps->setValorServicos(30.80);
$rps->setCodigoServico(2881);
$rps->setAliquotaServicos( 0.029);
$rps->setCnpj('10000000000001');
$rps->setRazaoSocialTomador('RAZAO SOCIAL TOMADOR LTDA');
$rps->setTipoLogradouro('R');
$rps->setLogradouro('NOME DA RUA');
$rps->setNumeroEndereco(001);
$rps->setBairro('VILA TESTE');
$rps->setCidade('3550308'); // São Paulo
$rps->setUf('SP');
$rps->setCep('00000000');
$rps->setEmailTomador('[email protected]');
$rps->setDiscriminacao('Teste Emissão de Notas pela API');
$response = $nfSP->enviarNota($rps);
O Lote envia diversos objetos do tipo RPS em uma unica requisição
$lote = new Lot();
$lote->setRpsList([$rps1, $rps2, $rps3]);
$response = $nfSP->enviarLote($lote);
O Lote ASYNC utiliza um outro Endpoint e pode ser útil caso o sistema de Notas esteja com alguma instabilidade ou em manutenção, é utilizada a mesma request porém é retornado um número de protocolo que pode ser consultado posteriormente
// Enviar Lote Async
$makeProtocol = $nfSP->enviarLoteAsync($lot);
// Consultar se o lote foi emitido
$lotResult = $nfSP->consultarLoteAsync('1223589');
$nfSP->consultarNfts('454565')
// Montando o objeto da NFTS
$nfts = new Nfts();
$nfts->setNumeroDocumento('000000000000');
$nfts->setSerieNFTS('A');
$nfts->setCodigoServico('7099');
$nfts->setValorServicos('150.30');
$nfts->setCnpjPrestador('00000000000100');
$nfts->setDiscriminacao('xxx');
$nfts->setDataPrestacao('2019-09-10');
$nfts->setTipoDocumento('01');
$nfts->setRazaoSocialPrestador('XXXX');
$nfts->setLogradouroPrestador('Avenida x x x');
$nfts->setCidadePrestador('x');
$nfts->setNumeroEnderecoPrestador('250');
$nfts->setBairroPrestador('Vila x');
$nfts->setUfPrestador('SP');
$nfts->setCepPrestador('06000000');
// Emitindo a NFTS
$nfSP->enviarNfts($nfts);
$response = $nfSP->cancelarNfts('00568');
Retorna uma array com as informaçes da resposta da API
$response->getResponse();
Retorna o XML enviado para API (REQUEST)
$response->getXmlInput();
Retorna o XML Recebido da API (RESPONSE)
$response->getXmlOutput();
Verifica o sucesso da operação realizada
$response->getSuccess();
É a classe utilizada para referenciar uma Nota Fiscal já Existente, não é necessário preencher todas propriedades, apenas o NumeroNfe é o suficiente.
Propriedade | Método | Tipo |
---|---|---|
InscricaoPrestador | setInscricaoPrestador() | int |
NumeroNfe | setNumeroNfe() | int |
CodigoVerificacao | setCodigoVerificacao() | string |
NumeroRPS | setNumeroRPS() | int |
SerieRPS | setSerieRPS() | string |
Utilizada na realização de consultas por periodo nas notas Emitidas e Recebidas, caso não altere nenhuma das propriedades retorna uma busca com os valores Padrões para data Atual
Propriedade | Método | Tipo | ** Observações** |
---|---|---|---|
CPF | setCpf() | string | |
CNPJ | setCnpj() | string | |
InscricaoMunicipal | setInscricaoMunicipal() | int | |
DtInicio | setDtInicio() | string | format(YYYY-MM-DD) |
DtFim | setDtFim() | string | format(YYYY-MM-DD) |
Pagina | setPagina() | int | |
Transacao | setTransacao() | boolean |
Objeto utilizado para emissão de novas notas
Propriedade | Método | Tipo | ** Observações** |
---|---|---|---|
InscricaoPrestador | setInscricaoPrestador() | int | |
SerieRps | setSerieRps() | string | |
NumeroRps | setNumeroRps() | int | |
TipoRps | setTipoRps() | string | |
DataEmissao | setDataEmissao() | string | format(YYYY-MM-DD) |
StatusRps | setStatusRps() | string | |
TributacaoRps | setTributacaoRps() | string | |
ValorServicos | setValorServicos() | float | |
ValorDeducoes | setValorDeducoes() | int | default: 0 |
ValorPIS | setValorPIS() | float | |
ValorCOFINS | setValorCOFINS() | float | |
ValorINSS | setValorINSS() | float | |
ValorIR | setValorIR() | float | |
ValorCSLL | setValorCSLL() | float | |
CodigoServico | setCodigoServico() | int | |
AliquotaServicos | setAliquotaServicos() | float | |
IssRetido | setIssRetido() | boolean | default: false |
InscricaoMunicipalTomador | setInscricaoMunicipalTomador() | int | |
InscricaoEstadualTomador | setInscricaoEstadualTomador() | int | |
RazaoSocialTomador | setRazaoSocialTomador() | string | |
EmailTomador | setEmailTomador() | string | |
CpfCnpjTomador | setCpfCnpjTomador() | string | |
TipoLogradouro | setTipoLogradouro() | string | |
Logradouro | setLogradouro() | string | |
NumeroEndereco | setNumeroEndereco() | int | |
ComplementoEndereco | setComplementoEndereco() | string | |
Bairro | setBairro() | string | |
Cidade | setCidade() | string | default: 3550308 (São Paulo) |
UF | setUF() | string | |
Cep | setCep() | string | |
Cpf | setCpf() | string | |
Cnpj | setCnpj() | string | |
Discriminacao | setDiscriminacao() | string | |
cpfIntermediario | setcpfIntermediario() | string | |
cnpjIntermediario | setcnpjIntermediario() | string | |
InscricaoMunicipalIntermediario | setInscricaoMunicipalIntermediario() | int | |
IssRetidoIntermediario | setIssRetidoIntermediario() | boolean | |
EmailIntermediario | setEmailIntermediario() | string | |
ValorCargaTributaria | setValorCargaTributaria() | float | |
PercentualCargaTributaria | setPercentualCargaTributaria() | float | |
FonteCargaTributaria | setFonteCargaTributaria() | string | |
CodigoCEI | setCodigoCEI() | string | |
MatriculaObra | setMatriculaObra() | string | |
MunicipioPrestacao | setMunicipioPrestacao() | string | |
ValortotalRecebido | setValortotalRecebido() | float | |
NumeroEncapsulamento | setNumeroEncapsulamento() | int |