libfacturista como componente (COM) fuera de proceso

Hay algunas razones por las que convendría usar la DLL como un componente (COM)
fuera de proceso en vez de ligarla a su aplicación.

1. Su aplicación es de 64 bits, pero no puede usar una DLL de 32 bits.

2. Se requiere declarar los prototipos de las funciones de la DLL
para que su aplicación pueda invocarlas.
A veces enlazar con una DLL nativa se vuelve complicado.

3. La DLL está protegida contra depuradores y la aplicación termina
cuando la ejecuta paso a paso.

4. Se nos ha informado que en ocasiones el entorno de desarrollo de .Net
no encuentra los archivos .dll .

5. En VB6, los .dll deben estar en Windows\System32 para ser
visibles si se ejecuta la aplicación desde el entorno de desarrollo.
Si se ejecuta desde el explorador de archivos de Windows, basta con tener la dll
en el mismo directorio de su aplicación.


Los puntos anteriores se solucionan poniendo la DLL en un proceso externo,
el cual se expone como un componente que puede ser instanciado con CreateObject() .

Aqui están los pasos para migrar a esta forma de trabajo.

1. Descargar https://www.dropbox.com/s/ll308bgfqm5y4sd/libfacturista20170308_mx.zop?dl=0
y descomprimirlo a un directorio aparte de su aplicación.
Si su SO es de 64 bits, el directorio debería estar bajo Windows\Program Files (x86) .

2. Si va a usarla en producción, activar su licencia seleccionando el archivo <ruta>\libfacturista_comx.exe

3. Registrar el componente en un CMD con

	cd <ruta>
	regasm /tlb <ruta>\libfacturista_comx.exe

Cuando haya una actualización del componente, antes de registrarla deberá quitar primero la anterior con

	regasm /u <ruta>\libfacturista_comx.exe


4. Actualizar el código de su aplicación:
a) Instanciar el componente con olf = CreateObject("libfacturista_comx.utf16Api")
b) Anteponer a las llamadas a funciones de la DLL el nombre que usó para el objeto,
por ejemplo olf.NombreFuncion()

De este modo, se llama a las mismas funciones pero ahora con una notación de objetos y
solucionando los puntos mencionados anteriormente.

c) Para preservar la memoria es indispensable liberar cada manejador obtenido,
así como indicar al componente que hemos terminado de usarlo
y liberar el objeto con la instrucción que nos dé nuestro lenguaje, por ejemplo:

olf.cfdi_destruir(hroot)
olf.Close()

release olf
olf=null

d) Tomar en cuenta que el componente devuelve cadenas UTF16 (Unicode),
tal vez su lenguaje lo soporte sin problemas.


Ahora bien, como no se crearán decenas de nuevas funciones para los datos de las
nuevas versiones de CFDI o sus complementos, aparte de poder usar estructuras INI
para la generación del XML, les damos estos componentes como alternativa:

CreateObject('libfacturista_comx.mx.nomina12.Nomina')

CreateObject("libfacturista_comx.mx.pagos10.Pagos")

CreateObject("libfacturista_comx.mx.cfdi33.Comprobante")


Con lo cual podrán asignar los valores a todas las propiedades de cada componente,
para después serializarlo e insertarlo en el documento (o manejador) XML.

	olfnom = CreateObject('libfacturista_comx.mx.nomina12.Nomina')

	olfnom.Version = "1.2"
	olfnom.TipoNomina = "O"
	olfnom.FechaPago = "2017-03-01"

	olfnom.Emisor.Curp = "MEVA750713HCCDZR01"
	olfnom.Emisor.RegistroPatronal = "DATO"
	olfnom.Emisor.RfcPatronOrigen = "AAA010101AAA"

	
	olfpag = CreateObject("libfacturista_comx.mx.pagos10.Pagos")
	
	olfpag.Pago.Item(0).addItem()
	olfpag.Pago.Item(0).FechaPago =  "2017-03-01T12:12:12"
	olfpag.Pago.Item(0).FormaDePagoP =  "01"
	olfpag.Pago.Item(0).MonedaP =  "AED"

	olfpag.Pago.Item(0).Impuestos.addItem()
	olfpag.Pago.Item(0).Impuestos.Item(0).TotalImpuestosRetenidos =  "1.0"
	olfpag.Pago.Item(0).Impuestos.Item(0).TotalImpuestosTrasladados =  "1.0"


	olfcom = CreateObject("libfacturista_comx.mx.cfdi33.Comprobante")
	
	olfcom.Version =  "3.3"
	olfcom.Serie =  "F"
	olfcom.Folio =  "1"
	olfcom.Fecha =  "2017-03-01T12:12:12"

	olfcom.Emisor.Rfc =  "AAA010101AAA"
	olfcom.Emisor.Nombre =  "facturista.com"
	olfcom.Emisor.RegimenFiscal =  "601"


Los ejemplos completos de uso están en:

ejemplos/foxpro/ejemplo_foxpro_nomina12_comx.prg
ejemplos/foxpro/ejemplo_foxpro_pagos10_comx.prg
ejemplos/foxpro/ejemplo_foxpro_cfdi33_comx.prg

De este modo en vez de crear una estructura INI, solo debería de asignar valores a los
miembros de un objeto, lo cual la DLL interpretará como atributos del XML.


Notas:

Las funciones para complemento de Nómina 1.1 se mantienen por compatibilidad
pero quedan obsoletas al hacerse obligatoria la Nómina 1.2.

Las funciones para complemento IEDU e Impuestos Locales siguen siendo válidas,
pero se usarian una vez que el xml 3.3 se haya insertado ( xml_insert() ) o
esté cargado ( cfdi_xml_cargar() )

Tomar en cuenta que el complemento IEDU se agregará al último Concepto del CFDI.

Los demás complementos (INE, Comercio Exterior, etc.) que actualmente
agrega con xml_insert() puede seguirlos usando una vez que tenga en memoria el xml base.

Puede seguir usando la DLL directamente si así lo prefiere.
Desde luego, para el CFDI 3.3 y nuevas estructuras o documentos XML
habrá que construir el INI o XML para pasarselo a cfdi_xml_cargar() o xml_insert() .