unit uEditorReciboProveedor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uEditorDBItem, JvAppStorage, JvAppRegistryStorage, DB, uDADataTable,
  JvComponentBase, JvFormPlacement, ImgList, PngImageList, StdActns, ActnList,
  ComCtrls, JvExComCtrls, JvStatusBar, TBX, TB2Item, TB2Dock, TB2Toolbar,
  pngimage, ExtCtrls, JvExControls, JvComponent, JvNavigationPane, uIEditorReciboProveedor,
  uCustomView, uViewBase, uViewReciboProveedor, uRecibosProveedorController,
  uBizRecibosProveedor, uViewPagosProveedor, dxLayoutLookAndFeels, cxCustomData,
  uViewDetallesGenerico, uViewRecibosProvCompensados, uViewReciboProvImportes,
  uDAInterfaces, cxControls, cxContainer, cxEdit, cxLabel;

type
  TfEditorReciboProveedor = class(TfEditorDBItem, IEditorReciboProveedor)
    DADataSource1: TDADataSource;
    frViewReciboProveedor1: TfrViewReciboProveedor;
    pagPagos: TTabSheet;
    pagCompensados: TTabSheet;
    frViewPagosProveedor1: TfrViewPagosProveedor;
    frViewRecibosProvCompensados1: TfrViewRecibosProvCompensados;
    frViewReciboProvImportes1: TfrViewReciboProvImportes;
    procedure FormShow(Sender: TObject);
    procedure dsDataTableDataChange(Sender: TObject; Field: TField);
    procedure CustomEditorClose(Sender: TObject; var Action: TCloseAction);
    procedure frViewReciboProveedor1eImportePropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);

    procedure frViewPagosProveedor1actAnadirExecute(Sender: TObject);
    procedure frViewPagosProveedor1actEliminarExecute(Sender: TObject);
    procedure frViewPagosProveedor1actEliminarUpdate(Sender: TObject);
    procedure frViewPagosProveedor1actModificarUpdate(Sender: TObject);
    procedure frViewPagosProveedor1actModificarExecute(Sender: TObject);

    procedure HabilitarRecibo;
    procedure DeshabilitarRecibo;
    procedure JvFormStorageRestorePlacement(Sender: TObject);
    procedure JvFormStorageSavePlacement(Sender: TObject);
    procedure frViewReciboProvImportes1eImportePropertiesEditValueChanged(Sender: TObject);
    procedure frViewRecibosProvCompensados1cxGridViewDataControllerSummaryAfterSummary(ASender: TcxDataSummary);

  private
    FController : IRecibosProveedorController;
    FRecibo: IBizRecibosProveedor;
    FViewRecibo : IViewReciboProveedor;
    FImporteRestante : Double;

    function GetController : IRecibosProveedorController;
    procedure SetController (const Value : IRecibosProveedorController); virtual;
    function GetRecibo: IBizRecibosProveedor;
    procedure SetRecibo(const Value: IBizRecibosProveedor);
    function GetViewRecibo: IViewReciboProveedor;
    procedure SetViewRecibo(const Value: IViewReciboProveedor);
    property ViewRecibo: IViewReciboProveedor read GetViewRecibo write SetViewRecibo;
    procedure CalcularTotal;

  protected
    procedure PrevisualizarInterno; override;
    procedure ImprimirInterno; override;
    procedure GuardarInterno; override;

    procedure PonerTitulos(const ATitulo: string = ''); override;

  public
    property Recibo: IBizRecibosProveedor read GetRecibo write SetRecibo;
    constructor Create(AOwner: TComponent); override;
  end;

implementation

uses schRecibosProveedorClient_Intf, uEditorFechaPagoProveedor, uEditorBase, uFactuGES_App;

{$R *.dfm}

procedure TfEditorReciboProveedor.CalcularTotal;
var
  ImporteAux: Double;
begin

  ImporteAux := 0;
  if not VarIsNull(frViewRecibosProvCompensados1.cxGridView.DataController.Summary.FooterSummaryValues[0]) then
     ImporteAux := frViewRecibosProvCompensados1.cxGridView.DataController.Summary.FooterSummaryValues[0];

  frViewReciboProvImportes1.eImporteTotalRecibo.Value := frViewReciboProvImportes1.eImporte.Value + frViewReciboProvImportes1.eOtrosGastos.Value + ImporteAux;
end;

constructor TfEditorReciboProveedor.Create(AOwner: TComponent);
begin
  inherited;
  FImporteRestante := 0;
  pgPaginas.ActivePageIndex := 0;
  ViewRecibo := frViewReciboProveedor1;
end;

procedure TfEditorReciboProveedor.CustomEditorClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  dsDataTable.DataTable := NIL;
  FViewRecibo := NIL;
  FRecibo := NIL;
end;

procedure TfEditorReciboProveedor.DeshabilitarRecibo;
begin
  frViewReciboProveedor1.eReferenciaProveedor.Enabled := False;
  frViewReciboProveedor1.edtFechaVencimiento.Enabled := False;
  frViewReciboProvImportes1.eImporte.Enabled := False;
  frViewReciboProvImportes1.eOtrosGastos.Enabled := False;
end;

procedure TfEditorReciboProveedor.dsDataTableDataChange(Sender: TObject; Field: TField);
begin
  inherited;

  if Assigned(FRecibo) and (not (FRecibo.DataTable.Fetching) or
    not (FRecibo.DataTable.Opening) or not (FRecibo.DataTable.Closing)) then
    PonerTitulos;
end;

procedure TfEditorReciboProveedor.FormShow(Sender: TObject);
begin
  inherited;

  if not Assigned(FViewRecibo) then
    raise Exception.Create('No hay ninguna vista asignada');

  if not Assigned(Recibo) then
    raise Exception.Create('No hay ningún almacén asignado');

  Recibo.DataTable.Active := True;
end;

procedure TfEditorReciboProveedor.frViewPagosProveedor1actAnadirExecute(Sender: TObject);
begin
  inherited;

  //En el caso de haber añadido el pago del recibo ya no podremos modificarlo
  if FController.AnadirPago(Recibo) then
     DeshabilitarRecibo
  //Podremos modificar si anulamos el pago mediante una devolución
  else
     HabilitarRecibo;
end;

procedure TfEditorReciboProveedor.frViewPagosProveedor1actEliminarExecute(Sender: TObject);
begin
  inherited;
  //En el caso de eliminar un pago el recibo queda como devuelto o pendiente y por tanto se puede modificar
  if (FController.EliminarPago(Recibo)) then
  begin
    FRecibo.Edit;
    if FRecibo.Pagos.DataTable.RecordCount > 0 then
       FRecibo.SITUACION := CTE_DEVUELTO
    else
       FRecibo.SITUACION := CTE_PENDIENTE;
    HabilitarRecibo;
  end
  //No podremos modificar si anulamos una devolución porque el recibo queda cobrado
  else
  begin
    FRecibo.Edit;
    FRecibo.SITUACION := CTE_PAGADO;
    DeshabilitarRecibo;
  end;
end;

procedure TfEditorReciboProveedor.frViewPagosProveedor1actEliminarUpdate(Sender: TObject);
begin
  if Assigned(FRecibo) and Assigned(FRecibo.Pagos) then
     frViewPagosProveedor1.actEliminar.Enabled := (FRecibo.Pagos.DataTable.RecordCount > 0)
end;

procedure TfEditorReciboProveedor.frViewPagosProveedor1actModificarExecute(Sender: TObject);
begin
  inherited;
  FController.ModificarPago(Recibo);
end;

procedure TfEditorReciboProveedor.frViewPagosProveedor1actModificarUpdate(Sender: TObject);
begin
  inherited;
  if Assigned(FRecibo) and Assigned(FRecibo.Pagos) then
     frViewPagosProveedor1.actModificar.Enabled := (FRecibo.Pagos.DataTable.RecordCount > 0);
end;

procedure TfEditorReciboProveedor.frViewReciboProvImportes1eImportePropertiesEditValueChanged(
  Sender: TObject);
begin
  inherited;
  CalcularTotal;
end;

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

  if (DisplayValue > frViewReciboProvImportes1.eImporte.DataBinding.Field.Value) then
  begin
     DisplayValue := frViewReciboProvImportes1.eImporte.DataBinding.Field.Value;
     ErrorText := 'El importe debe ser menor o igual que el actual';
     Error := True;
  end;
end;

procedure TfEditorReciboProveedor.frViewRecibosProvCompensados1cxGridViewDataControllerSummaryAfterSummary(ASender: TcxDataSummary);
begin
  inherited;
  CalcularTotal;
end;

function TfEditorReciboProveedor.GetController: IRecibosProveedorController;
begin
  Result := FController;
end;

function TfEditorReciboProveedor.GetRecibo: IBizRecibosProveedor;
begin
  Result := FRecibo;
end;

function TfEditorReciboProveedor.GetViewRecibo: IViewReciboProveedor;
begin
  Result := FViewRecibo;
end;

procedure TfEditorReciboProveedor.GuardarInterno;
begin
  inherited;
  FController.Guardar(FRecibo);
  Modified := False;
end;

procedure TfEditorReciboProveedor.HabilitarRecibo;
begin
//Si el recibo tiene sociado una remesa no se podrá cambiar nada
  frViewReciboProveedor1.eReferenciaProveedor.Enabled := True;
  frViewReciboProveedor1.edtFechaVencimiento.Enabled := True;
  frViewReciboProvImportes1.eImporte.Enabled := True;
  frViewReciboProvImportes1.eOtrosGastos.Enabled := True;
end;

procedure TfEditorReciboProveedor.ImprimirInterno;
begin
{
  inherited;
  FController.Print(FRecibo);
}  
end;

procedure TfEditorReciboProveedor.JvFormStorageRestorePlacement(Sender: TObject);
begin
  inherited;
  frViewPagosProveedor1.ListaPagosProveedor.ActiveView.RestoreFromRegistry(JvAppRegistryStorage.Root);
end;

procedure TfEditorReciboProveedor.JvFormStorageSavePlacement(Sender: TObject);
begin
  inherited;
  frViewPagosProveedor1.ListaPagosProveedor.ActiveView.StoreToRegistry(JvAppRegistryStorage.Root);
end;

procedure TfEditorReciboProveedor.PonerTitulos(const ATitulo: string);
var
  FTitulo : String;
begin
  if Assigned(Recibo) then
  begin
    if Recibo.EsNuevo then
      FTitulo := 'Nuevo recibo de proveedor'
    else
      FTitulo := 'Recibo de proveedor';
  end;

  if (Recibo.ID_RECIBO_COMPENSADO > 0) then
     FTitulo := FTitulo + ' (compensado)';

  if Length(Recibo.NOMBRE_PROVEEDOR) > 0 then
     FTitulo := FTitulo + ' - ' + Recibo.NOMBRE_PROVEEDOR;

  inherited PonerTitulos(FTitulo);
end;

procedure TfEditorReciboProveedor.PrevisualizarInterno;
begin
{
  inherited;
  FController.Preview(FRecibo);
}  
end;

procedure TfEditorReciboProveedor.SetController(const Value: IRecibosProveedorController);
begin
  FController := Value;
  if Assigned(FController) then
     frViewRecibosProvCompensados1.Controller := FController;

//    (ViewRecibo as IViewReciboProveedor).Controller := (FController as IRecibosProveedorController);
end;

procedure TfEditorReciboProveedor.SetRecibo(const Value: IBizRecibosProveedor);
begin
  FRecibo := Value;
  dsDataTable.DataTable := FRecibo.DataTable;

  if Assigned(FViewRecibo) and Assigned(Recibo) then
  begin
    FViewRecibo.Recibo := Recibo;
    frViewPagosProveedor1.Pagos := Recibo.Pagos;
    frViewRecibosProvCompensados1.ReciboProveedor := FRecibo;

    if (FRecibo.SITUACION = CTE_PAGADO) then
      DeshabilitarRecibo
    else
      HabilitarRecibo;
  end;
end;

procedure TfEditorReciboProveedor.SetViewRecibo(const Value: IViewReciboProveedor);
begin
  FViewRecibo := Value;

  if Assigned(FViewRecibo) and Assigned(Recibo) then
    FViewRecibo.Recibo := Recibo;
end;

end.
