Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 19-05-2017
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: May 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 162
Poder: 15
hgiacobone Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
De nuestra guía de estilo:
Escribir en mayúsculas equivale a gritar.
La cosa es que el tipo se mandó flor de post explicando algo que es muy solicitado por toda la comunidad, y le observan terrible bobada.

Poner en "Mayúsculas" el nombre de una instrucción Pascal, no es ni por asomo, una violación a la guia de estilo. Aparte, la suposición de que las mayusculas representan un grito , al menos a estas alturas, solo se considera una cuestión folclórica y tal vez hoy solo es utilizado por "History Chanel" cuando tratan temas como el inicio de las terminales de texto. Y tal vez ni eso.

Como sugerencia, deberían reveer este tipo de comentarios absurdos.
Cordialmente,
YAKO
Responder Con Cita
  #22  
Antiguo 19-05-2017
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: May 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 162
Poder: 15
hgiacobone Va por buen camino
Estimado amigo adripugliesso
Subiste el código al FTP del sitio ?
Donde podemos encontrar más info sobre tu solución?
__________________
Gracias de antemano por vuestra ayuda.
·.:*:.·Yako·.:*:.·

Última edición por hgiacobone fecha: 19-05-2017 a las 20:11:33. Razón: no te digo
Responder Con Cita
  #23  
Antiguo 19-05-2017
adripugliesso adripugliesso is offline
Miembro
 
Registrado: Jul 2015
Posts: 46
Poder: 0
adripugliesso Va por buen camino
Proyecto Ejemplo en Delphi 7

Acá les dejo un proyecto de ejemplo hecho en Delphi 7 de como usar los WebService de AFIP para Facturación Electrónica.

Cualquier duda consulten..

Espero que les sirva.-
Archivos Adjuntos
Tipo de Archivo: zip Proyecto.zip (57,2 KB, 90 visitas)
Responder Con Cita
  #24  
Antiguo 19-05-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 27.994
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por hgiacobone Ver Mensaje
La cosa es que el tipo se mandó flor de post explicando algo que es muy solicitado por toda la comunidad, y le observan terrible bobada.
Poner en "Mayúsculas" el nombre de una instrucción Pascal, no es ni por asomo, una violación a la guia de estilo. Aparte, la suposición de que las mayusculas representan un grito , al menos a estas alturas, solo se considera una cuestión folclórica y tal vez hoy solo es utilizado por "History Chanel" cuando tratan temas como el inicio de las terminales de texto. Y tal vez ni eso.
Como sugerencia, deberían reveer este tipo de comentarios absurdos.
Cordialmente,
YAKO
Ese mensaje es de hace 2 años, y el mensaje al que se refiere se editó para cumplir las normas.
En fin, bobadas, las que tú has soltado.
Responder Con Cita
  #25  
Antiguo 30-05-2017
seti.roman seti.roman is offline
Registrado
 
Registrado: May 2017
Posts: 4
Poder: 0
seti.roman Va por buen camino
OpensslUtils

Hola, soy nuevo en este Foro, les dejo algo que puede servirles, quizás no esté muy claro. Es para firmar el ticket sin usar un Bat a la librería Openssl.
Deben conseguir OpensslUtils, que no recuerdo donde la encontré e incorporarla al proyecto.

Les adjunto el código que uso yo. Espero les sea útil.

Código:
function Tcomprobante.crearfirma: string;
var
  signer: TMessageSigner;
  camino: String;
  ruta: Pwidechar;
  firma: String;
  position: integer;
begin
  camino := ExpandFileName(application.ExeName + '\..\keys');
  ruta := Pwidechar(camino);

  fgeneracion := now();
  fexpiracion := inchour(fgeneracion,1);

  signer := TMessageSigner.Create;
  signer.LoadPrivateKey(ruta +'\'+ responsable.edita_responsables['llave'], '');
  signer.LoadCertificate(ruta + '\'+ responsable.edita_responsables['cert']);

  signer.PlainMessage :=
  '<?xml version="1.0" encoding="UTF-8" ?>'+
  '<loginTicketRequest version="1.0">'+
  '<header>'+
  '<uniqueId>123456</uniqueId>'+
  '<generationTime>'+formatdatetime('yyyy-MM-dd',fgeneracion)+'T'+formatdatetime('hh:mm',fgeneracion)+':00-03:00</generationTime>'+
  '<expirationTime>'+formatdatetime('yyyy-MM-dd',fexpiracion)+'T'+formatdatetime('hh:mm',fexpiracion)+':00-03:00</expirationTime>'+
  '</header>'+
  '<service>wsfe</service>'+
  '</loginTicketRequest>';

  signer.MIMESign;

  firma := signer.SignedMessage;
  firma := rightstr(firma,length(firma)-186);

  position := ansipos('==', firma);
  if position <> 0 then
  begin
    delete(firma,position,length(firma));
  end;

  result := firma;
end;
Responder Con Cita
  #26  
Antiguo 30-10-2017
sanamarain sanamarain is offline
Registrado
 
Registrado: Sep 2017
Posts: 3
Poder: 0
sanamarain Va por buen camino
Hola también soy nuevo en el foro. Pude implementar una interface de factura electrónica con éxito y rápidamente sobre Delphi 7 gracias al gran aporte de adripugliesso, pero me interesa generar el CMS directamente sin la intervención de openssl como binario externo, es decir con la OpensslUtils que ya conseguí de la web de la universidad de Genoa de Marco Ferrante para la versión .7b de openssl (dll).
La consulta es para seti.roman, hay alguna otra rutina para implementar además de la que ya compartiste? Porque no logro validar el CMS generado.
Llego a crear el smime.p7m que es el archivo firmado con signed-data en formato Email, luego quito la cabecera, codifico en base64 y envío pero algo estoy haciendo mal o está faltando porque me devuelve "CMS inválido".

Saludos
Responder Con Cita
  #27  
Antiguo 30-10-2017
seti.roman seti.roman is offline
Registrado
 
Registrado: May 2017
Posts: 4
Poder: 0
seti.roman Va por buen camino
Hola, estuve probando hoy nuevamente y me pasó que la firma es inválida (antes funcionaba).
1) Estoy modificando el código a ver si lo hago andar nuevamente.

2) Yo uso la librería OpenSSLUtils.pas (0.9.6b) que también necesita libeay32.pas (0.9.6b) y las agrego al proyecto
(agregala a uses: OpenSSLUtils y libeay32 en tu form o módulo)

Última edición por seti.roman fecha: 30-10-2017 a las 20:05:32. Razón: Error e el código
Responder Con Cita
  #28  
Antiguo 30-10-2017
seti.roman seti.roman is offline
Registrado
 
Registrado: May 2017
Posts: 4
Poder: 0
seti.roman Va por buen camino
Ahora va corregido y (por ahora) funcionando:

Código:
function Tcomprobante.crearfirma: string;
var
  signer: TMessageSigner;
  ruta: Pwidechar;
  firma: String;
  position: integer;
begin
  ruta := Pwidechar(ExpandFileName(application.ExeName + '\..\keys'));

  fgeneracion := now();
  fexpiracion := inchour(fgeneracion,1);

  signer := TMessageSigner.Create;
  signer.LoadPrivateKey(ruta +'\'+ responsable.edita_responsables['llave'], '');
  signer.LoadCertificate(ruta + '\'+ responsable.edita_responsables['cert']);

  signer.PlainMessage :=
  '<?xml version="1.0" encoding="UTF-8" ?>'+
  '<loginTicketRequest version="1.0">'+
  '<header>'+
  '<uniqueId>123456</uniqueId>'+
  '<generationTime>'+formatdatetime('yyyy-MM-dd',fgeneracion)+'T'+formatdatetime('hh:mm',fgeneracion)+':00-03:00</generationTime>'+
  '<expirationTime>'+formatdatetime('yyyy-MM-dd',fexpiracion)+'T'+formatdatetime('hh:mm',fexpiracion)+':00-03:00</expirationTime>'+
  '</header>'+
  '<service>wsfe</service>'+
  '</loginTicketRequest>';

  signer.MIMESign;

  firma := signer.SignedMessage;
  firma := rightstr(firma,length(firma)-188); //*********** AGREGUE 2

  position := ansipos('==', firma);
  if position <> 0 then
  begin
    delete(firma,position+2,length(firma)); //******** SUME 2 A LA POSICION PARA QUE INCLUYA LOS ==
  end;
  xgs.observartexto(firma);
  result := firma;
end;
Responder Con Cita
  #29  
Antiguo 30-10-2017
seti.roman seti.roman is offline
Registrado
 
Registrado: May 2017
Posts: 4
Poder: 0
seti.roman Va por buen camino
Cita:
Empezado por sanamarain Ver Mensaje
Hola también soy nuevo en el foro. Pude implementar una interface de factura electrónica con éxito y rápidamente sobre Delphi 7 gracias al gran aporte de adripugliesso, pero me interesa generar el CMS directamente sin la intervención de openssl como binario externo, es decir con la OpensslUtils que ya conseguí de la web de la universidad de Genoa de Marco Ferrante para la versión .7b de openssl (dll).
La consulta es para seti.roman, hay alguna otra rutina para implementar además de la que ya compartiste? Porque no logro validar el CMS generado.
Llego a crear el smime.p7m que es el archivo firmado con signed-data en formato Email, luego quito la cabecera, codifico en base64 y envío pero algo estoy haciendo mal o está faltando porque me devuelve "CMS inválido".

Saludos
A ver, yo tuve que hacer esto con el token y el sign cuando los recibía después de enviar la solicitud firmada,
dado que venian con etiquetas y algún caractér raro, no me acuerdo muy bien. Te lo paso:

Código:
function Tcomprobante.autenticar: Tstringlist;
var
  autenticar: Tstringlist;
begin
  autenticar := Tstringlist.Create;
  autenticar.Text := (HTautenticar as LoginCms).loginCms(crearfirma);

  result := autenticar;
end;

function Tcomprobante.obteneraut: Tstringlist;
var
  cms: Tstringlist;
  i: Integer;
  token: String;
  sign: String;
begin
  cms := Tstringlist.Create;
  cms := autenticar;

  for i := 0 to cms.Count-1 do
  begin
    cms[i] := Trimleft(cms[i]);

    if StartsText('<token>',cms[i]) then
    begin
      cms[i] := cms[i].Replace('<token>', '');
      cms[i] := cms[i].Replace('</token>', '');
      token := cms[i];

      cms[i+1] := cms[i+1].Replace('<sign>', '');
      cms[i+1] := cms[i+1].Replace('</sign>', '');
      sign := cms[i+1];
    end;
  end;

  cms.Clear;

  cms.Add(Trimleft(token));
  cms.Add(Trimleft(sign));

  guardaraut(cms[0],cms[1]);
end;
Responder Con Cita
  #30  
Antiguo 01-11-2017
sanamarain sanamarain is offline
Registrado
 
Registrado: Sep 2017
Posts: 3
Poder: 0
sanamarain Va por buen camino
Muchas gracias por la pronta respuesta. Aún no lo he probado, pero intuía que estaba firmando mal por la comparación que yo hacía con la firma generada por openssl por línea de comandos. Sólo me faltaba la firma (para no hacerlo con openssl.exe), lo demás está todo implementado. Muchísimas gracias también por el código de la recuperación del token y sign. En un momento lo pruebo y posteo como me fue.
Responder Con Cita
  #31  
Antiguo 01-11-2017
sanamarain sanamarain is offline
Registrado
 
Registrado: Sep 2017
Posts: 3
Poder: 0
sanamarain Va por buen camino
Funcionó perfectamente!!! Sólo cambiando las líneas de las funciones rightstr y delete.
Muchísimas gracias, había dado muchas vueltas con esto y la solución era sencilla.
Responder Con Cita
  #32  
Antiguo 21-12-2017
lucho6007 lucho6007 is offline
Miembro
 
Registrado: Jan 2009
Posts: 12
Poder: 0
lucho6007 Va por buen camino
Hola gente! Estuve probando el ejemplo subido, compila perfecto sobre XE3, lo pruebo con certificados de homomlogación en un Windows 10 de 64 bits y genera bien el CAE. Pruebo el mismo ejecutable sobre una máquina virtual con XP y me dice: No se a podido establecer una conexión con el servidor - URL:https://wsaahomo.afip.gov.ar/ws/services/LoginCms - SOAPAction:""

Lo mas extraño es que si pruebo en la misma VM los componentes PyAFIPws si se conecta y genera los CAEs...

Alguien tiene idea que pasa?
Muchas gracias por su tiempo!
Responder Con Cita
  #33  
Antiguo 21-12-2017
lucho6007 lucho6007 is offline
Miembro
 
Registrado: Jan 2009
Posts: 12
Poder: 0
lucho6007 Va por buen camino
Me auto-respondo:
Funcoina sólo si tiene XP service pack 3, y
"Verificar tener activada la casilla "USAR TLS 1.0" en "Opciones de Internet->Opciones Avanzadas"
Responder Con Cita
  #34  
Antiguo 23-12-2017
lucho6007 lucho6007 is offline
Miembro
 
Registrado: Jan 2009
Posts: 12
Poder: 0
lucho6007 Va por buen camino
Código de barras

Hola colegas, alguno tiene idea cómo generar el código de barras que se imprime en la Fact. electrónica?
Es decir, ya tengo como codificarlo, pero no se como armar las "barras".
Se que va CUIT, Pto de venta, CAE, etc pero no se como armar las barras... Alguno tiene idea??

Muchas gracias y felices fiestas!
Responder Con Cita
  #35  
Antiguo 26-12-2017
aledieb aledieb is offline
Miembro
 
Registrado: Jun 2005
Ubicación: Buenos Aires, Argentina
Posts: 108
Poder: 13
aledieb Va por buen camino
Hola,
Cita:
Empezado por lucho6007 Ver Mensaje
Hola colegas, alguno tiene idea cómo generar el código de barras que se imprime en la Fact. electrónica?
Es decir, ya tengo como codificarlo, pero no se como armar las "barras".
Se que va CUIT, Pto de venta, CAE, etc pero no se como armar las barras... Alguno tiene idea??

Muchas gracias y felices fiestas!
Tenes que usar algún componente para código de barra o de reportes que lo incluya, el tipo de código de barra es el Interleaved 2 of 5, fastreport lo incluye y permite generar el código de verificación.

Este es uno que genera una imagen bmp ó jpg Version 3.7, Copyright (c) 2014-2017 WINSOFT, http://www.winsoft.sk
__________________
Suerte
Alejandro
Responder Con Cita
  #36  
Antiguo 26-12-2017
lucho6007 lucho6007 is offline
Miembro
 
Registrado: Jan 2009
Posts: 12
Poder: 0
lucho6007 Va por buen camino
Finalmente lo hice a mano, me basé en el codigo en Pyhton de PyAFIPws:
Código Delphi [-]
function GenerarImagen(AImage: TImage; Codigo: String; BaseWidth: Integer = 3; Width: Integer = 0; Height: Integer = 30): Boolean;
var Wide, Narrow, Barra, Espacio: Integer;
    BarraStr: String;
    XPos, I, J: Integer;

const Bars: array[0..11] of string = ('nnwwn', 'wnnnw', 'nwnnw', 'wwnnn', 'nnwnw', 'wnwnn', 'nwwnn', 'nnnww', 'wnnwn', 'nwnwn', 'nn', 'wn');
begin
  if AImage = nil then begin
    AImage:= TImage.Create(nil);
  end;

  Result:= False;
  Wide:= BaseWidth;
  Narrow:= BaseWidth div 3;

  if Odd(Length(Codigo)) then begin
    Codigo:= '0' + Codigo;
  end;

  Codigo:= '::' + Codigo + ';:'; // A y Z en el original

  if Width = 0 then begin
    Width:= (Length(Codigo) * 3) * BaseWidth + (10 * Narrow);
  end;
  AImage.Width:= Width;
  AImage.Height:= Height;

  AImage.Canvas.Pen.Color := clWhite;
  AImage.Canvas.Brush.Color:= clWhite;
  AImage.Canvas.Rectangle(0, 0, AImage.Width, AImage.Height);
  AImage.Canvas.Brush.Color:= clBlack;
  AImage.Canvas.Pen.Color := clBlack;

  XPos:= 18;
  I:= 1;
  while I <= Length(Codigo) do begin
    Barra:= Ord(Codigo[i]) - Ord('0');
    Espacio:= Ord(Codigo[I + 1]) - Ord('0');
    BarraStr:= '';
    for J:= 1 to Length(Bars[Barra]) do begin
      BarraStr:= BarraStr + Bars[Barra][J] + Bars[Espacio][J];
    end;

    for J:= 1 to Length(BarraStr) do begin
      if BarraStr[J] = 'n' then begin
        Width:= Narrow;
      end
      else begin
        Width:= Wide;
      end;
      if Odd(J) then begin
        AImage.Canvas.Rectangle(XPos, 0, XPos + Width, Height);
      end;
      XPos:= XPos + Width;
    end;
    Inc(I, 2);
  end;
  Result:= True;
end;

Última edición por lucho6007 fecha: 26-12-2017 a las 14:08:21. Razón: estaba mal el código de declaracion
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Factura Electronica - Afip Argentina Joe_Balda Varios 13 19-05-2017 21:03:40
Factura Electrónica AFIP Argentina SergioFrey Noticias 2 19-05-2017 21:02:03
xml+xsl a pdf(Factura Electronica) jgutti Varios 4 21-02-2012 16:08:23
factura electronica cmm07 Varios 4 02-04-2009 17:46:03
factura electronica spia Varios 2 22-02-2009 21:30:06


La franja horaria es GMT +2. Ahora son las 03:03:02.


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