unit uViewPresupuestoCliente;

interface

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

  uViewObservaciones,  uViewDatosYSeleccionCliente,
  cxGraphics, cxDropDownEdit, cxImageComboBox, cxDBEdit, cxContainer, cxEdit,
  cxTextEdit, cxMaskEdit, cxCalendar, dxLayoutControl, cxControls, cxMemo,
  uViewDireccionEntregaPresupuestoCliente, Buttons, ActnList, cxLookupEdit,
  cxDBLookupEdit, cxDBLookupComboBox, uFormasPagoController, uDAInterfaces,
  uBizFormasPago, cxButtonEdit, dxSkinsCore, dxSkinBlack, dxSkinBlue,
  dxSkinCaramel, dxSkinCoffee, dxSkinGlassOceans, dxSkiniMaginary, dxSkinLilian,
  dxSkinLiquidSky, dxSkinLondonLiquidSky, dxSkinMcSkin, dxSkinMoneyTwins,
  dxSkinOffice2007Black, dxSkinOffice2007Blue, dxSkinOffice2007Green,
  dxSkinOffice2007Pink, dxSkinOffice2007Silver, dxSkinSilver, dxSkinStardust,
  dxSkinsDefaultPainters, dxSkinValentine, dxSkinXmas2008Blue,
  dxSkinsdxLCPainter;

type
  IViewPresupuestoCliente = interface(IViewBase)
  ['{C5385699-C1A4-4AEB-B3D0-EE3BDB322FE2}']
    function GetPresupuesto: IBizPresupuestoCliente;
    procedure SetPresupuesto(const Value: IBizPresupuestoCliente);
    property Presupuesto: IBizPresupuestoCliente read GetPresupuesto write SetPresupuesto;

    function GetViewClientePresupuesto: TfrViewDatosYSeleccionCliente;
    procedure SetViewClientePresupuesto(const Value: TfrViewDatosYSeleccionCliente);
    property ViewClientePresupuesto: TfrViewDatosYSeleccionCliente read GetViewClientePresupuesto write SetViewClientePresupuesto;
  end;

  TfrViewPresupuestoCliente = class(TfrViewBase, IViewPresupuestoCliente)
    DADataSource: TDADataSource;
    dxLayoutControl1Group_Root: TdxLayoutGroup;
    dxLayoutControl1: TdxLayoutControl;
    dxLayoutControl1Item2: TdxLayoutItem;
    edtFechaPresupuesto: TcxDBDateEdit;
    dxLayoutControl1Group1: TdxLayoutGroup;
    dxLayoutControl1Group2: TdxLayoutGroup;
    dxLayoutControl1Item6: TdxLayoutItem;
    memObservaciones: TcxDBMemo;
    dxLayoutControl1Item3: TdxLayoutItem;
    eReferencia: TcxDBTextEdit;
    dxLayoutControl1Group7: TdxLayoutGroup;
    dxLayoutControl1Item1: TdxLayoutItem;
    frViewClientePresupuesto: TfrViewDatosYSeleccionCliente;
    ActionList1: TActionList;
    actElegirDireccion: TAction;
    dxLayoutControl1Item4: TdxLayoutItem;
    cbFormaPago: TcxDBLookupComboBox;
    dxLayoutControl1Item5: TdxLayoutItem;
    bFormasPago: TButton;
    dxLayoutControl1Group5: TdxLayoutGroup;
    dsFormaPago: TDADataSource;
    dxLayoutControl1Item7: TdxLayoutItem;
    edtFechaDecision: TcxDBDateEdit;
    dxLayoutControl1Item15: TdxLayoutItem;
    eRefCliente: TcxDBTextEdit;
    dxLayoutControl1Item8: TdxLayoutItem;
    cbClienteFinal: TcxDBButtonEdit;
    cbSituacion: TcxDBImageComboBox;
    dxLayoutControl1Item10: TdxLayoutItem;
    dxLayoutControl1Item9: TdxLayoutItem;
    eReferenciaAux: TcxDBTextEdit;
    dxLayoutControl1Group3: TdxLayoutGroup;
    dxLayoutControl1Group4: TdxLayoutGroup;
    dxLayoutControl1Group6: TdxLayoutGroup;
    dxLayoutControl1Group8: TdxLayoutGroup;
    procedure CustomViewCreate(Sender: TObject);
    procedure CustomViewDestroy(Sender: TObject);
    procedure actElegirDireccionExecute(Sender: TObject);
    procedure actElegirDireccionUpdate(Sender: TObject);
    procedure bFormasPagoClick(Sender: TObject);
    procedure frViewClientePresupuestoButton1Click(Sender: TObject);
    procedure frViewClientePresupuestoButton2Click(Sender: TObject);
    procedure cbClienteFinalPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
  protected
    FPresupuesto : IBizPresupuestoCliente;
    FFormasPago : IBizFormaPago;
    FFormasPagoController : IFormasPagoController;
    FViewClientePresupuesto : TfrViewDatosYSeleccionCliente;

    function GetPresupuesto: IBizPresupuestoCliente;
    procedure SetPresupuesto(const Value: IBizPresupuestoCliente); virtual;
    function GetViewClientePresupuesto: TfrViewDatosYSeleccionCliente;
    procedure SetViewClientePresupuesto(const Value: TfrViewDatosYSeleccionCliente);
  public
    property Presupuesto: IBizPresupuestoCliente read GetPresupuesto write SetPresupuesto;
    property ViewClientePresupuesto: TfrViewDatosYSeleccionCliente read GetViewClientePresupuesto;
  end;

implementation

{$R *.dfm}

{ TfrViewPresupuestoCliente }

uses
  uClientesController, uBizContactos, uBizDireccionesContacto,
  uPresupuestosClienteController;


procedure TfrViewPresupuestoCliente.actElegirDireccionExecute(Sender: TObject);
var
  AClientesController : IClientesController;
  APresupuestoController : IPresupuestosClienteController;
  ADireccion : IBizDireccionesContacto;
begin
  inherited;
  AClientesController := TClientesController.Create;
  APresupuestoController := TPresupuestosClienteController.Create;
  try
    ADireccion := AClientesController.ElegirDireccionEntrega(FPresupuesto.Cliente.Direcciones, 
      'Seleccione la dirección del cliente que quiere utilizar como dirección de envio de este presupuesto.');
    if Assigned(ADireccion) then
    begin
      APresupuestoController.CopiarDireccionEnvio(ADireccion, FPresupuesto);
      FPresupuesto.Edit;
      FPresupuesto.IMPORTE_PORTE := ADireccion.PORTE;
    end;
  finally
    AClientesController := NIL;
    APresupuestoController := NIL;
  end;
end;

procedure TfrViewPresupuestoCliente.actElegirDireccionUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := (not ReadOnly) and
    Assigned(FPresupuesto) and
    Assigned(FViewClientePresupuesto) and
    FPresupuesto.DataTable.Active and
    Assigned(FPresupuesto.Cliente) and
    Assigned(FPresupuesto.Cliente) and
    Assigned(FPresupuesto.Cliente.Direcciones) and
    FPresupuesto.Cliente.Direcciones.DataTable.Active and
    (FPresupuesto.Cliente.Direcciones.DataTable.RecordCount > 0);
end;

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

procedure TfrViewPresupuestoCliente.cbClienteFinalPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
var
  ACliente : IBizCliente;
  AClienteController : IClientesController;
begin
  inherited;
  AClienteController := TClientesController.Create;
  try
    ACliente := (AClienteController.ElegirContacto(AClienteController.BuscarTodos,
      'Elija el cliente final de este presupuesto', False) as IBizCliente);
    if Assigned(ACliente) then
    begin
      ShowHourglassCursor;
      try
        Presupuesto.Edit;
        Presupuesto.CLIENTE_FINAL := ACliente.NOMBRE;
      finally
        HideHourglassCursor;
      end;
    end;
  finally
    ACliente := NIL;
    AClienteController := NIL;
  end;
end;

procedure TfrViewPresupuestoCliente.CustomViewCreate(Sender: TObject);
begin
  inherited;
  FFormasPago := Nil;
  FFormasPagoController := TFormasPagoController.Create;
  FViewClientePresupuesto := frViewClientePresupuesto;
  FViewClientePresupuesto.MsgElegirCliente := 'Elija el cliente al que se le realizará el presupuesto.';
end;

procedure TfrViewPresupuestoCliente.CustomViewDestroy(Sender: TObject);
begin
  FFormasPago := Nil;
  FFormasPagoController := NIL;
  FViewClientePresupuesto := NIL;
  inherited;
end;

procedure TfrViewPresupuestoCliente.frViewClientePresupuestoButton1Click(Sender: TObject);
begin
  if Assigned(Presupuesto) and Assigned(Presupuesto.Cliente) and
    Assigned (Presupuesto.Detalles) and (Presupuesto.Detalles.RecordCount > 0) then
  begin
    if (Application.MessageBox('Los descuentos de los artículos del presupuesto serán actualizados con los del nuevo cliente seleccionado, ¿Desea continuar?', 'Atención', MB_YESNO) = IDNO) then
      Exit;
  end;
  frViewClientePresupuesto.actElegirContacto.Execute;
end;

procedure TfrViewPresupuestoCliente.frViewClientePresupuestoButton2Click(Sender: TObject);
begin
  if Assigned(Presupuesto) and Assigned(Presupuesto.Cliente) and
    Assigned (Presupuesto.Detalles) and (Presupuesto.Detalles.RecordCount > 0) then
  begin
    if (Application.MessageBox('Los descuentos de los artículos del presupuesto serán actualizados con los del nuevo cliente seleccionado, ¿Desea continuar?', 'Atención', MB_YESNO) = IDNO) then
      Exit;
  end;
  frViewClientePresupuesto.actAnadirContacto.Execute;
end;

function TfrViewPresupuestoCliente.GetPresupuesto: IBizPresupuestoCliente;
begin
  Result := FPresupuesto;
end;

function TfrViewPresupuestoCliente.GetViewClientePresupuesto: TfrViewDatosYSeleccionCliente;
begin
  Result := FViewClientePresupuesto;
end;

procedure TfrViewPresupuestoCliente.SetPresupuesto(const Value: IBizPresupuestoCliente);
begin
  FPresupuesto := Value;
  if Assigned(FPresupuesto) then
  begin
    DADataSource.DataTable := FPresupuesto.DataTable;

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

    frViewClientePresupuesto.Cliente := FPresupuesto.Cliente;
  end
  else begin
    DADataSource.DataTable := NIL;
    dsFormaPago.DataTable := NIL;
    frViewClientePresupuesto.Cliente := nil;
  end;
end;

procedure TfrViewPresupuestoCliente.SetViewClientePresupuesto(const Value: TfrViewDatosYSeleccionCliente);
begin
  FViewClientePresupuesto := Value;
end;

end.
