unit uEditorFacturaCliente;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uEditorDBItem, DB, uDADataTable, JvAppStorage,
  JvAppRegistryStorage, JvComponent, JvFormPlacement, ImgList,
  PngImageList, StdActns, ActnList, ComCtrls, TBX, TB2Item, TB2Dock,
  TB2Toolbar, ExtCtrls, JvExControls, JvNavigationPane, 
  uViewFacturaCliente, uCustomView, uViewBase, uViewTotales,
  StdCtrls, pngimage, AppEvnts, JvComponentBase,
  uBizFacturasCliente,


  uIEditorFacturaCliente, uFacturasClienteController, uViewDetallesBase,
  uViewDetallesFacturaCliente, dxLayoutLookAndFeels, JvExComCtrls, JvStatusBar;


type
  TfEditorFacturaCliente = class(TfEditorDBItem, IEditorFacturaCliente)
    frViewDetallesFacturaCliente1: TfrViewDetallesFacturaCliente;
    frViewTotales1: TfrViewTotales;
    frViewFacturaCliente1: TfrViewFacturaCliente;
    procedure FormShow(Sender: TObject);
    procedure frViewClienteFactura1edtlNombrePropertiesEditValueChanged(
      Sender: TObject);
    procedure frViewTotales1cxCurrencyEdit1PropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
    procedure frViewTotales1cxCurrencyEdit2PropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
    procedure dsDataTableDataChange(Sender: TObject; Field: TField);
    procedure CustomEditorClose(Sender: TObject; var Action: TCloseAction);
    procedure frViewClienteFacturaedtlNombrePropertiesChange(Sender: TObject);

  private
    FController : IFacturasClienteController;
    FFactura: IBizFacturaCliente;
    FViewFactura: IViewFacturaCliente;
  protected
    function GetController : IFacturasClienteController;
    procedure SetController (const Value : IFacturasClienteController);
    function GetFactura: IBizFacturaCliente;
    procedure SetFactura(const Value: IBizFacturaCliente);

    function GetViewFactura: IViewFacturaCliente;
    procedure SetViewFactura(const Value: IViewFacturaCliente);

    property ViewFacturaCliente: IViewFacturaCliente read GetViewFactura write SetViewFactura;
    procedure OnContactoChanged(Sender : TObject);

    procedure GuardarInterno; override;
    procedure EliminarInterno; override;
    procedure ImprimirInterno; override;
    procedure PrevisualizarInterno; override;
  public
    procedure PonerTitulos(const ATitulo: string = ''); override;
    property Controller : IFacturasClienteController read GetController write SetController;
    property Factura: IBizFacturaCliente read GetFactura write SetFactura;
    constructor Create(AOwner: TComponent); override;
  end;

implementation
{$R *.dfm}

uses
  cxDBEdit, uBizContactos, uDataModuleUsuarios;


{ TfEditorFacturaCliente }

{
**************************** TfEditorFacturaCliente ****************************
}
constructor TfEditorFacturaCliente.Create(AOwner: TComponent);
begin
  inherited;
  pgPaginas.ActivePageIndex := 0;
  ViewFacturaCliente := frViewFacturaCliente1;  
end;

procedure TfEditorFacturaCliente.CustomEditorClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  dsDataTable.DataTable := NIL;
  frViewTotales1.DADataSource.DataTable := NIL;

  FViewFactura := NIL;
  FFactura := NIL;
end;

procedure TfEditorFacturaCliente.dsDataTableDataChange(Sender: TObject;
  Field: TField);
begin
  inherited;
  if Assigned(FFactura) and (not (FFactura.DataTable.Fetching) or
    not (FFactura.DataTable.Opening) or not (FFactura.DataTable.Closing)) then
    PonerTitulos;
end;

procedure TfEditorFacturaCliente.EliminarInterno;
begin
  if (Application.MessageBox('¿Desea borrar esta factura de cliente?', 'Atención', MB_YESNO) = IDYES) then
  begin
    FController.Eliminar(Factura);
    inherited;
  end;
end;

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

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

  if not Assigned(Factura) then
    raise Exception.Create('No hay ningún albarán asignado');

  Factura.DataTable.Active := True;
end;

procedure TfEditorFacturaCliente.frViewClienteFactura1edtlNombrePropertiesEditValueChanged(Sender: TObject);
begin
  inherited;
  with (Sender as TcxDBTextEdit) do
    Enabled := (FFactura.ID <> 0)
end;

procedure TfEditorFacturaCliente.frViewClienteFacturaedtlNombrePropertiesChange(
  Sender: TObject);
begin
  inherited;
  PonerTitulos;
end;

procedure TfEditorFacturaCliente.frViewTotales1cxCurrencyEdit1PropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  inherited;
  Factura.DESCUENTO := DisplayValue;
end;

procedure TfEditorFacturaCliente.frViewTotales1cxCurrencyEdit2PropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  inherited;
  Factura.IVA := DisplayValue;
end;

function TfEditorFacturaCliente.GetController: IFacturasClienteController;
begin
  Result := FController;
end;

function TfEditorFacturaCliente.GetFactura: IBizFacturaCliente;
begin
  Result := FFactura;
end;

function TfEditorFacturaCliente.GetViewFactura: IViewFacturaCliente;
begin
  Result := FViewFactura;
end;

procedure TfEditorFacturaCliente.GuardarInterno;
begin
  inherited;
  FController.Guardar(FFactura);
  Modified := False;
end;

procedure TfEditorFacturaCliente.ImprimirInterno;
begin
  inherited;
  FController.Print(FFactura);
end;

procedure TfEditorFacturaCliente.OnContactoChanged(Sender: TObject);
begin
  FFactura.Cliente := frViewFacturaCliente1.frViewClienteFactura.Cliente;
end;

procedure TfEditorFacturaCliente.PonerTitulos(const ATitulo: string);
var
  FTitulo : String;
begin
  FTitulo := ATitulo;
  if (FTitulo = '') and Assigned(Factura) then
  begin
    if Factura.EsNuevo then
      FTitulo := 'Nueva factura'
    else
      FTitulo := 'Factura'  + ' - ' + FFactura.Cliente.Nombre
  end;

  inherited PonerTitulos(FTitulo);

  Self.Caption := FTitulo + ' (' + dmUsuarios.EmpresaActual.NOMBRE + ')';
end;

procedure TfEditorFacturaCliente.PrevisualizarInterno;
begin
  inherited;
  FController.Preview(FFactura);
end;

procedure TfEditorFacturaCliente.SetController(const Value: IFacturasClienteController);
begin
  FController := Value;

  if Assigned(FController) then
  begin
     frViewFacturaCliente1.frViewClienteFactura.Controller := Controller.ClienteController;
     frViewDetallesFacturaCliente1.Controller := Controller.DetallesController;
  end;
end;

procedure TfEditorFacturaCliente.SetFactura(const Value: IBizFacturaCliente);
begin
  FFactura := Value;

  if Assigned(FFactura) then
  begin
    dsDataTable.DataTable := FFactura.DataTable;
    frViewTotales1.DADataSource.DataTable := FFactura.DataTable;

    if Assigned(FViewFactura) then
    begin
      frViewFacturaCliente1.frViewClienteFactura.Cliente := (Controller.ClienteController.Buscar(Factura.ID_CLIENTE) as IBizCliente);
      frViewFacturaCliente1.frViewClienteFactura.OnClienteChanged := OnContactoChanged;
      FViewFactura.Factura := FFactura;
      frViewDetallesFacturaCliente1.Detalles := FFactura.Detalles;
    end;

    Factura.DataTable.Active := True;
  end;
end;

procedure TfEditorFacturaCliente.SetViewFactura(const Value: IViewFacturaCliente);
begin
  FViewFactura := Value;

  if Assigned(FViewFactura) and Assigned(Factura) then
    FViewFactura.Factura := Factura;
end;

end.
