{
===============================================================================
  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: 04-10-2004
  Versión actual: 1.0.0
  Fecha versión actual: 04-10-2004
===============================================================================
  Modificaciones:

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

unit TablaAlbaranesInstalador;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  BaseDatos, Ibdatabase, dxDBGrid, Contadores;

type
  TDatosAlbaranInstalador = class(TPersistent)
  public
    CodigoEmpresa : integer;
    Codigo : string;
    FechaAlta : string;
    Usuario : string;
    CodigoInstalador : string;
    Nombre : string;
    Telefono : string;
    Descripcion : string;
  end;

  TdmTablaAlbaranesInstalador = class(TDataModule)
  private
    procedure IniciarSQLAlbaran;
    procedure IniciarSQLDetalles;
    procedure IniciarSQLGrids;
  public
    sqlInsertarAlbaran : TStrings;
    sqlModificarAlbaran : TStrings;
    sqlConsultarAlbaran : TStrings;
    sqlEliminarAlbaran : TStrings;
    sqlConsultarGridAlbaranes : TStrings;
    sqlConsultarGridAlbaranesIns : TStrings;
    sqlInsertarDetalles : TStrings;
    sqlModificarDetalles : TStrings;
    sqlConsultarDetalles : TStrings;
    sqlEliminarDetalles : TStrings;
    sqlConsultarGridDetalles : 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 DarDatosAlbaran(Albaran : TDatosAlbaranInstalador): Boolean;
    function ExisteCodigo(CodigoEmpresa: Integer; Codigo : String) : Boolean;
    procedure InicializarGridDetalles(var Grid: TdxDBGrid);
    procedure InicializarGridAlbaranes(var Grid: TdxDBGrid);
    procedure InicializarTablaAlbaranes(Tabla: TPTabla);
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    function DarListaAnos(CodigoEmpresa: Integer): TStringList;
  end;

var
  dmTablaAlbaranesInstalador: TdmTablaAlbaranesInstalador;

implementation

{$R *.DFM}

uses
  IBSQL, Mensajes, StrFunc, IB, DB, Excepciones,
  TablaUnidadesMedida, dxDBCtrl, dxDBTLCL, IBCustomDataSet, dxTL, Constantes,
  Literales, RdxGestorContadores;

{ TdmTablaAlbaranesCliente }

constructor TdmTablaAlbaranesInstalador.Create(AOwner: TComponent);
begin
  inherited;
  { Cabecera }
  sqlInsertarAlbaran := TStringList.Create;
  sqlModificarAlbaran := TStringList.Create;
  sqlConsultarAlbaran := TStringList.Create;
  sqlEliminarAlbaran := TStringList.Create;

  { Detalles }
  sqlInsertarDetalles := TStringList.Create;
  sqlModificarDetalles := TStringList.Create;
  sqlConsultarDetalles := TStringList.Create;
  sqlEliminarDetalles := TStringList.Create;
  sqlConsultarGridDetalles := TStringList.Create;

  { Grids }
  sqlConsultarGridAlbaranes := TStringList.Create;
  sqlConsultarGridAlbaranesIns := TStringList.Create;

  IniciarSQLAlbaran;
  IniciarSQLDetalles;
  IniciarSQLGrids;
end;

destructor TdmTablaAlbaranesInstalador.Destroy;
begin
  { Cabecera }
  sqlInsertarAlbaran.Free;
  sqlModificarAlbaran.Free;
  sqlConsultarAlbaran.Free;
  sqlEliminarAlbaran.Free;

  { Detalles }
  sqlInsertarDetalles.Free;
  sqlModificarDetalles.Free;
  sqlConsultarDetalles.Free;
  sqlEliminarDetalles.Free;
  sqlConsultarGridDetalles.Free;

  { Grids }
  sqlConsultarGridAlbaranes.Free;
  sqlConsultarGridAlbaranesIns.Free;
  inherited;
end;

function TdmTablaAlbaranesInstalador.DarDatosAlbaran(
  Albaran: TDatosAlbaranInstalador): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if EsCadenaVacia(Albaran.Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from ALBARANESINSTALADOR ');
    SQL.Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA)');
    ParamByName('CODIGOEMPRESA').AsInteger := Albaran.CodigoEmpresa;
    ParamByName('CODIGO').AsString := Albaran.Codigo;
    try
      Prepare;
      ExecQuery;
      //Compruebo que el codigo de albarán existe. Si no existe, devuelvo false
      if (RecordCount > 0) then
      begin
        with Albaran do
        begin
          FechaAlta := FieldByName('FECHAALTA').AsString;
          Usuario:= FieldByName('USUARIO').AsString;
          CodigoInstalador := FieldByName('CODIGOINSTALADOR').AsString;
          Nombre := FieldByName('NOMBRE').AsString;
          Telefono := FieldByName('TELEFONO').AsString;
          Descripcion := FieldByName('DESCRIPCION').AsString;
          Result := True;
        end;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaAlbaranesInstalador.DarNuevoCodigo: String;
begin
  Result := GestorContadores.DarNuevoCodigo(contAlbaranesInstalador);
end;

function TdmTablaAlbaranesInstalador.ExisteCodigo(CodigoEmpresa: Integer; Codigo: String): Boolean;
var
  oSQL : TIBSQL;
  Contador : String;
begin
  Result := False;
  oSQL := TIBSQL.Create(Self);
  oSQL.Database := dmBaseDatos.BD;
  oSQL.Transaction := dmBaseDatos.Transaccion;
  oSQL.SQL.Add('select CODIGO ');
  oSQL.SQL.Add('from ALBARANESPROVEEDOR ');
  oSQL.SQL.Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA)');

  try
    with oSQL do
    begin
      ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
      ParamByName('CODIGO').AsString := Codigo;
      Prepare;
      ExecQuery;
      Contador := Fields[0].AsString;
      Result := (Codigo = Contador);
    end;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
  oSQL.Close;
  oSQL.Transaction := NIL;
  oSQL.Free;
end;

function TdmTablaAlbaranesInstalador.FormatearCodigo(Codigo: String): String;
begin
  Result := GestorContadores.FormatearCodigo(contAlbaranesInstalador, Codigo);
end;

function TdmTablaAlbaranesInstalador.IncrementarCodigo: boolean;
begin
  Result := GestorContadores.IncrementarValor(contAlbaranesInstalador);
end;

procedure TdmTablaAlbaranesInstalador.InicializarGridAlbaranes(var Grid: TdxDBGrid);
var
  Columna : TdxDBTreeListColumn;
begin
  with Grid do begin
    DestroyColumns;
    ShowSummaryFooter := True;
    {Columna CODIGO}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Sorted := csDown;
    Columna.SummaryFooterType := cstCount;
    Columna.SummaryFooterFormat := 'Total: 0 albaranes';

    {Columna ANO}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'ANO';
    Columna.Caption := 'Año';
    Columna.Width := tamColFecha;
    Columna.Visible := False;

    {Columna FECHAALTA}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'FECHAALTA';
    Columna.Caption := 'Fecha alta';
    Columna.Width := tamColFecha;
    {Columna CODIGOINSTALADOR}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'CODIGOINSTALADOR';
    Columna.Caption := 'Cód. instalador';
    Columna.Width := tamColCodigo;
    {Columna NOMBRE}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombre;
  end;
end;

procedure TdmTablaAlbaranesInstalador.InicializarGridDetalles(var Grid: TdxDBGrid);
var
  Columna : TdxDBTreeListColumn;
begin
  with Grid do begin
    DestroyColumns;
    {Columna CODIGOALBARAN}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.Visible := False;
    Columna.FieldName := 'CODIGOALBARAN';
    {Columna NUMCONCEPTO}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.Visible := False;
    Columna.FieldName := 'NUMCONCEPTO';
    {Columna CODIGOARTICULO}
    Columna := CreateColumn(TdxDBTreeListButtonColumn);
    Columna.FieldName := 'CODIGOARTICULO';
    Columna.Caption := 'Cód. material';
    Columna.Width := tamColCodigo;
    {Columna DESCRIPCION}
    Columna := CreateColumn(TdxDBTreeListButtonColumn);
    Columna.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Descripción';
    Columna.Width := tamColDescripcion;
    {Columna CANTIDAD}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'CANTIDAD';
    Columna.Caption := 'Cantidad';
    Columna.Width := tamColCantidad;
    {Columna UNIDADESMEDIDA}
    Columna := CreateColumn(TdxDBTreeListPickColumn);
    Columna.FieldName := 'UNIDADESMEDIDA';
    Columna.Caption := 'Unid. medida';
    (Columna as TdxDBTreeListPickColumn).Items := dmTablaUnidadesMedida.DarUnidadesMedida;
    Columna.Width := tamColUnidadesMedida;
  end;
end;

procedure TdmTablaAlbaranesInstalador.InicializarTablaAlbaranes(
  Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('FECHAALTA') <> NIL then
      with (FieldByName('FECHAALTA') as TDateField) do begin
        EditMask := MASK_FECHA;
      end;
  end;
end;

procedure TdmTablaAlbaranesInstalador.IniciarSQLAlbaran;
begin
  with sqlInsertarAlbaran do
  begin
    Add('insert into ALBARANESINSTALADOR ');
    Add('(CODIGOEMPRESA, CODIGO, FECHAALTA, USUARIO, DESCRIPCION, ');
    Add('CODIGOINSTALADOR, NOMBRE, TELEFONO)');
    Add('values (:CODIGOEMPRESA, :CODIGO, :FECHAALTA, :USUARIO, ');
    Add(':DESCRIPCION, :CODIGOINSTALADOR, :NOMBRE, :TELEFONO) ');
  end;

  with sqlModificarAlbaran do
  begin
    Add('update ALBARANESINSTALADOR set ');
    Add('FECHAALTA = :FECHAALTA, ');
    Add('USUARIO = :USUARIO, ');
    Add('DESCRIPCION = :DESCRIPCION, ');
    Add('CODIGOINSTALADOR = :CODIGOINSTALADOR, ');
    Add('NOMBRE = :NOMBRE, ');
    Add('TELEFONO = :TELEFONO ');
    Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA)');
  end;

  with sqlEliminarAlbaran do
  begin
    Add('delete from ALBARANESINSTALADOR ');
    Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA)');
  end;

  with sqlConsultarAlbaran do
  begin
    Add('select * from ALBARANESINSTALADOR ');
    Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA)');
  end;
end;

procedure TdmTablaAlbaranesInstalador.IniciarSQLDetalles;
begin
  with sqlInsertarDetalles do
  begin
    Add('insert into DETALLESALBARANESINSTALADOR ');
    Add('(CODIGOEMPRESA, CODIGOALBARAN, NUMCONCEPTO, CODIGOARTICULO, DESCRIPCION, ');
    Add('CANTIDAD, UNIDADESMEDIDA) ');
    Add('values (:CODIGOEMPRESA, :CODIGOALBARAN, :NUMCONCEPTO, :CODIGOARTICULO, ');
    Add(':DESCRIPCION, :CANTIDAD, :UNIDADESMEDIDA)');
  end;

  with sqlModificarDetalles do
  begin
    Add('update DETALLESALBARANESINSTALADOR set ');
    Add('NUMCONCEPTO = :NUMCONCEPTO, ');
    Add('CODIGOARTICULO = :CODIGOARTICULO, ');
    Add('DESCRIPCION = :DESCRIPCION, ');
    Add('CANTIDAD = :CANTIDAD, ');
    Add('UNIDADESMEDIDA = :UNIDADESMEDIDA ');
    Add('where (CODIGOALBARAN = :CODIGOALBARAN) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('and (NUMCONCEPTO = :NUMCONCEPTO)');
  end;

  with sqlEliminarDetalles do
  begin
    Add('delete from DETALLESALBARANESINSTALADOR ');
    Add('where (CODIGOALBARAN = :CODIGOALBARAN) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('and (NUMCONCEPTO = :NUMCONCEPTO)');
  end;

  with sqlConsultarDetalles do
  begin
    Add('select CODIGOALBARAN, NUMCONCEPTO, CODIGOARTICULO, ');
    Add('DESCRIPCION, CANTIDAD, UNIDADESMEDIDA ');
    Add('from DETALLESALBARANESINSTALADOR ');
    Add('where (CODIGOALBARAN = :CODIGOALBARAN) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('and (NUMCONCEPTO = :NUMCONCEPTO)');
  end;
end;

procedure TdmTablaAlbaranesInstalador.IniciarSQLGrids;
begin
  with sqlConsultarGridAlbaranes do
  begin
    Add('select CODIGO, FECHAALTA, CODIGOINSTALADOR, ');
    Add('EXTRACT (YEAR FROM FECHAALTA) as ANO, ');
    Add('NOMBRE');
    Add('from ALBARANESINSTALADOR ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('order by CODIGO');
  end;

  with sqlConsultarGridAlbaranesIns do
  begin
    Add('select CODIGO, FECHAALTA, CODIGOINSTALADOR, ');
    Add('EXTRACT (YEAR FROM FECHAALTA) as ANO, ');
    Add('NOMBRE');
    Add('from ALBARANESINSTALADOR ');
    Add('where (CODIGOINSTALADOR = :CODIGOINSTALADOR) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('order by CODIGO');
  end;

  with sqlConsultarGridDetalles do
  begin
    Add('select CODIGOEMPRESA, CODIGOALBARAN, NUMCONCEPTO, ');
    Add('CODIGOARTICULO, DESCRIPCION, ');
    Add('CANTIDAD, UNIDADESMEDIDA ');
    Add('from DETALLESALBARANESINSTALADOR ');
    Add('where (CODIGOALBARAN = :CODIGOALBARAN) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('order by NUMCONCEPTO');
  end;

end;

function TdmTablaAlbaranesInstalador.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contAlbaranesInstalador);
end;

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

function TdmTablaAlbaranesInstalador.DarListaAnos(CodigoEmpresa: Integer): 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 distinct (EXTRACT (YEAR FROM FECHAALTA)) ANO ');
    SQL.Add('from ALBARANESINSTALADOR ');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) ');    
    SQL.Add('order by FECHAALTA desc');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    
  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;

end.
