unit uViewDatosYSeleccionClienteFacturaCliente; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uViewBase, StdCtrls, cxControls, cxContainer, cxEdit, cxLabel, cxDBLabel, ExtCtrls, DB, uDADataTable, uBizContactos, ComCtrls, ToolWin, ActnList, ImgList, PngImageList, cxTextEdit, cxDBEdit, pngimage, JvExControls, JvComponent, JvButton, JvTransparentButton, Mask, DBCtrls, uClientesController, dxLayoutControl, Buttons, uDAInterfaces, cxMaskEdit, cxButtonEdit, uBizFacturasCliente, uBizDireccionesContacto, uDireccionesContactoController, Menus, cxLookAndFeelPainters, cxButtons; type IViewDatosYSeleccionClienteFacturaCliente = interface(IViewBase) ['{0336F03C-3349-4368-BF63-D03E6F741069}'] function GetFactura: IBizFacturaCliente; procedure SetFactura(const Value: IBizFacturaCliente); property Factura: IBizFacturaCliente read GetFactura write SetFactura; function GetCliente: IBizCliente; procedure SetCliente(Value: IBizCliente); property Cliente: IBizCliente read GetCliente write SetCliente; { function GetID_Cliente: integer; procedure SetID_Cliente(const Value: integer); property ID_Cliente: integer read GetID_Cliente write SetID_Cliente;} function GetOnClienteChanged : TNotifyEvent; procedure SetOnClienteChanged (const Value : TNotifyEvent); property OnClienteChanged : TNotifyEvent read GetOnClienteChanged write SetOnClienteChanged; procedure ElegirDireccionCliente; procedure ElegirCliente; procedure VerFichaCliente; procedure AnadirNuevoCliente; procedure RefrescarDireccion; end; TfrViewDatosYSeleccionClienteFacturaCliente = class(TfrViewBase, IViewDatosYSeleccionClienteFacturaCliente) dsCliente: TDADataSource; ActionList1: TActionList; actElegirContacto: TAction; actAnadirContacto: TAction; actVerContacto: TAction; PngImageList: TPngImageList; dxLayoutControl1Group_Root: TdxLayoutGroup; dxLayoutControl1: TdxLayoutControl; dxLayoutControl1Item1: TdxLayoutItem; edtlNombre: TcxDBTextEdit; dxLayoutControl1Item2: TdxLayoutItem; edtNIFCIF: TcxDBTextEdit; Button1: TBitBtn; dxLayoutControl1Item7: TdxLayoutItem; Button2: TBitBtn; dxLayoutControl1Item8: TdxLayoutItem; Button3: TBitBtn; dxLayoutControl1Item9: TdxLayoutItem; dxLayoutControl1Group1: TdxLayoutGroup; dxLayoutControl1Group2: TdxLayoutGroup; dsFactura: TDADataSource; actElegirDireccion: TAction; dxLayoutControl1Group4: TdxLayoutGroup; dxLayoutControl1Item4: TdxLayoutItem; edtDireccion: TcxTextEdit; Button4: TButton; dxLayoutControl1Item5: TdxLayoutItem; dxLayoutControl1Group3: TdxLayoutGroup; procedure actElegirContactoExecute(Sender: TObject); procedure actAnadirContactoExecute(Sender: TObject); procedure actVerContactoUpdate(Sender: TObject); procedure edtDireccionPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure actVerContactoExecute(Sender: TObject); procedure actElegirDireccionUpdate(Sender: TObject); procedure actElegirDireccionExecute(Sender: TObject); procedure actElegirPersonaContactoUpdate(Sender: TObject); private FOnClienteChanged : TNotifyEvent; FMsgElegirCliente: String; protected FClientesController : IClientesController; FDireccionesController : IDireccionesContactoController; FFactura : IBizFacturaCliente; FCliente : IBizCliente; FDireccion : IBizDireccionesContacto; function GetCliente: IBizCliente; virtual; procedure SetCliente(Value: IBizCliente); virtual; function GetOnClienteChanged : TNotifyEvent; procedure SetOnClienteChanged (const Value : TNotifyEvent); procedure SetReadOnly(Value: Boolean); override; function GetID_Cliente: integer; virtual; procedure SetID_Cliente(const Value: integer); virtual; function GetFactura: IBizFacturaCliente; procedure SetFactura(const Value: IBizFacturaCliente); procedure EscribirTextoDireccion; procedure CopiarDireccionAFactura; procedure LimpiarDireccionDeFactura; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure ElegirDireccionCliente; procedure ElegirCliente; procedure VerFichaCliente; procedure AnadirNuevoCliente; procedure RefrescarDireccion; property Factura: IBizFacturaCliente read GetFactura write SetFactura; property Cliente: IBizCliente read GetCliente write SetCliente; property OnClienteChanged : TNotifyEvent read GetOnClienteChanged write SetOnClienteChanged; property ID_Cliente: integer read GetID_Cliente write SetID_Cliente; end; implementation {$R *.dfm} uses uDataModuleClientes, Math, uCustomView, uBizContactosPersonal, uDialogUtils, uStringsUtils; procedure TfrViewDatosYSeleccionClienteFacturaCliente.actElegirContactoExecute(Sender: TObject); begin ElegirCliente; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.actElegirDireccionExecute( Sender: TObject); begin inherited; ElegirDireccionCliente; EscribirTextoDireccion; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.actElegirDireccionUpdate( Sender: TObject); begin inherited; (Sender as TAction).Enabled := Assigned(FCliente.Direcciones) and (FCliente.Direcciones.Active) and (FCliente.Direcciones.RecordCount > 0); end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.actElegirPersonaContactoUpdate( Sender: TObject); begin inherited; (Sender as TAction).Enabled := Assigned(FCliente.Personal) and (FCliente.Personal.Active) and (FCliente.Personal.RecordCount > 0); end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.actAnadirContactoExecute( Sender: TObject); begin AnadirNuevoCliente; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.actVerContactoExecute( Sender: TObject); begin inherited; VerFichaCliente; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.actVerContactoUpdate(Sender: TObject); begin inherited; (Sender as TAction).Enabled := (Length(edtlNombre.Text) > 0); end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.AnadirNuevoCliente; var ACliente : IBizCliente; begin inherited; ACliente := (FClientesController.Nuevo as IBizCliente); FClientesController.Ver(ACliente); Self.Cliente := ACliente; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.CopiarDireccionAFactura; begin FFactura.Edit; FFactura.ID_DIRECCION := FDireccion.ID; if EsCadenaVacia(FDireccion.NOMBRE) then FFactura.CALLE := FDireccion.CALLE else FFactura.CALLE := FDireccion.NOMBRE + ' - ' + FDireccion.CALLE; FFactura.POBLACION := FDireccion.POBLACION; FFactura.CODIGO_POSTAL := FDireccion.CODIGO_POSTAL; FFactura.PROVINCIA := FDireccion.PROVINCIA; FFactura.IMPORTE_PORTE := FDireccion.PORTE; end; constructor TfrViewDatosYSeleccionClienteFacturaCliente.Create(AOwner: TComponent); begin inherited; FMsgElegirCliente := 'Elija el cliente al que se le realizará la factura.'; FClientesController := TClientesController.Create; FDireccionesController := TDireccionesContactoController.Create; edtlNombre.Enabled := False; edtNIFCIF.Enabled := False; edtDireccion.Enabled := False; end; destructor TfrViewDatosYSeleccionClienteFacturaCliente.Destroy; begin FClientesController := NIL; FDireccionesController := NIL; inherited; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.edtDireccionPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin inherited; ElegirDireccionCliente; EscribirTextoDireccion; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.ElegirCliente; var ACliente : IBizCliente; begin inherited; ACliente := (FClientesController.ElegirContacto(FClientesController.BuscarTodos, FMsgElegirCliente, False) as IBizCliente); if Assigned(ACliente) then Self.Cliente := ACliente; ACliente := Nil; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.ElegirDireccionCliente; var ADireccion : IBizDireccionesContacto; begin inherited; ADireccion := FClientesController.ElegirDireccionEntrega(FCliente, ' '); if Assigned(ADireccion) then begin FDireccion := ADireccion; CopiarDireccionAFactura; end; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.EscribirTextoDireccion; var ACadena : String; begin ACadena := ''; if Assigned(FDireccion) then ACadena := Format('%s %s %s %s', [FFactura.CALLE, FFactura.POBLACION, FFactura.CODIGO_POSTAL, FFactura.PROVINCIA]); edtDireccion.Text := ACadena; end; function TfrViewDatosYSeleccionClienteFacturaCliente.GetCliente: IBizCliente; begin Result := FCliente; end; function TfrViewDatosYSeleccionClienteFacturaCliente.GetID_Cliente: integer; begin Result := -1; if Assigned(FCliente) then Result := FCliente.ID; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.SetCliente(Value: IBizCliente); begin FCliente := Value; if Assigned(FCliente) then begin dsCliente.DataTable := FCliente.DataTable; if not FCliente.DataTable.Active then FCliente.DataTable.Active := True; if FCliente.Direcciones.RecordCount > 0 then begin ElegirDireccionCliente; EscribirTextoDireccion; end else begin FFactura.Edit; FFactura.ID_DIRECCIONIsNull := True; //Limpiamos la direccion que pudiera tener el anterior cliente del documento si lo tuviere. RefrescarDireccion; CopiarDireccionAFactura; EscribirTextoDireccion; end; end else begin dsCliente.DataTable := NIL; FCliente := NIL; FDireccion := NIL; end; if Assigned(FOnClienteChanged) then FOnClienteChanged(Self); end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.SetID_Cliente(const Value: integer); begin Self.Cliente := IBizCliente(FClientesController.Buscar(Value)); end; function TfrViewDatosYSeleccionClienteFacturaCliente.GetOnClienteChanged: TNotifyEvent; begin Result := FOnClienteChanged; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.LimpiarDireccionDeFactura; begin FFactura.Edit; FFactura.ClearField('ID_DIRECCION'); FFactura.ClearField('CALLE'); FFactura.ClearField('POBLACION'); FFactura.ClearField('CODIGO_POSTAL'); FFactura.ClearField('PROVINCIA'); FFactura.ClearField('IMPORTE_PORTE'); end; function TfrViewDatosYSeleccionClienteFacturaCliente.GetFactura: IBizFacturaCliente; begin Result := FFactura; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.RefrescarDireccion; begin FDireccion := FDireccionesController.Nuevo; if (not FFactura.ID_DIRECCIONIsNull) and (FDireccionesController.Localizar(FCliente.Direcciones, FFactura.ID_DIRECCION)) then FDireccionesController.CopiarDireccion(FCliente.Direcciones, FDireccion) else FDireccionesController.CopiarDireccionFiscal(FCliente, FDireccion); end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.SetOnClienteChanged( const Value: TNotifyEvent); begin FOnClienteChanged := Value; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.SetFactura( const Value: IBizFacturaCliente); begin FFactura := Value; if Assigned(FFactura) then begin dsFactura.DataTable := FFactura.DataTable; FCliente := FFactura.Cliente; dsCliente.DataTable := FCliente.DataTable; if not FCliente.DataTable.Active then FCliente.DataTable.Active := True; RefrescarDireccion; EscribirTextoDireccion; end else begin dsFactura.DataTable := NIL; FCliente := NIL; FDireccion := NIL; end; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.SetReadOnly(Value: Boolean); begin inherited; if (csLoading in Self.ComponentState) then Exit; actAnadirContacto.Enabled := not ReadOnly; actElegirContacto.Enabled := not ReadOnly; end; procedure TfrViewDatosYSeleccionClienteFacturaCliente.VerFichaCliente; begin if not Assigned(Cliente) then ShowErrorMessage('No se ha indicado un cliente', 'La factura no tiene ningún cliente asociado a mostrar.') else begin FClientesController.Ver(Cliente); end; end; end.