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) ['{02F0A00C-FAE7-43A4-B959-D2B929FF287A}'] 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 ElegirPersonaContacto; procedure ElegirDireccionCliente; 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; Button1: TBitBtn; dxLayoutControl1Item7: TdxLayoutItem; Button2: TBitBtn; dxLayoutControl1Item8: TdxLayoutItem; Button3: TBitBtn; dxLayoutControl1Item9: TdxLayoutItem; dxLayoutControl1Group1: TdxLayoutGroup; dxLayoutControl1Group2: TdxLayoutGroup; dsAlbaran: 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; FAlbaran : IBizAlbaranCliente; 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 GetAlbaran: IBizAlbaranCliente; procedure SetAlbaran(const Value: IBizAlbaranCliente); procedure EscribirTextoDireccion; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure ElegirPersonaContacto; procedure ElegirDireccionCliente; 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, uBizContactosPersonal, uDialogUtils; procedure TfrViewDatosYSeleccionClienteAlbaran.actElegirContactoExecute(Sender: TObject); begin ElegirCliente; end; procedure TfrViewDatosYSeleccionClienteAlbaran.actElegirDireccionExecute( Sender: TObject); begin inherited; ElegirDireccionCliente; end; procedure TfrViewDatosYSeleccionClienteAlbaran.actElegirDireccionUpdate( Sender: TObject); begin inherited; (Sender as TAction).Enabled := Assigned(FCliente.Direcciones) and (FCliente.Direcciones.Active) and (FCliente.Direcciones.RecordCount > 0); end; procedure TfrViewDatosYSeleccionClienteAlbaran.actElegirPersonaContactoExecute( Sender: TObject); begin inherited; ElegirPersonaContacto; end; procedure TfrViewDatosYSeleccionClienteAlbaran.actElegirPersonaContactoUpdate( Sender: TObject); begin inherited; (Sender as TAction).Enabled := Assigned(FCliente.Personal) and (FCliente.Personal.Active) and (FCliente.Personal.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 presupuesto.'; FClientesController := TClientesController.Create; FDireccionesController := TDireccionesContactoController.Create; edtlNombre.Enabled := False; edtNIFCIF.Enabled := False; edtDireccion.Enabled := False; edtPersonaContacto.Enabled := False; end; destructor TfrViewDatosYSeleccionClienteAlbaran.Destroy; begin FClientesController := NIL; FDireccionesController := NIL; inherited; end; procedure TfrViewDatosYSeleccionClienteAlbaran.edtDireccionPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin inherited; ElegirDireccionCliente; end; procedure TfrViewDatosYSeleccionClienteAlbaran.edtPersonaContactoPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin inherited; ElegirPersonaContacto; 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.ElegirDireccionCliente; var ADireccion : IBizDireccionesContacto; begin inherited; ADireccion := FClientesController.ElegirDireccionEntrega(FCliente, ' '); if Assigned(ADireccion) then begin FDireccion := ADireccion; FAlbaran.Edit; if FDireccion.IDIsNull then begin FAlbaran.ClearField('ID_DIRECCION'); FAlbaran.ClearField('IMPORTE_PORTE'); end else begin FAlbaran.ID_DIRECCION := FDireccion.ID; FAlbaran.IMPORTE_PORTE := FDireccion.PORTE; end; //Siempre asignaremos la persona de contacto ya sea de las direcciones del contacto o la ID_Direccion=0 que es la principal de la ficha FAlbaran.PERSONA_CONTACTO := FDireccion.PERSONA_CONTACTO; EscribirTextoDireccion; end; end; procedure TfrViewDatosYSeleccionClienteAlbaran.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 FAlbaran.Edit; FAlbaran.PERSONA_CONTACTO := APersona.NOMBRE; end; end; procedure TfrViewDatosYSeleccionClienteAlbaran.EscribirTextoDireccion; var ACadena : String; begin ACadena := ''; if Assigned(FDireccion) then ACadena := Format('%s %s %s %s', [FDireccion.CALLE, FDireccion.POBLACION, FDireccion.CODIGO_POSTAL, FDireccion.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); 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 FAlbaran.Edit; FAlbaran.PERSONA_CONTACTO := FCliente.PERSONA_CONTACTO; FAlbaran.ID_DIRECCIONIsNull := True; //Limpiamos la direccion que pudiera tener el anterior cliente del documento si lo tuviere. RefrescarDireccion; end; end else begin dsCliente.DataTable := NIL; FCliente := NIL; FDireccion := NIL; edtPersonaContacto.Enabled := False; 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; function TfrViewDatosYSeleccionClienteAlbaran.GetAlbaran: IBizAlbaranCliente; begin Result := FAlbaran; end; procedure TfrViewDatosYSeleccionClienteAlbaran.RefrescarDireccion; begin FDireccion := FDireccionesController.Nuevo; if (not FAlbaran.ID_DIRECCIONIsNull) and (FDireccionesController.Localizar(FCliente.Direcciones, FAlbaran.ID_DIRECCION)) then FDireccionesController.CopiarDireccion(FCliente.Direcciones, FDireccion) else FDireccionesController.CopiarDireccionFiscal(FCliente, FDireccion); EscribirTextoDireccion; 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; //Solo podremos establecer persona de contacto si se ha asignado un cliente if FCliente.ID > 0 then edtPersonaContacto.Enabled := True; RefrescarDireccion; end else begin dsAlbaran.DataTable := NIL; FCliente := NIL; FDireccion := 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 presupuesto no tiene ningún cliente asociado a mostrar.') else begin FClientesController.Ver(Cliente); end; end; end.