{
===============================================================================
  Copyright (©) 2006. Rodax Software.
===============================================================================
  Los contenidos de este fichero son propiedad de Rodax Software titular del
  copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
  en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
  acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
  bajo el que se suministra.
  -----------------------------------------------------------------------------
  Web:  www.rodax-software.com
===============================================================================
  Fecha primera versión: 18-04-2006
  Versión actual: 1.0.0
  Fecha versión actual: 18-04-2006
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
===============================================================================
}

unit EDI_SLSRPT;

interface

uses
  Classes, EDI_Reader;

const
  LONG_LINEA_CAB = 859;
  LONG_LINEA_LUG = 142;
  LONG_LINEA_ART = 778;

type
  TEDIFILE_CABVEN = record
    REGISTRO_OK : boolean;
    CLAVE1  : array[1..10] of char;
    NUMINF  : array[1..35] of char;
    FUNCION : array[1..3] of char;
    FECINI  : array[1..12] of char;
    FECFIN  : array[1..12] of char;
    FECINF  : array[1..12] of char;
    PERVEN  : array[1..16] of char;

    EANOFI  : array[1..17] of char;
    EANEMI  : array[1..17] of char;
    EANREC  : array[1..17] of char;
    EANVEN  : array[1..17] of char;
    EANALM  : array[1..17] of char;
    EANREP  : array[1..17] of char;
    EANPRO  : array[1..17] of char;

    EANADMSA: array[1..17] of char;
    EANREPSR: array[1..17] of char;

    ADMVENSA: array[1..35] of char;
    REPDEPSR: array[1..35] of char;
    EMAILSA : array[1..35] of char;
    NUMFAXSA: array[1..35] of char;
    NUMTELSA: array[1..35] of char;
    NUMTLXSA: array[1..35] of char;
    X400SA  : array[1..35] of char;

    EMAILSR : array[1..35] of char;
    NUMFAXSR: array[1..35] of char;
    NUMTELSR: array[1..35] of char;
    NUMTLXSR: array[1..35] of char;
    X400SR  : array[1..35] of char;

    NUMPRE  : array[1..35] of char;
    NUMINFSC: array[1..35] of char;
    NUMCON  : array[1..35] of char;

    FECPRE  : array[1..12] of char;
    FECINFSC: array[1..12] of char;
    FECCON  : array[1..12] of char;

    DIVPED  : array[1..3] of char;
    DIVPRE  : array[1..3] of char;
    DIVPAG  : array[1..3] of char;
    DIVPEDF : array[1..3] of char;
    DIVPREF : array[1..3] of char;
    DIVPAGF : array[1..3] of char;

    TASCAM  : array[1..15] of char;
    FECTAS  : array[1..12] of char;
  end;

  TEDIFILE_LUGVEN = record
    REGISTRO_OK : boolean;
    CLAVE1  : array[1..10] of char;
    CLAVE2  : array[1..5] of char;
    EANLUG  : array[1..17] of char;
    LUGVEN  : array[1..70] of char;
    FECINI  : array[1..12] of char;
    FECFIN  : array[1..12] of char;
    PERVEN  : array[1..16] of char;
  end;

  TEDIFILE_ARTVEN = record
    REGISTRO_OK : boolean;
    CLAVE1  : array[1..10] of char;
    CLAVE2  : array[1..5] of char;
    CLAVE3  : array[1..5] of char;
    EANART  : array[1..17] of char;
    CODCOM  : array[1..35] of char;
    NUMVAR  : array[1..35] of char;
    CODPRO  : array[1..35] of char;
    DESARTCO: array[1..35] of char;
    DESART  : array[1..70] of char;
    NUMCON  : array[1..35] of char;
    NUMLIS  : array[1..35] of char;
    CONESP1 : array[1..3] of char;
    CONESP2 : array[1..3] of char;
    CONESP3 : array[1..3] of char;
    VALVEN  : array[1..15] of char;
    PRENETCT: array[1..15] of char;
    PREBRUCT: array[1..15] of char;
    PREINFET: array[1..15] of char;
    PREINFFT: array[1..15] of char;
    PRECALCT: array[1..15] of char;
    PRENETCA: array[1..15] of char;
    PREBRUCA: array[1..15] of char;
    PREINFEA: array[1..15] of char;
    PREINFFA: array[1..15] of char;
    PRECALCA: array[1..15] of char;
    BAPRUN1 : array[1..9] of char;
    UNIMED1 : array[1..3] of char;
    BAPRUN2 : array[1..9] of char;
    UNIMED2 : array[1..3] of char;
    BAPRUN3 : array[1..9] of char;
    UNIMED3 : array[1..3] of char;
    BAPRUN4 : array[1..9] of char;
    UNIMED4 : array[1..3] of char;
    BAPRUN5 : array[1..9] of char;
    UNIMED5 : array[1..3] of char;
    CANVEN  : array[1..15] of char;
    EXIPRO  : array[1..15] of char;
    DESEXI  : array[1..15] of char;
    ESPMEDCV: array[1..3] of char;
    ESPMEDEP: array[1..3] of char;
    ESPMEDDE: array[1..3] of char;
    CANDEV  : array[1..15] of char;
    EANVEN  : array[1..17] of char;
    NOMVEN  : array[1..70] of char;
    NUMTALON: array[1..35] of char;
    CANVENNET : array[1..15] of char;
    UMEDVENNET: array[1..3] of char;
    CANESP  : array[1..15] of char;
    UMEDESP : array[1..3] of char;
  end;

  PCABVEN = ^TEDIFILE_CABVEN;
  PLUGVEN = ^TEDIFILE_LUGVEN;
  PARTVEN = ^TEDIFILE_ARTVEN;

  TCABVEN_Reader = class(TEDIFile_Reader)
  protected
    function ProcessLine (const ALine : String) : Boolean; override;
  end;


  TLUGVEN_Reader = class(TEDIFile_Reader)
  protected
    function ProcessLine (const ALine : String) : Boolean; override;
  end;


  TARTVEN_Reader = class(TEDIFile_Reader)
  protected
    function ProcessLine (const ALine : String) : Boolean; override;
  end;


implementation

uses
  SysUtils, Dialogs, uDataModuleEDI_Sales;

{ TCABVEN_Reader }

function TCABVEN_Reader.ProcessLine(const ALine: String): Boolean;
var
  Registro : TEDIFILE_CABVEN;
  pRegistro : PCABVEN;
  LongLinea : Integer;
  AuxLine : String;
begin
  Result := False;
  LongLinea := Length(ALine);

  { Por si la línea fuera más larga o más corta de lo normal, la hago de
    de la longitud que debería tener }
  AuxLine := Format('%-' + IntTostr(LONG_LINEA_CAB) + '.' + IntTostr(LONG_LINEA_CAB) + 's', [ALine]);

  // Inicializo los campos del registro.
  FillChar(Registro, SizeOf(TEDIFILE_CABVEN), 0);

  { Para rellenar el campo REGISTRO_OK del registro mediante el 'move',
    añado al principio de AuxLine el byte #0 (valor para 'False'). }
  AuxLine := Concat(#0, AuxLine);
  Move(AuxLine[1], Registro, LONG_LINEA_CAB+1);  // +1 por el byte del concat

  // El registro es correcto si tiene la longitud adecuada.
  Registro.REGISTRO_OK := (LongLinea = LONG_LINEA_CAB);

  // Añado el registro a la lista de registros.
  New(pRegistro);
  Move(Registro, pRegistro^, SizeOf(TEDIFILE_CABVEN));
  FileData.Add(pRegistro);
  Result := True;
end;

{ TLUGVEN_Reader }

function TLUGVEN_Reader.ProcessLine(const ALine: String): Boolean;
var
  Registro : TEDIFILE_LUGVEN;
  pRegistro : PLUGVEN;
  LongLinea : Integer;
  AuxLine : String;
begin
  Result := False;
  LongLinea := Length(ALine);

  { Por si la línea fuera más larga o más corta de lo normal, la hago de
    de la longitud que debería tener }
  AuxLine := Format('%-' + IntTostr(LONG_LINEA_LUG) + '.' + IntTostr(LONG_LINEA_LUG) + 's', [ALine]);

  // Inicializo los campos del registro.
  FillChar(Registro, SizeOf(TEDIFILE_LUGVEN), 0);

  { Para rellenar el campo REGISTRO_OK del registro mediante el 'move',
    añado al principio de AuxLine el byte #0 (valor para 'False'). }
  AuxLine := Concat(#0, AuxLine);
  Move(AuxLine[1], Registro, LONG_LINEA_LUG+1);  // +1 por el byte del concat

  // El registro es correcto si tiene la longitud adecuada.
  Registro.REGISTRO_OK := (LongLinea = LONG_LINEA_LUG);

  // Añado el registro a la lista de registros.
  New(pRegistro);
  Move(Registro, pRegistro^, SizeOf(TEDIFILE_LUGVEN));
  FileData.Add(pRegistro);
  Result := True;
end;

{ TARTVEN_Reader }

function TARTVEN_Reader.ProcessLine(const ALine: String): Boolean;
var
  Registro : TEDIFILE_ARTVEN;
  pRegistro : PARTVEN;
  LongLinea : Integer;
  AuxLine : String;
begin
  Result := False;
  LongLinea := Length(ALine);

  { Por si la línea fuera más larga o más corta de lo normal, la hago de
    de la longitud que debería tener }
  AuxLine := Format('%-' + IntTostr(LONG_LINEA_ART) + '.' + IntTostr(LONG_LINEA_ART) + 's', [ALine]);

  // Inicializo los campos del registro.
  FillChar(Registro, SizeOf(TEDIFILE_ARTVEN), 0);

  { Para rellenar el campo REGISTRO_OK del registro mediante el 'move',
    añado al principio de AuxLine el byte #0 (valor para 'False'). }
  AuxLine := Concat(#0, AuxLine);
  Move(AuxLine[1], Registro, LONG_LINEA_ART+1);  // +1 por el byte del concat

  // El registro es correcto si tiene la longitud adecuada.
  Registro.REGISTRO_OK := (LongLinea = LONG_LINEA_ART);

  // Añado el registro a la lista de registros.
  New(pRegistro);
  Move(Registro, pRegistro^, SizeOf(TEDIFILE_ARTVEN));
  FileData.Add(pRegistro);
  Result := True;
end;

end.
