PROJETO S@T-FISCAL
Citação::
Grande problema é a queda de comunicação com o servidor.
Nesse caso, para também o banco de dados, e ai o problema é maior ainda, nem NFC-E resolve.
O problema seria o SAT queimar e o cliente só ter hum na loja, nesse caso vamos ter aqui um de reserva para atender de imediato o cliente(vender para ele), isso caso não esteja na garantia.
Então nesse caso sim entra a NFC-E.
Acontece que meus poucos neuronios já estão cansados demais, haja, agora NFC-E, o problema não é nem enviar, mas imprimir.
Nilson, por questões de queda de servidor é que resolvi mudar a forma com que meus caixas irão trabalhar.
Irão trabalhar independentemente de servidor de banco de dados.
Estou estudando uma forma de utilizar meus pdvs off-line(um requisito que no PAF-ECF já contempla este cenário).
Já com relação a uma possÃvel queima do SAT, ai entra a NFC-e.
Eu já estou é de saco cheio de tudo, vontade de largar tudo e mudar de profissão, mas qual ????
Citação::
:
Opa, então essa semana tbm começo a desenvolver o gerenciador...
Eu não tenho o grande conhecimento que você tem!!! rs
de inicio eu pensei tambem em criar um serviço para isso que ficasse aguardando as vendas serem gravadas no banco de dados mas pensei q eu teria q criar um loop pra ficar verificando essas vendas e fiquei preocupado em sobrecarregar o banco em fazer varias consultas ( Se minha logica estiver errada desculpe como falei em relação a conhecimento)
Agora estou pensando em criar um aplicativo que será instalado no servidor que fique ansioso aguardando XMLs e os PDVs vão gerar o XML diretamente na pasta do servidor, ao encontrar um arquivo XML o mesmo faz toda a validação e emissão do CFe e logo apos envia uma resposta (Gerando um TXT) informando se foi emitido ou não... O PDV lê essa resposta e caso negativo ele mostra o erro na tela e bloqueia a finalização da venda...
Nesse processo que vc vai desenvolver o seu vc me indicaria algo? obrigado
Leandro, por questões obvias em meu pdv, vou utilizar a geração de arquivos xml. Uma vez que preciso apenas ao final da venda gerar o xml sem muitas complicações.
Meu sistema já gera um arquivo txt para cada venda então somente preciso alterar e passar a gerar um XML.
Grande problema é a queda de comunicação com o servidor.
E por esta razão penso em alguma solução que possa substituir este servidor em caso de pane. E a única que me vem a cabeça seria NFC-e.
Indo totalmente contrário ao que foi determinado pela secretaria da fazenda, penso em ter o SAT como emissor e NFC-e em contingência.
Mas ainda não decidi se arrisco confiar no servidor, ou já desenvolvo essa válvula de escape (NFC-e).
Entendo... pensei na NFC-e tbm mas sinceramente ter q manter atualizado (SAT, NF-e, NFC-e) e outras obrigações como Farmacia Popular e + uma porrada de coisas eu desencanei de NFC-e... vou desenvolver mesmo esse gerenciador e vamos trabalhando mas em breve imagino que a gente vai ter q ter programadores trabalhando pra gente em escritorio... pois ter todas essas obrigações só vai deixar a gente de cabelo branco ou talvez sem cabelo e sem vida social
Citação:Estou estudando uma forma de utilizar meus pdvs off-line(um requisito que no PAF-ECF já contempla este cenário)
FOX, Esse é meu pesadelo, como seria esse off-line ? Já pensei em coisas tipo salvar em txt as querys e depois atualizar no servidor após ele ser restaurado, mas ai entra o risco por falta de não poder utilizar as transações.
Como seria esse seu, da para dar uma dica básica ?
Sabe que até um Tópico próprio daria esse assunto: [Ô]COMO SE LIVRAR DA FALTA DO SERVIDOR DE BANCO DE DADOS ?[Ô]
Espelhamento de HD foi uma boa pratica que encontrei, mas depende de nossa manutenção presencial, precisaria de algo em que o sistema ou o cliente mesmo redirecione.
Que o sistema não pare.
Citação::
Estou estudando uma forma de utilizar meus pdvs off-line(um requisito que no PAF-ECF já contempla este cenário)
FOX, Esse é meu pesadelo, como seria esse off-line ? Já pensei em coisas tipo salvar em txt as querys e depois atualizar no servidor após ele ser restaurado, mas ai entra o risco por falta de não poder utilizar as transações.
Como seria esse seu, da para dar uma dica básica ?
Sabe que até um Tópico próprio daria esse assunto: [Ô]COMO SE LIVRAR DA FALTA DO SERVIDOR DE BANCO DE DADOS ?[Ô]
Espelhamento de HD foi uma boa pratica que encontrei, mas depende de nossa manutenção presencial, precisaria de algo em que o sistema ou o cliente mesmo redirecione.
Que o sistema não pare.
Nilson, você pode usar banco de dados local o que irá garantir suas transações( eu não as utilizo). Não pesquisei nada ainda, mas irei implementar com certeza.
Vamos trocando figurinha.
Eu criei um grupo para desenvolvedores no whatsapp para ter um contato mais próximo, iniciei esse grupo hoje, quem quiser participar manda email para zap@satfiscal.net que eu adiciono. Importante ressaltar que durante a semana iremos tratar apenas de assuntos sobre programação e nos finais de semana assuntos livres.
Tentei achar o caminho das pedras pra postar o seguinte código no site, mas não achei o botão do tipo [Ô]postar código fonte, postar dica[Ô], continuo procurando com fé rsrsrs
Pra quem precisar de uma ajuda pro arredondamento usado pelo SAT, baseado nas normas ABNT NBR 5891, segue exemplo de uma função minha em VB6, bem explicadinha:
[ô]////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[ô]FUNÇÃO PARA FAZER O ARREDONDAMENTO DE VALORES, BASEADO NAS REGRAS DE ARREDONDAMENTO DA NORMA ABNT NBR 5891 DE 1977
[ô]TRABALHA COM 4 DIGITOS NA DECIMAL DE ENTRADA
[ô]DEVOLVERà O VALOR ARREDONDADO COM 2 DECIMAIS
[ô]////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Public Function Arredondamento_ABNT_NBR5891(Valor As Currency) As Currency
On Error GoTo Trata_Erros
[ô]TRANSFORMA E FORMATA O VALOR PARA STRING E 4 DECIMAIS
Dim StrValor_Trabalhar As String
StrValor_Trabalhar = Format(Valor, [Ô]############0.0000[Ô])
[ô]DESCOBRE A POSIÇÃO DA VIRGULA
Dim Posicao_Virgula As Integer
Posicao_Virgula = InStr(1, CStr(StrValor_Trabalhar), [Ô],[Ô])
Dim StrDecimal As String
StrDecimal = Mid(StrValor_Trabalhar, Posicao_Virgula + 1, Len(StrValor_Trabalhar))
[ô]VERIFICA SE NA DECIMAL OS 2 ULTIMOS DIGITOS SÃO IGUAIS A [Ô]00[Ô], SE FOREM, NÃO SERà NECESSÃRIO ARREDONDAR
[ô]POR EXEMPLO 2,5500
If Mid(StrDecimal, 3, 2) = [Ô]00[Ô] Then
Arredondamento_ABNT_NBR5891 = Format(CCur(StrValor_Trabalhar), [Ô]############0.00[Ô])
Exit Function
End If
[ô]DEFAULT
Dim StrValor_Retornar As String
StrValor_Retornar = CStr(Format(Valor, [Ô]#############0.00[Ô]))
[ô]********************************************************************************************************************************************
[ô]1- Quando o algarismo seguinte a 2ª CASA for INFERIOR a 5, A 2ª CASA permanecerá SEM modificação.
[ô]ENTÃO SE NA 3ª CASA O NUMERO FOR < 5 (MENOR QUE 5) ENTÃO NÃO ARREDONDA, MANTEM O VALOR ORIGINAL
[ô]EXEMPLO 2,5501 FICARà SOMENTE 2,55 POIS A TERCEIRA CASA (0) é MENOR QUE 5
[ô]********************************************************************************************************************************************
If CInt(Mid(StrDecimal, 3, 1)) < 5 Then
StrValor_Retornar = Mid(StrValor_Trabalhar, 1, Len(StrValor_Trabalhar) - 2) [ô]PEGA O VALOR SEM AS 2 ULTIMAS CASAS, EX: 2,5501 REMOVERà O 01 DO FINAL, RETORNANDO SOMENTE O 2,55
Arredondamento_ABNT_NBR5891 = Format(StrValor_Retornar, [Ô]############0.00[Ô])
Exit Function
End If
[ô]********************************************************************************************************************************************
[ô]2 - Quando o algarismo seguinte A 2ª CASA for SUPERIOR a 5 ENTÃO AUMENTARA EM UMA UNIDADE A 2ª CASA, EXEMPLO: 2,556 (FICA 2,56)
[ô]********************************************************************************************************************************************
[ô]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[ô]VERIFICA SE A TERCEIRA CASA é MAIOR QUE 5
[ô]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
If CInt(Mid(StrDecimal, 3, 1)) > 5 Then
[ô]SE FOR MAIOR QUE 5, ENTÃO ARREDONDA PRA MAIS O VALOR, EXEMPLO: 2,556 FICARà 2,56
StrValor_Retornar = Mid(StrValor_Trabalhar, 1, Len(StrValor_Trabalhar) - 2) [ô]PEGA O VALOR SEM AS 2 ULTIMAS CASAS, EX: 2,5501 REMOVERà O 01 DO FINAL, RETORNANDO SOMENTE O 2,55
StrValor_Retornar = CCur(StrValor_Retornar) + CCur([Ô]0,01[Ô])
Arredondamento_ABNT_NBR5891 = Format(StrValor_Retornar, [Ô]############0.00[Ô])
Exit Function
End If
[ô]************************************************************************************************************************************************************************
[ô]3 - Quando a TERCEIRA CASA é IGUAL A CINCO, TEREMOS 2 OPCOES (A e B):
[ô]************************************************************************************************************************************************************************
[ô]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[ô](A) - SE A SEGUNDA CASA FOR IMPAR ENTÃO ARREDONDA PRA MAIS O VALOR, EXEMPLO: 2,3751 (o 7 dos 37 centavos é IMPAR, neste caso arredonda pra mais)
[ô]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
If EImpar(CLng(Mid(StrDecimal, 2, 1))) = True Then
StrValor_Retornar = Mid(StrValor_Trabalhar, 1, Len(StrValor_Trabalhar) - 2) [ô]PEGA O VALOR SEM AS 2 ULTIMAS CASAS, EX: 2,3751 REMOVERà O 51 DO FINAL, RETORNANDO SOMENTE O 2,37
StrValor_Retornar = CCur(StrValor_Retornar) + CCur([Ô]0,01[Ô])
Arredondamento_ABNT_NBR5891 = Format(StrValor_Retornar, [Ô]############0.00[Ô])
Exit Function
End If
[ô]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[ô](B) - SE A SEGUNDA CASA FOR PAR, ENTÃO:
[ô]SE A QUARTA CASA FOR ALGARISMO ZERO, NÃO HAVERà ALTERAÇÃO NAS DECIMAIS, RETORNANDO O VALOR SEM ARREDONDAR, EXEMPLO: 2,5450 (FICARA 2,54)
[ô]SE A QUARTA CASA FOR ALGARISMO DIFERENTE DE ZERO, A 2ª CASA deverá ser AUMENTADA EM UMA unidade, EXEMPLO: 2,5451 (FICARà 2,55)
[ô]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[ô]SE A QUARTA CASA FOR IGUAL A ZERO
If CInt(Mid(StrDecimal, 4, 1)) = 0 Then
StrValor_Retornar = Mid(StrValor_Trabalhar, 1, Len(StrValor_Trabalhar) - 2) [ô]PEGA O VALOR SEM AS 2 ULTIMAS CASAS, EX: 2,5450 REMOVERà O 50 DO FINAL, RETORNANDO SOMENTE O 2,54
Arredondamento_ABNT_NBR5891 = Format(StrValor_Retornar, [Ô]############0.00[Ô])
Exit Function
[ô]SE A QUARTA CASA FOR MAIOR QUE ZERO, ACRESCENTA EM 0,01 ARREDONDANDO PRA MAIS O VALOR DECIMAL COM 2 CASAS
Else
StrValor_Retornar = Mid(StrValor_Trabalhar, 1, Len(StrValor_Trabalhar) - 2) [ô]PEGA O VALOR SEM AS 2 ULTIMAS CASAS, EX: 2,3451 REMOVERà O 51 DO FINAL, RETORNANDO SOMENTE O 2,34
StrValor_Retornar = CCur(StrValor_Retornar) + CCur([Ô]0,01[Ô]) [ô]SOMA MAIS 1 CENTAVO
Arredondamento_ABNT_NBR5891 = Format(StrValor_Retornar, [Ô]############0.00[Ô])
Exit Function
End If
Trata_Erros:
If Err.Number <> 0 Then
MsgBox [Ô]Erro na funcao de ARREDONDAMENTO ABNT NBR 5891: [Ô] & Err.Source & [Ô] [Ô] & Err.Description, vbCritical
Exit Function
End If
End Function
Function EImpar(ByVal iNum As Long) As Boolean
[ô]Verifica se o número é impar
[ô]Se for impar a função retorna True.
[ô]Se for par a função retorna False.
EImpar = (iNum Mod 2)
End Function
Abraços
Segue o código que estou usando em VB6:
Dim StrCodigo as String
StrCodigo = [Ô]CFe35700153485215000106599000032240000049527319|20150714164608|100.00||pLptLMeLB50r7WPs178odovBcSan4KfTOJ58bwbW1WVRiDVKzjDi2xpCxokJtT+17V6OIkmBF2/AoAGBv6H7GC2rjsZt7tDPeCnlS8GmTylKu7HSivnpmNCpbos8hkvVz66/xWODKBRNVI+PVdyTmUYXOkguQWCTJydaRYStpRDSNT6aN8Gnm8IOOLUSkizlP6q3DMWK3+pl0wdaL/yS72S5kPuzohxn0bnTO9PS6aJQvjqq45mCMrUPn7hwUvLA+mgYNaekFRcNFfj59huiBuiZluFxDbcYANAySPV+N0cVvfmShE888ZHrPANHoYUf6DSm0r/WANUH72lISuVLuw==[Ô]
Dim store_len As Integer
store_len = Len(StrCodigo) + 3
Dim store_pL As Byte
store_pL = CByte(store_len Mod 256)
Dim store_pH As Byte
store_pH = CByte(store_len / 256)
Dim ModeloQR As String
ModeloQR = Chr(29) & Chr(40) & Chr(107) & Chr(4) & Chr(0) & Chr(49) & Chr(65) & Chr(50) & Chr(0)
Dim TamanhoQR As String
TamanhoQR = Chr(29) & Chr(40) & Chr(107) & Chr(3) & Chr(0) & Chr(49) & Chr(67) & Chr(3)
Dim NivelCorrecaoQR As String
NivelCorrecaoQR = Chr(29) & Chr(40) & Chr(107) & Chr(3) & Chr(0) & Chr(49) & Chr(69) & Chr(48)
Dim DadosQR As String
DadosQR = Chr(29) & Chr(40) & Chr(107) & store_pL & store_pH & Chr(49) & Chr(80) & StrCodigo
Dim ImprimeQR As String
ImprimeQR = Chr(29) & Chr(40) & Chr(107) & Chr(3) & Chr(0) & Chr(49) & Chr(81) & Chr(48)
[ô]ENVIA DIRETO NA PORTA - ComImpressora é o componente MSComm
ComImpressoraNF.Output = ModeloQR
ComImpressoraNF.Output = TamanhoQR
ComImpressoraNF.Output = NivelCorrecaoQR
ComImpressoraNF.Output = DadosQR
ComImpressoraNF.Output = ImprimeQR
Citação:qualquer impressora térmica imprime o qrcode ?
As novas sim, antigas precisa se informar com o fabricante se tem atualizações para ela.
Mas sempre bom perguntar antes de comprar.
Citação:e no caso do .net, da pra fazer isso tranquilo ?
é tudo muito novo ainda, gerar o qrcode tem controles que geram, o problema é imprimir e ajustar os tamanhos, o minimo permitido é o modulo 4(4 centimetros), imprimindo nesse tamanho a maioria dos celulares que testamos não leram, só leram mesmo o modulo 6.
E tem ainda o codebar 128, por essas e outras é que a principio, principalmente devido a pressa, decide me amarrar da dr700 da daruma que já facilita em tudo isso, mas tem outras marcas tambem, eu não recomendo porque não utilizei ainda, não conheço.