{
===============================================================================
  Copyright (©) 2001. 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: 01-10-2001
  Versión actual: 1.0.9
  Fecha versión actual: 02-02-2005
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    18-01-2002    Ordenar por descripción el grid de materiales.

    07-04-2002    Adaptar todas las funciones a la transacción única.

    06-05-2002    Adaptación al grid 'TdxDBGrid'.

    27-05-2002    Cambio a un objeto contador (TContadorAlbaranCliente)

    16-11-2002    p250. Poner el número total de proveedores dados de alta
                  en la inicialización del grid.

    19-11-2003    p268. Cambiar funciones min y max cliente para que en lugar
                  de devolverme el proveedor con mayor o menor codigo me devuelva el
                  proveedor cuyo nombre seria el mayor o menor alfabeticamente.

    06-03-2004    P272. Adaptación a multiempresa.

    08-10-2004    Se ha añadido el método darListaProveedores

    23-11-2004    p297. Solo sacar etiquetas de los clientes/proveedores etiquetados.

    02-02-2005    p550. Añadimos funcion darCorreo
===============================================================================
}
unit TablaProveedores;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
  Dialogs, DBTables, DB, IBCustomDataSet, IBSQL, BaseDatos, IBDatabase,
  dxDBGrid, Framework;

type
  TDatosProveedor = class(TObjeto)
  public
    Codigo : String;
    NIFCIF : String;
    Nombre : String;
    Calle : String;
    Numero : String;
    Piso : String;
    CodigoPostal : String;
    Poblacion : String;
    Provincia : String;
    Telefono1 : String;
    Telefono2 : String;
    Fax : String;
    Correo : String;
    PersonaContacto : String;
    Observaciones : String;
    constructor Create; overload;
    constructor Create(CodigoProveedor : String); overload;
    procedure ObtenerDatos; override;
    procedure SalvarDatos;
  end;

  TdmTablaProveedores = class(TDataModule)
  private
    procedure IniciarSQL;
  public
    sqlInsertar : TStrings;
    sqlModificar : TStrings;
    sqlConsultar : TStrings;
    sqlEliminar : TStrings;
    sqlGrid : TStrings;

    //Metodos que llamaran a contador
    function DarNuevoCodigo : String;
    function IncrementarCodigo: boolean;
    function InsertarContador: boolean;
    function ValidarCodigo(Codigo : String) : Boolean;
    function FormatearCodigo(Codigo : String) : String;

    function ExisteCodigo(Codigo : String) : Boolean;
    function DarDatosProveedor(Proveedor : TDatosProveedor) : Boolean;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    procedure InicializarGridProveedores(var Grid: TdxDBGrid);
    function DarProveedorMin : String;
    function DarProveedorMax : String;
    function DarListaProveedores: TStringList;
    function insertarProveedorCliEmp(CodigoProveedor, Codigo : String) : Boolean;
    function modificarProveedorCliEmp(CodigoProveedor, Codigo : String) : Boolean;
    function darCodigoClienteProveedor(CodigoProveedor: String): Variant;
    function etiquetarProveedores(Codigos: TStringList; TipoOp: Integer): Boolean;
    function DarCorreo(Codigo: String): String;    
  end;

var
  dmTablaProveedores: TdmTablaProveedores;

implementation

{$R *.DFM}

uses
  Mensajes, Constantes, IB, dxDBCtrl, StrFunc, Excepciones, Contadores,
  RdxGestorContadores, RdxEmpresaActiva, dxGrClms;


constructor TdmTablaProveedores.Create (AOwner : TComponent);
begin
  inherited;
  sqlInsertar := TStringList.Create;
  sqlModificar := TStringList.Create;
  sqlConsultar := TStringList.Create;
  sqlEliminar := TStringList.Create;
  sqlGrid := TStringList.Create;
  IniciarSQL;
end;

destructor TdmTablaProveedores.Destroy;
begin
  sqlInsertar.Free;
  sqlModificar.Free;
  sqlConsultar.Free;
  sqlEliminar.Free;
  sqlGrid.Free;
  inherited;
end;

procedure TdmTablaProveedores.IniciarSQL;
begin
  with sqlInsertar do
  begin
    Add('insert into PROVEEDORES ');
    Add('(CODIGO, NIFCIF, NOMBRE, CALLE, NUMERO, PISO, ');
    Add('CODIGOPOSTAL, POBLACION, PROVINCIA, TELEFONO1, ');
    Add('TELEFONO2, FAX, CORREO, PERSONACONTACTO, ');
    Add('OBSERVACIONES, ETIQUETADO, ULTIMOCAMBIO) ');
    Add('values (:CODIGO, :NIFCIF, :NOMBRE, :CALLE, :NUMERO, :PISO, ');
    Add(':CODIGOPOSTAL, :POBLACION, :PROVINCIA, :TELEFONO1, ');
    Add(':TELEFONO2, :FAX, :CORREO, :PERSONACONTACTO, ');
    Add(':OBSERVACIONES, :ETIQUETADO, CURRENT_TIME)');
  end;

  with sqlModificar do
  begin
    Add('update PROVEEDORES set ');
    Add('NIFCIF = :NIFCIF, ');
    Add('NOMBRE = :NOMBRE, ');
    Add('CALLE = :CALLE, ');
    Add('NUMERO = :NUMERO, ');
    Add('PISO = :PISO, ');
    Add('CODIGOPOSTAL = :CODIGOPOSTAL, ');
    Add('POBLACION = :POBLACION, ');
    Add('PROVINCIA = :PROVINCIA, ');
    Add('TELEFONO1 = :TELEFONO1, ');
    Add('TELEFONO2 = :TELEFONO2, ');
    Add('FAX = :FAX, ');
    Add('CORREO = :CORREO, ');
    Add('PERSONACONTACTO = :PERSONACONTACTO, ');
    Add('OBSERVACIONES = :OBSERVACIONES, ');
    Add('ETIQUETADO = :ETIQUETADO, ');
    Add('ULTIMOCAMBIO = CURRENT_TIME ');    
    Add('where CODIGO = :CODIGO');
  end;

  with sqlEliminar do
  begin
    Add('delete from PROVEEDORES ');
    Add('where CODIGO = :CODIGO');
  end;

  with sqlConsultar do
  begin
    Add('select CODIGO, NIFCIF, NOMBRE, CALLE, NUMERO, PISO, ');
    Add('CODIGOPOSTAL, POBLACION, PROVINCIA, TELEFONO1, ');
    Add('TELEFONO2, FAX, CORREO, PERSONACONTACTO, ');
    Add('OBSERVACIONES, ETIQUETADO');
    Add('from PROVEEDORES');
    Add('where CODIGO = :CODIGO');
  end;

  with sqlGrid do
  begin
    Add('select CODIGO, ETIQUETADO, NIFCIF, NOMBRE, TELEFONO1, FAX, CORREO ');
    Add('from PROVEEDORES');
    Add('order by NOMBRE');
  end;
end;

function TdmTablaProveedores.DarNuevoCodigo : String;
begin
  Result := GestorContadores.DarNuevoCodigo(contProveedores);
end;

function TdmTablaProveedores.IncrementarCodigo: boolean;
begin
  Result := GestorContadores.IncrementarValor(contProveedores);
end;

function TdmTablaProveedores.ValidarCodigo(Codigo : String) : Boolean;
begin
  Result := GestorContadores.ValidarCodigo(contProveedores, Codigo);
end;

function TdmTablaProveedores.FormatearCodigo(Codigo : String) : String;
begin
  Result := GestorContadores.FormatearCodigo(contProveedores, Codigo);
end;

function TdmTablaProveedores.ExisteCodigo(Codigo: String): Boolean;
var
  oSQL : TIBSQL;
  Contador : String;
begin
  Result := False;
  if EsCadenaVacia(Codigo) then
    Exit;
    
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO ');
    SQL.Add('from PROVEEDORES ');
    SQL.Add('where CODIGO = :CODIGO');
    ParamByName('CODIGO').AsString := Codigo;
    try
      Prepare;
      ExecQuery;
      Contador := Fields[0].AsString;
      Result := (Codigo = Contador);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaProveedores.DarDatosProveedor(Proveedor : TDatosProveedor) : Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if EsCadenaVacia(Proveedor.Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from PROVEEDORES ');
    SQL.Add('where CODIGO = :CODIGO');
    ParamByName('CODIGO').AsString := Proveedor.Codigo;
    try
      Prepare;
      ExecQuery;
      if (RecordCount > 0) then
        with Proveedor do
        begin
          Nifcif := FieldByName('NIFCIF').AsString;
          Nombre := FieldByName('NOMBRE').AsString;
          Calle := FieldByName('CALLE').AsString;
          Numero := FieldByName('NUMERO').AsString;
          Piso := FieldByName('PISO').AsString;
          CodigoPostal := FieldByName('CODIGOPOSTAL').AsString;
          Poblacion := FieldByName('POBLACION').AsString;
          Provincia := FieldByName('PROVINCIA').AsString;
          Telefono1 := FieldByName('TELEFONO1').AsString;
          Telefono2 := FieldByName('TELEFONO2').AsString;
          Fax := FieldByName('FAX').AsString;
          Correo := FieldByName('CORREO').AsString;
          PersonaContacto := FieldByName('PERSONACONTACTO').AsString;
          Observaciones := FieldByName('OBSERVACIONES').AsString;
          Result := True;
        end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaProveedores.InicializarGridProveedores(var Grid: TdxDBGrid);
var
  Columna : TdxDBTreeListColumn;
begin
  with Grid do begin
    DestroyColumns;
    ShowSummaryFooter := True;
    {Columna ETIQUETADO}
    {Columna ETIQUETADO}
    Columna := CreateColumn(TdxDBGridImageColumn);
    Columna.FieldName := 'ETIQUETADO';
    Columna.Caption := 'Etiquetado';
    Columna.Width := 2;
    {Columna CODIGO}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.SummaryFooterType := cstCount;
    Columna.SummaryFooterFormat := 'Total: 0 proveedores';
    {Columna NIFCIF}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'NIFCIF';
    Columna.Caption := 'NIF/CIF';
    Columna.Width := tamColNIFCIF;
    {Columna NOMBRE}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombre;
    {Columna TELEFONO 1}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'TELEFONO1';
    Columna.Caption := 'Teléfono 1';
    Columna.Width := tamColTelefono;    
    {Columna FAX}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.Visible := True;
    Columna.FieldName := 'FAX';
    Columna.Caption := 'Fax';
    Columna.Width := tamColTelefono;
    {Columna CORREO}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.Visible := True;
    Columna.FieldName := 'CORREO';
    Columna.Caption := 'Correo electrónico';
    Columna.Width := tamColEMail;    
  end;
end;

function TdmTablaProveedores.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contProveedores);
end;

function TdmTablaProveedores.DarProveedorMax: String;
var
  oSQL : TIBSQL;
begin
  Result := '';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO ');
    SQL.Add('from PROVEEDORES ');
    SQL.Add('where NOMBRE = (select max(NOMBRE) from PROVEEDORES)');
    try
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaProveedores.DarProveedorMin: String;
var
  oSQL : TIBSQL;
begin
  Result := '';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO ');
    SQL.Add('from PROVEEDORES ');
    SQL.Add('where NOMBRE = (select min(NOMBRE) from PROVEEDORES)');
    try
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaProveedores.DarListaProveedores: TStringList;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  Lista := TStringList.Create;
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select NOMBRE ');
    SQL.Add('from PROVEEDORES ');
    SQL.Add('order by NOMBRE');

  try
    Prepare;
    ExecQuery;
    Lista.Add(CTE_TODOS);
    while not EOF do begin
      Lista.Add(Fields[0].AsString);
      Next;
    end;
    result := Lista;
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

function TdmTablaProveedores.insertarProveedorCliEmp(CodigoProveedor,
  Codigo: String): Boolean;
var
  oSQL : TIBSQL;
begin
  result := False;
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('insert into PROVEEDORESCLIEMP ');
    SQL.Add('(CODIGOEMPRESA, CODIGOPROVEEDOR, CODIGOCLIENTE)');
    SQL.Add('values (:CODIGOEMPRESA, :CODIGOPROVEEDOR, :CODIGOCLIENTE)');
  try
    ParamByName('CODIGOEMPRESA').AsString := EmpresaActiva.Codigo;
    ParamByName('CODIGOPROVEEDOR').AsString := CodigoProveedor;
    ParamByName('CODIGOCLIENTE').AsString := Codigo;
    Prepare;
    ExecQuery;
    result := True;
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

function TdmTablaProveedores.modificarProveedorCliEmp(CodigoProveedor,
  Codigo: String): Boolean;
var
  oSQL : TIBSQL;
begin
  result := False;
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PROVEEDORESCLIEMP set');
    SQL.Add('CODIGOCLIENTE = :CODIGOCLIENTE');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
    SQL.Add('and (CODIGOPROVEEDOR = :CODIGOPROVEEDOR)');
  try
    ParamByName('CODIGOEMPRESA').AsString := EmpresaActiva.Codigo;
    ParamByName('CODIGOPROVEEDOR').AsString := CodigoProveedor;
    ParamByName('CODIGOCLIENTE').AsString := Codigo;
    Prepare;
    ExecQuery;
    result := (RowsAffected <> 0);
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

function TdmTablaProveedores.darCodigoClienteProveedor(
  CodigoProveedor: String): Variant;
var
  oSQL : TIBSQL;
begin
  result := '';
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGOCLIENTE');
    SQL.Add('from  PROVEEDORESCLIEMP');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
    SQL.Add('and (CODIGOPROVEEDOR = :CODIGOPROVEEDOR)');
  try
    ParamByName('CODIGOEMPRESA').AsString := EmpresaActiva.Codigo;
    ParamByName('CODIGOPROVEEDOR').AsString := CodigoProveedor;
    Prepare;
    ExecQuery;
    Result := Fields[0].AsString;
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

function TdmTablaProveedores.etiquetarProveedores(Codigos: TStringList;
  TipoOp: Integer): Boolean;
var
  oSQL : TIBSQL;
  Cadena : String;
  i : Integer;
begin
  Result := False;

  if Codigos.Count = 0 then
    Exit;

  //Preparamos la cadena para sql
  for i:=0 to Codigos.Count - 1 do
  begin
      if esCadenaVacia(Cadena) then
        Cadena := '''' + Codigos.Strings[i] + ''''
      else
        Cadena := Cadena + ', ''' + Codigos.Strings[i] + '''';
  end;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    try
      SQL.Add('update PROVEEDORES ');
      if TipoOp = CTE_NOETIQUETAR
      then SQL.Add('set ETIQUETADO = 1 ')
      else SQL.Add('set ETIQUETADO = 0 ');
      SQL.Add('where CODIGO in (');
      SQL.Add(Cadena);
      SQL.Add(')');
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaProveedores.DarCorreo(Codigo: String): String;
var
  oSQL : TIBSQL;
  Contador : String;
begin
  Result := '';

  if EsCadenaVacia(Codigo) then
     Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CORREO ');
    SQL.Add('from PROVEEDORES ');
    SQL.Add('where CODIGO = :CODIGO');
    ParamByName('CODIGO').AsString := Codigo;
    try
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TDatosProveedor }

constructor TDatosProveedor.Create;
begin
  inherited Create;
end;

constructor TDatosProveedor.Create(CodigoProveedor: String);
begin
  inherited Create;
  Codigo := CodigoProveedor;
  // Recuperar los datos
  ObtenerDatos;
end;

procedure TDatosProveedor.ObtenerDatos;
var
  oSQL : TIBSQL;
begin
  oSQL := TIBSQL.Create(NIL);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from PROVEEDORES ');
    if (not EsCadenaVacia(Codigo)) then
    begin
      SQL.Add('where CODIGO = :CODIGO');
      ParamByName('CODIGO').AsString := Codigo;
    end
    else begin
      SQL.Add('where NOMBRE = :NOMBRE');
      ParamByName('NOMBRE').AsString := Nombre;
    end;

    try
      Prepare;
      ExecQuery;

      // Compruebo si se han recuperado datos
      if (RecordCount > 0) then
      begin
        NIFCIF := FieldByName('NIFCIF').AsString;
        Nombre := FieldByName('NOMBRE').AsString;
        Observaciones := FieldByName('OBSERVACIONES').AsString;
        Calle := FieldByName('CALLE').AsString;
        Numero := FieldByName('NUMERO').AsString;
        Piso := FieldByName('PISO').AsString;
        CodigoPostal := FieldByName('CODIGOPOSTAL').AsString;
        Poblacion := FieldByName('POBLACION').AsString;
        Provincia := FieldByName('PROVINCIA').AsString;
        Telefono1 := FieldByName('TELEFONO1').AsString;
        Telefono2 := FieldByName('TELEFONO2').AsString;
        Fax := FieldByName('FAX').AsString;
        Correo := FieldByName('CORREO').AsString;
        PersonaContacto := FieldByName('PERSONACONTACTO').AsString;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TDatosProveedor.SalvarDatos;
var
  oSQL : TIBSQL;
begin
  oSQL := TIBSQL.Create(NIL);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;

    if EsCadenaVacia(Codigo) then
    begin
      Codigo := dmTablaProveedores.DarNuevoCodigo;
      SQL.Assign(dmTablaProveedores.sqlInsertar);
    end
    else
      SQL.Assign(dmTablaProveedores.sqlModificar);

    ParamByName('CODIGO').AsString := Codigo;
    ParamByName('NIFCIF').AsString := NifCif;
    ParamByName('NOMBRE').AsString := Nombre;
    ParamByName('OBSERVACIONES').AsString := Observaciones;
    ParamByName('CALLE').AsString := Calle;
    ParamByName('NUMERO').AsString := Numero;
    ParamByName('PISO').AsString := Piso;
    ParamByName('CODIGOPOSTAL').AsString := CodigoPostal;
    ParamByName('POBLACION').AsString := Poblacion;
    ParamByName('PROVINCIA').AsString := Provincia;
    ParamByName('TELEFONO1').AsString := Telefono1;
    ParamByName('TELEFONO2').AsString := Telefono2;
    ParamByName('FAX').AsString := Fax;
    ParamByName('CORREO').AsString := Correo;
    ParamByName('PERSONACONTACTO').AsString := PersonaContacto;

    try
      Prepare;
      try
        ExecQuery;
        dmTablaProveedores.IncrementarCodigo;        
      except
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

end.
