{
===============================================================================
  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: 23-08-2003
  Versión actual: 1.0.1
  Fecha versión actual: 21-07-2005
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    21-07-2005    Introducir el contrato de venta y las recomendaciones de
                  conservacion.
===============================================================================
}

unit Documentos;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, RdxPaneles, RdxBarras, DB, IBCustomDataSet, IBDatabase,
  cxControls, cxContainer, cxListBox, cxDBEdit, DBCtrls,
  Grids, DBGrids, RdxBotones, cxStyles, cxCustomData, cxGraphics, cxFilter,
  cxData, cxEdit, cxDBData, cxGridLevel, cxClasses, cxGridCustomView,
  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid,
  cxRadioGroup, RdxRadioButton,
  StdCtrls, ActnList, cxTextEdit, cxMaskEdit, cxDropDownEdit, cxLookupEdit,
  cxDBLookupEdit, cxDBLookupComboBox, IBSQL, IBQuery, cxMemo, ComCtrls,
  RdxPageControl, ImgList, RxMemDS, IBTable, cxDataStorage, cxRichEdit,
  cxDBRichEdit, cxGridCardView, cxGridDBCardView;

type
  TfrDocumentos = class(TForm)
    BarraSuperior: TRdxBarraSuperior;
    TablaDocumentos: TIBDataSet;
    dsDocumentos: TDataSource;
    bAceptar: TRdxBoton;
    Label1: TLabel;
    TablaPropiedadesDocumentos: TIBDataSet;
    dsPropiedadesDocumentos: TDataSource;
    cbDocumentos: TcxLookupComboBox;
    Label2: TLabel;
    cbFamilias: TcxDBLookupComboBox;
    dsFamilias: TDataSource;
    TablaFamilias: TIBQuery;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    FormaPago: TcxDBMemo;
    PlazosEntrega: TcxDBMemo;
    Notas: TcxDBMemo;
    gridPropiedades: TcxGrid;
    VistaPropiedades: TcxGridDBTableView;
    gridPropiedadesLevel1: TcxGridLevel;
    bAnadirValor: TRdxBoton;
    bEliminarValor: TRdxBoton;
    Acciones: TActionList;
    actAnadirProp: TAction;
    actEliminarProp: TAction;
    VistaPropiedadesDBColumn1: TcxGridDBColumn;
    VistaPropiedadesDBColumn2: TcxGridDBColumn;
    TablaPropiedades: TIBQuery;
    dsPropiedades: TDataSource;
    imgSombra: TImage;
    Paginas: TRdxPagesControl;
    pagValores: TTabSheet;
    pagPropiedades: TTabSheet;
    pnlCuerpo: TPanel;
    pnlInferior: TPanel;
    pnlSuperior: TPanel;
    pagPrecios: TTabSheet;
    RdxBoton1: TRdxBoton;
    RdxBoton2: TRdxBoton;
    TablaPreciosDocumentos: TIBDataSet;
    dsPreciosDocumentos: TDataSource;
    actAnadirPre: TAction;
    actEliminarPre: TAction;
    bSubir: TRdxBoton;
    actSubir: TAction;
    actBajar: TAction;
    bBajar: TRdxBoton;
    VistaPropiedadesDBColumn4: TcxGridDBColumn;
    TablaPropiedadesDocumentosMem: TRxMemoryData;
    TablaPreciosDocumentosMem: TRxMemoryData;
    gridPrecios: TcxGrid;
    VistaPrecios: TcxGridDBTableView;
    cxGridDBColumn1: TcxGridDBColumn;
    cxGridDBColumn3: TcxGridDBColumn;
    cxGridLevel2: TcxGridLevel;
    VistaPropiedadesDBColumn3: TcxGridDBColumn;
    Seccion: TcxComboBox;
    eSeccion: TLabel;
    pagContrato: TTabSheet;
    pagRecomendaciones: TTabSheet;
    ContratoVenta: TcxDBRichEdit;
    Conservacion: TcxDBRichEdit;
    Label6: TLabel;
    Label7: TLabel;
    VistaPropiedadesCard: TcxGridDBCardView;
    VistaPropiedadesCardRow4: TcxGridDBCardViewRow;
    VistaPropiedadesCardRow1: TcxGridDBCardViewRow;
    VistaPropiedadesCardRow2: TcxGridDBCardViewRow;
    VistaPropiedadesCardRow3: TcxGridDBCardViewRow;
    procedure FormCreate(Sender: TObject);
    procedure bAceptarClick(Sender: TObject);
    procedure cbDocumentosPropertiesChange(Sender: TObject);
    procedure actAnadirPropExecute(Sender: TObject);
    procedure actEliminarPropExecute(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure TablaPropiedadesDocumentosNewRecord(DataSet: TDataSet);
    procedure TablaPreciosDocumentosNewRecord(DataSet: TDataSet);
    procedure actAnadirPreExecute(Sender: TObject);
    procedure actEliminarPreExecute(Sender: TObject);
    procedure actSubirExecute(Sender: TObject);
    procedure actBajarExecute(Sender: TObject);
    procedure actBajarUpdate(Sender: TObject);
    procedure actSubirUpdate(Sender: TObject);
    procedure TablaPropiedadesDocumentosAfterDelete(DataSet: TDataSet);
    procedure TablaPropiedadesDocumentosAfterInsert(DataSet: TDataSet);
    procedure TablaPropiedadesDocumentosMemFilterRecord(DataSet: TDataSet;
      var Accept: Boolean);
    procedure TablaPreciosDocumentosMemFilterRecord(DataSet: TDataSet;
      var Accept: Boolean);
    procedure SeccionPropertiesChange(Sender: TObject);
  private
    FUltimaPropiedad : integer;
    procedure SetUltimaPropiedad;
    procedure EstadoDocumento;
    procedure BorrarPropiedadesIB;
    procedure BorrarPreciosIB;
    procedure SalvarPropiedades;
    procedure SalvarPrecios;
    procedure ConfigurarPantalla;
  public
    { Public declarations }
  end;

var
  frDocumentos: TfrDocumentos;

implementation

{$R *.dfm}

uses
  IB, IBErrorCodes, BaseDatos, TablaDocumentos, StrFunc, Configuracion, Entidades;

procedure TfrDocumentos.FormCreate(Sender: TObject);
beGin
  ConfigurarFrame(Self, entOpciones);

  with TablaFamilias do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    Prepare;
    Open;
  end;

  with TablaPropiedades do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    Prepare;
    Open;
  end;

  with TablaDocumentos do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    InsertSQL.Assign(dmTablaDocumentos.sqlInsertar);
    ModifySQL.Assign(dmTablaDocumentos.sqlModificar);
    DeleteSQL.Assign(dmTablaDocumentos.sqlEliminar);
    SelectSQL.Assign(dmTablaDocumentos.sqlConsultar);
    RefreshSQL.Assign(dmTablaDocumentos.sqlRefresh);
    Prepare;
    Open;
  end;

  with TablaPropiedadesDocumentos do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    //Prepare;
  end;

  with TablaPreciosDocumentos do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    //Prepare;
  end;

  with TablaPropiedadesDocumentosMem do
  begin
    CopyStructure(TablaPropiedadesDocumentos);
    LoadFromDataSet(TablaPropiedadesDocumentos, 0, lmCopy);
    Filtered := True;
    Open;
  end;

  with TablaPreciosDocumentosMem do
  begin
    CopyStructure(TablaPreciosDocumentos);
    LoadFromDataSet(TablaPreciosDocumentos, 0, lmCopy);
    Filtered := True;
    Open;
  end;

  FUltimaPropiedad := 0;
  cbDocumentos.Text := TablaDocumentos.FieldByName('DESCRIPCION').AsString;
  SetUltimaPropiedad;
  Seccion.ItemIndex := 0;
  Paginas.ActivePageIndex := 0;
end;

procedure TfrDocumentos.bAceptarClick(Sender: TObject);
begin
  if ((VistaPropiedadesCard.DataController.RecordCount mod 2) <> 0) then
  begin
    showmessage('El número de propiedades del contrato debe ser par');
    exit;
  end;

  EstadoDocumento;

  TablaDocumentos.Edit;
  if ContratoVenta.Lines.Count = 0 then
    ContratoVenta.DataBinding.Field.AsVariant := Null;

  if Conservacion.Lines.Count = 0 then
    Conservacion.DataBinding.Field.AsVariant := Null;
  TablaDocumentos.Post;

  BorrarPropiedadesIB;
  SalvarPropiedades;
  BorrarPreciosIB;
  SalvarPrecios;
  dmBaseDatos.Transaccion.CommitRetaining;
  Close;
end;

procedure TfrDocumentos.cbDocumentosPropertiesChange(Sender: TObject);
begin
  if not EsCadenaVacia(cbDocumentos.EditValue) then
  begin
    EstadoDocumento;
    TablaDocumentos.Locate('CODIGO', cbDocumentos.EditValue, []);
    TablaPreciosDocumentosMem.First;

    ConfigurarPantalla;

    SetUltimaPropiedad;
  end;
end;

procedure TfrDocumentos.actAnadirPropExecute(Sender: TObject);
begin
  TablaPropiedadesDocumentosMem.Append;
end;

procedure TfrDocumentos.actEliminarPropExecute(Sender: TObject);
begin
  TablaPropiedadesDocumentosMem.Delete;
end;

procedure TfrDocumentos.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  TablaFamilias.Close;
  TablaPropiedades.Close;
end;

procedure TfrDocumentos.TablaPropiedadesDocumentosNewRecord(
  DataSet: TDataSet);
begin
  with DataSet do
  begin
    FieldByName('CODIGODOCUMENTO').AsString := TablaDocumentos.FieldByName('CODIGO').AsString;
    FieldByName('NUMPROPIEDAD').AsInteger := FUltimaPropiedad + 1;
    if cbDocumentos.EditValue = 'ARMARIOS' then
      FieldByName('SECCION').AsString := Seccion.Text;
  end;
end;

procedure TfrDocumentos.TablaPreciosDocumentosNewRecord(DataSet: TDataSet);
begin
  with DataSet do
  begin
    FieldByName('CODIGODOCUMENTO').AsString := TablaDocumentos.FieldByName('CODIGO').AsString;
    FieldByName('NUMPRECIO').AsInteger := DataSet.RecNo;
  end;
end;

procedure TfrDocumentos.actAnadirPreExecute(Sender: TObject);
begin
  TablaPreciosDocumentosMem.Append;
end;

procedure TfrDocumentos.actEliminarPreExecute(Sender: TObject);
begin
  TablaPreciosDocumentosMem.Delete;
end;

procedure TfrDocumentos.actSubirExecute(Sender: TObject);
var
  NumPropiedad : Integer;
begin
  NumPropiedad := TablaPropiedadesDocumentosMem.FieldByName('NUMPROPIEDAD').AsInteger;
  IntercambiarPropiedades(@TablaPropiedadesDocumentosMem, NumPropiedad, NumPropiedad - 1);
  VistaPropiedadesCard.DataController.RefreshExternalData;
end;

procedure TfrDocumentos.actBajarExecute(Sender: TObject);
var
  NumPropiedad : Integer;
begin
  NumPropiedad := TablaPropiedadesDocumentosMem.FieldByName('NUMPROPIEDAD').AsInteger;
  IntercambiarPropiedades(@TablaPropiedadesDocumentosMem, NumPropiedad, NumPropiedad + 1);
  VistaPropiedadesCard.DataController.RefreshExternalData;
end;

procedure TfrDocumentos.actBajarUpdate(Sender: TObject);
begin
  with TablaPropiedadesDocumentosMem do
    (Sender as TAction).Enabled := (FieldByName('NUMPROPIEDAD').AsInteger < FUltimaPropiedad);
end;

procedure TfrDocumentos.actSubirUpdate(Sender: TObject);
begin
  with TablaPropiedadesDocumentosMem do
    (Sender as TAction).Enabled := FieldByName('NUMPROPIEDAD').AsInteger > 0;
end;

procedure TfrDocumentos.SetUltimaPropiedad;
begin
  with TablaPropiedadesDocumentosMem do
  begin
    try
      DisableControls;
      Last;
      FUltimaPropiedad := FieldByName('NUMPROPIEDAD').AsInteger;
    finally
      EnableControls;
      First;
    end;
  end;
end;

procedure TfrDocumentos.EstadoDocumento;
begin
  with TablaPropiedadesDocumentosMem do
  begin
    if State in dsEditModes then
    begin
      if EsCadenaVacia(FieldByName('CODIGOPROPIEDAD').AsString) then
        Cancel
      else
        Post;
    end;
  end;

  with TablaPreciosDocumentosMem do
  begin
    if State in dsEditModes then
    begin
      if EsCadenaVacia(FieldByName('DESCRIPCION').AsString) then
        Cancel
      else
        Post;
    end;
  end;

  if TablaDocumentos.State in dsEditModes then
    TablaDocumentos.Post;
end;

procedure TfrDocumentos.TablaPropiedadesDocumentosAfterDelete(
  DataSet: TDataSet);
begin
  FUltimaPropiedad := FUltimaPropiedad - 1;
end;

procedure TfrDocumentos.TablaPropiedadesDocumentosAfterInsert(
  DataSet: TDataSet);
begin
    FUltimaPropiedad := FUltimaPropiedad + 1;
end;

procedure TfrDocumentos.TablaPropiedadesDocumentosMemFilterRecord(
  DataSet: TDataSet; var Accept: Boolean);
begin
  Accept := DataSet['CODIGODOCUMENTO'] = TablaDocumentos['CODIGO'];
  if Accept and (cbDocumentos.EditValue = 'ARMARIOS') then
    Accept := (DataSet.FieldByName('SECCION').AsString = Seccion.Text);
end;

procedure TfrDocumentos.TablaPreciosDocumentosMemFilterRecord(
  DataSet: TDataSet; var Accept: Boolean);
begin
  Accept := DataSet['CODIGODOCUMENTO'] = TablaDocumentos['CODIGO'];
end;

procedure TfrDocumentos.BorrarPreciosIB;
begin
  with TablaPreciosDocumentos do
  begin
    Open;
    if IsEmpty then
      Exit;
    Filtered := False;
    DisableControls;
    Last;
    while not BOF do
    begin
      Delete;
      Prior;
    end;
    if not IsEmpty then
      Delete;
    EnableControls;
  end;
end;

procedure TfrDocumentos.BorrarPropiedadesIB;
begin
  with TablaPropiedadesDocumentos do
  begin
    Open;
    if IsEmpty then
      Exit;
    DisableControls;
    Filtered := False;
    Last;
    while not BOF do
    begin
      Delete;
      Prior;
    end;
    if not IsEmpty then
      Delete;
    EnableControls;
  end;
end;

procedure TfrDocumentos.SalvarPrecios;
var
  CodDoc : String;
  NumeroCampo : Integer;
  NumeroPrecio : Integer;
begin
  try
    with TablaPreciosDocumentosMem do
    begin
      Filtered := False;
      SortOnFields('CODIGODOCUMENTO; NUMPRECIO', False);
      if IsEmpty then
        Exit;
      DisableControls;
      First;
      NumeroPrecio := 0;
      CodDoc := '';
      TablaPreciosDocumentos.Open;
      while not EOF do
      begin
        TablaPreciosDocumentos.Append;
        for NumeroCampo := 0 to FieldCount-1 do
        begin
          if Fields[NumeroCampo].FieldName = 'CODIGODOCUMENTO' then
            if FieldS[NumeroCampo].AsString <> CodDoc then
            begin
              CodDoc := Fields[NumeroCampo].AsString;
              NumeroPrecio := 0;
            end;
          if Fields[NumeroCampo].FieldName = 'NUMPRECIO' then
          begin
            TablaPreciosDocumentos.Fields[NumeroCampo].AsInteger := NumeroPrecio;
            NumeroPrecio := NumeroPrecio + 1;
          end
          else
            TablaPreciosDocumentos.Fields[NumeroCampo].AsVariant := Fields[NumeroCampo].AsVariant;
        end;
        TablaPreciosDocumentos.Post;
        Next;
      end;
      EnableControls;
    end
  except
    on E : EIBError do begin
      if E.IBErrorCode = isc_unique_key_violation then
      begin
        TablaPreciosDocumentos.Delete;
        TablaPreciosDocumentosMem.EnableControls;
      end;
      raise EIBError.Create(E.SQLCode, E.IBErrorCode, E.Message);
    end;
  end;
end;

procedure TfrDocumentos.SalvarPropiedades;
var
  CodDoc : String;
  NumeroCampo : Integer;
  NumeroPropiedad : Integer;
begin
  try
    with TablaPropiedadesDocumentosMem do
    begin
      Filtered := False;
      SortOnFields('CODIGODOCUMENTO; NUMPROPIEDAD', False);
      if IsEmpty then
        Exit;
      DisableControls;
      First;
      NumeroPropiedad := 0;
      CodDoc := '';
      TablaPropiedadesDocumentos.Open;
      while not EOF do
      begin
        TablaPropiedadesDocumentos.Append;
        for NumeroCampo := 0 to FieldCount-1 do
        begin
          if Fields[NumeroCampo].FieldName = 'CODIGODOCUMENTO' then
            if FieldS[NumeroCampo].AsString <> CodDoc then
            begin
              CodDoc := Fields[NumeroCampo].AsString;
              NumeroPropiedad := 0;
            end;
          if Fields[NumeroCampo].FieldName = 'NUMPROPIEDAD' then
          begin
            TablaPropiedadesDocumentos.Fields[NumeroCampo].AsInteger := NumeroPropiedad;
            NumeroPropiedad := NumeroPropiedad + 1;
          end
          else
            TablaPropiedadesDocumentos.Fields[NumeroCampo].AsVariant := Fields[NumeroCampo].AsVariant;
        end;
        TablaPropiedadesDocumentos.Post;
        Next;
      end;
      EnableControls;
    end
  except
    on E : EIBError do begin
      if E.IBErrorCode = isc_unique_key_violation then
      begin
        TablaPropiedadesDocumentos.Delete;
        TablaPropiedadesDocumentosMem.EnableControls;
      end;
      raise EIBError.Create(E.SQLCode, E.IBErrorCode, E.Message);
    end;
  end;
end;

procedure TfrDocumentos.SeccionPropertiesChange(Sender: TObject);
begin
  if TablaPropiedadesDocumentosMem.Active then
    TablaPropiedadesDocumentosMem.First;
end;

procedure TfrDocumentos.ConfigurarPantalla;
begin
  pagContrato.TabVisible := (cbDocumentos.EditValue = 'MCOCINA');
  pagRecomendaciones.TabVisible := (cbDocumentos.EditValue = 'MCOCINA');

  if cbDocumentos.EditValue = 'ARMARIOS' then
  begin
    eSeccion.Visible := True;
    Seccion.Visible := True;
    TablaPropiedadesDocumentos.Filtered := True;
    if TablaPropiedadesDocumentos.Active then
      TablaPropiedadesDocumentosMem.First;
  end
  else begin
    eSeccion.Visible := False;
    Seccion.Visible := False;
    TablaPropiedadesDocumentos.Filtered := False;
    if TablaPropiedadesDocumentos.Active then
      TablaPropiedadesDocumentosMem.First;
  end;
end;

end.
