Facturación en Controlador Fiscal (Argentina)

HMG en Español

Moderator: Rathinagiri

Post Reply
User avatar
Roberto Lopez
HMG Founder
Posts: 3900
Joined: Wed Jul 30, 2008 6:43 pm
Has thanked: 13 times
Been thanked: 136 times

Facturación en Controlador Fiscal (Argentina)

Post by Roberto Lopez » Fri Feb 24, 2017 9:26 pm

Consulta:

Alguien sabe cual es el estado actual de la normativa de AFIP respecto del software de facturación para controladores fiscales?

Sigue siendo necesaria la presentación de un formulario y el código fuente de la aplicación ante AFIP?

Muchas Gracias.
Regards/Saludos,

Roberto


(Veritas Filia Temporis)

User avatar
danielmaximiliano
Posts: 2045
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Has thanked: 87 times
Been thanked: 12 times
Contact:

Post by danielmaximiliano » Thu Mar 09, 2017 11:32 pm

Perdón por no responder ya que estoy sin internet desde el 2 enero 2017..
Estoy desconectado del foro x ese motivo; si todavía tiene ese problema.Me fijo en mi cuenta afip

Pueden usar mi celular que está más abajo para comunicarse conmigo mediante WhatsApp
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`.HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. : +54901169026142
Telegram Name : DaNiElMaXiMiLiAnO

User avatar
Roberto Lopez
HMG Founder
Posts: 3900
Joined: Wed Jul 30, 2008 6:43 pm
Has thanked: 13 times
Been thanked: 136 times

Post by Roberto Lopez » Thu Mar 09, 2017 11:51 pm

danielmaximiliano wrote:
Thu Mar 09, 2017 11:32 pm
Perdón por no responder ya que estoy sin internet desde el 2 enero 2017..
Estoy desconectado del foro x ese motivo; si todavía tiene ese problema.Me fijo en mi cuenta afip

Pueden usar mi celular que está más abajo para comunicarse conmigo mediante WhatsApp
Gracias por tu respuesta Daniel.

Encontré en otro foro, que, ahora, quién vaya a ser usuario de tu software, debe, desde la web de AFIP (con clave fiscal) declarar el CUIT del programador (o empresa) responsable del software y que la otra parte, debe aceptar la responsabilidad (con su clave fiscal) para que el trámite quede completo.

Mucho más sencillo de lo que era.

Muchas Gracias.
Regards/Saludos,

Roberto


(Veritas Filia Temporis)

User avatar
danielmaximiliano
Posts: 2045
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Has thanked: 87 times
Been thanked: 12 times
Contact:

Post by danielmaximiliano » Sat Mar 11, 2017 10:00 pm

Si, exactamente lo que hice, fue declarar la impresora fiscal bajo mi cargo y que el programaba cumple los requisitos que es la conmitancia que es lo que el scanner lee se imprime ...
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`.HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. : +54901169026142
Telegram Name : DaNiElMaXiMiLiAnO

User avatar
Roberto Lopez
HMG Founder
Posts: 3900
Joined: Wed Jul 30, 2008 6:43 pm
Has thanked: 13 times
Been thanked: 136 times

Post by Roberto Lopez » Mon Mar 13, 2017 12:51 am

danielmaximiliano wrote:
Sat Mar 11, 2017 10:00 pm
Si, exactamente lo que hice, fue declarar la impresora fiscal bajo mi cargo y que el programaba cumple los requisitos que es la conmitancia que es lo que el scanner lee se imprime ...
Ahora estoy tratando de ponerme al día con las impresoras fiscales de segunda generación Hasar y viendo el tema de los reportes obligatorios que deben descargarse de la IF para elevar a AFIP.

Además, como trato de no usar el OCX (uso directamente winfis32.dll) tengo una lucha adicional.

Nunca terminamos de aprender lo suficiente :)
Regards/Saludos,

Roberto


(Veritas Filia Temporis)

User avatar
danielmaximiliano
Posts: 2045
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Has thanked: 87 times
Been thanked: 12 times
Contact:

Post by danielmaximiliano » Mon Mar 13, 2017 1:11 am

Te mando mis rutinas simple de winfis

Code: Select all

*-------------------------------------------------------------*
Function AbrirPuerto( lRetorno )
*-------------------------------------------------------------*
nHandler := CallDll32( "OpenComFiscal" , "WINFIS32.DLL" , 1 , 0 )

    If nHandler >= 0 
       Principal.StatusBar.Item(2) :="Puerto de impresora OK "
       nError := CallDll32( "InitFiscal"    , "WINFIS32.DLL" , nHandler )
       If nError = 0
         lRetorno :=  .T.
       Else 
         alerror( nError )
         Principal.StatusBar.Item(2) := " La impresora no se puede Inicializar"   
          lRetorno := .T.  
       Endif
   Else
    alerror( nHandler )
    Principal.StatusBar.Item(2) :=" Hubo un error de abrir puerto Comm "
    lRetorno := .T.      
   Endif

Return ( lRetorno )

*-------------------------------------------------------------*
Function CerrarPuerto()
*-------------------------------------------------------------*
CallDll32 ( "CloseComFiscal" , "WINFIS32.DLL" , nHandler)
Return

*-------------------------------------------------------------*
FUNCTION Cierrez()
*-------------------------------------------------------------*
Local Cierrez 
cFecha :=  DtoC( Date() )
Cierrez := "9" + Se + "Z"

If MsgYesno( '¿ Realizar Cierre Z ? ' + ChR(10)+ ;
             ' Fecha : ' + cFecha , " Mensaje de atención ")
      nError := CallDll32 ( "MandaPaqueteFiscal" , "WINFIS32.DLL" , nHandler , Cierrez )       
    If nError == 0
	    msginfo( "Se Realizo el cierre Z", "Informacion" )
        CerrarPuerto()
    Else
        msginfo( "Intente Realizar nuevo cierre Z " , " Mesaje de atención " )
    endif
Endif
Return   

            
*-------------------------------------------------------------*
FUNCTION Cierrex()
*-------------------------------------------------------------*
Local Cierrex
cFecha :=  DtoC( Date() )
Cierrez := "9" + Se + "X"
If MsgYesno( ' ¿ Realizar Cierre X ? ' + ChR(10)+ ;
             ' Fecha : ' + cFecha , " Mensaje de atención " )
      nError := CallDll32 ( "MandaPaqueteFiscal" , "WINFIS32.DLL" , nHandler , Cierrez )       
      If  nError  == 0
		  msginfo( "Se Realizo el cierre X " , " Información " )
          CerrarPuerto()
      Else
      msginfo( " Intente Realizar nuevo cierre X ", " Mensaje de atención ")
      Endif
    
endif

Return   
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`.HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. : +54901169026142
Telegram Name : DaNiElMaXiMiLiAnO

User avatar
Roberto Lopez
HMG Founder
Posts: 3900
Joined: Wed Jul 30, 2008 6:43 pm
Has thanked: 13 times
Been thanked: 136 times

Post by Roberto Lopez » Thu Mar 16, 2017 4:05 pm

danielmaximiliano wrote:
Mon Mar 13, 2017 1:11 am
Te mando mis rutinas simple de winfis

Code: Select all

*-------------------------------------------------------------*
Function AbrirPuerto( lRetorno )
*-------------------------------------------------------------*
nHandler := CallDll32( "OpenComFiscal" , "WINFIS32.DLL" , 1 , 0 )

    If nHandler >= 0 
       Principal.StatusBar.Item(2) :="Puerto de impresora OK "
       nError := CallDll32( "InitFiscal"    , "WINFIS32.DLL" , nHandler )
       If nError = 0
         lRetorno :=  .T.
       Else 
         alerror( nError )
         Principal.StatusBar.Item(2) := " La impresora no se puede Inicializar"   
          lRetorno := .T.  
       Endif
   Else
    alerror( nHandler )
    Principal.StatusBar.Item(2) :=" Hubo un error de abrir puerto Comm "
    lRetorno := .T.      
   Endif

Return ( lRetorno )

*-------------------------------------------------------------*
Function CerrarPuerto()
*-------------------------------------------------------------*
CallDll32 ( "CloseComFiscal" , "WINFIS32.DLL" , nHandler)
Return

*-------------------------------------------------------------*
FUNCTION Cierrez()
*-------------------------------------------------------------*
Local Cierrez 
cFecha :=  DtoC( Date() )
Cierrez := "9" + Se + "Z"

If MsgYesno( '¿ Realizar Cierre Z ? ' + ChR(10)+ ;
             ' Fecha : ' + cFecha , " Mensaje de atención ")
      nError := CallDll32 ( "MandaPaqueteFiscal" , "WINFIS32.DLL" , nHandler , Cierrez )       
    If nError == 0
	    msginfo( "Se Realizo el cierre Z", "Informacion" )
        CerrarPuerto()
    Else
        msginfo( "Intente Realizar nuevo cierre Z " , " Mesaje de atención " )
    endif
Endif
Return   

            
*-------------------------------------------------------------*
FUNCTION Cierrex()
*-------------------------------------------------------------*
Local Cierrex
cFecha :=  DtoC( Date() )
Cierrez := "9" + Se + "X"
If MsgYesno( ' ¿ Realizar Cierre X ? ' + ChR(10)+ ;
             ' Fecha : ' + cFecha , " Mensaje de atención " )
      nError := CallDll32 ( "MandaPaqueteFiscal" , "WINFIS32.DLL" , nHandler , Cierrez )       
      If  nError  == 0
		  msginfo( "Se Realizo el cierre X " , " Información " )
          CerrarPuerto()
      Else
      msginfo( " Intente Realizar nuevo cierre X ", " Mensaje de atención ")
      Endif
    
endif

Return   
Muchas Gracias Daniel.

Son muy similares a las que uso con las IF de primera generación. .

Lo que pasa es que el tema con las nuevas (P-HAS-5100-FAR, SMH/PT-1000F y SMH/PT-250F) es que, si usás winfis32.dll, necesitas enviar un checksum, que me está costando bastante calcular ya que no hay ejemplos de programación con la dll directamente y yo estoy tratando de no usar el OCX.

Por ejemplo, para abrir un comprobante, tenés que enviar algo así (según el comprobante que quieras abrir):

Code: Select all

STX
SN
ESC
40 hexa/64 decimal (ASCII '@')
FS
1 Código de Comprobante
ETX
BCC
Como ves, hay varios cambios, pero el más importante es el BCC, que es el checksum que te mencionaba.
Regards/Saludos,

Roberto


(Veritas Filia Temporis)

User avatar
danielmaximiliano
Posts: 2045
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Has thanked: 87 times
Been thanked: 12 times
Contact:

Post by danielmaximiliano » Fri Mar 17, 2017 1:49 am

Veo mañana cuando regrese este tema Roberto.

Slds
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`.HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. : +54901169026142
Telegram Name : DaNiElMaXiMiLiAnO

jkazmirchuk
Posts: 1
Joined: Fri Oct 21, 2016 1:06 pm

Post by jkazmirchuk » Wed Aug 16, 2017 8:16 pm

Roberto:

Buscando info sobre las Impresoras Fiscales de nueva generación vi tu post.

Si entendí bien y no es tarde, el BCC que mencionás se puede obtener con la siguiente función:

* ------------------------------------------------------------------------------
* FUNCTION CF_GetCRC( cCmd )
* CF: Obtener Caracteres de Verificación de Bloque (CRC)
* ------------------------------------------------------------------------------
* Procedimiento: Obtener los Caracteres de Verificación de Bloque (CRC)
* Parámetros : cCmd: Cadena de caracteres para obtener su CRC
* Retorna : Caracteres de Verificación de Bloque (CRC)
* ------------------------------------------------------------------------------
FUNCTION CF_GetCRC( cCmd )

LOCAL nCRC := 0
LOCAL nI

FOR nI := 1 TO Len( cCmd )

nCRC += Asc( SubStr( cCmd, nI, 1 ) )

NEXT

RETURN ( Upper( PadL( NtoC( nCRC, 16 ), 4, '0' ) ) )
* ------------------------------------------------------------------------------

User avatar
Roberto Lopez
HMG Founder
Posts: 3900
Joined: Wed Jul 30, 2008 6:43 pm
Has thanked: 13 times
Been thanked: 136 times

Post by Roberto Lopez » Fri Aug 18, 2017 12:38 am

jkazmirchuk wrote:
Wed Aug 16, 2017 8:16 pm
Roberto:

Buscando info sobre las Impresoras Fiscales de nueva generación vi tu post.

Si entendí bien y no es tarde, el BCC que mencionás se puede obtener con la siguiente función:

* ------------------------------------------------------------------------------
* FUNCTION CF_GetCRC( cCmd )
* CF: Obtener Caracteres de Verificación de Bloque (CRC)
* ------------------------------------------------------------------------------
* Procedimiento: Obtener los Caracteres de Verificación de Bloque (CRC)
* Parámetros : cCmd: Cadena de caracteres para obtener su CRC
* Retorna : Caracteres de Verificación de Bloque (CRC)
* ------------------------------------------------------------------------------
FUNCTION CF_GetCRC( cCmd )

LOCAL nCRC := 0
LOCAL nI

FOR nI := 1 TO Len( cCmd )

nCRC += Asc( SubStr( cCmd, nI, 1 ) )

NEXT

RETURN ( Upper( PadL( NtoC( nCRC, 16 ), 4, '0' ) ) )
* ------------------------------------------------------------------------------
Ese problema (gracias a la ayuda de gente de este foro) lo resolví, pero, también descubrí, que en realidad, hay una forma muchísimo más sencilla de controlar la IF, y es vía la interfase http de la impresora (que incorpora un servidor web).

Si bien, finalmente el proyecto cambió y se optó por IFs de primera generación, yo avancé bastante en la investigación (basándome en ejemplos).

Los comandos pueden enviarse a la impresora, por medio del utilitario "curl" y mi experimento se basó en el, pero, seguramente, podría hacerse, directamente desde Harbour, usando la librería HBTIP (no lo he probado).

Para abrir un comprobante:

Code: Select all

curl http://127.0.0.1/fiscal.xml -H "Content-Type: text/xml" --data-binary @abrircomprobante.xml >resp.txt
El archivo "abrircomprobante.xml" contiene:

Code: Select all

<AbrirDocumento>
<CodigoComprobante>TiqueFacturaB</CodigoComprobante>
</AbrirDocumento>
Para imprimir un ítem:

Code: Select all

curl http://127.0.0.1/fiscal.xml  -H "Content-Type: text/xml" --data-binary @imprimiritem.xml >resp.txt
El archivo "imprimiritem.xml" contiene:

Code: Select all

<ImprimirItem>
<Descripcion>Cable miniplug 1.5</Descripcion>
<Cantidad>1.0</Cantidad>
<PrecioUnitario>200.00</PrecioUnitario>
<CondicionIVA>Gravado</CondicionIVA>
<AlicuotaIVA>21.00</AlicuotaIVA>
<OperacionMonto>ModoSumaMonto</OperacionMonto>
<TipoImpuestoInterno>IIVariableKIVA</TipoImpuestoInterno>
<MagnitudImpuestoInterno>0.00</MagnitudImpuestoInterno>
<ModoDisplay>DisplayNo</ModoDisplay>
<ModoBaseTotal>ModoPrecioTotal</ModoBaseTotal>
<UnidadReferencia>20</UnidadReferencia>
<CodigoProducto>779123456789</CodigoProducto>
<CodigoInterno>C1130</CodigoInterno>
<UnidadMedida>Pack</UnidadMedida>
</ImprimirItem>
Para imprimir el subtotal:

Code: Select all

curl http://127.0.0.1/fiscal.xml -H "Content-Type: text/xml" --data-binary @subtotal.xml >resp.txt
El archivo "subtotal.xml" contiene:

Code: Select all

<ConsultarSubtotal>
<Impresion>ImprimeSubtotal</Impresion>
<ModoDisplay>DisplayNo</ModoDisplay>
</ConsultarSubtotal>
Para imprimir el pago:

Code: Select all

curl http://127.0.0.1/fiscal.xml -H "Content-Type: text/xml" --data-binary @imprimirpago.xml >resp.txt
El archivo "imprimirpago.xml" contiene:

Code: Select all

<ImprimirPago>
<Descripcion>Tarjeta de Crédito</Descripcion>
<Monto>200.00</Monto>
<Operacion>Pagar</Operacion>
<ModoDisplay>DisplayNo</ModoDisplay>
<DescripcionAdicional>Nro.: *******3245</DescripcionAdicional>
<CodigoFormaPago>TarjetaDeCredito</CodigoFormaPago>
<Cuotas>6</Cuotas>
<Cupones>12345678</Cupones>
<Referencia>ABC123</Referencia>
</ImprimirPago>
Para cerrar el comprobante:

Code: Select all

curl http://127.0.0.1/fiscal.xml -H "Content-Type: text/xml" --data-binary @cerrarcomprobante.xml >resp.txt
El archivo "cerrarcomprobante.xml" contiene:

Code: Select all

<CerrarDocumento>
<Copias>2</Copias>
<DireccionEMail>cliente@suempresa.com.ar</DireccionEMail>
</CerrarDocumento>
Como Hasar distribuye un emulador junto con la documentación, el software y los ejemplos, es muy fácil experimentar.
Regards/Saludos,

Roberto


(Veritas Filia Temporis)

Post Reply