unit uViewDatosYSeleccionClienteAlbaran; 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, uBizAlbaranesCliente, uBizDireccionesContacto, uDireccionesContactoController, Menus, cxLookAndFeelPainters, cxButtons, cxMemo; type IViewDatosYSeleccionClienteAlbaran = interface(IViewBase) ['{7C180225-6C92-4F43-948A-4F67CD9A168D}'] function GetAlbaran: IBizAlbaranCliente; procedure SetAlbaran(const Value: IBizAlbaranCliente); property Albaran: IBizAlbaranCliente read GetAlbaran write SetAlbaran; 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 ElegirDireccionParaAlbaran; procedure ElegirCliente; procedure VerFichaCliente; procedure AnadirNuevoCliente; procedure RefrescarDireccion; end; TfrViewDatosYSeleccionClienteAlbaran = class(TfrViewBase, IViewDatosYSeleccionClienteAlbaran) 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; bElegirCliente: TBitBtn; dxLayoutControl1Item7: TdxLayoutItem; bNuevoCliente: TBitBtn; dxLayoutControl1Item8: TdxLayoutItem; bVerFichaCliente: TBitBtn; dxLayoutControl1Item9: TdxLayoutItem; dxLayoutControl1Group1: TdxLayoutGroup; dxLayoutControl1Group2: TdxLayoutGroup; dsAlbaran: TDADataSource; actElegirDireccion: TAction; dxLayoutControl1Item4: TdxLayoutItem; edtDireccion: TcxMemo; bElegirDireccion: TButton; dxLayoutControl1Item5: TdxLayoutItem; dxLayoutControl1Item10: TdxLayoutItem; edtTelefonos: TcxTextEdit; dxLayoutControl1Item11: TdxLayoutItem; edtReferencia: TcxDBTextEdit; dxLayoutControl1Group6: TdxLayoutGroup; 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); private FOnClienteChanged : TNotifyEvent; FMsgElegirCliente: String; procedure EscribirTextoTelefonos; protected FClientesController : IClientesController; FDireccionesController : IDireccionesContactoController; FAlbaran : IBizAlbaranCliente; FCliente : IBizCliente; 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 GetAlbaran: IBizAlbaranCliente; procedure SetAlbaran(const Value: IBizAlbaranCliente); procedure EscribirTextoDireccion; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure ElegirDireccionParaAlbaran; procedure ElegirCliente; procedure VerFichaCliente; procedure AnadirNuevoCliente; procedure RefrescarDireccion; property Albaran: IBizAlbaranCliente read GetAlbaran write SetAlbaran; 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, uDialogUtils; procedure TfrViewDatosYSeleccionClienteAlbaran.actElegirContactoExecute(Sender: TObject); begin ElegirCliente; end; procedure TfrViewDatosYSeleccionClienteAlbaran.actElegirDireccionExecute( Sender: TObject); begin inherited; ElegirDireccionParaAlbaran; RefrescarDireccion; end; procedure TfrViewDatosYSeleccionClienteAlbaran.actElegirDireccionUpdate( Sender: TObject); begin inherited; (Sender as TAction).Enabled := Assigned(FCliente) and Assigned(FCliente.Direcciones) and (FCliente.Direcciones.Active) and (FCliente.Direcciones.RecordCount > 0); end; procedure TfrViewDatosYSeleccionClienteAlbaran.actAnadirContactoExecute( Sender: TObject); begin AnadirNuevoCliente; end; procedure TfrViewDatosYSeleccionClienteAlbaran.actVerContactoExecute( Sender: TObject); begin inherited; VerFichaCliente; end; procedure TfrViewDatosYSeleccionClienteAlbaran.actVerContactoUpdate(Sender: TObject); begin inherited; (Sender as TAction).Enabled := (Length(edtlNombre.Text) > 0); end; procedure TfrViewDatosYSeleccionClienteAlbaran.AnadirNuevoCliente; var ACliente : IBizCliente; begin inherited; ACliente := (FClientesController.Nuevo as IBizCliente); FClientesController.Ver(ACliente); Self.Cliente := ACliente; end; constructor TfrViewDatosYSeleccionClienteAlbaran.Create(AOwner: TComponent); begin inherited; FMsgElegirCliente := 'Elija el cliente al que se le realizará el albarán.'; FClientesController := TClientesController.Create; FDireccionesController := TDireccionesContactoController.Create; edtlNombre.Enabled := False; edtNIFCIF.Enabled := False; edtDireccion.Enabled := False; edtReferencia.Enabled := False; edtTelefonos.Enabled := False; end; destructor TfrViewDatosYSeleccionClienteAlbaran.Destroy; begin FClientesController := NIL; FDireccionesController := NIL; inherited; end; procedure TfrViewDatosYSeleccionClienteAlbaran.edtDireccionPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin inherited; ElegirDireccionParaAlbaran; end; procedure TfrViewDatosYSeleccionClienteAlbaran.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 TfrViewDatosYSeleccionClienteAlbaran.ElegirDireccionParaAlbaran; var ADireccion : IBizDireccionesContacto; begin if FCliente.Direcciones.RecordCount > 0 then ADireccion := FClientesController.ElegirDireccionEntrega(FCliente, 'El cliente dispone de varias direcciones. Seleccione la que quiere utilizar.') else begin ADireccion := FDireccionesController.Nuevo; FDireccionesController.CopiarDireccionFiscal(FCliente, ADireccion); end; if Assigned(ADireccion) then begin FAlbaran.Edit; try if ADireccion.IDIsNull then // Se ha elegido la dirección de razón social begin FAlbaran.ClearField('ID_DIRECCION'); FAlbaran.ClearField('IMPORTE_PORTE'); end else begin FAlbaran.ID_DIRECCION := ADireccion.ID; FAlbaran.IMPORTE_PORTE := ADireccion.PORTE; end; with FAlbaran do begin CALLE := ADireccion.CALLE; POBLACION := ADireccion.POBLACION; CODIGO_POSTAL := ADireccion.CODIGO_POSTAL; PROVINCIA := ADireccion.PROVINCIA; PERSONA_CONTACTO := ADireccion.PERSONA_CONTACTO; TELEFONO := ADireccion.TELEFONO; MOVIL := ADireccion.MOVIL; end; finally FAlbaran.Post; end; end; end; procedure TfrViewDatosYSeleccionClienteAlbaran.EscribirTextoDireccion; var ACadena : String; begin ACadena := ''; if Assigned(FAlbaran) then ACadena := Format('%s %s %s %s', [FAlbaran.CALLE, FAlbaran.POBLACION, FAlbaran.CODIGO_POSTAL, FAlbaran.PROVINCIA]); edtDireccion.Text := ACadena; end; function TfrViewDatosYSeleccionClienteAlbaran.GetCliente: IBizCliente; begin Result := FCliente; end; function TfrViewDatosYSeleccionClienteAlbaran.GetID_Cliente: integer; begin Result := -1; if Assigned(FCliente) then Result := FCliente.ID; end; procedure TfrViewDatosYSeleccionClienteAlbaran.SetCliente(Value: IBizCliente); var ADireccion : IBizDireccionesContacto; begin ADireccion := NIL; FCliente := Value; if Assigned(FCliente) then begin dsCliente.DataTable := FCliente.DataTable; if not FCliente.DataTable.Active then FCliente.DataTable.Active := True; ElegirDireccionParaAlbaran; EscribirTextoDireccion; EscribirTextoTelefonos; end else begin dsCliente.DataTable := NIL; FCliente := NIL; end; if Assigned(FOnClienteChanged) then FOnClienteChanged(Self); end; procedure TfrViewDatosYSeleccionClienteAlbaran.SetID_Cliente(const Value: integer); begin Self.Cliente := IBizCliente(FClientesController.Buscar(Value)); end; function TfrViewDatosYSeleccionClienteAlbaran.GetOnClienteChanged: TNotifyEvent; begin Result := FOnClienteChanged; end; procedure TfrViewDatosYSeleccionClienteAlbaran.RefrescarDireccion; begin EscribirTextoDireccion; EscribirTextoTelefonos; end; function TfrViewDatosYSeleccionClienteAlbaran.GetAlbaran: IBizAlbaranCliente; begin Result := FAlbaran; end; procedure TfrViewDatosYSeleccionClienteAlbaran.EscribirTextoTelefonos; var ACadena : String; begin ACadena := ''; if not FAlbaran.TELEFONOIsNull then ACadena := FAlbaran.TELEFONO; if not FAlbaran.MOVILIsNull then begin if ACadena <> '' then ACadena := ACadena + ' / '; ACadena := ACadena + FAlbaran.MOVIL; end; edtTelefonos.Text := ACadena; end; procedure TfrViewDatosYSeleccionClienteAlbaran.SetOnClienteChanged( const Value: TNotifyEvent); begin FOnClienteChanged := Value; end; procedure TfrViewDatosYSeleccionClienteAlbaran.SetAlbaran( const Value: IBizAlbaranCliente); begin FAlbaran := Value; if Assigned(FAlbaran) then begin dsAlbaran.DataTable := FAlbaran.DataTable; FCliente := FAlbaran.Cliente; dsCliente.DataTable := FCliente.DataTable; if not FCliente.DataTable.Active then FCliente.DataTable.Active := True; // ¿Hay cliente en el albaran? if FCliente.ID > 0 then RefrescarDireccion else begin edtDireccion.Lines.Clear; edtTelefonos.Text := ''; end; end else begin dsAlbaran.DataTable := NIL; FCliente := NIL; end; end; procedure TfrViewDatosYSeleccionClienteAlbaran.SetReadOnly(Value: Boolean); begin inherited; if (csLoading in Self.ComponentState) then Exit; actAnadirContacto.Enabled := not ReadOnly; actElegirContacto.Enabled := not ReadOnly; end; procedure TfrViewDatosYSeleccionClienteAlbaran.VerFichaCliente; begin if not Assigned(Cliente) then ShowErrorMessage('No se ha indicado un cliente', 'El albarán no tiene ningún cliente asociado a mostrar.') else begin FClientesController.Ver(Cliente); end; end; end.