{
===============================================================================
  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.1.0
  Fecha versión actual: 02-08-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    31-10-2001    Se han añadido los campos IMPORTEDESCUENTO e IMPORTEIVA.

    01-11-2001    Se ha eliminado la columna FACTURADO por CODIGOFACTURA.

    27-11-2001    En los detalles se ha añadido la columna 'Unid. medida'.

    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 albaranes dados de alta
                  en la inicialización del grid.

    08-04-2003    P263. Agrupar por años los albaranes, nueva función
                  DarListaAnos.

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

    02-08-2004    P285. Modificada la función 'NoFacturarAlbaran'.
===============================================================================
}

unit TablaAlbaranesCliente;

interface

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

type
  TDatosAlbaranCliente = class(TPersistent)
  public
  	CodigoEmpresa : integer;
	  Codigo : string;
    FechaAlta : string;
    CodigoFactura : string;
    Usuario : string;
    CodigoCliente : string;
    NIFCIF : string;
    Nombre : string;
    Calle : string;
    Numero : string;
    Piso : string;
    CodigoPostal : string;
    Poblacion : string;
    Provincia : string;
    PersonaContacto : string;
    Telefono : string;
    Fax : string;
    BaseImponible : string;
    Descuento : string;
    IVA : string;
    ImporteTotal : string;
    Descripcion : string;
  end;

  TdmTablaAlbaranesCliente = class(TDataModule)
  private
    procedure IniciarSQLAlbaran;
    procedure IniciarSQLDetalles;
    procedure IniciarSQLGrids;
  public
    sqlInsertarAlbaran : TStrings;
    sqlModificarAlbaran : TStrings;
    sqlConsultarAlbaran : TStrings;
    sqlEliminarAlbaran : TStrings;
    sqlConsultarGridAlbaranes : TStrings;
    sqlConsultarGridAlbaranesCli : TStrings;
    sqlConsultarGridAlbaranesFacturar : 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 : TDatosAlbaranCliente): Boolean;
    function ExisteCodigo(CodigoEmpresa: Integer; Codigo : String) : Boolean;
    function FacturarAlbaran(CodigoEmpresa: Integer; Codigo, CodigoFactura: String) : boolean;
    function NoFacturarAlbaran(CodigoEmpresa: Integer; Codigo: String) : boolean;
    function AlbaranFacturado (CodigoEmpresa: Integer; Codigo: String): boolean;
    procedure InicializarGridDetalles(var Grid: TdxDBGrid);
    procedure InicializarGridAlbaranes(var Grid: TdxDBGrid);
    procedure InicializarTablaAlbaranes(Tabla: TPTabla);
    procedure InicializarTablaDetalles(Tabla: TPTabla);
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    function DarListaAnos(CodigoEmpresa: Integer): TStringList;    
  end;

var
  dmTablaAlbaranesCliente: TdmTablaAlbaranesCliente;

implementation

{$R *.DFM}

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

{ TdmTablaAlbaranesCliente }

constructor TdmTablaAlbaranesCliente.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;
  sqlConsultarGridAlbaranesCli := TStringList.Create;
  sqlConsultarGridAlbaranesFacturar := TStringList.Create;

  IniciarSQLAlbaran;
  IniciarSQLDetalles;
  IniciarSQLGrids;
end;

destructor TdmTablaAlbaranesCliente.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;
  sqlConsultarGridAlbaranesCli.Free;
  sqlConsultarGridAlbaranesFacturar.Free;
  inherited;
end;

function TdmTablaAlbaranesCliente.AlbaranFacturado(CodigoEmpresa: Integer; 
  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('select CODIGOFACTURA ');
    SQL.Add('from ALBARANESCLIENTE ');
    SQL.Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA)');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    ParamByName('CODIGO').AsString := Codigo;
    try
      Prepare;
      ExecQuery;
      Result := not EsCadenaVacia(FieldByName('CODIGOFACTURA').AsString);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaAlbaranesCliente.DarDatosAlbaran(
  Albaran: TDatosAlbaranCliente): 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 ALBARANESCLIENTE ');
    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;
          CodigoCliente := FieldByName('CODIGOCLIENTE').AsString;
          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;
          PersonaContacto := FieldByName('PERSONACONTACTO').AsString;
          Telefono := FieldByName('TELEFONO').AsString;
          Fax := FieldByName('FAX').AsString;
          BaseImponible := FieldByName('BASEIMPONIBLE').AsString;
          Descuento := FieldByName('DESCUENTO').AsString;
          IVA := FieldByName('IVA').AsString;
          ImporteTotal := FieldByName('IMPORTETOTAL').AsString;
          Descripcion := FieldByName('DESCRIPCION').AsString;
          CodigoFactura := FieldByName('CODIGOFACTURA').AsString;
          Result := True;
        end;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaAlbaranesCliente.DarNuevoCodigo: String;
begin
  Result := GestorContadores.DarNuevoCodigo(contAlbaranesCliente);
end;

function TdmTablaAlbaranesCliente.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 ALBARANESCLIENTE ');
  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 TdmTablaAlbaranesCliente.FacturarAlbaran(CodigoEmpresa: Integer; 
	Codigo, CodigoFactura: 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 ALBARANESCLIENTE set ');
    SQL.Add('CODIGOFACTURA = :CODIGOFACTURA');
    SQL.Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('and (CODIGOFACTURA is NULL)');

	ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    ParamByName('CODIGO').AsString := Codigo;
    ParamByName('CODIGOFACTURA').AsString := CodigoFactura;
    Prepare;
    ExecQuery;
    if RowsAffected = 0 then
      raise Exception.CreateFmt(msgAlbYaFacturado, [Codigo])
    else
      Result := True;
    { No hay que tocar la transacción para que sigua la
      ejecución por la función que ha llamado a esta. }
    Close;
    Transaction := NIL;
    Free;
  end;
end;

function TdmTablaAlbaranesCliente.FormatearCodigo(Codigo: String): String;
begin
  Result := GestorContadores.FormatearCodigo(contAlbaranesCliente, Codigo);
end;

function TdmTablaAlbaranesCliente.IncrementarCodigo: boolean;
begin
  Result := GestorContadores.IncrementarValor(contAlbaranesCliente);
end;

procedure TdmTablaAlbaranesCliente.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 CODIGOCLIENTE}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'CODIGOCLIENTE';
    Columna.Caption := 'Cód. cliente';
    Columna.Width := tamColCodigo;
    {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 IMPORTETOTAL}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe total';
    Columna.Width := tamColPrecio;
    {Columna CODIGOFACTURA}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'CODIGOFACTURA';
    Columna.Caption := 'Cód. factura';
    Columna.Width := tamColCodigo;    
  end;
end;

procedure TdmTablaAlbaranesCliente.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;
    {Columna PRECIOUNIDAD}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'PRECIOUNIDAD';
    Columna.Caption := 'Precio unidad';
    Columna.Width := tamColPrecio;
    {Columna TOTAL}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'TOTAL';
    Columna.ReadOnly := True;
    Columna.Caption := 'Precio total';
    Columna.Width := tamColPrecio;    
  end;
end;

procedure TdmTablaAlbaranesCliente.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;

    if FindField('BASEIMPONIBLE') <> NIL then
      //with (FieldByName('BASEIMPONIBLE') as TFloatField) do begin
      with (FieldByName('BASEIMPONIBLE') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

    if FindField('DESCUENTO') <> NIL then
      with (FieldByName('DESCUENTO') as TFloatField) do begin
        DisplayFormat := DISPLAY_DTO;
        EditFormat := EDIT_DTO;
      end;

    if FindField('IMPORTEDESCUENTO') <> NIL then
      //with (FieldByName('IMPORTEDESCUENTO') as TFloatField) do begin
      with (FieldByName('IMPORTEDESCUENTO') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

    if FindField('IVA') <> NIL then
      with (FieldByName('IVA') as TFloatField) do begin
        DisplayFormat := DISPLAY_DTO;
        EditFormat := EDIT_DTO;
      end;

    if FindField('IMPORTEIVA') <> NIL then
      //with (FieldByName('IMPORTEIVA') as TFloatField) do begin
      with (FieldByName('IMPORTEIVA') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

    if FindField('IMPORTETOTAL') <> NIL then
      //with (FieldByName('IMPORTETOTAL') as TFloatField) do begin
      with (FieldByName('IMPORTETOTAL') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;
  end;
end;

procedure TdmTablaAlbaranesCliente.InicializarTablaDetalles(
  Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    with (FieldByName('PRECIOUNIDAD') as TFloatField) do begin
      DisplayFormat := DISPLAY_EUROS2;
      EditFormat := EDIT_EUROS2;
    end;
    with (FieldByName('TOTAL') as TFloatField) do begin
      DisplayFormat := DISPLAY_EUROS2;
      EditFormat := EDIT_EUROS2;
    end;
  end;
end;

procedure TdmTablaAlbaranesCliente.IniciarSQLAlbaran;
begin
  with sqlInsertarAlbaran do
  begin
    Add('insert into ALBARANESCLIENTE ');
    Add('(CODIGOEMPRESA, CODIGO, FECHAALTA, USUARIO, DESCRIPCION, ');
    Add('CODIGOCLIENTE, NIFCIF, NOMBRE, CALLE, NUMERO, PISO, CODIGOPOSTAL, ');
    Add('POBLACION, PROVINCIA, PERSONACONTACTO, TELEFONO, FAX, ');
    Add('BASEIMPONIBLE, DESCUENTO, IVA, IMPORTETOTAL, IMPORTEDESCUENTO, ');
    Add('IMPORTEIVA)' );
    Add('values (:CODIGOEMPRESA, :CODIGO, :FECHAALTA, :USUARIO, ');
    Add(':DESCRIPCION, :CODIGOCLIENTE, :NIFCIF, :NOMBRE, :CALLE, :NUMERO, ');
    Add(':PISO, :CODIGOPOSTAL, :POBLACION, :PROVINCIA, ');
    Add(':PERSONACONTACTO, :TELEFONO, :FAX, :BASEIMPONIBLE, ');
    Add(':DESCUENTO, :IVA, :IMPORTETOTAL, :IMPORTEDESCUENTO, :IMPORTEIVA)');
  end;

  with sqlModificarAlbaran do
  begin
    Add('update ALBARANESCLIENTE set ');
    Add('FECHAALTA = :FECHAALTA, ');
    Add('USUARIO = :USUARIO, ');
    Add('DESCRIPCION = :DESCRIPCION, ');
    Add('CODIGOCLIENTE = :CODIGOCLIENTE, ');
    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('PERSONACONTACTO = :PERSONACONTACTO, ');
    Add('TELEFONO = :TELEFONO, ');
    Add('FAX = :FAX, ');
    Add('BASEIMPONIBLE = :BASEIMPONIBLE, ');
    Add('DESCUENTO = :DESCUENTO, ');
    Add('IMPORTEDESCUENTO = :IMPORTEDESCUENTO, ');
    Add('IVA = :IVA, ');
    Add('IMPORTEIVA = :IMPORTEIVA, ');    
    Add('IMPORTETOTAL = :IMPORTETOTAL ');
    Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA)');
  end;

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

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

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

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

  with sqlEliminarDetalles do
  begin
    Add('delete from DETALLESALBARANESCLIENTE ');
    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, PRECIOUNIDAD, TOTAL ');
    Add('from DETALLESALBARANESCLIENTE ');
    Add('where (CODIGOALBARAN = :CODIGOALBARAN) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');        
    Add('and (NUMCONCEPTO = :NUMCONCEPTO)');
  end;
end;

procedure TdmTablaAlbaranesCliente.IniciarSQLGrids;
begin
  with sqlConsultarGridAlbaranes do
  begin
    Add('select CODIGO, FECHAALTA, CODIGOCLIENTE, NIFCIF, ');
    Add('EXTRACT (YEAR FROM FECHAALTA) as ANO, ');
    Add('NOMBRE, IMPORTETOTAL, CODIGOFACTURA');
    Add('from ALBARANESCLIENTE ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) ');            
    Add('order by CODIGO');
  end;

  with sqlConsultarGridAlbaranesCli do
  begin
    Add('select CODIGO, FECHAALTA, CODIGOCLIENTE, NIFCIF, ');
    Add('EXTRACT (YEAR FROM FECHAALTA) as ANO, ');
    Add('NOMBRE, IMPORTETOTAL, CODIGOFACTURA');
    Add('from ALBARANESCLIENTE ');
    Add('where (CODIGOCLIENTE = :CODIGOCLIENTE) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('order by CODIGO');
  end;

  with sqlConsultarGridAlbaranesFacturar do
  begin
    Add('select CODIGO, FECHAALTA, CODIGOCLIENTE, NIFCIF, ');
    Add('EXTRACT (YEAR FROM FECHAALTA) as ANO, ');
    Add('NOMBRE, IMPORTETOTAL, CODIGOFACTURA');
    Add('from ALBARANESCLIENTE ');
    Add('where (CODIGOFACTURA is NULL) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('order by CODIGO');
  end;

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

end;

function TdmTablaAlbaranesCliente.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contAlbaranesCliente);
end;

function TdmTablaAlbaranesCliente.NoFacturarAlbaran(CodigoEmpresa: Integer; 
  Codigo: String): boolean;
var
  oSQL : TIBSQL;
begin
  { Con la adaptación a multiempresa, esto hay que hacerlo por código
    por que si se hace por integridad referencial, la BD pone NULL en
    CODIGOFACTURA y en CODIGOEMPRESA (eso está mal) }
  Result := False;
  if (Length(Trim(Codigo)) = 0) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update ALBARANESCLIENTE set ');
    SQL.Add('CODIGOFACTURA = NULL');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) and (CODIGO = :CODIGO) ');
    ParamByName('CODIGO').AsString := Codigo;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

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

function TdmTablaAlbaranesCliente.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 ALBARANESCLIENTE ');
    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.
