{
===============================================================================
  Copyright (©) 2002. 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: 25-12-2002
  Versión actual: 1.0.1
  Fecha versión actual: 08-06-2003
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    08-06-2003    Revisión del método 'EsUltimaFactura' porque no se tenía
                  en cuenta la serie a la que pertenece la factura.
===============================================================================
}

unit TablaFacturasProforma;

interface

uses
  //Generales
  SysUtils, Classes, Controls, IBSQL, cxGridDBTableView, cxCustomData, DB,
  //Particulares
  IBCustomDataSet, cxGrid, StdCtrls, cxButtonEdit, cxEdit, cxMemo,

  //Aplicacion
  Framework, StrFunc, Entidades, Constantes, BaseDatos, RdxEmpresaActiva,

  //Contador
  Contadores, RdxGestorContadores;

type
  TDatosFacturaProforma = class(TObjeto)
  private
    //
  protected
    procedure ObtenerDatos; override;
    procedure AssignTo(Dest: TPersistent); override;
  public
    Codigo : String;
    FechaAlta : TDateTime;
    Usuario : String;
    FechaFactura : TDateTime;
    CodigoCliente : String;
    NIFCIF : String;
    Nombre : String;
    Calle : String;
    Numero : String;
    Piso : String;
    CodigoPostal : String;
    Poblacion : String;
    Provincia : String;
    Telefono1 : String;
    Telefono2 : String;
    Movil1 : String;
    Movil2 : String;
    Fax : String;
    PersonaContacto : String;
    BaseImponible : double;
    Descuento : integer;
    ImporteDescuento : double;
    Iva : integer;
    ImporteIva : double;
    Re : integer;
    ImporteRe : double;
    ImporteTotal : double;
    FormaPago : String;
    Observaciones : String;
    constructor Create(CodigoFactura : String); overload;
    constructor Create; overload; override;
    destructor Destroy; override;
  end;

  TListaFacturasProforma = class(TListaObjetos)
  private
    FSQL : String;
    function GetFactura(Index: Integer): TDatosFacturaProforma;
  protected
    procedure AssignTo(Dest: TPersistent); override;
    procedure ObtenerLista; override;
  public
    constructor Create(oSQL : String); overload;
    constructor Create; overload; override;
    property Items[Index: Integer] : TDatosFacturaProforma read GetFactura;
  end;

/////////////////////////////////////////////////////////////////////////////////

  TdmTablaFacturasProforma = class(TDataModule)
  private
    procedure IniciarSQLFactura;
    procedure IniciarSQLDetalles;
    procedure IniciarSQLGrids;
  public
    sqlInsertarFactura : TStrings;
    sqlModificarFactura : TStrings;
    sqlConsultarFactura : TStrings;
    sqlEliminarFactura : TStrings;
    sqlConsultarGridFacturas : TStrings;
    sqlInsertarDetalles : TStrings;
    sqlModificarDetalles : TStrings;
    sqlConsultarDetalles : TStrings;
    sqlEliminarDetalles : TStrings;
    sqlConsultarGridDetalles : TStrings;

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

    function DarDatosFactura(Factura : TDatosFacturaProforma): Boolean;
    function FormatearNumConcepto(NumConcepto : String) : String;
    function ExisteCodigo(Codigo : String) : Boolean;
    procedure InicializarGridDetalles(var Grid: TcxGrid);
    procedure InicializarGridFacturas(var Grid: TcxGrid);
    procedure InicializarTablaFacturas(Tabla: TPTabla);
    procedure InicializarTablaDetalles(Tabla: TPTabla);
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    function EsUltimaFactura(Codigo : String): Boolean;
  end;

var
  dmTablaFacturasProforma: TdmTablaFacturasProforma;

implementation
{$R *.DFM}

uses
  TablaEmpresas;

{ TdmTablaFacturas }

constructor TdmTablaFacturasProforma.Create(AOwner: TComponent);
begin
  inherited;
  { Cabecera }
  sqlInsertarFactura := TStringList.Create;
  sqlModificarFactura := TStringList.Create;
  sqlConsultarFactura := TStringList.Create;
  sqlEliminarFactura := TStringList.Create;

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

  { Grids }
  sqlConsultarGridFacturas := TStringList.Create;
  sqlConsultarGridDetalles := TStringList.Create;

  IniciarSQLFactura;
  IniciarSQLDetalles;
  IniciarSQLGrids;
end;

function TdmTablaFacturasProforma.DarNuevoCodigo: String;
begin
  Result := GestorContadores.darNuevoCodigo(contFacturasProforma);
end;

destructor TdmTablaFacturasProforma.Destroy;
begin
  { Cabecera }
  sqlInsertarFactura.Free;
  sqlModificarFactura.Free;
  sqlConsultarFactura.Free;
  sqlEliminarFactura.Free;

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

  { Grids }
  sqlConsultarGridFacturas.Free;
  sqlConsultarGridDetalles.Free;
  inherited;
end;

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

function TdmTablaFacturasProforma.FormatearCodigo(Codigo: String): String;
begin
  Result := GestorContadores.formatearCodigo(contFacturasProforma, Codigo);
end;

function TdmTablaFacturasProforma.FormatearNumConcepto(
  NumConcepto: String): String;
var
  Concepto : Integer;
begin
  Concepto := StrToInt(NumConcepto);
  Result :=  format('%.10d', [Concepto]);
end;

function TdmTablaFacturasProforma.IncrementarCodigo: boolean;
begin
  Result := GestorContadores.IncrementarValor(contFacturasProforma);
end;

procedure TdmTablaFacturasProforma.InicializarGridDetalles(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    OptionsView.Footer := True;
    {Columna CODIGOEMPRESA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOEMPRESA';
    Columna.Visible := False;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    {Columna CODIGOFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOFACTURA';
    Columna.Visible := False;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    {Columna NUMCONCEPTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NUMCONCEPTO';
    Columna.Visible := False;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    {Columna CODIGOARTICULO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOARTICULO';
    Columna.Caption := 'Cód. artículo';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.Visible := False;
    Columna.PropertiesClassName := 'TcxButtonEditProperties';
    with TcxButtonEditProperties(Columna.Properties) do
    begin
      Buttons[0].Kind := bkEllipsis;
    end;
    {Columna DESCRIPCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Descripción servicio/artículo';
    Columna.Width := tamColDescripcion;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxMemoProperties';
    with TcxMemoProperties(Columna.Properties) do
      ScrollBars := ssVertical;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: #,0 conceptos';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna CANTIDAD}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CANTIDAD';
    Columna.Caption := 'Cantidad';
    Columna.Width := tamColCantidad;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxCalcEditProperties';

    {Columna IMPORTEUNIDAD}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTEUNIDAD';
    Columna.Caption := 'Importe unidad';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;
    Columna.PropertiesClassName := 'TcxCalcEditProperties';

    {Columna IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe total';
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
    Columna.Options.Sorting := False;    
    Columna.Options.Editing := False;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := DISPLAY_EUROS2;
        Kind := skSum;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
  end;
end;

procedure TdmTablaFacturasProforma.InicializarGridFacturas(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    OptionsView.Footer := True;
    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: 0 facturas';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna FECHAFACTURA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAFACTURA';
    Columna.Caption := 'Fecha';
    Columna.Width := tamColFecha;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soDescending;
    {Columna CODIGOCLIENTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCLIENTE';
    Columna.Caption := 'Cód. cliente';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    {Columna NIFCIF}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NIFCIF';
    Columna.Caption := 'NIF/CIF';
    Columna.Width := tamColNIFCIF;
    Columna.Options.Filtering := False;
    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombre;
    Columna.Options.Filtering := False;
    {Columna IMPORTETOTAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe total';
    Columna.HeaderAlignmentHorz := taRightJustify;
    Columna.Width := tamColImporte;
    Columna.Options.Filtering := False;
  end;
end;

procedure TdmTablaFacturasProforma.InicializarTablaDetalles(Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('CANTIDAD') <> NIL then
      with (FieldByName('CANTIDAD') as TNumericField) do begin
        DisplayFormat := DISPLAY_CANTIDAD;
        EditFormat := EDIT_CANTIDAD;
      end;

    if FindField('IMPORTEUNIDAD') <> NIL then
      with (FieldByName('IMPORTEUNIDAD') as TFloatField) do begin
        DisplayFormat := DISPLAY_EUROS4;
        EditFormat := EDIT_EUROS4;
      end;

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

procedure TdmTablaFacturasProforma.InicializarTablaFacturas(
  Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('BASEIMPONIBLE') <> NIL then
      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 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 TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

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

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

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

procedure TdmTablaFacturasProforma.IniciarSQLDetalles;
begin
  with sqlInsertarDetalles do
  begin
    Add('INSERT INTO DETALLESFACTURASPROFORMAART ( ');
    Add('CODIGOEMPRESA, CODIGOFACTURA, NUMCONCEPTO, ');
    Add('CODIGOARTICULO, FAMILIA, ');
    Add('DESCRIPCION, CANTIDAD, ');
    Add('IMPORTEUNIDAD, IMPORTETOTAL) ');
    Add('VALUES ( ');
    Add(':CODIGOEMPRESA, :CODIGOFACTURA, :NUMCONCEPTO, ');
    Add(':CODIGOARTICULO, :FAMILIA, ');
    Add(':DESCRIPCION, :CANTIDAD, ');
    Add(':IMPORTEUNIDAD, :IMPORTETOTAL) ');
  end;

  with sqlModificarDetalles do
  begin
    Add('UPDATE DETALLESFACTURASPROFORMAART SET  ');
    Add('CODIGOARTICULO = :CODIGOARTICULO, ');
    Add('FAMILIA = :FAMILIA, ');
    Add('DESCRIPCION = :DESCRIPCION, ');
    Add('CANTIDAD = :CANTIDAD, ');
    Add('IMPORTEUNIDAD = :IMPORTEUNIDAD, ');
    Add('IMPORTETOTAL = :IMPORTETOTAL ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA) AND  ');
    Add('(CODIGOFACTURA = :CODIGOFACTURA) AND  ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO) ');
  end;

  with sqlEliminarDetalles do
  begin
    Add('delete from DETALLESFACTURASPROFORMAART ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA) AND  ');
    Add('(CODIGOFACTURA = :CODIGOFACTURA) AND  ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO) ');
  end;

  with sqlConsultarDetalles do
  begin
    Add('select CODIGOFACTURA, NUMCONCEPTO, CODIGOARTICULO, FAMILIA, ');
    Add('DESCRIPCION, CANTIDAD, IMPORTEUNIDAD, IMPORTETOTAL ');
    Add('from DETALLESFACTURASPROFORMAART ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA) AND  ');
    Add('(CODIGOFACTURA = :CODIGOFACTURA) AND  ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO) ');
  end;
end;

procedure TdmTablaFacturasProforma.IniciarSQLGrids;
begin
  with sqlConsultarGridFacturas do
  begin
    Add('select CODIGO, FECHAALTA, FECHAFACTURA,');
    Add('CODIGOCLIENTE, NIFCIF, NOMBRE, IMPORTETOTAL ');
    Add('from FACTURASPROFORMA ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA)');
  end;

  with sqlConsultarGridDetalles do
  begin
    Add('select CODIGOEMPRESA, CODIGOFACTURA, NUMCONCEPTO, CODIGOARTICULO, FAMILIA, ');
    Add('DESCRIPCION, CANTIDAD, IMPORTEUNIDAD, IMPORTETOTAL ');
    Add('from DETALLESFACTURASPROFORMAART ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add('AND (CODIGOFACTURA = :CODIGOFACTURA)');
    Add('order by CODIGOFACTURA, NUMCONCEPTO');
  end;
end;

procedure TdmTablaFacturasProforma.IniciarSQLFactura;
begin
  with sqlInsertarFactura do
  begin
    Add('INSERT INTO FACTURASPROFORMA ');
    Add('(CODIGOEMPRESA, CODIGO, FECHAALTA, FECHAFACTURA, ');
    Add('CODIGOCLIENTE, NIFCIF, NOMBRE, ');
    Add('CALLE, NUMERO, PISO, ');
    Add('CODIGOPOSTAL, POBLACION, PROVINCIA, ');
    Add('TELEFONO1, TELEFONO2, MOVIL1, ');
    Add('MOVIL2, FAX, PERSONACONTACTO, ');
    Add('BASEIMPONIBLE, DESCUENTO, IMPORTEDESCUENTO, ');
    Add('IVA, IMPORTEIVA, IMPORTETOTAL, RE, IMPORTERE, ');
    Add('FORMAPAGO, OBSERVACIONES, ');
    Add('USUARIO) VALUES ');
    Add('(:CODIGOEMPRESA, :CODIGO, :FECHAALTA, ');
    Add(':FECHAFACTURA, ');
    Add(':CODIGOCLIENTE, :NIFCIF, ');
    Add(':NOMBRE, :CALLE, :NUMERO, ');
    Add(':PISO, :CODIGOPOSTAL, ');
    Add(':POBLACION, :PROVINCIA, ');
    Add(':TELEFONO1, :TELEFONO2, ');
    Add(':MOVIL1, :MOVIL2, ');
    Add(':FAX, :PERSONACONTACTO, ');
    Add(':BASEIMPONIBLE, :DESCUENTO, ');
    Add(':IMPORTEDESCUENTO, :IVA, ');
    Add(':IMPORTEIVA, :IMPORTETOTAL, ');
    Add(':RE, :IMPORTERE, ');
    Add(':FORMAPAGO, :OBSERVACIONES, ');
    Add(':USUARIO) ');
  end;

  with sqlModificarFactura do
  begin
    Add('UPDATE FACTURASPROFORMA SET ');
    Add('FECHAFACTURA = :FECHAFACTURA, ');
    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('TELEFONO1 = :TELEFONO1, ');
    Add('TELEFONO2 = :TELEFONO2, ');
    Add('MOVIL1 = :MOVIL1, ');
    Add('MOVIL2 = :MOVIL2, ');
    Add('FAX = :FAX, ');
    Add('PERSONACONTACTO = :PERSONACONTACTO, ');
    Add('BASEIMPONIBLE = :BASEIMPONIBLE, ');
    Add('DESCUENTO = :DESCUENTO, ');
    Add('IMPORTEDESCUENTO = :IMPORTEDESCUENTO, ');
    Add('IVA = :IVA, ');
    Add('IMPORTEIVA = :IMPORTEIVA, ');
    Add('RE = :RE, ');
    Add('IMPORTERE = :IMPORTERE, ');
    Add('IMPORTETOTAL = :IMPORTETOTAL, ');
    Add('FORMAPAGO = :FORMAPAGO, ');
    Add('OBSERVACIONES = :OBSERVACIONES ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add(' AND (CODIGO = :CODIGO)');
  end;

  with sqlEliminarFactura do
  begin
    Add('delete from FACTURASPROFORMA ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add(' AND (CODIGO = :CODIGO)');
  end;

  with sqlConsultarFactura do
  begin
    Add('SELECT * FROM FACTURASPROFORMA ');
    Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add(' AND (CODIGO = :CODIGO)');
  end;
end;

function TdmTablaFacturasProforma.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contFacturasProforma);
end;

function TdmTablaFacturasProforma.ValidarCodigo(Codigo: String): Boolean;
begin
  Result := GestorContadores.validarCodigo(contFacturasProforma, Codigo);
end;

function TdmTablaFacturasProforma.DecrementarCodigo: boolean;
begin
  Result := GestorContadores.decrementarValor(contFacturasProforma);
end;

function TdmTablaFacturasProforma.DarDatosFactura(
  Factura: TDatosFacturaProforma): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
end;

function TdmTablaFacturasProforma.EsUltimaFactura(Codigo: String): Boolean;
var
  oSQL : TIBSQL;
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 count(*) ');
    SQL.Add('from FACTURASPROFORMA ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA ');
    SQL.Add('and CODIGO > :CODIGO ');
    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      ParamByName('CODIGO').AsString := Codigo;
      Prepare;
      ExecQuery;
      if Fields[0].AsInteger = 0 then
        Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TDatosFacturaProforma }

procedure TDatosFacturaProforma.AssignTo(Dest: TPersistent);
begin
  inherited;

end;

constructor TDatosFacturaProforma.Create(CodigoFactura: String);
begin
  inherited Create;
  Codigo := CodigoFactura;
  ObtenerDatos;
end;

constructor TDatosFacturaProforma.Create;
begin
  inherited Create;
end;

destructor TDatosFacturaProforma.Destroy;
begin
  inherited;
end;

procedure TDatosFacturaProforma.ObtenerDatos;
var
  oSQL : TIBSQL;
begin
  if EsCadenaVacia(Codigo) then
    Exit;

  oSQL := TIBSQL.Create(nil);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from FACTURASPROFORMA ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add(' and CODIGO = :CODIGO');
    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      ParamByName('CODIGO').AsString := Codigo;
      Prepare;
      ExecQuery;

      if (RecordCount > 0) then
      begin
          FechaAlta := FieldByName('FECHAALTA').AsDateTime;
          FechaFactura := FieldByName('FECHAFACTURA').AsDateTime;
          FormaPago := FieldByName('FORMAPAGO').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;
          Telefono1 := FieldByName('TELEFONO1').AsString;
          Telefono2 := FieldByName('TELEFONO2').AsString;
          Movil1 := FieldByName('MOVIL1').AsString;
          Movil2 := FieldByName('MOVIL2').AsString;
          Fax := FieldByName('FAX').AsString;
          BaseImponible := FieldByName('BASEIMPONIBLE').AsFloat;
          Descuento := FieldByName('DESCUENTO').AsInteger;
          Iva := FieldByName('IVA').AsInteger;
          ImporteDescuento := FieldByName('IMPORTEDESCUENTO').AsFloat;
          ImporteIva := FieldByName('IMPORTEIVA').AsFloat;
          RE := FieldByName('RE').AsInteger;
          ImporteRE := FieldByName('IMPORTERE').AsFloat;
          ImporteTotal := FieldByName('IMPORTETOTAL').AsFloat;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TListaFacturasProforma }

procedure TListaFacturasProforma.AssignTo(Dest: TPersistent);
begin
  inherited;

end;

constructor TListaFacturasProforma.Create(oSQL: String);
begin
  inherited Create;
  FSQL := oSQL;
  ObtenerLista;
end;

constructor TListaFacturasProforma.Create;
begin
  inherited Create;
  FSQL := 'select CODIGO from FACTURASPROFORMA';
  FSQL := FSQL + ' where CODIGOEMPRESA = :CODIGOEMPRESA';
  ObtenerLista;
end;

function TListaFacturasProforma.GetFactura(
  Index: Integer): TDatosFacturaProforma;
begin
  Result := TDatosFacturaProforma(FLista.Items[Index]);
end;

procedure TListaFacturasProforma.ObtenerLista;
var
  oSQL : TIBSQL;
  Factura : TDatosFacturaProforma;
begin
  oSQL := TIBSQL.Create(nil);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Text := FSQL;
    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Prepare;
      ExecQuery;
      while not EOF do begin
        Factura := TDatosFacturaProforma.Create(FieldByName('CODIGO').AsString);
        FLista.Add(Factura);
        Next;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

end.
