unit uEditorSituacionPresupuesto;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,
  uIEditorSituacionPresupuesto, uPresupuestosController, uBizPresupuestos,
  JvExControls, JvComponent, JvgWizardHeader, cxControls, cxContainer, cxEdit,
  cxTextEdit, cxMaskEdit, cxDropDownEdit, cxCalendar, cxDBEdit, ActnList;

type
  TfEditorSituacionPresupuesto = class(TForm, IEditorSituacionPresupuesto)
    pnlSeleccion: TPanel;
    bAceptar: TButton;
    bCancelar: TButton;
    JvgWizardHeader1: TJvgWizardHeader;
    rbPendiente: TRadioButton;
    rbAceptado: TRadioButton;
    rbRechazado: TRadioButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    edtFechaAceptado: TcxDateEdit;
    edtFechaRechazado: TcxDateEdit;
    ActionList1: TActionList;
    actPendiente: TAction;
    actAceptado: TAction;
    actRechazado: TAction;
    actAceptar: TAction;
    Label4: TLabel;
    edtFechaPresupuesto: TEdit;
    procedure actPendienteExecute(Sender: TObject);
    procedure actAceptadoExecute(Sender: TObject);
    procedure actRechazadoExecute(Sender: TObject);
    procedure actAceptarExecute(Sender: TObject);
  private
    FController: IPresupuestosController;
    FPresupuesto: IBizPresupuesto;
    function GetController : IPresupuestosController;
    procedure SetController (const Value : IPresupuestosController);

    function GetPresupuesto: IBizPresupuesto;
    procedure SetPresupuesto(const Value: IBizPresupuesto);
    procedure RefrescarEstado;
  public
    property Presupuesto: IBizPresupuesto read GetPresupuesto write SetPresupuesto;
    property Controller : IPresupuestosController read GetController
      write SetController;
  end;

implementation

{$R *.dfm}

uses
  uDateUtils, DateUtils, uMontajesDetallesController, uBizMontajesDetalles;

{ TfEditorSituacionPedido }

procedure TfEditorSituacionPresupuesto.actAceptadoExecute(Sender: TObject);
begin
  RefrescarEstado;
end;

procedure TfEditorSituacionPresupuesto.actAceptarExecute(Sender: TObject);
var
  AControllerMontajes: IMontajesDetallesController;
  AMontaje: IBizMontajeDetalles;
begin
  if rbPendiente.Checked then
    if (FPresupuesto.SITUACION <> SITUACION_PENDIENTE) then
       FController.CambiarSituacion(FPresupuesto, SITUACION_PENDIENTE);

  if rbAceptado.Checked then
  begin
    if (FPresupuesto.SITUACION <> SITUACION_ACEPTADO) then
    begin
      FController.CambiarSituacion(FPresupuesto, SITUACION_ACEPTADO,
        edtFechaAceptado.Date, False);

      //Para crear un montaje asociado al presupuesto
      if (Application.MessageBox('¿Desea crear un montaje para este presupuesto?', 'Atención', MB_YESNO) = IDYES) then
      begin
        try
          AControllerMontajes := TMontajesDetallesController.Create;
          AMontaje := AControllerMontajes.Nuevo(FPresupuesto);
//          AMontaje := (AControllerMontajes.Nuevo as IBizMontajeDetalles);
//          AMontaje.REFERENCIA := FPresupuesto.REFERENCIA;
//          AMontaje.ID_PRESUPUESTO := FPresupuesto.ID;
//          AMontaje.Cliente := FPresupuesto.Cliente;
          AControllerMontajes.Guardar(AMontaje);
          AControllerMontajes := Nil;
          AMontaje := Nil;
        except
          FController.DescartarCambios(FPresupuesto);
          AControllerMontajes.DescartarCambios((AMontaje));
          AControllerMontajes := Nil;
          AMontaje := Nil;
          raise Exception.Create('Error, Ya existe un montaje asociado a este presupuesto');
        end;
      end;

      //Guardamos el cambio de situación del presupuesto
      FController.Guardar(FPresupuesto);
    end;
  end;

  if rbRechazado.Checked then
     if (FPresupuesto.SITUACION <> SITUACION_RECHAZADO) then
        FController.CambiarSituacion(FPresupuesto, SITUACION_RECHAZADO, edtFechaRechazado.Date);

  ModalResult := mrOk;
  Close;
end;

procedure TfEditorSituacionPresupuesto.actPendienteExecute(Sender: TObject);
begin
  RefrescarEstado;
end;

procedure TfEditorSituacionPresupuesto.actRechazadoExecute(Sender: TObject);
begin
  RefrescarEstado;
end;

function TfEditorSituacionPresupuesto.GetController: IPresupuestosController;
begin
  Result := FController;
end;

function TfEditorSituacionPresupuesto.GetPresupuesto: IBizPresupuesto;
begin
  Result := FPresupuesto;
end;

procedure TfEditorSituacionPresupuesto.SetController(
  const Value: IPresupuestosController);
begin
  FController := Value;
end;

procedure TfEditorSituacionPresupuesto.SetPresupuesto(const Value: IBizPresupuesto);
begin
  FPresupuesto := Value;
  if not FPresupuesto.DataTable.Active then
    FPresupuesto.DataTable.Open;

  edtFechaPresupuesto.Text := DateToStr(FPresupuesto.FECHA_PRESUPUESTO);
  
  rbPendiente.Checked := (FPresupuesto.Situacion = SITUACION_PENDIENTE);
  rbRechazado.Checked := (FPresupuesto.Situacion = SITUACION_RECHAZADO);
  rbAceptado.Checked := (FPresupuesto.Situacion = SITUACION_ACEPTADO);

  if not EsFechaVacia(FPresupuesto.FECHA_DECISION) then
  begin
    edtFechaAceptado.Date := FPresupuesto.FECHA_DECISION;
    edtFechaRechazado.Date  := FPresupuesto.FECHA_DECISION;
  end
  else begin
    edtFechaAceptado.Clear;
    edtFechaRechazado.Clear;
  end;
end;

procedure TfEditorSituacionPresupuesto.RefrescarEstado;
begin
  edtFechaAceptado.Enabled := rbAceptado.Checked;
  if (edtFechaAceptado.Enabled) then
  begin
    if (edtFechaAceptado.Date < FPresupuesto.FECHA_PRESUPUESTO) then
      edtFechaAceptado.Date := DateOf(Now);
  end;
  
  edtFechaRechazado.Enabled := rbRechazado.Checked;
  if (edtFechaRechazado.Enabled) then
  begin
    if (edtFechaRechazado.Date < FPresupuesto.FECHA_PRESUPUESTO) then
      edtFechaRechazado.Date := DateOf(Now);
  end;
end;

end.
