unit uViewListaPresupuestosObra;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewDetallesGenerico, cxStyles, cxCustomData, cxGraphics, cxFilter,
  cxData, cxDataStorage, cxEdit, DB, cxDBData, ActnList, ImgList, PngImageList,
  uDAInterfaces, uDADataTable, ComCtrls, ToolWin, cxGridLevel,
  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxClasses,
  cxControls, cxGridCustomView, cxGrid, uBizObras, uObrasController,
  //uBizPresupuestosCliente, uPresupuestosClienteController,
  cxCurrencyEdit;

type
  IViewListaPresupuestosObra = interface(IViewDetallesGenerico)
    ['{E52E2718-EEE5-4ABD-8E9C-33CD9D54D6F2}']
    function GetObra: IBizObra;
    procedure SetObra(const Value: IBizObra);
    property Obra: IBizObra read GetObra write SetObra;

    function GetController : IObrasController;
    procedure SetController (const Value : IObrasController);
    property Controller : IObrasController read GetController write SetController;
  end;


  TfrViewListaPresupuestosObra = class(TfrViewDetallesGenerico, IViewListaPresupuestosObra)
    cxGridViewREFERENCIA: TcxGridDBColumn;
    cxGridViewFECHA_PRESUPUESTO: TcxGridDBColumn;
    cxGridViewSITUACION: TcxGridDBColumn;
    cxGridViewBASE_IMPONIBLE: TcxGridDBColumn;
    cxGridViewNOMBRE: TcxGridDBColumn;
  private
//    procedure CopiarDatosPresupuesto(APresupuesto: IBizPresupuestoCliente);
  protected
    FObra : IBizObra;
//    FPresupuestosEjecucion : IBizEjecucionPresupuestos;
    FObrasController : IObrasController;

    //FPresupuestos: IBizPresupuestoCliente;
//    FPresupuestosController : IPresupuestosClienteController;
    function GetObra: IBizObra;
    procedure SetObra(const Value: IBizObra);

    procedure AnadirInterno; override;
    procedure ModificarInterno; override;
    procedure EliminarInterno; override;

    function GetController : IObrasController;
    procedure SetController (const Value : IObrasController);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Obra: IBizObra read GetObra write SetObra;
    property Controller : IObrasController read GetController write SetController;

  end;

implementation

{$R *.dfm}

{ TfrViewListaPresupuestosObra }

procedure TfrViewListaPresupuestosObra.AnadirInterno;
//var
//  APresupuestos : IBizPresupuestoCliente;
//  APresupuesto : IBizPresupuestoCliente;
begin
  // inherited; <- No llamar al padre porque queremos tratamiento especial.
{  APresupuestos := FPresupuestosController.BuscarAceptados;
  try
    APresupuesto := FPresupuestosController.ElegirPresupuestos(APresupuestos, 'Elija el presupuesto de cliente que quiere asociar a la ejecución de esta obra', False);
    if Assigned(APresupuesto) then
    begin
      APresupuesto.Open;
      FPresupuestosEjecucion.Insert;
      CopiarDatosPresupuesto(APresupuesto);

      FObra.Ejecuciones.Edit;
      FObra.Ejecuciones.IMPORTE_INGRESOS := FObra.Ejecuciones.IMPORTE_INGRESOS + FPresupuestosEjecucion.BASE_IMPONIBLE;
      FObra.Ejecuciones.RecalcularBeneficio;
    end;
  finally
    APresupuesto := NIL;
    APresupuestos := NIL;
  end;
}  
end;

constructor TfrViewListaPresupuestosObra.Create(AOwner: TComponent);
begin
  inherited;
//  FPresupuestosController := TPresupuestosClienteController.Create;
end;

destructor TfrViewListaPresupuestosObra.Destroy;
begin
  //FPresupuestos := NIL;
  FObra := NIL;
  FObrasController := NIL;
//  FPresupuestosEjecucion := NIL;
//  FPresupuestosController := NIL;
  inherited;
end;

procedure TfrViewListaPresupuestosObra.EliminarInterno;
var
  AImporte : Currency;
begin
//  AImporte := FPresupuestosEjecucion.BASE_IMPONIBLE;
  // Llamamos al padre que hace un delete.
  inherited;
  FObra.Ejecuciones.Edit;
  FObra.Ejecuciones.IMPORTE_INGRESOS := FObra.Ejecuciones.IMPORTE_INGRESOS - AImporte;
  FObra.Ejecuciones.RecalcularBeneficio;  
end;

function TfrViewListaPresupuestosObra.GetController: IObrasController;
begin
  Result := FObrasController;
end;

function TfrViewListaPresupuestosObra.GetObra: IBizObra;
begin
  Result := FObra;
end;

procedure TfrViewListaPresupuestosObra.ModificarInterno;
var
  AImporte : Currency;
  AID : Integer;
//  APresupuesto : IBizPresupuestoCliente;
begin
  // inherited; <- No llamar al padre porque queremos tratamiento especial.
{  if not FPresupuestosEjecucion.ID_PRESUPUESTOIsNull then
  begin
    AID := FPresupuestosEjecucion.ID_PRESUPUESTO;

    APresupuesto := FPresupuestosController.Buscar(AID);
    try
      APresupuesto.Open;
      if not APresupuesto.IsEmpty then
      begin
        AImporte := APresupuesto.BASE_IMPONIBLE;
        FPresupuestosController.Ver(APresupuesto);

        FPresupuestosEjecucion.Edit;
        CopiarDatosPresupuesto(APresupuesto);

        if AImporte <> APresupuesto.BASE_IMPONIBLE then
        begin
          FObra.Ejecuciones.Edit;
          FObra.Ejecuciones.IMPORTE_INGRESOS := FObra.Ejecuciones.IMPORTE_INGRESOS - AImporte;
          FObra.Ejecuciones.IMPORTE_INGRESOS := FObra.Ejecuciones.IMPORTE_INGRESOS + FPresupuestosEjecucion.BASE_IMPONIBLE;
          FObra.Ejecuciones.RecalcularBeneficio;
        end;
      end;
    finally
      APresupuesto := NIL;
    end;
  end;
}  
end;

procedure TfrViewListaPresupuestosObra.SetController(
  const Value: IObrasController);
begin
  FObrasController := Value;
end;

procedure TfrViewListaPresupuestosObra.SetObra(const Value: IBizObra);
begin
  FObra := Value;

  if Assigned(FObra) then
  begin
    FObra.Active := True;
//    FPresupuestosEjecucion := FObra.Ejecuciones.Presupuestos;
//    dsDetalles.DataTable := FPresupuestosEjecucion.DataTable;
  end
  else begin
    FObra := NIL;
//    FPresupuestosEjecucion := NIL;
    dsDetalles.DataTable := NIL;
  end;
end;

{
procedure TfrViewListaPresupuestosObra.CopiarDatosPresupuesto(APresupuesto: IBizPresupuestoCliente);
begin
  with FPresupuestosEjecucion do
  begin
    if not (State in dsEditModes) then
      Edit;

    ID_EJECUCION := FObra.Ejecuciones.ID;
    ID_PRESUPUESTO := APresupuesto.ID;
    REFERENCIA := APresupuesto.REFERENCIA;
    FECHA_PRESUPUESTO := APresupuesto.FECHA_PRESUPUESTO;
    SITUACION := APresupuesto.SITUACION;
    BASE_IMPONIBLE := APresupuesto.BASE_IMPONIBLE;
    NOMBRE := APresupuesto.NOMBRE;
    Post;
  end;
end;
}

end.
