unit uEnviosTypes;

{
  uEnviosTypes.pas
  Tipos genéricos compartidos para el sistema de envíos multi-transportista.

  Descripción:
    Define la interfaz IEnviosClient, los records de parámetros y resultados,
    y la enumeración TTipoTransportista. No contiene ninguna referencia a un
    transportista concreto en los tipos de datos públicos.
}

interface

type
  // -------------------------------------------------------------------------
  // Tipos de transportista soportados (debe coincidir con ge_envios_transportistas.tipo_api)
  // -------------------------------------------------------------------------
  TTipoTransportista = (ttTIPSA, ttMRW, ttSEUR, ttGLS, ttNACEX, ttOtro);

  // -------------------------------------------------------------------------
  // Configuración de acceso a un transportista (leída de ge_envios_config)
  // -------------------------------------------------------------------------
  TEnviosConfig = record
    ConfigId       : Integer;          // PK de ge_envios_config
    TransportistaId: Integer;          // FK de ge_envios_transportistas
    NombreTransp   : string;           // Nombre visible (ej: 'TIPSA / DinaPaq')
    TipoApi        : string;           // Clave factory: 'TIPSA', 'MRW', 'SEUR'...
    TipoEnum       : TTipoTransportista;
    Entorno        : Boolean;          // False=Produccion, True=Validacion
    UrlProduccion  : string;           // URL base del entorno real de este transportista
    UrlPruebas     : string;           // URL base del entorno de validación
    CodAgencia     : string;
    CodCliente     : string;
    Password       : string;
    // Datos del remitente (empresa)
    NomRemitente   : string;
    DirRemitente   : string;
    PobRemitente   : string;
    CPRemitente    : string;
    TlfRemitente   : string;
    EmailRemitente : string;
    ModeloImpresora: string;
    ServDefecto    : string;           // Código tipo servicio por defecto
  end;

  // -------------------------------------------------------------------------
  // Parámetros genéricos para crear un envío (Flujo A)
  // -------------------------------------------------------------------------
  TEnvioParams = record
    // Origen (remitente)
    NomOri       : string;
    DirOri       : string;
    PobOri       : string;
    CPOri        : string;
    TlfOri       : string;
    // Destino
    NomDes       : string;
    DirDes       : string;
    PobDes       : string;
    CPDes        : string;
    TlfDes       : string;
    CodPais      : string;
    // Datos del envío
    CodTipoServ  : string;
    NumBultos    : Integer;
    Referencia   : string;
    Observaciones: string;
    Peso         : Double;
  end;

  // -------------------------------------------------------------------------
  // Resultado de crear un envío
  // -------------------------------------------------------------------------
  TEnvioResult = record
    OK                 : Boolean;
    AlbaranTransportista: string;     // Nº albarán asignado por el transportista
    GuidTransportista  : string;
    FechaEntrega       : TDateTime;
    CodAgeDestino      : string;
    TipoEnvio          : string;
    Error              : string;
  end;

  // -------------------------------------------------------------------------
  // Parámetros genéricos para solicitar una recogida (Flujo B)
  // -------------------------------------------------------------------------
  TRecogidaParams = record
    // Origen (donde recoge el transportista — destino del pedido)
    NomOri        : string;
    TipoViaOri    : string;
    DirOri        : string;
    NumOri        : string;
    CPOri         : string;
    TlfOri        : string;
    // Destino (donde llevar los paquetes — empresa/almacén)
    NomDes        : string;
    TipoViaDes    : string;
    DirDes        : string;
    NumDes        : string;
    PobDes        : string;
    CPDes         : string;
    TlfDes        : string;
    // Datos de la recogida
    FechaRecogida : TDateTime;
    HoraIni       : TDateTime;
    HoraFin       : TDateTime;
    NumBultos     : Integer;
    CodTipoServ   : string;
    Referencia    : string;
    PersContacto  : string;
    Observaciones : string;
    ObsDes        : string;
    Contenido     : string;
  end;

  // -------------------------------------------------------------------------
  // Resultado de una solicitud de recogida
  // -------------------------------------------------------------------------
  TRecogidaResult = record
    OK             : Boolean;
    CodRecogida    : string;    // Nº de recogida asignado por el transportista
    GuidTransportista: string;
    FechaAlta      : TDateTime;
    CodAgeOrigen   : string;
    CodAgeDestino  : string;
    Error          : string;
  end;

  // -------------------------------------------------------------------------
  // Un estado de seguimiento
  // -------------------------------------------------------------------------
  TEstadoEnvio = record
    IdEstado    : Integer;
    Codigo      : Integer;
    Descripcion : string;
    FechaHora   : TDateTime;
    CodUsuario  : string;
  end;

  // -------------------------------------------------------------------------
  // Constantes de estado genéricas (compatibles con TIPSA y otros)
  // -------------------------------------------------------------------------
const
  ENV_EST_DOCUMENTADO    = 0;
  ENV_EST_TRANSITO       = 1;
  ENV_EST_REPARTO        = 2;
  ENV_EST_ENTREGADO      = 3;
  ENV_EST_INCIDENCIA     = 4;
  ENV_EST_DEVUELTO       = 5;
  ENV_EST_PICKUP_PUNTO   = 14;
  ENV_EST_ENTREGA_PARCIAL= 15;

// -------------------------------------------------------------------------
// Helpers
// -------------------------------------------------------------------------
function TipoTransportistaFromStr(const AStr: string): TTipoTransportista;
function EstadoDescripcionTIPSA(ACodigo: Integer): string;

implementation

uses
  System.SysUtils;

function TipoTransportistaFromStr(const AStr: string): TTipoTransportista;
var
  LUpper: string;
begin
  LUpper := UpperCase(Trim(AStr));
  if LUpper = 'TIPSA'  then Result := ttTIPSA
  else if LUpper = 'MRW'   then Result := ttMRW
  else if LUpper = 'SEUR'  then Result := ttSEUR
  else if LUpper = 'GLS'   then Result := ttGLS
  else if LUpper = 'NACEX' then Result := ttNACEX
  else Result := ttOtro;
end;

function EstadoDescripcionTIPSA(ACodigo: Integer): string;
begin
  case ACodigo of
    0:  Result := 'Documentado';
    1:  Result := 'En tránsito';
    2:  Result := 'En reparto';
    3:  Result := 'Entregado';
    4:  Result := 'Incidencia';
    5:  Result := 'Devuelto';
    6:  Result := 'Falta de expedición';
    7:  Result := 'Recanalizado';
    9:  Result := 'Falta expedición administrativa';
    10: Result := 'Destruido';
    14: Result := 'Disponible en punto Pickup';
    15: Result := 'Entrega parcial';
    16: Result := 'Caducado';
    17: Result := 'Depositado en punto';
    18: Result := 'Leído en destino';
  else
    Result := 'Estado ' + IntToStr(ACodigo);
  end;
end;

end.
