Ver Mensaje Individual
  #215  
Antiguo 01-10-2010
edgaronfo edgaronfo is offline
Miembro
 
Registrado: jul 2007
Posts: 33
Reputación: 0
edgaronfo Va por buen camino
Question Qué onda con el SAT?

Hola programadores y foreros, les envío un cordial saludo.
Este es mi primer post y antes que nada permítanme felicitarlos por el excelente trabajo que están haciendo en estos foros del clubdelphi.com ya que me han salvado incontables veces; pero en especial en este foro de las facturas electrónicas SAT, este foro me ha salvado la vida (bueno tal vez no tanto como la vida pero me ha dado una gran ayudadota): MUUUUCHAS GRACIAAAAAAS!!!!

Gracias al código que han puesto aquí estoy haciendo mi modulito de facturas electrónicas, si no, quién sabe si lo hubiera podido hacer. De nuevo muchas gracias.

Y me gustaría añadir mi granito de arena al tema, ya que yo tuve problemas para añadir los encabezados y el tipo de documento al documento xml y en estos foros leí un hilo que decía que tienes que respetar los namespaces del documento, y no fijarlo como atributo:

véase: Attributos fantasmas en nodos XML (www_clubdelphi_com/foros/showthread.php?t=40379)

y leyendo sus indicaciones llegué a esto:

Código:
procedure prepareSatXML(thisXMLDoc : TXMLDocument);
var CFD : IXMLComprobante;
begin
    thisXMLDoc.XML.Text := '';
    thisXMLDoc.Active := True;
    thisXMLDoc.Version := '1.0';
    thisXMLDoc.Encoding:='UTF-8';

    CFD := GetComprobante(thisXMLDoc);
    CFD.DeclareNamespace('xsi', 'http_//www_w3_org/2001/XMLSchema-instance');
    CFD.Schema:='http_//www_sat_gob_mx/cfd/2 http_//www_sat_gob_mx/sitio_internet/cfd/2/cfdv2.xsd';
    CFD.Version:='2.0';
end;
aunque para usar CFD.Schema tuve que hacer un poco más de argucias en el unit que me generó el delphi xml bind

Por cierto, primero use el xml binder para que delphi me generara una unidad de interface para manejar automáticamente el documento xml en el formato que pide hacienda como está ejemplificado arriba (IXMLComprobante).

Y luego use el TSXLPageProducer para que automáticamente me generara la cadena original (Ejemplo de TSXLPageProducer):
Código:
procedure TForm1.bttnCadenaOriginal1Click(Sender: TObject);
var xslt_source : string;
begin
  xslt_source := 'cadenaoriginal_2_0.xslt';
try
   XMLDoc.Active := False; // just in case
   XSLPageProducer1.FileName := xslt_source;
   XSLPageProducer1.XMLData := XMLDoc;
   XMLDoc.Active := True;
   Memo1.Text := XSLPageProducer1.Content; // Transform!!
 except
   on E: Exception do
     Memo1.Text := E.Message
 end;
end;
Y así dejas que delphi se haga bolas por tí, jejeje.
espero que sea de ayuda para alguien como lo fue para mí.

Entonces mis preguntas son:
De dónde obtienes NoAprobación y AnoAprobación ??

Y finalmente usando Sello.pas que bajas de este mismo hilo (muchísimas gracias felipep) puedes producir el sello, el certificado y el NoCertificado.

Y precisamente aquí es donde está mi última pregunta:
la función GetNoCertificado(const AFileName: string): string; de la unidad Sello.pas me regresa un string muy raro, así debe ser?
ejemplo de resultado:
〱〰㈱〰〰〰〰㈰㔲㜱圌¨
que cuando le hago: UTF8Decode(NoCertificado) me da:
??????????? (puros signos de interrogación)

Muchas gracias por su atención.


Saludos!
Responder Con Cita