unit uViewAlbaranCliente;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewBase, uBizAlbaranesCliente, DB, uDADataTable, uCustomView,
  AppEvnts, StdCtrls, Mask, DBCtrls,

  uViewObservaciones,  uViewDatosYSeleccionCliente,
  cxGraphics, cxDropDownEdit, cxImageComboBox, cxDBEdit, cxContainer, cxEdit,
  cxTextEdit, cxMaskEdit, cxCalendar, dxLayoutControl, cxControls, cxMemo,
  uViewDireccionEntregaAlbaranCliente, Buttons, ActnList,

//  uBizPedidosCliente, uPedidosClienteController,

  ExtCtrls, cxLookupEdit, cxDBLookupEdit, uBizFormasPago,
  cxDBLookupComboBox, uFormasPagoController, uAlmacenesController, uDAInterfaces,
  uViewDatosYSeleccionClienteBase, uViewDatosYSeleccionClienteAlbaran,
  dxLayoutLookAndFeels, uAlbaranesClienteController, cxLookAndFeels,
  cxLookAndFeelPainters, dxLayoutcxEditAdapters;

type
  IViewAlbaranCliente = interface(IViewBase)
  ['{F4946DFE-B64C-47C8-96D6-24549E6DAC11}']
    function GetAlbaran: IBizAlbaranCliente;
    procedure SetAlbaran(const Value: IBizAlbaranCliente);
    property Albaran: IBizAlbaranCliente read GetAlbaran write SetAlbaran;
    function GetController : IAlbaranesClienteController;
    procedure SetController (const Value : IAlbaranesClienteController);
    property Controller : IAlbaranesClienteController read GetController write SetController;


    function GetViewClienteAlbaran: IViewDatosYSeleccionClienteAlbaran;
    property ViewClienteAlbaran: IViewDatosYSeleccionClienteAlbaran read GetViewClienteAlbaran;
    
    procedure RellenarCuentasBancarias;
    procedure AsignarCuentaBancaria;
  end;

  TfrViewAlbaranCliente = class(TfrViewBase, IViewAlbaranCliente)
    DADataSource: TDADataSource;
    dxLayoutControl1Group_Root: TdxLayoutGroup;
    dxLayoutControl1: TdxLayoutControl;
    dxLayoutControl1Item2: TdxLayoutItem;
    edtFechaAlbaran: TcxDBDateEdit;
    dxLayoutControl1Group1: TdxLayoutGroup;
    dxLayoutControl1Group2: TdxLayoutGroup;
    dxLayoutControl1Item6: TdxLayoutItem;
    memObservaciones: TcxDBMemo;
    dxLayoutControl1Item3: TdxLayoutItem;
    eReferencia: TcxDBTextEdit;
    dxLayoutControl1Group6: TdxLayoutGroup;
    dxLayoutControl1Group7: TdxLayoutGroup;
    dxLayoutControl1Group8: TdxLayoutGroup;
    dxLayoutControl1Group3: TdxLayoutGroup;
    dxLayoutControl1Item8: TdxLayoutItem;
    eCalle: TcxDBTextEdit;
    dxLayoutControl1Item10: TdxLayoutItem;
    eCodigoPostal: TcxDBTextEdit;
    dxLayoutControl1Item12: TdxLayoutItem;
    ePersonaContacto: TcxDBTextEdit;
    dxLayoutControl1Item13: TdxLayoutItem;
    eTlfTrabajo: TcxDBTextEdit;
    dxLayoutControl1Group4: TdxLayoutGroup;
    dxLayoutControl1Item14: TdxLayoutItem;
    bElegirDireccion: TBitBtn;
    ActionList1: TActionList;
    actElegirDireccion: TAction;
    Button1: TButton;
    dxLayoutControl1Item5: TdxLayoutItem;
    actVerPedidoCli: TAction;
    eReferenciaPedidoCli: TcxTextEdit;
    dxLayoutControl1Item7: TdxLayoutItem;
    dxLayoutControl1Group5: TdxLayoutGroup;
    dxLayoutControl1Item4: TdxLayoutItem;
    cbFormaPago: TcxDBLookupComboBox;
    dxLayoutControl1Item15: TdxLayoutItem;
    bFormasPago: TButton;
    dsFormaPago: TDADataSource;
    dxLayoutControl1Item16: TdxLayoutItem;
    eFechaRecepcion: TcxDBDateEdit;
    dxLayoutControl1Group11: TdxLayoutGroup;
    dxLayoutControl1Item19: TdxLayoutItem;
    cbConAlmacen: TCheckBox;
    dxLayoutControl1Item20: TdxLayoutItem;
    cbAlmacen: TcxDBLookupComboBox;
    dsAlmacenes: TDADataSource;
    dxLayoutControl1Item18: TdxLayoutItem;
    Label1: TLabel;
    dxLayoutControl1Group12: TdxLayoutGroup;
    dxLayoutControl1Group10: TdxLayoutGroup;
    dxLayoutControl1Item22: TdxLayoutItem;
    eRefFacturaCli: TcxDBTextEdit;
    dxLayoutControl1Item24: TdxLayoutItem;
    eFechaPrevista: TcxDBDateEdit;
    dxLayoutControl1Item23: TdxLayoutItem;
    eRefCliente: TcxDBTextEdit;
    dxLayoutControl1Item21: TdxLayoutItem;
    eFechaEnvio: TcxDBDateEdit;
    dxLayoutControl1Item9: TdxLayoutItem;
    cbProvincia: TcxDBComboBox;
    dxLayoutControl1Item11: TdxLayoutItem;
    cbPoblacion: TcxDBComboBox;
    dxLayoutControl1Group9: TdxLayoutGroup;
    frViewDatosYSeleccionClienteAlbaran1: TfrViewDatosYSeleccionClienteAlbaran;
    dxLayoutControl1Item1: TdxLayoutItem;
    dxLayoutControl1Group16: TdxLayoutGroup;
    dxLayoutControl1Group13: TdxLayoutGroup;
    dxLayoutControl1Item17: TdxLayoutItem;
    cbCuentaBancaria: TcxDBComboBox;
    dxLayoutControl1Group14: TdxLayoutGroup;
    procedure CustomViewCreate(Sender: TObject);
    procedure CustomViewDestroy(Sender: TObject);
    procedure actElegirDireccionExecute(Sender: TObject);
    procedure actVerPedidoCliExecute(Sender: TObject);

    procedure bFormasPagoClick(Sender: TObject);
    procedure cbConAlmacenClick(Sender: TObject);
    procedure eFechaPrevistaPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
    procedure eFechaEnvioPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
    procedure eFechaRecepcionPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
    procedure frViewClienteAlbaranactElegirContactoUpdate(Sender: TObject);
    procedure actElegirDireccionUpdate(Sender: TObject);
    procedure actVerPedidoCliUpdate(Sender: TObject);
    procedure frViewClienteAlbaranactAnadirContactoUpdate(Sender: TObject);
    procedure cbProvinciaPropertiesInitPopup(Sender: TObject);
    procedure cbPoblacionPropertiesInitPopup(Sender: TObject);

  protected
    FAlbaran : IBizAlbaranCliente;
    FAlmacenesController : IAlmacenesController;
    FController : IAlbaranesClienteController;
    FViewClienteAlbaran : IViewDatosYSeleccionClienteAlbaran;
    FFormasPago : IBizFormaPago;
    FFormasPagoController : IFormasPagoController;
    FProvincias : TStringList;
    FPoblaciones : TStringList;

    procedure CargarProvincias;
    procedure CargarPoblaciones;

    function GetAlbaran: IBizAlbaranCliente;
    procedure SetAlbaran(const Value: IBizAlbaranCliente); virtual;
    function GetViewClienteAlbaran: IViewDatosYSeleccionClienteAlbaran;

    function GetController : IAlbaranesClienteController;
    procedure SetController (const Value : IAlbaranesClienteController);

  public
    property Albaran: IBizAlbaranCliente read GetAlbaran write SetAlbaran;
    property ViewClienteAlbaran: IViewDatosYSeleccionClienteAlbaran read GetViewClienteAlbaran;
    property Controller : IAlbaranesClienteController read GetController write SetController;

    procedure RellenarCuentasBancarias;
    procedure AsignarCuentaBancaria;
  end;

implementation

{$R *.dfm}

{ TfrViewAlbaranCliente }

uses
  uFactuGES_App, uEmpresasController, uClientesController, uBizDireccionesContacto, 
  schAlbaranesClienteClient_Intf, uBizAlmacenes, uDateUtils,
  uDialogUtils, uProvinciasPoblacionesController, uStringsUtils;


procedure TfrViewAlbaranCliente.actElegirDireccionExecute(Sender: TObject);
var
  AClientesController : IClientesController;
  AAlbaranController : IAlbaranesClienteController;
  ADireccion : IBizDireccionesContacto;
begin
  inherited;
  AClientesController := TClientesController.Create;
  AAlbaranController := TAlbaranesClienteController.Create;
  try
    ADireccion := AClientesController.ElegirDireccionEntrega(FAlbaran.Cliente, 
      'Seleccione la dirección del cliente que quiere utilizar como dirección de envio de este albaran.');
    if Assigned(ADireccion) then
    begin
      AAlbaranController.CopiarDireccionEnvio(ADireccion, FAlbaran);
      FAlbaran.Edit;
      FAlbaran.IMPORTE_PORTE := ADireccion.PORTE;
    end;
  finally
    ADireccion := NIL;
    AClientesController := NIL;
    AAlbaranController := NIL;
  end;
end;

procedure TfrViewAlbaranCliente.actElegirDireccionUpdate(Sender: TObject);
begin
  inherited;
  if (Sender as TAction).Enabled then
     (Sender as TAction).Enabled := (not ReadOnly) and
      Assigned(FAlbaran) and
      Assigned(FViewClienteAlbaran) and
      FAlbaran.DataTable.Active and
      Assigned(FAlbaran.Cliente) and
      Assigned(FAlbaran.Cliente) and
      Assigned(FAlbaran.Cliente.Direcciones) and
      FAlbaran.Cliente.Direcciones.DataTable.Active and
      (FAlbaran.Cliente.Direcciones.DataTable.RecordCount > 0);
end;

procedure TfrViewAlbaranCliente.actVerPedidoCliExecute(Sender: TObject);
begin
  inherited;
//  FPedidoController.Ver(FPedidoAsociado);
end;

procedure TfrViewAlbaranCliente.actVerPedidoCliUpdate(Sender: TObject);
begin
  inherited;
  if (Sender as TAction).Enabled then
     (Sender as TAction).Enabled := (Albaran.REF_PEDIDO <> '')
 end;

procedure TfrViewAlbaranCliente.AsignarCuentaBancaria;
begin
  FAlbaran.Edit;
  try
    FAlbaran.DATOS_BANCARIOS := cbCuentaBancaria.Properties.Items[0];
  finally
    FAlbaran.Post;
  end;
end;

procedure TfrViewAlbaranCliente.bFormasPagoClick(Sender: TObject);
begin
  inherited;
  if Assigned(FFormasPago) then
     FFormasPagoController.VerTodos(FFormasPago);
end;

procedure TfrViewAlbaranCliente.CargarPoblaciones;
var
  i : integer;
  AID : Integer;
begin
  AID := StrToInt(FProvincias.Values[cbProvincia.Text]);
  with TProvinciasPoblacionesController.Create do
    try
      FPoblaciones := DarListaPoblaciones(AID);

      with cbPoblacion.Properties.Items do
      begin
        BeginUpdate;
        try
          Clear;
          for i := 0 to FPoblaciones.Count - 1 do
            Add(FPoblaciones.Names[i]);
        finally
          EndUpdate;
        end;
      end;
    finally
      Free;
    end;
end;

procedure TfrViewAlbaranCliente.CargarProvincias;
var
  i : integer;
begin
  with TProvinciasPoblacionesController.Create do
    try
      FProvincias := DarListaProvincias;

      with cbProvincia.Properties.Items do
      begin
        BeginUpdate;
        try
          Clear;
          for i := 0 to FProvincias.Count - 1 do
            Add(FProvincias.Names[i]);
        finally
          EndUpdate;
        end;
      end;
    finally
      Free;
    end;
end;

procedure TfrViewAlbaranCliente.cbConAlmacenClick(Sender: TObject);
begin
  inherited;

  //Para que no me cambie el estilo del campo
  if ReadOnly then Exit;

  if cbConAlmacen.Checked then
  begin
    cbAlmacen.Enabled := True;
    cbAlmacen.DroppedDown := True;
  end
  else begin
    cbAlmacen.Enabled := False;
    FAlbaran.Edit;
    FAlbaran.ID_ALMACEN := 0;
  end;
end;

procedure TfrViewAlbaranCliente.cbPoblacionPropertiesInitPopup(Sender: TObject);
begin
  inherited;
  ShowHourglassCursor;
  try
    FreeANDNIL(FPoblaciones);
    if not Assigned(FProvincias) then
      CargarProvincias;
    if not EsCadenaVacia(cbProvincia.Text) and (FProvincias.IndexOfName(cbProvincia.Text) <> -1) then
      CargarPoblaciones
  finally
    HideHourglassCursor;
  end;
end;

procedure TfrViewAlbaranCliente.cbProvinciaPropertiesInitPopup(Sender: TObject);
begin
  inherited;
  ShowHourglassCursor;
  try
    if not Assigned(FProvincias) then
      CargarProvincias;
  finally
    HideHourglassCursor;
  end;
end;

procedure TfrViewAlbaranCliente.CustomViewCreate(Sender: TObject);
begin
  inherited;
  FProvincias := NIL;
  FPoblaciones := NIL;

  FFormasPago := Nil;
  FFormasPagoController := TFormasPagoController.Create;

  //  FPedidoAsociado := NIL;
//  FPedidoController := TPedidosClienteController.Create;

  FViewClienteAlbaran := frViewDatosYSeleccionClienteAlbaran1;
  FAlmacenesController := TAlmacenesController.Create;
end;

procedure TfrViewAlbaranCliente.CustomViewDestroy(Sender: TObject);
begin
  inherited;
  if Assigned(FProvincias) then
    FreeANDNIL(FProvincias);

  if Assigned(FPoblaciones) then
    FreeANDNIL(FPoblaciones);
  
  FFormasPago := Nil;
  FFormasPagoController := NIL;
  FViewClienteAlbaran := Nil;
//  FPedidoController := NIL;
//  FPedidoAsociado := NIL;
  FAlmacenesController := NIL;
end;

procedure TfrViewAlbaranCliente.eFechaEnvioPropertiesValidate(Sender: TObject;
  var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
begin
  inherited;

  if VarIsNull(DisplayValue) or (DisplayValue = '') then
  begin
     if (ShowConfirmMessage('Si elimina la fecha prevista de envio, se eliminarán tambien las fechas de envio y recepción en caso de tenerlas. ¿Desea continuar?', '') = IDYES) then
     begin
         eFechaRecepcion.Clear;
         eFechaRecepcion.Enabled := false;
     end
     else
         DisplayValue := DateToStr(eFechaEnvio.Date);
  end
  else
     eFechaRecepcion.Enabled := true;
end;

procedure TfrViewAlbaranCliente.eFechaPrevistaPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  inherited;
  if VarIsNull(DisplayValue) or (DisplayValue = '') then
  begin
     if (ShowConfirmMessage('Si elimina la fecha prevista de envio, se eliminarán tambien las fechas de envio y recepción en caso de tenerlas. ¿Desea continuar?', '') = IDYES) then
     begin
       eFechaEnvio.Clear;
       eFechaEnvio.Enabled := false;
       eFechaRecepcion.Clear;
       eFechaRecepcion.Enabled := false;
     end
     else
       DisplayValue := DateToStr(eFechaPrevista.Date);
  end
  else
     eFechaEnvio.Enabled := true;
end;

procedure TfrViewAlbaranCliente.eFechaRecepcionPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  inherited;
  if not (VarIsNull(DisplayValue) or (DisplayValue = '')) then
  begin
     if (eFechaRecepcion.Date < eFechaEnvio.Date) then
     begin
       ShowWarningMessage('La fecha de recepción debe ser posterior a la fecha de envio');
       eFechaRecepcion.SetFocus;
     end;

  end;
end;

procedure TfrViewAlbaranCliente.frViewClienteAlbaranactAnadirContactoUpdate(Sender: TObject);
begin
{
  if (Sender as TAction).Enabled then
     (Sender as TAction).Enabled := not Assigned(FPedidoAsociado);
}     
end;

procedure TfrViewAlbaranCliente.frViewClienteAlbaranactElegirContactoUpdate(Sender: TObject);
begin
{
  if (Sender as TAction).Enabled then
     (Sender as TAction).Enabled := not Assigned(FPedidoAsociado);
}     
end;

function TfrViewAlbaranCliente.GetAlbaran: IBizAlbaranCliente;
begin
  Result := FAlbaran;
end;

function TfrViewAlbaranCliente.GetController: IAlbaranesClienteController;
begin
  Result := FController;
end;

function TfrViewAlbaranCliente.GetViewClienteAlbaran: IViewDatosYSeleccionClienteAlbaran;
begin
  Result := FViewClienteAlbaran;
end;

procedure TfrViewAlbaranCliente.RellenarCuentasBancarias;
var
  AController : IEmpresasController;
  ALista : TStringList;
  AListaIBAN : TStringList;
  AListaCliente: TStringList;
  i : integer;
begin
  AController := TEmpresasController.Create;
  try
    ALista := AController.DarListaCuentasBancarias(AppFactuGES.EmpresaActiva);
    AListaIBAN := AController.DarListaCuentasBancariasIBAN(AppFactuGES.EmpresaActiva);
    AListaCliente := Controller.ClienteController.DarListaCuentasBancarias(FAlbaran.ID_CLIENTE);

    try
      with cbCuentaBancaria.Properties.Items do
      begin
        BeginUpdate;
        try
          Clear;
{
          for i := 0 to ALista.Count - 1 do
            Add(ALista.Names[i]);

          if AListaIBAN.Count > 0 then
          begin
            Add('--------------');
            for i := 0 to AListaIBAN.Count - 1 do
              Add(AListaIBAN.Names[i]);
          end;
}
          if AListaCliente.Count > 0 then
          begin
//            Add('--------------');
            for i := 0 to AListaCliente.Count - 1 do
              Add(AListaCliente.Names[i]);
          end;

          Add('');

        finally
          EndUpdate;
        end;
      end;
    finally
      FreeANDNIL(ALista);
      FreeANDNIL(AListaIBAN);      
    end;
  finally
    AController := NIL;
  end;
end;

procedure TfrViewAlbaranCliente.SetAlbaran(const Value: IBizAlbaranCliente);
begin
  FAlbaran := Value;
  RellenarCuentasBancarias;

  if Assigned(FAlbaran) then
  begin
    DADataSource.DataTable := FAlbaran.DataTable;
    FViewClienteAlbaran.Albaran := FAlbaran;

    FFormasPago := FFormasPagoController.BuscarTodos;
    dsFormaPago.DataTable := FFormasPago.DataTable;
    dsFormaPago.DataTable.Active := True;

    dsAlmacenes.DataTable := (FAlmacenesController.BuscarTodos).DataTable;
    dsAlmacenes.DataTable.Active := True;

    //Para que no me cambie el estilo del campo
    if not ReadOnly then
    begin
      cbConAlmacen.Checked := (FAlbaran.ID_ALMACEN > 0);
      cbAlmacen.Enabled := cbConAlmacen.Checked;

      eReferenciaPedidoCli.Enabled := False;
      eRefFacturaCli.Enabled := False;

      if EsFechaVacia(FAlbaran.FECHA_PREVISTA_ENVIO) then
      begin
         eFechaEnvio.Enabled := false;
         eFechaRecepcion.Enabled := false;
      end
      else
      begin
         eFechaEnvio.Enabled := true;
         if EsFechaVacia(FAlbaran.FECHA_ENVIO) then
            eFechaRecepcion.Enabled := false
         else
            eFechaRecepcion.Enabled := true;
      end;
    end;

{
    FPedidoAsociado := NIL;
    if (FAlbaran.ID_PEDIDO > 0) then
    begin
      FPedidoAsociado := FPedidoController.Buscar(FAlbaran.ID_PEDIDO);
      if Assigned(FPedidoAsociado) then
      begin
        FPedidoAsociado.DataTable.Active := True;
        eReferenciaPedidoCli.Text := FPedidoAsociado.REFERENCIA
      end
      else
        eReferenciaPedidoCli.Text := '';
    end
    else
      eReferenciaPedidoCli.Text := 'No hay pedido asociado';
}      
  end
  else begin
    DADataSource.DataTable := NIL;
    FViewClienteAlbaran.Albaran := NIL;
//    FPedidoAsociado := NIL;
    dsFormaPago.DataTable := NIL;
    dsAlmacenes.DataTable := NIL;
  end;
end;

procedure TfrViewAlbaranCliente.SetController(const Value: IAlbaranesClienteController);
begin
  FController := Value;
end;

end.
