unit uFactuGES_App; interface uses SysUtils, Classes, Forms, uBizUsuarios, uBizEmpresas, uBizEjercicios, uControllerBase, uEmpresasController, uUsuariosController, uHostManager, uConfiguracionController, uBizEmpresasTiendas; type TDoLoadModulesEvent = procedure; TDoMainFormEvent = procedure; IAppSplashForm = interface ['{9905DF57-4476-42E6-A7CD-B1479A84E220}'] procedure Show; procedure Hide; procedure Update; function GetMensaje: String; procedure SetMensaje(const AMensaje : String); property Mensaje : String read GetMensaje write SetMensaje; end; IAppFactuGES = interface ['{FB6A0F3C-C1D1-462D-AFD4-2A368F85E920}'] function GetMainForm: TCustomForm; function GetEmpresasController: IEmpresasController; function GetUsuariosController: IUsuariosController; function GetAppName: String; function GetAppFullName: String; function GetAppVersion: String; function GetUsuarioActivo: IBizUsuario; function GetEmpresaActiva: IBizEmpresa; function GetTiendaActiva: IBizEmpresaTienda; function GetEjercicioActivo: IBizEjercicio; function GetModuleManager : THostManager; function GetTerminated: Boolean; function GetConfiguracionController : IConfiguracionController; function GetLoadModulesEvent : TDoLoadModulesEvent; procedure SetLoadModulesEvent (ALoadModulesEvent : TDoLoadModulesEvent); function GetDoMainFormEvent : TDoMainFormEvent; procedure SetDoMainFormEvent (AMainFormEvent : TDoMainFormEvent); function GetAppSplashForm : IAppSplashForm; procedure SetAppSplashForm (AAppSplashForm : IAppSplashForm); procedure CambiarEmpresa(const AIDEmpresa : Integer); procedure CambiarEmpresaPorDefecto; procedure CambiarEjercicio(const AIDEmpresa : Integer); procedure ShowSplashForm; procedure HideSplashForm; procedure Run; procedure Terminate; procedure Configurar; property AppVersion : String read GetAppVersion; property AppName : String read GetAppName; property AppFullName : String read GetAppFullName; property MainForm : TCustomForm read GetMainForm; property EmpresaActiva : IBizEmpresa read GetEmpresaActiva; property TiendaActiva : IBizEmpresaTienda read GetTiendaActiva; property EjercicioActivo : IBizEjercicio read GetEjercicioActivo; property UsuarioActivo : IBizUsuario read GetUsuarioActivo; property EmpresasController : IEmpresasController read GetEmpresasController; property UsuariosController : IUsuariosController read GetUsuariosController; property AppSplashForm : IAppSplashForm read GetAppSplashForm write SetAppSplashForm; property ModuleManager : THostManager read GetModuleManager; property DoMainFormEvent : TDoMainFormEvent read GetDoMainFormEvent write SetDoMainFormEvent; property DoLoadModulesEvent : TDoLoadModulesEvent read GetLoadModulesEvent write SetLoadModulesEvent; property Terminated : Boolean read GetTerminated; property Configuracion : IConfiguracionController read GetConfiguracionController; procedure ShowCapado; end; TAppFactuGES = class(TInterfacedObject, IAppFactuGES) private FEmpresasController : IEmpresasController; FUsuariosController: IUsuariosController; FEmpresaActiva: IBizEmpresa; FTiendaActiva: IBizEmpresaTienda; FEjercicioActivo: IBizEjercicio; FConfiguracionController : IConfiguracionController; FAppSplashForm : IAppSplashForm; FHostManager : THostManager; FTerminated : Boolean; FDoMainFormEvent: TDoMainFormEvent; FDoLoadModulesEvent: TDoMainFormEvent; function GetMainForm: TCustomForm; function GetEmpresasController: IEmpresasController; function GetUsuariosController: IUsuariosController; function GetAppName: String; function GetAppFullName: String; function GetAppVersion: String; function GetUsuarioActivo: IBizUsuario; function GetEmpresaActiva: IBizEmpresa; function GetTiendaActiva: IBizEmpresaTienda; function GetEjercicioActivo: IBizEjercicio; function GetModuleManager : THostManager; function GetTerminated: Boolean; function GetConfiguracionController : IConfiguracionController; function GetLoadModulesEvent : TDoLoadModulesEvent; procedure SetLoadModulesEvent (ALoadModulesEvent : TDoLoadModulesEvent); function GetDoMainFormEvent : TDoMainFormEvent; procedure SetDoMainFormEvent (AMainFormEvent : TDoMainFormEvent); function GetAppSplashForm : IAppSplashForm; procedure SetAppSplashForm (AAppSplashForm : IAppSplashForm); procedure AfterLoadModule(Sender: TObject; AModuleInfo: TModuleInfo); procedure RegisterModule(AModuleInfo : TModuleInfo); procedure BuscarTiendaPorDefecto; protected procedure DoMainForm; procedure CargarModulos; procedure ShowSplashForm; procedure HideSplashForm; procedure UpdateSplashForm; public constructor Create; virtual; destructor Destroy; override; procedure Run; procedure Terminate; procedure Configurar; procedure CambiarEmpresa(const AIDEmpresa : Integer); procedure CambiarEmpresaPorDefecto; procedure CambiarEjercicio(const AIDEmpresa : Integer); property AppVersion : String read GetAppVersion; property AppName : String read GetAppName; property AppFullName : String read GetAppFullName; property MainForm : TCustomForm read GetMainForm; property EmpresaActiva : IBizEmpresa read GetEmpresaActiva; property TiendaActiva : IBizEmpresaTienda read GetTiendaActiva; property EjercicioActivo : IBizEjercicio read GetEjercicioActivo; property AppSplashForm : IAppSplashForm read GetAppSplashForm write SetAppSplashForm; property UsuarioActivo : IBizUsuario read GetUsuarioActivo; property EmpresasController : IEmpresasController read GetEmpresasController; property UsuariosController : IUsuariosController read GetUsuariosController; property ModuleManager : THostManager read GetModuleManager; property DoMainFormEvent : TDoMainFormEvent read GetDoMainFormEvent write SetDoMainFormEvent; property DoLoadModulesEvent : TDoLoadModulesEvent read GetLoadModulesEvent write SetLoadModulesEvent; property Terminated : Boolean read GetTerminated; property Configuracion : IConfiguracionController read GetConfiguracionController; procedure ShowCapado; end; var AppFactuGES : IAppFactuGES; implementation uses Dialogs, uDialogUtils, cxControls, uUsuariosViewRegister, uDMBase, uEmpresasViewRegister, uEjerciciosController, uAppInfoUtils; procedure TAppFactuGES.CambiarEjercicio(const AIDEmpresa: Integer); var Aux : IBizEjercicio; AEjerciciosController: IEjerciciosController; begin AEjerciciosController := TEjerciciosController.Create; try Aux := AEjerciciosController.BuscarActivo(AIDEmpresa); if Assigned(Aux) then begin Aux.DataTable.Active := True; if not Aux.IsEmpty then FEjercicioActivo := Aux; end; finally AEjerciciosController := Nil; end; end; procedure TAppFactuGES.CambiarEmpresa(const AIDEmpresa: Integer); var Aux : IBizEmpresa; begin Aux := EmpresasController.Buscar(AIDEmpresa); if Assigned(Aux) then begin Aux.DataTable.Active := True; if not Aux.IsEmpty then FEmpresaActiva := Aux; end; //Establece el ejercicio activo de la empresa activa CambiarEjercicio(AIDEmpresa); BuscarTiendaPorDefecto; end; procedure TAppFactuGES.CambiarEmpresaPorDefecto; var AEmpresas : IBizEmpresa; begin AEmpresas := FEmpresasController.BuscarTodos; try AEmpresas.DataTable.Active := True; if AEmpresas.DataTable.RecordCount > 0 then CambiarEmpresa(AEmpresas.ID); AEmpresas.DataTable.Active := False; finally AEmpresas := NIL; end; end; procedure TAppFactuGES.CargarModulos; begin if not Assigned(FDoLoadModulesEvent) then raise Exception.Create('Evento para la carga de los módulos de la aplicación no asignado (CargarModulos)'); FDoLoadModulesEvent(); end; procedure TAppFactuGES.Configurar; begin FConfiguracionController.ConfigurarAplicacion; FConfiguracionController.AplicarConfiguracion; end; procedure TAppFactuGES.BuscarTiendaPorDefecto; begin //Nos devuelve el id de la tienda a la que pertenece el vendedor que tiene asignado //el usuario con el que ha accedido a la aplicación. //Esto funciona mientras la relación sea 1 a 1, cuando sea 1 a n (un usuario pertenece a varios vendedores deja de funcionar) FTiendaActiva := EmpresasController.DarTiendaUsuario(EmpresaActiva, UsuarioActivo.ID); Assert(Assigned(FTiendaActiva)); if Assigned(FTiendaActiva) then FTiendaActiva.DataTable.Open; end; constructor TAppFactuGES.Create; begin FTerminated := False; FDoMainFormEvent := NIL; FDoLoadModulesEvent := NIL; FAppSplashForm := NIL; FEmpresaActiva := NIL; FUsuariosController := NIL; // Se crea la primera vez que se usa FEmpresasController := NIL; // Se crea la primera vez que se usa FHostManager := THostManager.Create(NIL); with FHostManager do begin OnAfterLoad := AfterLoadModule; // Ruta por defecto de los módulos BPLPath := ExtractFilePath(Application.ExeName) + PathDelim; end; FConfiguracionController := TConfiguracionController.Create; end; destructor TAppFactuGES.Destroy; begin FAppSplashForm := NIL; FHostManager.UnloadModules; FreeAndNIL(FHostManager); FConfiguracionController := NIL; FTiendaActiva := NIL; FEjercicioActivo := NIL; FEmpresaActiva := NIL; FUsuariosController := NIL; FEmpresasController := NIL; inherited; end; procedure TAppFactuGES.DoMainForm; begin if not Assigned(FDoMainFormEvent) then raise Exception.Create('Evento para la creación del formulario principal no asignado (DoMainForm)'); FDoMainFormEvent(); end; function TAppFactuGES.GetMainForm: TCustomForm; begin Result := Application.MainForm; end; function TAppFactuGES.GetDoMainFormEvent: TDoMainFormEvent; begin Result := FDoMainFormEvent; end; function TAppFactuGES.GetAppFullName: String; begin Result := uAppInfoUtils.GetAppFullName; end; function TAppFactuGES.GetAppName: String; begin Result := uAppInfoUtils.GetAppName; end; function TAppFactuGES.GetAppSplashForm: IAppSplashForm; begin Result := FAppSplashForm; end; function TAppFactuGES.GetAppVersion: String; begin Result := uAppInfoUtils.GetAppVersion; end; function TAppFactuGES.GetConfiguracionController: IConfiguracionController; begin Result := FConfiguracionController; end; function TAppFactuGES.GetEjercicioActivo: IBizEjercicio; begin Result := FEjercicioActivo; end; function TAppFactuGES.GetEmpresaActiva: IBizEmpresa; begin Result := FEmpresaActiva end; function TAppFactuGES.GetEmpresasController: IEmpresasController; begin if not Assigned(FEmpresasController) then FEmpresasController := TEmpresasController.Create; Result := FEmpresasController; end; function TAppFactuGES.GetLoadModulesEvent: TDoLoadModulesEvent; begin Result := FDoLoadModulesEvent; end; function TAppFactuGES.GetModuleManager: THostManager; begin Result := FHostManager; end; function TAppFactuGES.GetTerminated: Boolean; begin Result := FTerminated; end; function TAppFactuGES.GetTiendaActiva: IBizEmpresaTienda; begin Result := FTiendaActiva; end; function TAppFactuGES.GetUsuarioActivo: IBizUsuario; begin Result := UsuariosController.CurrentUser; end; function TAppFactuGES.GetUsuariosController: IUsuariosController; begin if not Assigned(FUsuariosController) then FUsuariosController := TUsuariosController.Create; Result := FUsuariosController; end; procedure TAppFactuGES.HideSplashForm; begin if Assigned(FAppSplashForm) then FAppSplashForm.Hide; end; procedure TAppFactuGES.AfterLoadModule(Sender: TObject; AModuleInfo: TModuleInfo); begin RegisterModule(AModuleInfo); end; procedure TAppFactuGES.RegisterModule(AModuleInfo: TModuleInfo); begin if Assigned(FAppSplashForm) then FAppSplashForm.Mensaje := 'Cargando ''' + AModuleInfo.Module.ModuleName + '''...'; end; procedure TAppFactuGES.Run; begin FConfiguracionController.AplicarConfiguracion; if UsuariosController.StartLogin then begin ShowHourglassCursor; try ShowSplashForm; CargarModulos; DoMainForm; finally HideHourglassCursor; HideSplashForm; end; Application.Run; end; Terminate; end; procedure TAppFactuGES.SetDoMainFormEvent( AMainFormEvent: TDoMainFormEvent); begin FDoMainFormEvent := AMainFormEvent; end; procedure TAppFactuGES.SetAppSplashForm(AAppSplashForm: IAppSplashForm); begin FAppSplashForm := AAppSplashForm; end; procedure TAppFactuGES.SetLoadModulesEvent( ALoadModulesEvent: TDoLoadModulesEvent); begin FDoLoadModulesEvent := ALoadModulesEvent; end; {procedure TAppFactuGES.setVAR_IDTIENDA(AValue: Integer); begin FVAR_IDTIENDA := Avalue; end; procedure TAppFactuGES.setVAR_TIENDA(AValue: String); begin FVAR_TIENDA := Avalue; end;} procedure TAppFactuGES.ShowCapado; begin ShowInfoMessage('Sin Acceso', 'Funcionalidad en desarrollo, disculpen las molestias'); end; procedure TAppFactuGES.ShowSplashForm; begin if Assigned(FAppSplashForm) then begin FAppSplashForm.Show; FAppSplashForm.Update; end; end; procedure TAppFactuGES.Terminate; begin ModuleManager.UnloadModules; FTerminated := True; end; procedure TAppFactuGES.UpdateSplashForm; begin FAppSplashForm.Update; end; initialization // Pongo esto aquí por ahora AppFactuGES := NIL; uUsuariosViewRegister.RegisterViews; uEmpresasViewRegister.RegisterViews; finalization // Pongo esto aquí por ahora AppFactuGES := NIL; uUsuariosViewRegister.UnregisterViews; uEmpresasViewRegister.UnregisterViews; end.