Imagen

DESCARGA SOFTWARE PARA FACTURA ELECTRONICA DE AQUI.
Facturacion, Validacion, Addendas, Librerias de programacion, etc.


CARTA PORTE V3.1

ECODEX TIENE ESTOS NUEVOS DATOS DE CONTACTO :
Comercializacion y Ventas - Evelia Vicke evicke@ecodex.com.mx 33-16-03-03-48
Soporte - Humberto Guerrero soporte@ecodex.com.mx 33-34-90-46-03


.

Codigo Fuente de Mdo Libre en Delphi distinto a version 7

Para los que programamos en Delphi, aqui estan las respuestas
[[ FORO CERRADO DEBIDO A QUE YA LA INFORMACION YA NO ES VIGENTE ]]
omarloi
Mensajes: 22
Registrado: Mar Jul 13, 2010 1:16 pm

Re: Codigo Fuente de Mdo Libre en Delphi distinto a version

Mensaje por omarloi »

Gracias dado,

Hice lo que me digiste y me seguia marcando el mismo error,
ya desesperado y sin opciones quite la ñ de compañia y los acentos de Mexico (dado que el error me marcaba que habia caracteres no validos) y funciono, no me marco ningun error y me genero la cadena, el sello y el xml, sabe alguien a que se deba esto o si me afecta a la hora de generar la cadena o el sello ?? :?

Gracias.
Avatar de Usuario
Dado
Mensajes: 15980
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Codigo Fuente de Mdo Libre en Delphi distinto a version

Mensaje por Dado »

Si te va a afectar, ya que aunque no tengas acentos o ñ en el emisor en cualquier momento te puede llegar un cliente con una ñ en su nombre, o incluso un ampersand (&) en su RFC.

Validaste el sello para ver si lo genero bien?

Ahora, el error en general sigue siendo el mismo, conversion de cadenas, entre string, ansistring, utf8, etc....es un lio.
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
omarloi
Mensajes: 22
Registrado: Mar Jul 13, 2010 1:16 pm

Re: Codigo Fuente de Mdo Libre en Delphi distinto a version

Mensaje por omarloi »

Si crees qe sea error por la convercion de cadenas?

Si lo valide y si esta bien el sello, de lo cual me viene otra duda, para generar el sello digital se necesitan dos archivos, el .cer y el .key, me imagino que el .cer es el certificado de sello digital, pero el .key de que es? yo tenia entendido que el certificado de sello digital es solo un .cer, y me imagino que el procedimiento del codigo para generar el sello lo que hace es leer ese .cer y darnos el sello digital en cadena de texto, estoy bien o me equivoco? :?

Gracias.
Avatar de Usuario
Dado
Mensajes: 15980
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Codigo Fuente de Mdo Libre en Delphi distinto a version

Mensaje por Dado »

Absolutamente convencido de que el error es por la conversion de cadenas.

Acerca de las llaves publica privada y certificados inicie un tema en el foro "OpenSSL en general" con el titulo "Archivo key y cer, llave publica y privada. Que es eso?" checalo por alla.

Te adelanto un poco la respuesta:

Para generar el sello digital SOLO se necesita el *.key o llave privada.

El *.cer contiene la llave publica que sirve para revisar si el sello es autentico.

El certificado *.cer NO SE REQUIERE para generar el sello.

Tambien revisa en este foro "Delphi" un tema que dice "No tengo el archivo llave" dice lo mismo que aqui pero mas revuelto..... :mrgreen:
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
omarloi
Mensajes: 22
Registrado: Mar Jul 13, 2010 1:16 pm

Re: Codigo Fuente de Mdo Libre en Delphi distinto a version

Mensaje por omarloi »

Hola,

Me di cuenta que el error de los caracteres especiales me lo marcaba al momento de Generar la cadena Original, cuando cuando copia el XMLDOC :

XMLDocCopy.XML := XMLDoc.XML ;
XMLDocCopy.Active := true;

Al momento de activarlo me marcaba el error, lo que hice fue, en ves de hacer una copia de los XMLDoc, genere otro exactamente igual al XMLDoc en el XMLDocCopy, algo asi :

Código: Seleccionar todo

XMLDocCopy.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Comprobante xmlns="http://www.sat.gob.mx/cfd/2"></Comprobante>';
XMLDocCopy.Active := True;
CFD := GetComprobante(XMLDocCopy);

// A PARTIR DE AQUI TIENE QUE ADAPTARSE A TOMAR LOS DATOS DE SU BASE DE DATOS O FORMULARIO O DE DONDE
// TENGAN LA FACTURA "NORMAL", LOS RENGLONES QUE TIENEN UNA {opc} SIGNIFICA QUE (SEGUN EL ANEXO 20) SON
// DATOS OPCIONALES.

// El *unico* dato que entra como parametro es FolioFactura....ya que aqui pueden hacer una consulta SQL
// a una factura que ya este grabada en una base de datos y de ahi ir tomando los valores, es decir pueden usar:

// SQL.Add('select * from mitablafactura where foliofactura=' + IntToStr(FolioFactura));
// SQL.Execute

	with CFD do
	begin
		SetAttribute('xmlns:xsi','http://www.w3.org/2001/XMLSchema-instance');
		SetAttribute('xsi:schemaLocation','http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd');
		Version := '2.0';
{opc}	Serie := OpcC('FacturaE','FolioSerie');
		Folio := IntToStr(1234);
		Fecha := '2010-01-01T12:12:12'; //<<<<<<<<<<<<<<<<<<<<<REQUIERE TRABAJO AQUI
		Sello := ''; //Este dato *no* es opcional, pero se calcula mas adelante...
		NoAprobacion := StrToIntDef(OpcC('FacturaE','FolioNoAprobacion'),0);
		AnoAprobacion := StrToIntDef(OpcC('FacturaE','FolioAnoAprobacion'),0);
		FormaDePago := 'Pago en una sola exhibicion';
		NoCertificado := OpcC('FacturaE','CertNo');
{opc	Certificado := '';}
{opc	CondicionesDePago := '';}
		SubTotal := '68.50'; //<<<<<<<<<<<<<<<<<<<<<REQUIERE TRABAJO AQUI
{opc	Descuento := '';}
{opc	MotivoDescuento := '';}
		Total := '79.46'; //<<<<<<<<<<<<<<<<<<<<<REQUIERE TRABAJO AQUI
{opc	MetodoDePago := '';}
		TipoDeComprobante := 'ingreso';

		with Emisor do
		begin
			Rfc := OpcC('FacturaE','RFC');
			Nombre := OpcC('FacturaE','Nombre');

			with DomicilioFiscal {alias UbicacionFiscal} do
			begin
				Calle := OpcC('FacturaE','Calle');
{opc}			NoExterior := OpcC('FacturaE','NoExterior');
{opc			NoInterior := '';}
{opc}			Colonia := OpcC('FacturaE','Colonia');
{opc}			Localidad := OpcC('FacturaE','Localidad');
{opc			Referencia := '';}
				Municipio := OpcC('FacturaE','Municipio');
				Estado := OpcC('FacturaE','Estado');
				Pais := OpcC('FacturaE','Pais');
				CodigoPostal := OpcC('FacturaE','CodigoPostal');
			end; {with CFD.Emisor.DomicilioFiscal}

			if false then {todo el bloque es opcional, solo se usa si hay sucursales}
{opc}		with ExpedidoEn {alias Ubicacion} do
			begin
{opc}			Calle := '';
{opc}			NoExterior := '';
{opc}			NoInterior := '';
{opc}			Colonia := '';
{opc}			Localidad := '';
{opc}			Referencia := '';
{opc}			Municipio := '';
{opc}			Estado := '';
				Pais := '';
{opc}			CodigoPostal := '';
			end; {with CFD.Emisor.ExpedidoEn}
		end; {with CFD.Emisor}

		with Receptor do
		begin
			Rfc := Paso2Form.RFCCliente.Text;
			Nombre := Paso2Form.NombreCliente.Text;;

			with Domicilio {alias Ubicacion} do
			begin
{opc}			Calle := Paso2Form.CalleCliente.Text;
{opc}			NoExterior := Paso2Form.NoExteriorCliente.Text;
{opc			NoInterior := '';}
{opc}			Colonia := Paso2Form.ColoniaCliente.Text;
{opc}			Localidad := Paso2Form.CiudadCliente.Text;
{opc			Referencia := '';}
{opc}			Municipio := Paso2Form.MunicipioCliente.Text;
{opc}			Estado := Paso2Form.EstadoCliente.Text;
				Pais := Paso2Form.PaisCliente.Text;
{opc}			CodigoPostal := Paso2Form.CodigoPostalCliente.Text;
			end; {with CFD.Receptor.Domicilio}
		end; {with CFD.Receptor}

		with Conceptos do
		//AQUI DEBEN USAR UN FOR, REPEAT, WHILE, ETC SEGUN SU BASE DE DATOS
		{for n := 1 to maxarticulos do
		Repeat .... Until todoslosarticulos
		While not EOF do}
		begin
			with Conceptos.Add do
			begin
				Cantidad := Paso2Form.Cantidad1.Text;
{opc}			Unidad := Paso2Form.Unidad1.Text;
{opc			NoIdentificacion := '';}
				Descripcion := Paso2Form.Descr1.Text;
				ValorUnitario := FloatToStrF(StrToFloatDef(Paso2Form.PU1.Text,0),ffFixed,10,2);
				Importe := FloatToStrF(StrToFloatDef(Paso2Form.PT1.Text,0),ffFixed,10,2);
			end; {with CFD.Concepto}

			with Conceptos.Add do
			begin
				Cantidad := Paso2Form.Cantidad2.Text;
{opc}			Unidad := Paso2Form.Unidad2.Text;
{opc			NoIdentificacion := '';}
				Descripcion := Paso2Form.Descr2.Text;
				ValorUnitario := FloatToStrF(StrToFloatDef(Paso2Form.PU2.Text,0),ffFixed,10,2);
				Importe := FloatToStrF(StrToFloatDef(Paso2Form.PT2.Text,0),ffFixed,10,2);
			end; {with CFD.Concepto}

			with Conceptos.Add do
			begin
				Cantidad := Paso2Form.Cantidad3.Text;
{opc}			Unidad := Paso2Form.Unidad3.Text;
{opc			NoIdentificacion := '';}
				Descripcion := Paso2Form.Descr3.Text;
				ValorUnitario := FloatToStrF(StrToFloatDef(Paso2Form.PU3.Text,0),ffFixed,10,2);
				Importe := FloatToStrF(StrToFloatDef(Paso2Form.PT3.Text,0),ffFixed,10,2);
			end; {with CFD.Concepto}
		end; {with CFD.Conceptos}

		with Impuestos do
		begin
{opc		TotalImpuestosRetenidos := '';}

			//Si hay impuesto retenido se debe usar el siguiente bloque:
{			with Retenciones.Add do
			begin
				Impuesto := 'ISR o IVA';
				Importe := 'calculo de la retencion';
			end;}

{opc}		TotalImpuestosTrasladados := '10.96'; //<<<<<<<<<<<<<<<<<<<<<REQUIERE TRABAJO AQUI

			with Traslados.Add do
			begin
				Impuesto := 'IVA';
				Tasa := '16.00';
				Importe := '10.96'; //<<<<<<<<<<<<<<<<<<<<<REQUIERE TRABAJO AQUI
			end;

			//Si necesitan IEPS usen este bloque ::
{			with Traslados.Add do
			begin
				Impuesto := 'IEPS';
				Tasa := 'tasa del impuesto';
				Importe := 'valor calculado a partir del subtotal';
			end;}
		end ; {CFD.Impuestos}
	end; {with CFD}



Lo deje todo exactamente igual, solo en el parametro de folio, se lo tube que pasar manual como se ve en el codigo:
Folio := IntToStr(1234);

Lo corri y no me marco ningun error, me genero todo con caracteres especiales :D no creo que afecte en nada hacer este procedimiento verdad ??? ahora solo me falta validarlo, me puedes decir donde lo valido ??

Gracias.
Avatar de Usuario
Dado
Mensajes: 15980
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Codigo Fuente de Mdo Libre en Delphi distinto a version

Mensaje por Dado »

Talvez te sirva saber lo siguiente:

Cuando se ejecuta " XMLDocCopy.Active := true" lo que haces es activar un "parser" o interprete, ese interprete se supone que
te ayuda e incluso te previene para que tu XML siempre quede bien, y en tu caso, ese interprete le parece mal algun
dato.

Lo mas raro, lo que incluso todavia no entiendo porque, es que en XMLDoc el interprete no "hace panchos" y cuando tratas de
hacer la copia si te marca un error.

Asegurate que XMLDocCopy.DOMVendor sea igual a MSXML, eso lo puedes checar en el "object inspector"

Para la validacion checa el validador que tenemos en la pagina-portada de este sitio, en www.validacfd.com
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
omarloi
Mensajes: 22
Registrado: Mar Jul 13, 2010 1:16 pm

Re: Codigo Fuente de Mdo Libre en Delphi distinto a version

Mensaje por omarloi »

Si, los dos estan en MSXML, cuando genero el .XML me lo genera sin el sello,
pero si se lo agrego manual y lo valido esta bien.

Sabes a que se deba que no me ponga el sello en el XML cuando uso este codigo ??

Creo que pondre una funcion al final para que se lo agrege, no es una solucion convencional
pero si funciona y lo valida bien. :roll:

Gracias.
Avatar de Usuario
Dado
Mensajes: 15980
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Codigo Fuente de Mdo Libre en Delphi distinto a version

Mensaje por Dado »

Pues si, puedes intentar hacer esa funcion para que se la agregue al final.

La verdad a mi en lo personal no me gusto tu solucion, porque practicamente lo que haces es volver a generar la factura, por cierto en lugar de XMLDoc y CFD te recomiendo que uses XMLDocCopy y CFDCopy, esto se debe a un problema que hay con Delphi, te lo explico.

Si por ejemplo en tu XML NO TIENES digamos, definido el atributo "descuento" pero lo tratas de accesar con CFD.descuento entonces provoca que aparezca ese atributo pero con el valor [cadena vacia].

Es decir, si tienes un XML asi :

<Comprobante fecha='20100909T12:12:12 sello='JIDJFO5etc' subtotal='789.90' Total='1900.00'> //NOTA que NO HAY atributo descuento......
....etc....etc...
</Comprobante>

y si en tu codigo lees el atributo por CUALQUIER MOTIVO por ejemplo :

micadena := CFD.descuento;

eso provoca que AUTOMATICAMENTE aparezca el atributo, pero con una cadena vacia. quedaria entonces :

<Comprobante fecha='20100909T12:12:12 sello='JIDJFO5etc' subtotal='789.90' Total='1900.00' descuento=''>
....etc....etc...
</Comprobante>

El problema es que NO ESTA PERMITIDO valores vacios como el que tiene ahora el atributo descuento, es por eso que me apoyo con un XMLDocCopy y un CFDCopy
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
omarloi
Mensajes: 22
Registrado: Mar Jul 13, 2010 1:16 pm

Re: Codigo Fuente de Mdo Libre en Delphi distinto a version

Mensaje por omarloi »

Si, ami tampoco me gusta eso de otra ves generar la factura y al final agregarle el sello, pero hice como me dijiste poner el XMLDocCopy y el CFDCopy y ya me genera el XML con el sello :mrgreen:
alexsanchezm
Mensajes: 1
Registrado: Lun Ago 16, 2010 12:06 pm

Re: Codigo Fuente de Mdo Libre en Delphi distinto a version

Mensaje por alexsanchezm »

Hola,

Tengo exactamente el mismo problema que tu, lo compilo en CodeGear RAD Studio 2009 y no me marca errores, pero en tiempo de ejecución al momento de generar el CFD me marca el mismo error en la misma línea, ¿me podrías decir como lo solucionaste? he intentado un buen rato y no doy con la solución. ¿copiaste manualmente el xml o como lo hiciste funcionar?

De antemano muchas gracias por la ayuda que puedas brindarme
Cerrado