unit uViewDatosYSeleccionClienteContrato; 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, uBizContratosCliente, uBizDireccionesContacto, uDireccionesContactoController, Menus, cxLookAndFeelPainters, cxButtons, cxMemo; type IViewDatosYSeleccionClienteContrato = interface(IViewBase) ['{18A4627C-9E15-404A-ACAC-6A41D729F89B}'] function GetContrato: IBizContratoCliente; procedure SetContrato(const Value: IBizContratoCliente); property Contrato: IBizContratoCliente read GetContrato write SetContrato; 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 ElegirDireccionParaContrato; procedure ElegirCliente; procedure VerFichaCliente; procedure AnadirNuevoCliente; procedure RefrescarDireccion; end; TfrViewDatosYSeleccionClienteContrato = class(TfrViewBase, IViewDatosYSeleccionClienteContrato) 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; dsContrato: TDADataSource; actElegirDireccion: TAction; dxLayoutControl1Item4: TdxLayoutItem; edtDireccion: TcxMemo; bElegirDireccion: TButton; dxLayoutControl1Item5: TdxLayoutItem; dxLayoutControl1Item10: TdxLayoutItem; edtTelefonos: TcxTextEdit; dxLayoutControl1Item11: TdxLayoutItem; edtReferencia: TcxDBTextEdit; dxLayoutControl1Group6: TdxLayoutGroup; dxLayoutControl1Group7: TdxLayoutGroup; dxLayoutControl1Group3: TdxLayoutGroup; dxLayoutControl1Item3: TdxLayoutItem; edtIdioma: TcxDBTextEdit; 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; FContrato : IBizContratoCliente; 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 GetContrato: IBizContratoCliente; procedure SetContrato(const Value: IBizContratoCliente); procedure EscribirTextoDireccion; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure ElegirDireccionParaContrato; procedure ElegirCliente; procedure VerFichaCliente; procedure AnadirNuevoCliente; procedure RefrescarDireccion; property Contrato: IBizContratoCliente read GetContrato write SetContrato; 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 TfrViewDatosYSeleccionClienteContrato.actElegirContactoExecute(Sender: TObject); begin ElegirCliente; end; procedure TfrViewDatosYSeleccionClienteContrato.actElegirDireccionExecute( Sender: TObject); begin inherited; ElegirDireccionParaContrato; RefrescarDireccion; end; procedure TfrViewDatosYSeleccionClienteContrato.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 TfrViewDatosYSeleccionClienteContrato.actAnadirContactoExecute( Sender: TObject); begin AnadirNuevoCliente; end; procedure TfrViewDatosYSeleccionClienteContrato.actVerContactoExecute( Sender: TObject); begin inherited; VerFichaCliente; end; procedure TfrViewDatosYSeleccionClienteContrato.actVerContactoUpdate(Sender: TObject); begin inherited; (Sender as TAction).Enabled := (Length(edtlNombre.Text) > 0); end; procedure TfrViewDatosYSeleccionClienteContrato.AnadirNuevoCliente; var ACliente : IBizCliente; begin inherited; ACliente := (FClientesController.Nuevo as IBizCliente); FClientesController.Ver(ACliente); Self.Cliente := ACliente; end; constructor TfrViewDatosYSeleccionClienteContrato.Create(AOwner: TComponent); begin inherited; FMsgElegirCliente := 'Elija el cliente al que se le realizará el contrato.'; FClientesController := TClientesController.Create; FDireccionesController := TDireccionesContactoController.Create; edtlNombre.Enabled := False; edtNIFCIF.Enabled := False; edtDireccion.Enabled := False; edtReferencia.Enabled := False; edtTelefonos.Enabled := False; edtIdioma.Enabled := False; end; destructor TfrViewDatosYSeleccionClienteContrato.Destroy; begin FClientesController := NIL; FDireccionesController := NIL; inherited; end; procedure TfrViewDatosYSeleccionClienteContrato.edtDireccionPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin inherited; ElegirDireccionParaContrato; end; procedure TfrViewDatosYSeleccionClienteContrato.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 TfrViewDatosYSeleccionClienteContrato.ElegirDireccionParaContrato; 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 FContrato.Edit; try if ADireccion.IDIsNull then // Se ha elegido la dirección de razón social begin FContrato.ClearField('ID_DIRECCION'); FContrato.ClearField('IMPORTE_PORTE'); end else begin FContrato.ID_DIRECCION := ADireccion.ID; FContrato.IMPORTE_PORTE := ADireccion.PORTE; end; with FContrato do begin CALLE := ADireccion.CALLE; POBLACION := ADireccion.POBLACION; CODIGO_POSTAL := ADireccion.CODIGO_POSTAL; PROVINCIA := ADireccion.PROVINCIA; PAIS := ADireccion.PAIS; PERSONA_CONTACTO := ADireccion.PERSONA_CONTACTO; TELEFONO := ADireccion.TELEFONO; MOVIL := ADireccion.MOVIL; end; finally FContrato.Post; end; end; end; procedure TfrViewDatosYSeleccionClienteContrato.EscribirTextoDireccion; var ACadena : String; begin ACadena := ''; if Assigned(FContrato) then ACadena := Format('%s %s %s %s %s', [FContrato.CALLE, FContrato.POBLACION, FContrato.CODIGO_POSTAL, FContrato.PROVINCIA, FContrato.PAIS]); edtDireccion.Text := ACadena; end; function TfrViewDatosYSeleccionClienteContrato.GetCliente: IBizCliente; begin Result := FCliente; end; function TfrViewDatosYSeleccionClienteContrato.GetID_Cliente: integer; begin Result := -1; if Assigned(FCliente) then Result := FCliente.ID; end; procedure TfrViewDatosYSeleccionClienteContrato.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; ElegirDireccionParaContrato; EscribirTextoDireccion; EscribirTextoTelefonos; end else begin dsCliente.DataTable := NIL; FCliente := NIL; end; if Assigned(FOnClienteChanged) then FOnClienteChanged(Self); end; procedure TfrViewDatosYSeleccionClienteContrato.SetID_Cliente(const Value: integer); begin Self.Cliente := IBizCliente(FClientesController.Buscar(Value)); end; function TfrViewDatosYSeleccionClienteContrato.GetOnClienteChanged: TNotifyEvent; begin Result := FOnClienteChanged; end; procedure TfrViewDatosYSeleccionClienteContrato.RefrescarDireccion; begin EscribirTextoDireccion; EscribirTextoTelefonos; end; function TfrViewDatosYSeleccionClienteContrato.GetContrato: IBizContratoCliente; begin Result := FContrato; end; procedure TfrViewDatosYSeleccionClienteContrato.EscribirTextoTelefonos; var ACadena : String; begin ACadena := ''; if not FContrato.TELEFONOIsNull then ACadena := FContrato.TELEFONO; if not FContrato.MOVILIsNull then begin if ACadena <> '' then ACadena := ACadena + ' / '; ACadena := ACadena + FContrato.MOVIL; end; edtTelefonos.Text := ACadena; end; procedure TfrViewDatosYSeleccionClienteContrato.SetOnClienteChanged( const Value: TNotifyEvent); begin FOnClienteChanged := Value; end; procedure TfrViewDatosYSeleccionClienteContrato.SetContrato( const Value: IBizContratoCliente); begin FContrato := Value; if Assigned(FContrato) then begin dsContrato.DataTable := FContrato.DataTable; FCliente := FContrato.Cliente; dsCliente.DataTable := FCliente.DataTable; if not FCliente.DataTable.Active then FCliente.DataTable.Active := True; // ¿Hay cliente en el contrato? if FCliente.ID > 0 then RefrescarDireccion else begin edtDireccion.Lines.Clear; edtTelefonos.Text := ''; end; end else begin dsContrato.DataTable := NIL; FCliente := NIL; end; end; procedure TfrViewDatosYSeleccionClienteContrato.SetReadOnly(Value: Boolean); begin inherited; if (csLoading in Self.ComponentState) then Exit; actAnadirContacto.Enabled := not ReadOnly; actElegirContacto.Enabled := not ReadOnly; end; procedure TfrViewDatosYSeleccionClienteContrato.VerFichaCliente; begin if not Assigned(Cliente) then ShowErrorMessage('No se ha indicado un cliente', 'El contrato no tiene ningún cliente asociado a mostrar.') else begin FClientesController.Ver(Cliente); end; end; end.