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 ElegirPersonaContacto; procedure ElegirDireccionCliente; 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; Button1: TBitBtn; dxLayoutControl1Item7: TdxLayoutItem; Button2: TBitBtn; dxLayoutControl1Item8: TdxLayoutItem; Button3: TBitBtn; dxLayoutControl1Item9: TdxLayoutItem; dxLayoutControl1Group1: TdxLayoutGroup; dxLayoutControl1Group2: TdxLayoutGroup; dsContrato: TDADataSource; actElegirDireccion: TAction; actElegirPersonaContacto: TAction; dxLayoutControl1Item3: TdxLayoutItem; edtPersonaContacto: TcxDBTextEdit; dxLayoutControl1Group4: TdxLayoutGroup; dxLayoutControl1Item4: TdxLayoutItem; edtDireccion: TcxMemo; Button4: TButton; dxLayoutControl1Item5: TdxLayoutItem; dxLayoutControl1Group3: TdxLayoutGroup; dxLayoutControl1Item6: TdxLayoutItem; Button5: TButton; dxLayoutControl1Group5: TdxLayoutGroup; procedure actElegirContactoExecute(Sender: TObject); procedure actAnadirContactoExecute(Sender: TObject); procedure actVerContactoUpdate(Sender: TObject); procedure edtPersonaContactoPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure edtDireccionPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure actVerContactoExecute(Sender: TObject); procedure actElegirDireccionUpdate(Sender: TObject); procedure actElegirDireccionExecute(Sender: TObject); procedure actElegirPersonaContactoExecute(Sender: TObject); procedure actElegirPersonaContactoUpdate(Sender: TObject); private FOnClienteChanged : TNotifyEvent; FMsgElegirCliente: String; protected FClientesController : IClientesController; FDireccionesController : IDireccionesContactoController; FContrato : IBizContratoCliente; 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 GetContrato: IBizContratoCliente; procedure SetContrato(const Value: IBizContratoCliente); procedure EscribirTextoDireccion; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure ElegirPersonaContacto; procedure ElegirDireccionCliente; 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, uBizContactosPersonal, uDialogUtils; procedure TfrViewDatosYSeleccionClienteContrato.actElegirContactoExecute(Sender: TObject); begin ElegirCliente; end; procedure TfrViewDatosYSeleccionClienteContrato.actElegirDireccionExecute( Sender: TObject); begin inherited; ElegirDireccionCliente; end; procedure TfrViewDatosYSeleccionClienteContrato.actElegirDireccionUpdate( Sender: TObject); begin inherited; (Sender as TAction).Enabled := Assigned(FCliente.Direcciones) and (FCliente.Direcciones.Active) and (FCliente.Direcciones.RecordCount > 0); end; procedure TfrViewDatosYSeleccionClienteContrato.actElegirPersonaContactoExecute( Sender: TObject); begin inherited; ElegirPersonaContacto; end; procedure TfrViewDatosYSeleccionClienteContrato.actElegirPersonaContactoUpdate( Sender: TObject); begin inherited; (Sender as TAction).Enabled := Assigned(FCliente.Personal) and (FCliente.Personal.Active) and (FCliente.Personal.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; FDireccion := FDireccionesController.Nuevo; edtlNombre.Enabled := False; edtNIFCIF.Enabled := False; edtDireccion.Enabled := False; edtPersonaContacto.Enabled := False; Button5.Visible := False; end; destructor TfrViewDatosYSeleccionClienteContrato.Destroy; begin FDireccion := NIL; FClientesController := NIL; FDireccionesController := NIL; inherited; end; procedure TfrViewDatosYSeleccionClienteContrato.edtDireccionPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin inherited; ElegirDireccionCliente; end; procedure TfrViewDatosYSeleccionClienteContrato.edtPersonaContactoPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin inherited; ElegirPersonaContacto; 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.ElegirDireccionCliente; var ADireccion : IBizDireccionesContacto; begin inherited; ADireccion := FClientesController.ElegirDireccionEntrega(FCliente, ' '); if Assigned(ADireccion) then begin FDireccion := ADireccion; EscribirTextoDireccion; if FDireccion.IDIsNull then begin // FContrato.ClearField('ID_DIRECCION'); FContrato.ClearField('IMPORTE_PORTE'); end else begin // FContrato.ID_DIRECCION := FDireccion.ID; FContrato.IMPORTE_PORTE := FDireccion.PORTE; end; end; end; procedure TfrViewDatosYSeleccionClienteContrato.ElegirPersonaContacto; var APersona : IBizContactoPersonal; begin inherited; APersona := FClientesController.ElegirPersonaContacto(FCliente.Personal, 'El cliente dispone de personas de contacto dadas de alta en su ficha. Seleccione la que quiere utilizar.'); if Assigned(APersona) then begin FContrato.Edit; FContrato.PERSONA_CONTACTO := APersona.NOMBRE; end; end; procedure TfrViewDatosYSeleccionClienteContrato.EscribirTextoDireccion; var ACadena : String; begin ACadena := ''; //Siempre asignaremos la direccion y persona de contacto ya sea de las direcciones del contacto o la ID_Direccion=0 que es la principal de la ficha FContrato.Edit; FContrato.CALLE := FDireccion.CALLE; FContrato.POBLACION := FDireccion.POBLACION; FContrato.PROVINCIA := FDireccion.PROVINCIA; FContrato.CODIGO_POSTAL := FDireccion.CODIGO_POSTAL; FContrato.PERSONA_CONTACTO := FDireccion.PERSONA_CONTACTO; if Assigned(FDireccion) then ACadena := Format('%s %s %s %s', [FDireccion.CALLE, FDireccion.POBLACION, FDireccion.CODIGO_POSTAL, FDireccion.PROVINCIA]); 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); begin FCliente := Value; if Assigned(FCliente) then begin dsCliente.DataTable := FCliente.DataTable; if not FCliente.DataTable.Active then FCliente.DataTable.Active := True; //Solo podremos establecer persona de contacto si se ha asignado un cliente if FCliente.ID > 0 then edtPersonaContacto.Enabled := True; if FCliente.Direcciones.RecordCount > 0 then ElegirDireccionCliente else begin FDireccionesController.CopiarDireccionFiscal(FCliente, FDireccion); EscribirTextoDireccion; end; end else begin dsCliente.DataTable := NIL; FCliente := NIL; FDireccion := NIL; edtPersonaContacto.Enabled := False; 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; function TfrViewDatosYSeleccionClienteContrato.GetContrato: IBizContratoCliente; begin Result := FContrato; end; procedure TfrViewDatosYSeleccionClienteContrato.RefrescarDireccion; begin // FDireccion := FDireccionesController.Nuevo; // if (not FContrato.ID_DIRECCIONIsNull) and // (FDireccionesController.Localizar(FCliente.Direcciones, FContrato.ID_DIRECCION)) then // FDireccionesController.CopiarDireccion(FCliente.Direcciones, FDireccion) // else // FDireccionesController.CopiarDireccionFiscal(FCliente, FDireccion); // EscribirTextoDireccion; FDireccion.Active := True; FDireccion.DataTable.Insert; try with FDireccion do begin NOMBRE := FContrato.NOMBRE; CALLE := FContrato.CALLE; POBLACION := FContrato.POBLACION; PROVINCIA := FContrato.PROVINCIA; CODIGO_POSTAL := FContrato.CODIGO_POSTAL; PERSONA_CONTACTO := FContrato.PERSONA_CONTACTO; end; finally FDireccion.DataTable.Post; end; EscribirTextoDireccion; 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; //Solo podremos establecer persona de contacto si se ha asignado un cliente if FCliente.ID > 0 then edtPersonaContacto.Enabled := True; RefrescarDireccion; end else begin dsContrato.DataTable := NIL; FCliente := NIL; FDireccion := 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.