unit uViewDireccionEntregaPedidoProv;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, uViewBase, uBizPedidosProveedor, cxGraphics, dxLayoutControl, cxMemo,
  cxContainer, cxEdit, cxTextEdit, cxMaskEdit, cxDropDownEdit, cxLookupEdit,
  cxDBLookupEdit, cxDBLookupComboBox, StdCtrls, cxControls, DB, uDADataTable,
  ActnList, uBizAlmacenes, uAlmacenesController, uPedidosProveedorController,
  Buttons, uDAInterfaces, uClientesController, uDireccionesContactoController,
  uBizContactosDirecciones, uBizContratosCliente, uContratosClienteController;

type
  IViewDireccionEntregaPedidoProv = interface(IViewBase)
  ['{7467855C-066F-4A60-B88F-2837C8050B1E}']
    function GetPedidoProveedor: IBizPedidoProveedor;
    procedure SetPedidoProveedor(const Value: IBizPedidoProveedor);
    property PedidoProveedor: IBizPedidoProveedor read GetPedidoProveedor write SetPedidoProveedor;
    procedure RefrescarDireccion;
    procedure CambioDireccionAlmacen;
  end;

  TfrViewDireccionEntregaPedidoProv = class(TfrViewBase, IViewDireccionEntregaPedidoProv)
    dxLayoutControl1: TdxLayoutControl;
    rdxDestino1: TRadioButton;
    rdxDestino2: TRadioButton;
    cbLista: TcxDBLookupComboBox;
    dxLayoutGroup1: TdxLayoutGroup;
    dxLayoutItem1: TdxLayoutItem;
    dxLayoutControl1Item3: TdxLayoutItem;
    dxLayoutControl1Item2: TdxLayoutItem;
    ActionList1: TActionList;
    actLista: TAction;
    actOtro: TAction;
    dsPedido: TDADataSource;
    dsAlmacenes: TDADataSource;
    dxLayoutControl1Item1: TdxLayoutItem;
    bModificar: TBitBtn;
    txtDireccion: TStaticText;
    dxLayoutControl1Item5: TdxLayoutItem;
    dxLayoutControl1Item4: TdxLayoutItem;
    rdxDestinoCliente: TRadioButton;
    dxLayoutControl1Item6: TdxLayoutItem;
    cbListaDireccionesCliente: TcxDBLookupComboBox;
    dsDireccionesCliente: TDADataSource;
    actListaCliente: TAction;
    procedure actListaExecute(Sender: TObject);
    procedure actOtroExecute(Sender: TObject);
    procedure cbListaPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
    procedure cbListaDireccionesClientePropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
    procedure bModificarClick(Sender: TObject);
    procedure txtDireccionDblClick(Sender: TObject);
    procedure actListaClienteExecute(Sender: TObject);
    procedure actBotonElegirDirClienteUpdate(Sender: TObject);
  protected
    FAlmacenesController : IAlmacenesController;
    FAlmacenes: IBizAlmacen;
    FDireccionesCliente : IBizContactosDirecciones;
    FPedido : IBizPedidoProveedor;
    FController : IPedidosProveedorController;
    function GetPedidoProveedor: IBizPedidoProveedor;
    function HayContratoAsociado: Boolean;
    procedure SetPedidoProveedor(const Value: IBizPedidoProveedor);
    procedure CambioDireccionCliente;
    procedure RecuperarClienteAsociado;
    procedure SetReadOnly(Value: Boolean); override;

  public
    property PedidoProveedor: IBizPedidoProveedor read GetPedidoProveedor  write SetPedidoProveedor;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure RefrescarDireccion;
    procedure CambioDireccionAlmacen;    
  end;

implementation

{$R *.dfm}

uses
  uEditorRegistryUtils, uCustomView, uStringsUtils, uFactuGES_App;

procedure TfrViewDireccionEntregaPedidoProv.actBotonElegirDirClienteUpdate(
  Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := HayContratoAsociado and (rdxDestinoCliente.Checked);
end;

procedure TfrViewDireccionEntregaPedidoProv.actListaClienteExecute(
  Sender: TObject);
begin
  inherited;
  actListaCliente.Checked := True;
  CambioDireccionCliente;
end;

procedure TfrViewDireccionEntregaPedidoProv.actListaExecute(Sender: TObject);
begin
  actLista.Checked := True;
  RefrescarDireccion;
end;

procedure TfrViewDireccionEntregaPedidoProv.actOtroExecute(Sender: TObject);
begin
  actOtro.Checked := True;
//  txtDireccion.Enabled := True;

  if Assigned(FPedido) then
  begin
    FController.VerDireccionEntrega(FPedido);

    if (FPedido.ID_ALMACEN > 0) then
    begin
      FPedido.Edit;
      FPedido.ID_ALMACEN := 0;
    end;
  end;
  RefrescarDireccion;
end;

procedure TfrViewDireccionEntregaPedidoProv.bModificarClick(Sender: TObject);
begin
  inherited;
  actOtro.Execute;
end;

procedure TfrViewDireccionEntregaPedidoProv.CambioDireccionAlmacen;
begin
  if Assigned(FPedido) and Assigned(FAlmacenes) then
  begin
    FPedido.Edit;
    FPedido.CALLE := FAlmacenes.NOMBRE + #10#13 + FAlmacenes.CALLE;
    FPedido.POBLACION := FAlmacenes.POBLACION;
    FPedido.POBLACION := FAlmacenes.POBLACION;
    FPedido.PROVINCIA := FAlmacenes.PROVINCIA;
    FPedido.CODIGO_POSTAL := FAlmacenes.CODIGO_POSTAL;
    FPedido.PERSONA_CONTACTO := FAlmacenes.PERSONA_CONTACTO;
    FPedido.TELEFONO := FAlmacenes.MOVIL;
    RefrescarDireccion;
  end;
end;

procedure TfrViewDireccionEntregaPedidoProv.CambioDireccionCliente;
begin
  if Assigned(FPedido) and Assigned(FDireccionesCliente) then
  begin
    FPedido.Edit;
    FPedido.CALLE :=     FDireccionesCliente.NOMBRE + #10#13 + FDireccionesCliente.CALLE;
    FPedido.POBLACION := FDireccionesCliente.POBLACION;
    FPedido.POBLACION := FDireccionesCliente.POBLACION;
    FPedido.PROVINCIA := FDireccionesCliente.PROVINCIA;
    FPedido.CODIGO_POSTAL := FDireccionesCliente.CODIGO_POSTAL;
    FPedido.PERSONA_CONTACTO := FDireccionesCliente.PERSONA_CONTACTO;
    FPedido.TELEFONO := FDireccionesCliente.TELEFONO;
    RefrescarDireccion;
  end;
end;

procedure TfrViewDireccionEntregaPedidoProv.cbListaDireccionesClientePropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if Assigned(FPedido) and Assigned(FDireccionesCliente) then
     CambioDireccionCliente;
end;

procedure TfrViewDireccionEntregaPedidoProv.cbListaPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if Assigned(FPedido) and Assigned(FAlmacenes) then
     CambioDireccionAlmacen;
end;

constructor TfrViewDireccionEntregaPedidoProv.Create(AOwner: TComponent);
begin
  inherited;
  FController := TPedidosProveedorController.Create;
  FAlmacenesController := TAlmacenesController.Create;
  FAlmacenes := FAlmacenesController.BuscarTodos;
  FAlmacenes.DataTable.Active := True;
  dsAlmacenes.DataTable := FAlmacenes.DataTable;

  FDireccionesCliente := NIL;
  dsDireccionesCliente.DataTable := NIL;
end;

destructor TfrViewDireccionEntregaPedidoProv.Destroy;
begin
  cbListaDireccionesCliente.Properties.OnValidate := Nil;
  cbLista.Properties.OnValidate := Nil;

  dsDireccionesCliente.DataTable := NIL;
  FDireccionesCliente := NIL;

  FAlmacenesController := Nil;
  FAlmacenes := Nil;
  FController := NIL;
  inherited;
end;

function TfrViewDireccionEntregaPedidoProv.GetPedidoProveedor: IBizPedidoProveedor;
begin
  Result := FPedido;
end;

function TfrViewDireccionEntregaPedidoProv.HayContratoAsociado: Boolean;
begin
  Result := Assigned(FPedido) and (FPedido.ID_CONTRATO_CLIENTE > 0);
end;

procedure TfrViewDireccionEntregaPedidoProv.RecuperarClienteAsociado;
var
  AClientesController: IClientesController;
  AContratoController : IContratosClienteController;
  AContrato : IBizContratoCliente;
begin
  FDireccionesCliente := NIL;
  dsDireccionesCliente.DataTable := NIL;

  if (HayContratoAsociado()) then
  begin
    ShowHourglassCursor;
    AClientesController := TClientesController.Create;
    AContratoController := TContratosClienteController.Create;
    try
      AContrato := AContratoController.Buscar(FPedido.ID_CONTRATO_CLIENTE);
      if Assigned(AContrato) then
      begin
        AContrato.DataTable.Active := True;

        FDireccionesCliente := AClientesController.DarTodasDirecciones(AContrato.ID_CLIENTE);
        if Assigned(FDireccionesCliente) then
          FDireccionesCliente.DataTable.Open;
      end;
    finally
      AClientesController := NIL;
      AContratoController := NIL;
      AContrato := NIL;
      HideHourglassCursor;
    end;
  end
end;

procedure TfrViewDireccionEntregaPedidoProv.RefrescarDireccion;
begin
  txtDireccion.Caption := '';
  if Assigned(FPedido) then
  begin
    txtDireccion.Enabled := True;
    txtDireccion.Caption := FPedido.CALLE;
    txtDireccion.Caption := txtDireccion.Caption + #13#10 + FPedido.CODIGO_POSTAL + ' ' + FPedido.POBLACION;
    txtDireccion.Caption := txtDireccion.Caption + #13#10 + FPedido.PROVINCIA;
    txtDireccion.Caption := txtDireccion.Caption + #13#10 + 'Persona contacto: ' + FPedido.PERSONA_CONTACTO;
    txtDireccion.Caption := txtDireccion.Caption + #13#10 + 'Teléfono: ' + FPedido.TELEFONO;

    if (actOtro.Checked) then
    begin
      txtDireccion.Enabled := True;
      bModificar.Enabled := True;

      cbLista.Enabled := False;
      cbLista.Text := '';

      cbListaDireccionesCliente.Enabled := False;
      cbListaDireccionesCliente.Text := '';

    end
    else begin
      if (actListaCliente.Checked) then
      begin
        cbListaDireccionesCliente.Enabled := True;
        cbListaDireccionesCliente.DroppedDown := True;

        cbLista.Enabled := False;
        cbLista.Text := '';

        txtDireccion.Enabled := False;
        bModificar.Enabled := False;

      end
      else begin
        cbLista.Enabled := True;
        cbLista.DroppedDown := True;

        cbListaDireccionesCliente.Enabled := False;
        cbListaDireccionesCliente.Text := '';

        txtDireccion.Enabled := False;
        bModificar.Enabled := False;
      end;
    end;
  end;
end;

procedure TfrViewDireccionEntregaPedidoProv.SetPedidoProveedor(
  const Value: IBizPedidoProveedor);
begin
  cbLista.Properties.OnValidate := NIL;
  cbListaDireccionesCliente.Properties.OnValidate := NIL;
  dsPedido.DataTable := nil;

  FPedido := Value;

  RecuperarClienteAsociado;
  if Assigned(FDireccionesCliente) then
  begin
    dsDireccionesCliente.DataTable := FDireccionesCliente.DataTable;
    cbListaDireccionesCliente.Properties.OnValidate := cbListaDireccionesClientePropertiesValidate;
  end;

  cbLista.Properties.OnValidate := cbListaPropertiesValidate;
  dsPedido.DataTable := FPedido.DataTable;

  if (FPedido.ID_ALMACEN < 1) then
  begin
    if (FPedido.ID_DIRECCION_CLIENTE < 1) then
      actOtro.Checked := True
    else
      actListaCliente.Checked := True
  end
  else
     actLista.Checked := True;

  RefrescarDireccion;
end;

procedure TfrViewDireccionEntregaPedidoProv.SetReadOnly(Value: Boolean);
begin
  inherited;
  if ReadOnly then
  begin
    rdxDestino1.Enabled := False;
    rdxDestinoCliente.Enabled := False;
    rdxDestino2.Enabled := False;
  end;
end;

procedure TfrViewDireccionEntregaPedidoProv.txtDireccionDblClick(
  Sender: TObject);
begin
  inherited;
  actOtro.Execute;
end;

end.
