unit uViewListaPedidosProvObra;

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, uBizPedidosProveedor,
  uPedidosProveedorController, cxCalendar, cxTextEdit, cxCurrencyEdit,
  cxDBLookupComboBox;

type
  IViewListaPedidosProvObra = interface(IViewDetallesGenerico)
    ['{3DF64147-679B-4BE5-A984-98099D57C84D}']
    function GetObra: IBizObra;
    procedure SetObra(const Value: IBizObra);
    property Obra: IBizObra read GetObra write SetObra;
  end;

  TfrViewListaPedidosProvObra = class(TfrViewDetallesGenerico, IViewListaPedidosProvObra)
    cxGridViewFECHA_PEDIDO: TcxGridDBColumn;
    cxGridViewSITUACION: TcxGridDBColumn;
    cxGridViewNOMBRE: TcxGridDBColumn;
    cxGridViewREFERENCIA: TcxGridDBColumn;
    cxGridViewBASE_IMPONIBLE: TcxGridDBColumn;
    cxGridViewID_PRESUPUESTO: TcxGridDBColumn;
    dsPresupuestos: TDADataSource;
  private
    procedure CopiarDatosPedido(APedido: IBizPedidoProveedor);
    function BuscarPedidosParaElegir: IBizPedidoProveedor;
    { Private declarations }
  protected
    FObra : IBizObra;
    FPedidosProvEjecucion: IBizEjecucionPedidosProveedor;
    FPedidosProvController : IPedidosProveedorController;
    function GetObra: IBizObra;
    procedure SetObra(const Value: IBizObra);

    procedure AnadirInterno; override;
    procedure ModificarInterno; override;
    procedure EliminarInterno; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Obra: IBizObra read GetObra write SetObra;
  end;

implementation

uses uDataModuleObras;

{$R *.dfm}

{ TfrViewListaPedidosProvObra }

procedure TfrViewListaPedidosProvObra.AnadirInterno;
var
  APedidosProv : IBizPedidoProveedor;
  APedido : IBizPedidoProveedor;
begin
  // inherited; <- No llamar al padre porque queremos tratamiento especial.
  APedidosProv := BuscarPedidosParaElegir;
  try
    APedido := FPedidosProvController.ElegirPedidos(APedidosProv, 'Elija el pedido que desea asociar a la ejecución de esta obra', False);
    if Assigned(APedido) then
    begin
      APedido.Open;
      FPedidosProvEjecucion.Insert;
      CopiarDatosPedido(APedido);

      FObra.Ejecuciones.Edit;
      FObra.Ejecuciones.IMPORTE_GASTOS := FObra.Ejecuciones.IMPORTE_GASTOS + FPedidosProvEjecucion.BASE_IMPONIBLE;
      FObra.Ejecuciones.RecalcularBeneficio;      
    end;
  finally
    APedido := NIL;
    APedidosProv := NIL;
  end;
end;

constructor TfrViewListaPedidosProvObra.Create(AOwner: TComponent);
begin
  inherited;
  FPedidosProvController := TPedidosProveedorController.Create;

  with TcxLookupComboBoxProperties(cxGridViewID_PRESUPUESTO.Properties) do
  begin
    ListSource := dsPresupuestos;
    ListFieldNames := 'REFERENCIA;NOMBRE;FECHA_PRESUPUESTO';
    KeyFieldNames := 'ID_PRESUPUESTO';
  end;
end;

destructor TfrViewListaPedidosProvObra.Destroy;
begin
  FPedidosProvEjecucion := NIL;
  FObra := NIL;
  FPedidosProvController := NIL;
  inherited;
end;

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

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

procedure TfrViewListaPedidosProvObra.ModificarInterno;
var
  AImporte : Currency;
  AID : Integer;
  APedido : IBizPedidoProveedor;
begin
  // inherited; <- No llamar al padre porque queremos tratamiento especial.
  if not FPedidosProvEjecucion.ID_PEDIDOIsNull then
  begin
    AID := FPedidosProvEjecucion.ID_PEDIDO;

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

        FPedidosProvEjecucion.Edit;
        CopiarDatosPedido(APedido);

        if AImporte <> APedido.BASE_IMPONIBLE then
        begin
          FObra.Ejecuciones.Edit;
          FObra.Ejecuciones.IMPORTE_GASTOS := FObra.Ejecuciones.IMPORTE_GASTOS - AImporte;
          FObra.Ejecuciones.IMPORTE_GASTOS := FObra.Ejecuciones.IMPORTE_GASTOS + FPedidosProvEjecucion.BASE_IMPONIBLE;
          FObra.Ejecuciones.RecalcularBeneficio;
        end;
      end;
    finally
      APedido := NIL;
    end;
  end;
end;


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

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

function TfrViewListaPedidosProvObra.BuscarPedidosParaElegir: IBizPedidoProveedor;
var
  Expression1, Expression2, Expression3, CompoundExpression: TDAWhereExpression; 
  AArray : Array of TDAWhereExpression;
begin
  Expression1 := NIL;
  Expression2 := NIL;
  Expression3 := NIL;
  CompoundExpression := NIL;

  ShowHourglassCursor;
  try
    Result := FPedidosProvController.BuscarTodos;

    with Result.DataTable.DynamicWhere do
    begin
      // (ID_OBRA is null)
      Expression1 := NewBinaryExpression(NewField('', 'ID_OBRA'), NewNull, dboEqual);

      // (ID_OBRA = :ID)
      if not FObra.Ejecuciones.EsNuevo then
        Expression2 := NewBinaryExpression(NewField('', 'ID_OBRA'), NewConstant(FObra.ID, datInteger), dboEqual);

      if Assigned(Expression2) then
        CompoundExpression := NewBinaryExpression(Expression1, Expression2, dboOr)
      else
        CompoundExpression := Expression1;

      // (ID not in (1, 2, 3...)
      //Expression3 := NewUnaryExpression(NewBinaryExpression(NewField('', 'conditionc'), NewConstant('wk', datString), dboIn), duoNot);

      // Unir todo
      if IsEmpty then
        Expression := CompoundExpression //NewBinaryExpression(CompoundExpression, Expression3, dboAnd)
      else
        Expression := NewBinaryExpression(Expression, CompoundExpression, dboAnd); //NewBinaryExpression(Expression, NewBinaryExpression(CompoundExpression, Expression3, dboAnd), dboAnd);
    end;
  finally
    HideHourglassCursor;
  end;
end;

procedure TfrViewListaPedidosProvObra.CopiarDatosPedido(APedido: IBizPedidoProveedor);
begin
  with FPedidosProvEjecucion do
  begin
    if not (State in dsEditModes) then
      Edit;

    ID_EJECUCION := FObra.Ejecuciones.ID;
    ID_PEDIDO := APedido.ID;
    REFERENCIA := APedido.REFERENCIA;
    FECHA_PEDIDO := APedido.FECHA_PEDIDO;
    FECHA_ENTREGA := APedido.FECHA_ENTREGA;
    ID_PROVEEDOR := APedido.ID_PROVEEDOR;
    NOMBRE := APedido.NOMBRE;
    ID_ALMACEN := APedido.ID_ALMACEN;
    NOMBRE_ALMACEN := APedido.NOMBRE_ALMACEN;
    ID_OBRA := APedido.ID_OBRA;
    NOMBRE_OBRA := APedido.NOMBRE_OBRA;
    BASE_IMPONIBLE := APedido.BASE_IMPONIBLE;
    Post;
  end;
end;


end.
