Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-01-2015
lithium76 lithium76 is offline
Miembro
 
Registrado: ene 2015
Posts: 33
Poder: 0
lithium76 Va por buen camino
No pasa nada por la redacción, se entiende.. Gracias por ser tan rápido/a.. Eso he estado intentando pero no lo consigo de ninguna manera.. Tienes algún ejemplo de código si no te importa de como hacer para no trasladar el namespace, si no te importa? Muy agradecido
Responder Con Cita
  #2  
Antiguo 25-01-2015
iMia iMia is offline
Miembro
 
Registrado: jul 2010
Posts: 141
Poder: 14
iMia Va por buen camino
Como te he comentado, he reescrito todos los tipos de nuevo, sin nada de los namespaces.
A ver si manana te poongo el codigo completo del tipo facturae, para que veas lo simple (y mal para otros casos) que lo he dejado.
Responder Con Cita
  #3  
Antiguo 25-01-2015
lithium76 lithium76 is offline
Miembro
 
Registrado: ene 2015
Posts: 33
Poder: 0
lithium76 Va por buen camino
Sería de gran utilidad, muchas gracias.. aquí está una parte del mío (la de los nodos principales, todo no me deja por excesivamente largo) tal como salen del Data Binding por si queda más claro lo que quería decir

Código Delphi [-]
const
  TargetNamespace = 'http:....Facturae';

implementation

{ Global Functions }

function GetFacturae(Doc: IXMLDocument): IXMLFacturae;
begin
  Result := Doc.GetDocBinding('Facturae', TXMLFacturae, TargetNamespace) as IXMLFacturae;
end;

function LoadFacturae(const FileName: string): IXMLFacturae;
begin
  Result:= LoadXMLDocument(FileName).GetDocBinding('Facturae', TXMLFacturae, TargetNamespace) as IXMLFacturae;
end;

function NewFacturae: IXMLFacturae;
begin
  Result := NewXMLDocument.GetDocBinding('Facturae', TXMLFacturae, TargetNamespace) as IXMLFacturae;
end;

{ TXMLFacturae }

procedure TXMLFacturae.AfterConstruction;
begin
  RegisterChildNode('FileHeader', TXMLFileHeaderType);
  RegisterChildNode('Parties', TXMLPartiesType);
  RegisterChildNode('Invoices', TXMLInvoicesType);
  RegisterChildNode('Extensions', TXMLExtensionsType);
  RegisterChildNode('Signature', TXMLSignatureType_ds);
  inherited;
end;
Responder Con Cita
  #4  
Antiguo 26-01-2015
iMia iMia is offline
Miembro
 
Registrado: jul 2010
Posts: 141
Poder: 14
iMia Va por buen camino
Como verás lo he simplificado al máximo. y escribo el xml casi de forma literal

Código:
/// Tipo TFacturae
type
  TFacturae = class
  private
    fFileHeader:  TFileHeader;
    fParties:     TParties;
    fInvoices:    TInvoices;
//    fExtensions:  TExtensions;
  public
    constructor Create;
    ///
    function ToXml: IXMLDOMElement;
    ///
    property FileHeader: TFileHeader  read fFileHeader  write fFileHeader;
    property Parties:    TParties     read fParties     write fParties;
    property Invoices:   TInvoices    read fInvoices    write fInvoices;
//    property fExtensions: TExtensions  read fExtensions  write fExtensions;
  end;

{ TFacturae }

  XMLNode_eFact_32_Facturae                                     = 'fe:Facturae';
    XMLNode_eFact_32_FileHeader                                   = 'FileHeader';
    XMLNode_eFact_32_SchemaVersion                                  = 'SchemaVersion';
    XMLNode_eFact_32_Modality                                     = 'Modality';
    XMLNode_eFact_32_InvoiceIssuerType                            = 'InvoiceIssuerType';

constructor TFacturae.Create;
begin
  fFileHeader := TFileHeader.Create;
  fParties    := TParties.Create;
  fInvoices   := TInvoices.Create;
end;

function TFacturae.ToXml: IXMLDOMElement;
var
  XMLDoc: IXMLDOMDocument;
  XMLElement: IXMLDOMElement;
begin
  XMLDoc := CoFreeThreadedDOMDocument30.Create;
  try
    XMLElement := XMLDoc.createElement( XMLNode_eFact_32_Facturae );
    if XMLElement <> nil then
    begin
      XMLElement.AppendChild(Self.fFileHeader.ToXml);
      XMLElement.AppendChild(Self.fParties.ToXml);
      XMLElement.AppendChild(Self.fInvoices.ToXml);
    end;
    result := XMLElement;
  finally
  end;
end;


type
  TFileHeader = class
  private
    fSchemaVersion:     string; // (E)
    fModality:          string; // (E)
    fInvoiceIssuerType: string; // (E)
//    fThirdParty:              TThirdParty;
    fBatch:             TBatch;
//    fFactoringAssignmentData: TFactoringAssignmentData;
  public
    constructor Create;

    function ToXml: IXMLDOMNode;

    property SchemaVersion:     string read fSchemaVersion      write fSchemaVersion;
    property Modality:               string read fModality           write fModality;
    property InvoiceIssuerType: string read fInvoiceIssuerType  write fInvoiceIssuerType;
    property Batch:                  TBatch read fBatch              write fBatch;
  end;

{ FFileHeaderType }

  C_SchemaVersion_3_2 = '3.2';

  C_Modality_Individual = 'I';

  C_PersonTypeCode_Fisica   = 'F';
  C_PersonTypeCode_Juridica = 'J';

  C_ResidenceTypeCodeType_R = 'R';  /// - Residente en España
  C_ResidenceTypeCodeType_U = 'U';  /// - Residente en la UE

  C_InvoiceIssuerType_Emisor        = 'EM';

constructor TFileHeader.Create;
begin
  fSchemaVersion      := C_SchemaVersion_3_2_1;
  fModality           := C_Modality_Individual;
  fInvoiceIssuerType  := C_InvoiceIssuerType_Emisor;
  fBatch              := TBatch.Create;
end;

function TFileHeader.ToXml: IXMLDOMNode;
var
  XMLElement: IXMLDOMElement;
begin
  XMLElement := NewElementNode( nil, XMLNode_eFact_32_FileHeader );
  if XMLElement <> nil then
  begin
    XMLElement.appendChild(NewTextNode(XMLElement, XMLNode_eFact_32_SchemaVersion, Self.fSchemaVersion, 0));
    XMLElement.appendChild(NewTextNode(XMLElement, XMLNode_eFact_32_Modality, Self.fModality, 0));
    XMLElement.appendChild(NewTextNode(XMLElement, XMLNode_eFact_32_InvoiceIssuerType, Self.fInvoiceIssuerType, 0));
    XMLElement.appendChild(Self.fBatch.ToXml);
  end;
  result := XMLElement;
end;

...
p.d.: Està hecho para Delphi5...
Responder Con Cita
  #5  
Antiguo 26-01-2015
lithium76 lithium76 is offline
Miembro
 
Registrado: ene 2015
Posts: 33
Poder: 0
lithium76 Va por buen camino
Perdón pero he andado liado y no he podido responder antes... Pues es un gran trabajo, interesante la aproximación que has hecho al problema y la manera que has encontrado de resolverlo.. Me lo miraré más a fondo a ver si consigo rehacer mi código también . una lástima que el binding no consiga hacerlo directamente ¡Muchísimas gracias!
Responder Con Cita
  #6  
Antiguo 27-01-2015
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Yo tenía el mismo problema y lo resolví aquí, con la ayuda de Al González

Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
  #7  
Antiguo 27-01-2015
lithium76 lithium76 is offline
Miembro
 
Registrado: ene 2015
Posts: 33
Poder: 0
lithium76 Va por buen camino
¡Muchas gracias, olbeup! ¡Muy amable! Gran aporte este post que has puesto.. Una pregunta, si me permites, tu no trabajas a partir de la interface del Data Binding, no? ¿ Son todo IXMLNode's, que vas colocando según correspndo no?
Responder Con Cita
  #8  
Antiguo 04-02-2015
Kribbeling Kribbeling is offline
Registrado
NULL
 
Registrado: feb 2011
Posts: 5
Poder: 0
Kribbeling Va por buen camino
Cita:
Empezado por iMia Ver Mensaje
Como verás lo he simplificado al máximo. y escribo el xml casi de forma literal

Código:
/// Tipo TFacturae
type
  TFacturae = class
  private
    fFileHeader:  TFileHeader;
    fParties:     TParties;
    fInvoices:    TInvoices;
//    fExtensions:  TExtensions;
  public
    constructor Create;
    ///
    function ToXml: IXMLDOMElement;
    ///
    property FileHeader: TFileHeader  read fFileHeader  write fFileHeader;
    property Parties:    TParties     read fParties     write fParties;
    property Invoices:   TInvoices    read fInvoices    write fInvoices;
//    property fExtensions: TExtensions  read fExtensions  write fExtensions;
  end;

{ TFacturae }

  XMLNode_eFact_32_Facturae                                     = 'fe:Facturae';
    XMLNode_eFact_32_FileHeader                                   = 'FileHeader';
    XMLNode_eFact_32_SchemaVersion                                  = 'SchemaVersion';
    XMLNode_eFact_32_Modality                                     = 'Modality';
    XMLNode_eFact_32_InvoiceIssuerType                            = 'InvoiceIssuerType';

constructor TFacturae.Create;
begin
  fFileHeader := TFileHeader.Create;
  fParties    := TParties.Create;
  fInvoices   := TInvoices.Create;
end;

function TFacturae.ToXml: IXMLDOMElement;
var
  XMLDoc: IXMLDOMDocument;
  XMLElement: IXMLDOMElement;
begin
  XMLDoc := CoFreeThreadedDOMDocument30.Create;
  try
    XMLElement := XMLDoc.createElement( XMLNode_eFact_32_Facturae );
    if XMLElement <> nil then
    begin
      XMLElement.AppendChild(Self.fFileHeader.ToXml);
      XMLElement.AppendChild(Self.fParties.ToXml);
      XMLElement.AppendChild(Self.fInvoices.ToXml);
    end;
    result := XMLElement;
  finally
  end;
end;


type
  TFileHeader = class
  private
    fSchemaVersion:     string; // (E)
    fModality:          string; // (E)
    fInvoiceIssuerType: string; // (E)
//    fThirdParty:              TThirdParty;
    fBatch:             TBatch;
//    fFactoringAssignmentData: TFactoringAssignmentData;
  public
    constructor Create;

    function ToXml: IXMLDOMNode;

    property SchemaVersion:     string read fSchemaVersion      write fSchemaVersion;
    property Modality:               string read fModality           write fModality;
    property InvoiceIssuerType: string read fInvoiceIssuerType  write fInvoiceIssuerType;
    property Batch:                  TBatch read fBatch              write fBatch;
  end;

{ FFileHeaderType }

  C_SchemaVersion_3_2 = '3.2';

  C_Modality_Individual = 'I';

  C_PersonTypeCode_Fisica   = 'F';
  C_PersonTypeCode_Juridica = 'J';

  C_ResidenceTypeCodeType_R = 'R';  /// - Residente en España
  C_ResidenceTypeCodeType_U = 'U';  /// - Residente en la UE

  C_InvoiceIssuerType_Emisor        = 'EM';

constructor TFileHeader.Create;
begin
  fSchemaVersion      := C_SchemaVersion_3_2_1;
  fModality           := C_Modality_Individual;
  fInvoiceIssuerType  := C_InvoiceIssuerType_Emisor;
  fBatch              := TBatch.Create;
end;

function TFileHeader.ToXml: IXMLDOMNode;
var
  XMLElement: IXMLDOMElement;
begin
  XMLElement := NewElementNode( nil, XMLNode_eFact_32_FileHeader );
  if XMLElement <> nil then
  begin
    XMLElement.appendChild(NewTextNode(XMLElement, XMLNode_eFact_32_SchemaVersion, Self.fSchemaVersion, 0));
    XMLElement.appendChild(NewTextNode(XMLElement, XMLNode_eFact_32_Modality, Self.fModality, 0));
    XMLElement.appendChild(NewTextNode(XMLElement, XMLNode_eFact_32_InvoiceIssuerType, Self.fInvoiceIssuerType, 0));
    XMLElement.appendChild(Self.fBatch.ToXml);
  end;
  result := XMLElement;
end;

...
p.d.: Està hecho para Delphi5...
Muy Buenas ,

Esta es mi primera (bueno segunda) vez , no se si lo hago correctamente, en cualquier caso gracias.

Veo que has implementado codigo para la facturae, podrias pasarme algun ejemplo o las clases, muchas gracias .
Responder Con Cita
  #9  
Antiguo 19-02-2015
MasDelphi MasDelphi is offline
Miembro
 
Registrado: abr 2007
Posts: 10
Poder: 0
MasDelphi Va por buen camino
Hola a tod@s.
Finalmente he logrado generar la firma electrónica con el formato XAdES_EPES que es el utilizado para la FACTURAe, inicialmente comencé con Java, pero a medio camino probé las librerías de SecureBlackBox VCL de la empresa eldos.com/sbb/. Son fantásticas y muy completas, abandoné el Java y opté por desarrollarlo en Delphi XE5, en el enlace se puede descargar (incluye ejemplos muy interesantes), son librerías de pago, si deseas tener los fuentes, pero en mi caso fue suficiente con los archivos .dcu y los manuales (además de estudiar la información que ofrece el Ministerio de Industria), puede crear un pequeño programa que firmara el archivo .xml incrustando la firma electrónica, lo valido en la sede electrónica del Ministerio de Industria y todo OK.
Comparto la opinión de iMia, lo importante es entender el problema y los requerimientos, pensar la solución y no simplemente copiar el código.
Saludos.
Responder Con Cita
  #10  
Antiguo 19-02-2015
iMia iMia is offline
Miembro
 
Registrado: jul 2010
Posts: 141
Poder: 14
iMia Va por buen camino
Thumbs up

Has optado por una opción muuuuuy interesante... que ya pensé en su momento pero descarté por el coste del SBB... ya que no sabía que no hacía falta comprar los componentes si no quieres los fuentes, y que con los dcu's habia suficiente...

Aunque sea en 2 programas diferentes, así lo tienes todo en Delphi...

Cuando tenga más tiempo miraré esa opción...

EDITO: Acabo de mirar la web, y la licencia de pruebas tiene limitación de tiempo... creo que tendrás que pasar por caja...

Última edición por iMia fecha: 19-02-2015 a las 17:51:32.
Responder Con Cita
  #11  
Antiguo 20-02-2015
MasDelphi MasDelphi is offline
Miembro
 
Registrado: abr 2007
Posts: 10
Poder: 0
MasDelphi Va por buen camino
Pasar por caja...

Hola.
Sí, tiene una limitación de tiempo, aún estoy en plazo y no sabré si tendré problemas hasta llegar la fecha. Estas librerías tienen un control de licencia que no había visto en ningún otro código, se llama a una función a la cual se le pasa una cadena encriptada, con algún algoritmo del tipo HASH, es algo como: SetLicenseKey('660067560EFA9ACA818A0F134ED8D16D6D425561114AC7B9..... El nivel de control es alto y no es para menos si se tratan de librerías que encriptan y establecen marcas de seguridad con certificados digitales.
Probablemente sí tenga que pasar por caja, aunque tengo mis dudas porque sólo uso las librerías compiladas (dcu), no lo sé....
De todas formas, la urgencia que teníamos en el desarrollo me llevó a optar por este camino y hasta dentro de dos meses no se vence la licencia, creo que llegado el día pasaré por caja con gusto, librerías como esas (a mi juicio) tienen un precio mucho mayor.
Responder Con Cita
  #12  
Antiguo 24-06-2015
SAGOAN SAGOAN is offline
Miembro
 
Registrado: ago 2008
Posts: 13
Poder: 0
SAGOAN Va por buen camino
Hola a todos!!

Llevo leyendo 2 días sobre el tema de la Facturae y aun que avanzo voy superlento. Os explico, utilizo Delphi 2010, he bajado de la web www . facturae.gob.es / FORMATO /Paginas /version-3-2.aspx el esquema XSD [XML]. Estoy intentando crear con el XML Data Binding los tipos, funciones, etc.

Aquí viene el problema, el archivo con el esquema XSD viene con extensión .XML, lo cambio a .XSD y cuando el wizard del XML Data Binding intenta crear la unit con los tipos, funciones, etc da un error que en mi caso es "Acceso denegado" (raro no rarisismo). He probado a convertir un archivo XML(un borrador de Facturae creado con el programa del ministerio de industria) a XSD mediante la web www . flame-ware.com /products /xml-2-xsd y el XML Data Binding funciona correctamente, el problema es que el esquema XSD que se crea no cubre todos los casos que aborda el formato Facturae 3.2.1.

¿Alguien sabe porque da error el XML Data Binding?

Muchísimas gracias, estoy de los nervios.
Responder Con Cita
  #13  
Antiguo 25-06-2015
MasDelphi MasDelphi is offline
Miembro
 
Registrado: abr 2007
Posts: 10
Poder: 0
MasDelphi Va por buen camino
Cita:
Empezado por SAGOAN Ver Mensaje
Hola a todos!!

Llevo leyendo 2 días sobre el tema de la Facturae y aun que avanzo voy superlento. Os explico, utilizo Delphi 2010, he bajado de la web www . facturae.gob.es / FORMATO /Paginas /version-3-2.aspx el esquema XSD [XML]. Estoy intentando crear con el XML Data Binding los tipos, funciones, etc.

Aquí viene el problema, el archivo con el esquema XSD viene con extensión .XML, lo cambio a .XSD y cuando el wizard del XML Data Binding intenta crear la unit con los tipos, funciones, etc da un error que en mi caso es "Acceso denegado" (raro no rarisismo). He probado a convertir un archivo XML(un borrador de Facturae creado con el programa del ministerio de industria) a XSD mediante la web www . flame-ware.com /products /xml-2-xsd y el XML Data Binding funciona correctamente, el problema es que el esquema XSD que se crea no cubre todos los casos que aborda el formato Facturae 3.2.1.

¿Alguien sabe porque da error el XML Data Binding?

Muchísimas gracias, estoy de los nervios.
Hola SAGOAN.
Seguro que no te podré ayudar, pero te contaré mi experiencia.
En mi caso no usé el XML Data Binding, estudié el formato XAdES y creé una clase que generara la factura-e con dicho formato, simplemente componiendo un archivo texto con las etiquetas según el formato XAdES, luego cargaba dicho archivo a través de la página de Industria para verificar que no tuviera fallos, y finalmente con los componentes SecureBlackBox VCL creé un pequeño programa que incrustara la firma electrónica en dicho documento... Tres meses después de tener todo esto operativo encontré un programa que también permitía hacer la firma, por lo que al vencerse el período de prueba de los componentes SecureBlackBox VCL no los renové, y ahora uso dicho programa ... supongo que ahora habrán muchos más.

Recuerdo que el trabajo más complejo fue hacer el programa de la firma electrónica, y el del XML se me hizo sencillo dado que era volcar la información de la factura en el formato XML según XAdES, jamás cambié la extensión .XSD.

Bueno, estas son simples ideas, espero que avances en tu proyecto.

Saludos.
Responder Con Cita
  #14  
Antiguo 25-06-2015
SAGOAN SAGOAN is offline
Miembro
 
Registrado: ago 2008
Posts: 13
Poder: 0
SAGOAN Va por buen camino
Cita:
Empezado por MasDelphi Ver Mensaje
Hola SAGOAN.
Seguro que no te podré ayudar, pero te contaré mi experiencia.
En mi caso no usé el XML Data Binding, estudié el formato XAdES y creé una clase que generara la factura-e con dicho formato, simplemente componiendo un archivo texto con las etiquetas según el formato XAdES, luego cargaba dicho archivo a través de la página de Industria para verificar que no tuviera fallos, y finalmente con los componentes SecureBlackBox VCL creé un pequeño programa que incrustara la firma electrónica en dicho documento... Tres meses después de tener todo esto operativo encontré un programa que también permitía hacer la firma, por lo que al vencerse el período de prueba de los componentes SecureBlackBox VCL no los renové, y ahora uso dicho programa ... supongo que ahora habrán muchos más.

Recuerdo que el trabajo más complejo fue hacer el programa de la firma electrónica, y el del XML se me hizo sencillo dado que era volcar la información de la factura en el formato XML según XAdES, jamás cambié la extensión .XSD.

Bueno, estas son simples ideas, espero que avances en tu proyecto.

Saludos.

Muchas Gracias MasDelphi. La primera idea que tuve fue la que tu hiciste, pero al ver de lo amplio que resulta el formato XAdES estoy intentando utilizar el esquema XSD que ofrece la web de Facturae. Quizás tenga cambiar de idea y hacerlo como tu dices, me daré unos días y si alguien me puede iluminar con el XML Data Binding sería fenómeno.

Muchas gracias...
Responder Con Cita
  #15  
Antiguo 25-06-2015
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.473
Poder: 21
newtron Va camino a la fama
Cita:
Empezado por MasDelphi Ver Mensaje
... Tres meses después de tener todo esto operativo encontré un programa que también permitía hacer la firma...
¿Y se puede saber qué programa es ese?

Saludos
__________________
Be water my friend.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mexico - Como crear sellos en FACTURA ELECTRONICA.. pcicom API de Windows 12 10-11-2012 18:46:55
Factura Electrónica aig Varios 13 10-12-2010 17:12:44
factura electronica spia Varios 2 22-02-2009 21:30:06
Factura electronica AUNA Aprendiz Varios 5 01-09-2005 10:44:15
programa para validar formato de archivo de texto n3mohack Varios 4 21-04-2005 00:27:00


La franja horaria es GMT +2. Ahora son las 09:15:20.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi