//------------------------------------------------------------ public CResultAErreur PurgeEntites(Type typeObjets, int[] lstIds) { CResultAErreur result = CResultAErreur.True; CSessionClient session = CSessionClient.GetSessionForIdSession(IdSession); IInfoUtilisateur info = session != null?session.GetInfoUtilisateur() : null; if (info == null) { result.EmpileErreur(I.T("Invalid session in Purge entities|20014")); return(result); } if (info.GetDonneeDroit(CDroitDeBaseSC2I.c_droitAdministrationSysteme) == null) { result.EmpileErreur(I.T("Purge entity is allowed to administrators only|20015")); return(result); } result = session.BeginTrans(); if (!result) { return(result); } CDonneeNotificationModificationContexteDonnee dataModif = new CDonneeNotificationModificationContexteDonnee(IdSession); result = PurgeEntites(typeObjets, lstIds, dataModif); if (result) { CEnvoyeurNotification.EnvoieNotifications(new IDonneeNotification[] { dataModif }); result = session.CommitTrans(); } else { session.RollbackTrans(); } return(result); }
//------------------------------------------------------ static void racine_KeyDown(object sender, KeyEventArgs e) { if (e.Alt && e.Shift && e.KeyCode == Keys.F7) { CSessionClient session = CSessionClient.GetSessionUnique(); IInfoUtilisateur info = session != null?session.GetInfoUtilisateur() : null; if (info != null) { if (info.GetDonneeDroit(CDroitDeBaseSC2I.c_droitInterface) != null) { CSetupVisibiliteControles setup = new CSetupVisibiliteControles(); Control ctrl = sender as Control; if (ctrl != null) { Form frm = ctrl.FindForm(); if (frm != null) { setup = GetSetupForWindow(session, frm); CFormSetupFenetreDynamique.ShowArbre(frm, setup); SetSetupForWindow(session, frm, setup); setup.Apply(frm, false); } } } } } }
/// ////////////////////////////////////////// public CResultAErreur OpenSession( IAuthentificationSession authentification, string strDescription, CSessionClient sessionParente) { CResultAErreur result = CResultAErreur.True; if (sessionParente != null) { m_sessionParente = sessionParente; m_sponsor.Register(m_sessionParente); IInfoUtilisateur info = sessionParente.GetInfoUtilisateur(); if (info != null) { m_strNomUtilisateurSource = info.NomUtilisateur; } ConfigurationsImpression = sessionParente.ConfigurationsImpression; } else { m_strNomUtilisateurSource = I.T("Unknown|10000"); } /////////////////////////////////////////////// return(base.OpenSession(authentification, strDescription, ETypeApplicationCliente.Process)); }
//------------------------------------------------------ public static void AppliqueToForm(Form racine) { if (racine == null) { return; } racine.KeyPreview = true; racine.KeyDown -= m_handlerKey; CSessionClient session = CSessionClient.GetSessionUnique(); IInfoUtilisateur info = session != null?session.GetInfoUtilisateur() : null; bool bIsAdmin = false; if (info != null) { if (info.GetDonneeDroit(CDroitDeBaseSC2I.c_droitInterface) != null) { bIsAdmin = true; racine.KeyDown += m_handlerKey; } } CSetupVisibiliteControles setup = GetSetupForWindow(session, racine); if (setup != null && ( !bIsAdmin || (GetKeyState(0x10) & 0xF000) != 0xF000 || //SHIFT (GetKeyState(0x12) & 0xF000) != 0xF000)) //ALT { setup.Apply(racine, false); } }
//--------------------------------------------------------------------------------------------- public CUserTimosWebApp(CSessionClient session, DataRow row, string strLogin) { if (session != null) { IInfoUtilisateur infosUser = session.GetInfoUtilisateur(); if (infosUser != null) { row[c_champUserName] = infosUser.NomUtilisateur; row[c_champUserLogin] = strLogin; row[c_champUserKey] = infosUser.KeyUtilisateur.StringValue; row[c_champSessionId] = session.IdSession; bool bIsAdministrator = false; CDbKey keyGroupeAdminWeb = CTimosWebAppRegistre.WebAdminGroupKey; if (keyGroupeAdminWeb != null && infosUser.ListeKeysGroupes.Contains(keyGroupeAdminWeb)) { bIsAdministrator = true; } row[c_champIsAdministrator] = bIsAdministrator; m_row = row; m_dicoProperties = new Dictionary <string, object>(); m_dicoProperties[c_champUserName] = infosUser.NomUtilisateur; m_dicoProperties[c_champUserLogin] = strLogin; m_dicoProperties[c_champUserKey] = infosUser.KeyUtilisateur.StringValue; m_dicoProperties[c_champSessionId] = session.IdSession; m_dicoProperties[c_champIsAdministrator] = bIsAdministrator; } } }
public CResultAErreur DémarreWorkflow(CTypeEtapeWorkflow typeEtapeDebut, bool bStartImmediate) { CSessionClient session = CSessionClient.GetSessionForIdSession(ContexteDonnee.IdSession); IInfoUtilisateur info = session != null?session.GetInfoUtilisateur() : null; if (info != null) { //TESTDBKEYOK KeyManager = info.KeyUtilisateur; } CResultAErreur result = CResultAErreur.True; if (EtapesEnCours.Count != 0) { result.EmpileErreur(I.T("Workflow was already started|20073")); return(result); } if (typeEtapeDebut == null || typeEtapeDebut.Workflow != TypeWorkflow//cas pourri : l'étape de début n'est pas valide pour ce workflow ça ne doit pas arriver ) { if (TypeWorkflow == null) { result.EmpileErreur(I.T("Workflow type should be set before it starts|20077")); return(result); } typeEtapeDebut = TypeWorkflow.EtapeDemarrageDefaut; if (typeEtapeDebut == null) { result.EmpileErreur(I.T("Workflow type @1 doesn't have any start point|20074", TypeWorkflow != null?TypeWorkflow.Libelle:"???")); return(result); } } using (CContexteDonnee ctx = new CContexteDonnee(ContexteDonnee.IdSession, true, false)) { ///Si bStartImmediate, travaille dans un contexte spécifique qui est sauvé tout de suite CContexteDonnee contexteDeTravail = bStartImmediate ? ctx : ContexteDonnee; CWorkflow wkf = GetObjetInContexte(contexteDeTravail) as CWorkflow; typeEtapeDebut = typeEtapeDebut.GetObjetInContexte(contexteDeTravail) as CTypeEtapeWorkflow; CResultAErreurType <CEtapeWorkflow> resEtape = wkf.CreateOrGetEtapeInCurrentContexte(typeEtapeDebut); if (resEtape) { CEtapeWorkflow etape = resEtape.DataType; etape.DemandeDemarrageInCurrentContext(null); } else { result.EmpileErreur(resEtape.Erreur); } IsRunning = true; RunGeneration++; if (result && bStartImmediate) { result = ctx.SaveAll(true); } } return(result); }
public CInfoSessionAsDynamicClass[] GetInfosSessionsActives() { List <CInfoSessionAsDynamicClass> lst = new List <CInfoSessionAsDynamicClass>(); int[] listeIdSessions = GetListeIdSessionsConnectees(); foreach (int nId in listeIdSessions) { CInfoSessionAsDynamicClass infoSession = new CInfoSessionAsDynamicClass(); infoSession.IdSession = nId; CDbKey keyUtilisateur = null; IInfoSession session = GetSessionClient(nId); try { session.GetInfoUtilisateur(); } catch { session = GetSessionClientSurServeur(nId); infoSession.Invalide = true; session = GetSessionClientSurServeur(nId); } if (session == null) { infoSession.Invalide = true; session = GetSessionClientSurServeur(nId); infoSession.NomUtilisateur = I.T("ACCESS ERROR|20000"); } try { infoSession.NomUtilisateur = session.GetInfoUtilisateur().NomUtilisateur; IInfoUtilisateur info = session.GetInfoUtilisateur(); //TESTDBKEYOK keyUtilisateur = info.KeyUtilisateur; infoSession.KeyUtilisateur = info.KeyUtilisateur; DateTime dt = session.DateHeureConnexion; infoSession.DateDebutConnexion = dt; infoSession.DateDerniereActivité = session.DateHeureDerniereActivite; infoSession.LibelleSession = session.DescriptionApplicationCliente; } catch { if (nId == 0) { infoSession.NomUtilisateur = I.T("Server|20001"); } else { infoSession.Invalide = true; infoSession.NomUtilisateur = I.T("ACCESS ERROR|20000"); } } infoSession.IsSystem = keyUtilisateur == null; lst.Add(infoSession); } return(lst.ToArray()); }
/// ////////////////////////////////////////////////////////////////// public CCacheInfoUtilisateurSurClient(int nIdSession, IInfoUtilisateur infoServeur) { m_nIdSession = nIdSession; m_infoUtilisateurSurServeur = infoServeur; m_sponsor.Register(m_infoUtilisateurSurServeur); InitFromInfoServeur(); m_recepteurNotificationChangementDroit = new CRecepteurNotification(m_nIdSession, typeof(CDonneeNotificationChangementDroitUtilisateur)); m_recepteurNotificationChangementDroit.OnReceiveNotification += new NotificationEventHandler(OnNotificationChangementDroit); }
//--------------------------------------------------------- /// <summary> /// Stocke les informations de fin d'étape dans l'étape /// <BR></BR>Cette méthode ne doit pas être utilisée en dehors d'un appel par l'objet serveur /// </summary> /// <returns></returns> public CResultAErreur InternalSetInfosTerminéeInCurrentContexte(EEtatEtapeWorkflow etat) { DateFin = DateTime.Now; CSessionClient session = CSessionClient.GetSessionForIdSession(ContexteDonnee.IdSession); IInfoUtilisateur info = session != null?session.GetInfoUtilisateur() : null; //TESTDBKEYOK KeyTermineur = info != null ? info.KeyUtilisateur : null; EtatCode = (int)etat; return(CResultAErreur.True); }
/// ////////////////////////////////////////////////////////////////// public void Dispose() { m_sponsor.Unregister(m_infoUtilisateurSurServeur); m_infoUtilisateurSurServeur = null; m_sponsor.Dispose(); m_sponsor = null; if (m_recepteurNotificationChangementDroit != null) { m_recepteurNotificationChangementDroit.Dispose(); } m_recepteurNotificationChangementDroit = null; }
public static bool UtilisateurConnecteIsUserManager(CContexteDonnee ctx) { IDonneeDroitUtilisateur data = null; CSessionClient session = CSessionClient.GetSessionForIdSession(ctx.IdSession); if (session != null) { IInfoUtilisateur infoUser = session.GetInfoUtilisateur(); if (infoUser != null) { data = infoUser.GetDonneeDroit(CDroitDeBase.c_droitBaseGestionUtilisateurs); } } return(data != null); }
/// ////////////////////////////////////////////////// protected override void MyInitValeurDefaut() { DateCreation = DateTime.Now; CSessionClient session = CSessionClient.GetSessionForIdSession(ContexteDonnee.IdSession); IInfoUtilisateur info = session != null?session.GetInfoUtilisateur() : null; //TESTDBKEYOK if (info != null) { KeyManager = info.KeyUtilisateur; } else { KeyManager = null; } IsRunning = false; RunGeneration = 0; }
//------------------------------------------------------ public void InitForObjet(CObjetDonneeAIdNumerique objet, CVersionDonnees version) { CSessionClient session = CSessionClient.GetSessionForIdSession(objet.ContexteDonnee.IdSession); IInfoUtilisateur info = session.GetInfoUtilisateur(); if (info != null) { m_bCanRestore = info.GetDonneeDroit(CDroitDeBaseSC2I.c_droitAdministration) != null; } m_bCanRestore &= version != null && version.TypeVersion.Code == CTypeVersion.TypeVersion.Archive; m_panelRestore.Visible = m_bCanRestore; if (m_contexteDonnees != null) { m_contexteDonnees.Dispose(); } m_tableValeurs.Clear(); m_objetDepart = null; m_version = null; m_arbreObjet.Nodes.Clear(); if (objet == null || version == null) { return; } m_contexteDonnees = new CContexteDonnee(objet.ContexteDonnee.IdSession, true, false); m_contexteDonnees.SetVersionDeTravail(-1, false); //Travaille sur toutes les versions m_objetDepart = (CObjetDonneeAIdNumerique)m_contexteDonnees.GetObjetInThisContexte(objet); m_version = (CVersionDonnees)m_contexteDonnees.GetObjetInThisContexte(version); List <int> lstIds = new List <int>(); if (m_version.TypeVersion.Code == CTypeVersion.TypeVersion.Previsionnelle) { CVersionDonnees verTmp = m_version.VersionParente; while (verTmp != null) { lstIds.Add(verTmp.Id); verTmp = verTmp.VersionParente; } } m_nIdsVersionsSuccessives = lstIds.ToArray(); CreateNodeObjet(m_arbreObjet.Nodes, m_objetDepart); }
public static void AddToMenuParent(ToolStripMenuItem menu, string strContexte, object objet) { if (objet == null) { return; } CModeleTexte modeleSel = CTimosAppRegistre.GetModeleTexteForType(strContexte, objet.GetType()); CListeObjetsDonnees liste = new CListeObjetsDonnees(CSc2iWin32DataClient.ContexteCourant, typeof(CModeleTexte)); liste.Filtre = new CFiltreData(CModeleTexte.c_champTypeAssocie + "=@1", objet.GetType().ToString()); foreach (CModeleTexte modele in liste) { CMenuModeleTexte menuModele = new CMenuModeleTexte(modele, strContexte, objet); if (modeleSel != null && modele.Id == modeleSel.Id) { menuModele.Checked = true; } menuModele.MouseUp += new MouseEventHandler(menuModele.menuModele_MouseUp); menu.DropDownItems.Add(menuModele); } CSessionClient session = CSessionClient.GetSessionForIdSession(CSc2iWin32DataClient.ContexteCourant.IdSession); if (session != null) { IInfoUtilisateur info = session.GetInfoUtilisateur(); if (info != null && info.GetDonneeDroit(CDroitDeBaseSC2I.c_droitAdministration) != null) { menu.DropDownItems.Add(new ToolStripSeparator()); CMenuModeleTexte menuModeleAdd = new CMenuModeleTexte(null, strContexte, objet); menuModeleAdd.Text = I.T("Add|124"); menuModeleAdd.Click += new EventHandler(menuModeleAdd.itemAddMenu_Click); menu.DropDownItems.Add(menuModeleAdd); } } if (menu.DropDownItems.Count == 0) { menu.Visible = false; } }
/// ////////////////////////////////////////////////// public override CResultAErreur TraitementApresSauvegarde(sc2i.data.CContexteDonnee contexte, bool bOperationReussie) { CResultAErreur result = CResultAErreur.True; result = base.TraitementApresSauvegarde(contexte, bOperationReussie); if (!result) { return(result); } DataTable table = contexte.Tables[GetNomTable()]; List <DataRow> lstRowsEtapesADemarrer = table == null ? null : table.ExtendedProperties[c_constEtapesADemarre] as List <DataRow>; if (lstRowsEtapesADemarrer != null && lstRowsEtapesADemarrer.Count > 0) { int? nIdSessionMain = IdSession; CDbKey keyUtilisateur = null; CSessionClient session = CSessionClient.GetSessionForIdSession(IdSession); if (session != null) { IInfoUtilisateur info = session.GetInfoUtilisateur(); //TESTDBKEYOK if (info != null) { keyUtilisateur = info.KeyUtilisateur; } CSousSessionClient sousSession = session as CSousSessionClient; if (sousSession != null) { nIdSessionMain = sousSession.RootSession.IdSession; } } List <CParametresStartEtapeInPile> lstToStart = new List <CParametresStartEtapeInPile>(); foreach (DataRow row in lstRowsEtapesADemarrer) { //Ancien mode, avant 13/9/2013 //RunEtapeInThread ( (int)row[CEtapeWorkflow.c_champId]); //TESTDBKEYOK lstToStart.Add(new CParametresStartEtapeInPile( nIdSessionMain, (int)row[CEtapeWorkflow.c_champId], keyUtilisateur)); } CPileExecutionEtapes.AddEtapesADemarrer(lstToStart.ToArray()); } return(result); }
public static CActeur UtilisateurActuel(CContexteDonnee ctx) { CSessionClient session = CSessionClient.GetSessionForIdSession(ctx.IdSession); if (session != null) { IInfoUtilisateur infoUser = session.GetInfoUtilisateur(); if (infoUser != null) { CDonneesActeurUtilisateur data = new CDonneesActeurUtilisateur(ctx); //TESTDBKEYOK if (data.ReadIfExists(infoUser.KeyUtilisateur)) { return(data.Acteur); } } } return(null); }
private void AppliqueRestrictions() { IInfoUtilisateur infoUser = CTimosApp.SessionClient.GetInfoUtilisateur(); if (infoUser != null) { int?nIdVersion = CSc2iWin32DataClient.ContexteCourant.IdVersionDeTravail; CListeRestrictionsUtilisateurSurType restrictions = infoUser.GetListeRestrictions(nIdVersion); if (restrictions != null) { CRestrictionUtilisateurSurType rest; rest = restrictions.GetRestriction(typeof(CTicket)); switch (rest.RestrictionGlobale) { case ERestriction.Aucune: m_lnkNouveauTicket.Visible = true; break; case ERestriction.Hide: m_lnkNouveauTicket.Visible = false; break; case ERestriction.NoCreate: m_lnkNouveauTicket.Visible = false; break; case ERestriction.NoDelete: m_lnkNouveauTicket.Visible = true; break; case ERestriction.ReadOnly: m_lnkNouveauTicket.Visible = false; break; default: m_lnkNouveauTicket.Visible = true; break; } } } }
//------------------------------------------------------------------------------------ public void GetInfosPopup(IDonneeNotification donnee, ref bool bShouldDisplay, ref string strLibelle, ref Image image) { bShouldDisplay = false; CDonneeNotificationBesoinIntervention db = donnee as CDonneeNotificationBesoinIntervention; if (db == null) { return; } if (!db.IsDelete) { //TESTDBKEYOK IInfoUtilisateur info = CTimosApp.SessionClient.GetInfoUtilisateur(); if (info != null && info.KeyUtilisateur == db.KeyUtilisateurConcerne) { strLibelle = db.Libelle; image = Resources.alerte; bShouldDisplay = true; } } }
public static IDonneeDroitUtilisateur GetDonneeDroitForSession(int nIdSession, string strCodeDroit) { try { CSessionClient session = CSessionClient.GetSessionForIdSession(nIdSession); if (session == null) { return(null); } IInfoUtilisateur info = session.GetInfoUtilisateur(); if (info == null) { return(null); } return(info.GetDonneeDroit(strCodeDroit)); } catch { } return(null); }
//--------------------------------------------------------- /// <summary> /// Stocke les différentes informations pour le démarrage d'une étape /// (date de début, date de fin à null, idDémarreur et IdTermineur à null) /// <BR></BR>Cette méthode ne doit pas être utilisée en dehors d'un appel par l'objet serveur /// </summary> /// <returns></returns> public CResultAErreur InternalSetInfosDemarrageInCurrentContext() { if (DateDebut != null && DateFin != null) { //Historise l'étape CEtapeWorkflowHistorique h = new CEtapeWorkflowHistorique(ContexteDonnee); h.CreateNewInCurrentContexte(); h.DateDebut = DateDebut.Value; h.DateFin = DateFin.Value; //TESTDBKEYOK h.KeyDémarreur = KeyDémarreur; h.KeyTermineur = KeyTermineur; h.CodesRetourString = CodesRetourString; h.EtatCode = EtatCode; h.EtapeAppelante = EtapeAppelante; h.Etape = this; h.RunGeneration = RunGeneration; } DateDebut = DateTime.Now; RunGeneration = Workflow.RunGeneration; DateFin = null; CodesRetour = new string[0]; CSessionClient session = CSessionClient.GetSessionForIdSession(ContexteDonnee.IdSession); if (session is CSousSessionClient) { session = ((CSousSessionClient)session).RootSession; } IInfoUtilisateur info = session != null?session.GetInfoUtilisateur() : null; KeyDémarreur = info != null ? info.KeyUtilisateur : null; KeyTermineur = null; EtatCode = (int)EEtatEtapeWorkflow.ADemarrer; if (Workflow.EtapeAppelante != null && Workflow.EtapeAppelante.Etat.Code != EEtatEtapeWorkflow.Démarrée) { Workflow.EtapeAppelante.OnDemarrageDepuisSousWorkflow(); } Workflow.IsRunning = true; return(CResultAErreur.True); }
/// /////////////////////////////////////////////////// public IInfoUtilisateur[] GetUtilisateursConnectes() { List <IInfoUtilisateur> lst = new List <IInfoUtilisateur>(); lock (typeof(CLockerListeSessions)) { foreach (CSessionClientSurServeur session in m_listeSessions.Values) { try { IInfoUtilisateur user = session.GetInfoUtilisateur(); if (user != null && user.KeyUtilisateur != null) { lst.Add(user); } } catch { } } } return(lst.ToArray()); }
//--------------------------------------------------- public static void EditeProjet( CProjet projet, bool bModeEdition, CFormEditionStandard formAppelante) { CFormQuickEditProjet form = new CFormQuickEditProjet(); form.m_formAppelante = formAppelante; form.m_gestionnaireModeEdition.ModeEdition = bModeEdition; form.m_projet = projet; IInfoUtilisateur info = CTimosApp.SessionClient.GetInfoUtilisateur(); if (info != null) { CRestrictionUtilisateurSurType restriction = info.GetRestrictionsSurObjet(projet, projet.ContexteDonnee.IdVersionDeTravail); if (restriction != null) { form.m_listeRestrictions.SetRestriction(restriction); } } CListeRestrictionsUtilisateurSurType restrictionsEnPlus = CDroitEditionType.GetDroits(projet); if (restrictionsEnPlus != null) { form.m_listeRestrictions.Combine(restrictionsEnPlus); } CRestrictionUtilisateurSurType rest = form.m_listeRestrictions.GetRestriction(typeof(CProjet)); form.m_gestionnaireModeEdition.ModeEdition = bModeEdition && (rest.RestrictionGlobale & ERestriction.ReadOnly) != ERestriction.ReadOnly; form.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width / 2 - form.Width / 2, Screen.PrimaryScreen.WorkingArea.Height / 2 - form.Height / 2); form.ShowDialog(); form.Dispose(); }
/////////////////////////////////////////////////// public override CResultAErreur TraitementAvantSauvegarde(CContexteDonnee contexte) { CResultAErreur result = base.TraitementAvantSauvegarde(contexte); CSessionClient session = CSessionClient.GetSessionForIdSession(IdSession); //Annule les modifications sur les champs interdits en modification DataTable table = contexte.Tables[GetNomTable()]; //Objet témoin pour vérifier les valeurs non affectées CRelationElementAChamp_ChampCustom relTemoin = null; if (IdVersionDeTravail != null) //Dans les versions, on ne stocke pas les créations de valeurs nulles { relTemoin = (CRelationElementAChamp_ChampCustom)contexte.GetNewObjetForTable(table); relTemoin.CreateNewInCurrentContexte(); } if (table != null && session != null) { IInfoUtilisateur user = session.GetInfoUtilisateur(); if (user != null) { ArrayList lst = new ArrayList(table.Rows); IElementAChamps lastElt = null; CRestrictionUtilisateurSurType restDeBase = null; CRestrictionUtilisateurSurType restAppliquee = null; foreach (DataRow row in lst) { CRelationElementAChamp_ChampCustom rel = (CRelationElementAChamp_ChampCustom)contexte.GetNewObjetForRow(row); if (row.RowState == DataRowState.Added && relTemoin != null) { if (relTemoin.Valeur != null && relTemoin.Valeur.Equals(rel.Valeur) || relTemoin.Valeur == null && relTemoin.Valeur == null) { rel.CancelCreate(); } } if (row.RowState == DataRowState.Modified || row.RowState == DataRowState.Added) { if (restDeBase == null) { Type tp = rel.ElementAChamps.GetType(); restDeBase = user.GetRestrictionsSur(tp, contexte.IdVersionDeTravail); } if (restDeBase != null && rel.ElementAChamps.Equals(lastElt)) { restAppliquee = restDeBase.Clone() as CRestrictionUtilisateurSurType; } //Vérifie qu'on a le droit if (!rel.ElementAChamps.Equals(lastElt) && restAppliquee != null) { restAppliquee.ApplyToObjet(rel.ElementAChamps); } lastElt = rel.ElementAChamps; if (restAppliquee != null) { ERestriction restChamp = restAppliquee.GetRestriction(rel.ChampCustom.CleRestriction); if ((restChamp & ERestriction.ReadOnly) == ERestriction.ReadOnly) { row.RejectChanges(); } } } } } } if (relTemoin != null) { relTemoin.CancelCreate(); } return(result); }
public bool StartWorkflowMultiSteps(ArrayList listEtapesToStart) { CSessionClient session = CSessionClient.GetSessionForIdSession(ContexteDonnee.IdSession); IInfoUtilisateur info = session != null?session.GetInfoUtilisateur() : null; if (info != null) { KeyManager = info.KeyUtilisateur; } CResultAErreur result = CResultAErreur.True; if (TypeWorkflow.Etapes.Count == 0) { if (EtapeAppelante != null) { EtapeAppelante.EndEtapeNoSave(); return(true); } } foreach (object stepsPath in listEtapesToStart) { if (!(stepsPath is string)) { throw new Exception(I.T("Invalid parameter for 'StartWorkflowMultiSteps'. Parameter must be an array of steps type path (separated by points).|20106")); } string strPath = (string)stepsPath; int nPosPoint = strPath.IndexOf('.'); string strStepType = ""; string strSuitePath = ""; if (nPosPoint > 0) { strStepType = strPath.Substring(0, nPosPoint); strSuitePath = strPath.Substring(nPosPoint + 1); } else { strStepType = strPath; } CTypeEtapeWorkflow typeEtape = null; if (strStepType.Trim().Length == 0) { typeEtape = TypeWorkflow.EtapeDemarrageDefaut; } else { CListeObjetsDonnees lst = TypeWorkflow.Etapes; lst.Filtre = new CFiltreData(CTypeEtapeWorkflow.c_champIdUniversel + "=@1", strStepType); if (lst.Count > 0) { typeEtape = lst[0] as CTypeEtapeWorkflow; } if (typeEtape == null) { throw new Exception(I.T("Step type @1 can not be found|20107")); } } CResultAErreurType <CEtapeWorkflow> resEtape = CreateOrGetEtapeInCurrentContexte(typeEtape); if (resEtape) { CEtapeWorkflow etape = resEtape.DataType; etape.StartWithPath(strSuitePath); } else { result.EmpileErreur(resEtape.Erreur); } IsRunning = true; RunGeneration++; } return(result); }
//---------------------------------------------------------------------------------- public virtual CResultAErreur InsertDataInDataSet( IEnumerable list, DataSet ds, ITableExport tableParente, int[] nValeursCle, RelationAttribute relationToObjetParent, IElementAVariablesDynamiquesAvecContexteDonnee elementAVariablePourFiltres, CCacheValeursProprietes cacheValeurs, ITableExport tableFilleANePasCharger, bool bAvecOptimisation, CConteneurIndicateurProgression indicateur) { CResultAErreur result = CResultAErreur.True; if (NePasCalculer) { return(result); } if (tableParente != null && nValeursCle.Length == 0) { return(result); } DataTable table = ds.Tables[NomTable]; if (table == null) { result.EmpileErreur(I.T("Table @1 doesn't exist|116", NomTable)); return(result); } indicateur.SetInfo(I.T("Table @1|115", NomTable)); if (nValeursCle.Length > 1 && relationToObjetParent == null) { result.EmpileErreur(I.T("Error: Multiple child table loading without knowing the relation indicating how the parental link is established|117")); return(result); } DataColumn colFilleDeContrainte = null; DataTable tableFilleDeContrainte = null; if (tableParente != null) { if (ChampOrigine.TypeDonnee.IsArrayOfTypeNatif || !bAvecOptimisation || ChampOrigine is CDefinitionProprieteDynamiqueThis) { //On est dans une relation fille foreach (Constraint constraint in table.Constraints) { if (constraint is ForeignKeyConstraint) { ForeignKeyConstraint fkConst = (ForeignKeyConstraint)constraint; if (fkConst.RelatedTable.TableName == tableParente.NomTable) { colFilleDeContrainte = fkConst.Columns[0]; break; } } } tableFilleDeContrainte = table; } else { //On est dans une relation parente DataTable tblP = ds.Tables[tableParente.NomTable]; foreach (Constraint contraint in tblP.Constraints) { if (contraint is ForeignKeyConstraint) { ForeignKeyConstraint fk = (ForeignKeyConstraint)contraint; if (fk.RelatedTable.TableName == table.TableName) { colFilleDeContrainte = fk.Columns[0]; tableFilleDeContrainte = tblP; break; } } } } } if (list == null) { return(result); } //Désactive les ids auto sur les objetDonneeAIdNumerique. //Car on utilise alors les valeurs de clé des éléments bool bUtiliserIdObjets = false; if (bAvecOptimisation && (ChampOrigine == null || ChampOrigine.NomPropriete.IndexOf('.') < 0 || !ChampOrigine.TypeDonnee.IsArrayOfTypeNatif)) { if (list is CListeObjetsDonnees && (tableParente == null || colFilleDeContrainte == null)) { if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(((CListeObjetsDonnees)list).TypeObjets)) { table.PrimaryKey[0].AutoIncrement = false; bUtiliserIdObjets = true; } } if (list is ArrayList) { ArrayList arrL = (ArrayList)list; if (arrL.Count > 0 && typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(arrL[0].GetType())) { table.PrimaryKey[0].AutoIncrement = false; bUtiliserIdObjets = true; } } } if (FiltreAAppliquer != null) { CListeObjetsDonnees listeObjetsDonnee = list as CListeObjetsDonnees; if (listeObjetsDonnee == null)//Tente de convertir en liste d'objets { //Récupère le contexte de données CContexteDonnee ctx = null; foreach (object obj in list) { IObjetAContexteDonnee objACtx = obj as IObjetAContexteDonnee; if (objACtx != null) { ctx = objACtx.ContexteDonnee; break; } } listeObjetsDonnee = CListeObjetsDonnees.CreateListFrom(ctx, list); } if (listeObjetsDonnee != null) { list = listeObjetsDonnee; result = GetFiltreDataAAppliquer(elementAVariablePourFiltres); if (!result) { result.EmpileErreur(I.T("Error in the filter of the table @1|119", NomTable)); return(result); } try { if (result.Data != null) { listeObjetsDonnee.Filtre = CFiltreData.GetAndFiltre(listeObjetsDonnee.Filtre, (CFiltreData)result.Data); } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); result.EmpileErreur(I.T("Error during combination of table @1 filter|120", NomTable)); return(result); } } } //Table fille-> //si relation : Attribut relation (parente) représentant le lien entre la relation fille et cette tablle //Si donnée cumulée : true Hashtable tableTablesFillesToDependanceDirecte = new Hashtable(); //Table parente->Champ fille contenant l'id Hashtable tableParentsCharges = new Hashtable(); #region Optimisations des CListeObjetsDonnees if (bAvecOptimisation && list is CListeObjetsDonnees) { CListeObjetsDonnees listeObjets = (CListeObjetsDonnees)list; if (bUtiliserIdObjets) { #region Identifie les tables filles qui peuvent être remplies en une seule requête. //Identifie les sous tables qui peuvent être chargées en une seule fois : //Il s'agit des sous tables liée directement à une propriété par //des relations (attribut RelationFille ou Relation). foreach (ITableExport tableFille in TablesFilles) { Type tpAnalyse = listeObjets.TypeObjets; if (tableFille != tableFilleANePasCharger && (tableFille is C2iTableExportATableFille || tableFille is C2iTableExportCumulee)) { if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueDonneeCumulee) { tableTablesFillesToDependanceDirecte[tableFille] = true; } else if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueRelationTypeId) { tableTablesFillesToDependanceDirecte[tableFille] = true; } else if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueThis) { tableTablesFillesToDependanceDirecte[tableFille] = true; } else if (tableFille.ChampOrigine != null) { string strPropOrigine = tableFille.ChampOrigine.NomProprieteSansCleTypeChamp; if (strPropOrigine.IndexOf('.') < 0) { //Seules les propriétés directes sont optimisées (pour le moment et peut être que ça suffit) PropertyInfo info = tpAnalyse.GetProperty(strPropOrigine); if (info != null) { object[] attribs = info.GetCustomAttributes(typeof(RelationFilleAttribute), true); if (attribs.Length > 0) { RelationFilleAttribute attrFille = (RelationFilleAttribute)attribs[0]; tpAnalyse = attrFille.TypeFille; if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(tpAnalyse)) { info = tpAnalyse.GetProperty(attrFille.ProprieteFille); if (info != null) { attribs = info.GetCustomAttributes(typeof(RelationAttribute), true); if (attribs.Length > 0) { RelationAttribute attrParent = (RelationAttribute)attribs[0]; if (attrParent.ChampsFils.Length == 1) { tableTablesFillesToDependanceDirecte[tableFille] = attrParent; } } } } } } } } } } #endregion #region Charges les tables parentes qui peuvent être chargées if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(listeObjets.TypeObjets)) { string strNomTableFille = listeObjets.NomTable; foreach (ITableExport tableParenteAOptimiser in TablesFilles) { if (tableParenteAOptimiser != tableFilleANePasCharger && tableParenteAOptimiser.ChampOrigine != null && !tableParenteAOptimiser.ChampOrigine.TypeDonnee.IsArrayOfTypeNatif) { if (IsOptimisable(tableParenteAOptimiser, TypeSource)) { CListeObjetsDonnees listeMere = listeObjets.GetDependances(tableParenteAOptimiser.ChampOrigine.NomProprieteSansCleTypeChamp); if (listeMere != null) { result = tableParenteAOptimiser.InsertDataInDataSet( listeMere, ds, null, 0, elementAVariablePourFiltres, cacheValeurs, this, true, indicateur); if (!result) { return(result); } //Trouve le champ fille de lien foreach (Constraint contrainte in table.Constraints) { if (contrainte is ForeignKeyConstraint) { ForeignKeyConstraint fk = (ForeignKeyConstraint)contrainte; if (fk.RelatedTable.TableName == tableParenteAOptimiser.NomTable) { tableParentsCharges[tableParenteAOptimiser] = fk.Columns[0].ColumnName; break; } } } } } } } } #endregion } #region Identification des dépendances if (m_strDependancesToOptim == null) { Hashtable tableDependances = new Hashtable(); AddProprietesOrigineDesChampsToTable(tableDependances, "", listeObjets.ContexteDonnee); foreach (ITableExport tableFille in TablesFilles) { if (tableFille != tableFilleANePasCharger && !tableTablesFillesToDependanceDirecte.Contains(tableFille) && !tableParentsCharges.Contains(tableFille)) { string strChemin = ""; if (ChampOrigine != null) { strChemin = ChampOrigine.NomPropriete; } if (tableFille.FiltreAAppliquer == null) { tableFille.AddProprietesOrigineDesChampsToTable(tableDependances, strChemin, listeObjets.ContexteDonnee); } } } m_strDependancesToOptim = new string[tableDependances.Count]; int nDep = 0; foreach (string strOrigine in tableDependances.Keys) { m_strDependancesToOptim[nDep++] = strOrigine; } } #endregion } #endregion indicateur.SetInfo(I.T("Table @1|115", NomTable)); CFiltreData filtreDeBase = null; if (list is CListeObjetsDonnees) { filtreDeBase = ((CListeObjetsDonnees)list).Filtre; } ArrayList listeIds = new ArrayList(); string strColonneCle = table.PrimaryKey[0].ColumnName; indicateur.SetBornesSegment(0, nValeursCle.Length); indicateur.SetValue(0); //Lecture par paquets de 1000 clés for (int n = 0; n < nValeursCle.Length; n += c_nNbLectureParLotFils) { if (bAvecOptimisation && (list is CListeObjetsDonnees) && relationToObjetParent != null) { CListeObjetsDonnees listeObjets = (CListeObjetsDonnees)list; StringBuilder blCles = new StringBuilder(); char cSepIn = ','; if (filtreDeBase is CFiltreDataAvance) { cSepIn = ';'; } for (int nCle = n; nCle < Math.Min(n + c_nNbLectureParLotFils, nValeursCle.Length); nCle++) { blCles.Append(nValeursCle[nCle]); blCles.Append(cSepIn); } if (blCles.Length > 0) { blCles.Remove(blCles.Length - 1, 1); string strCles = blCles.ToString(); if (filtreDeBase is CFiltreDataAvance) { listeObjets.Filtre = CFiltreData.GetAndFiltre( filtreDeBase, new CFiltreDataAvance( listeObjets.NomTable, relationToObjetParent.ChampsFils[0] + " in {" + strCles + "}")); } else { listeObjets.Filtre = CFiltreData.GetAndFiltre( filtreDeBase, new CFiltreData( relationToObjetParent.ChampsFils[0] + " in (" + strCles.Replace(';', ',') + ")")); } } } if (indicateur.CancelRequest) { result.EmpileErreur(I.T("Execution cancelled by the user|118")); return(result); } if (list is CListeObjetsDonnees && m_strDependancesToOptim != null && m_strDependancesToOptim.Length > 0) { ((CListeObjetsDonnees)list).ReadDependances(m_strDependancesToOptim); } int nCountTotal = 1; if (list is IList) { nCountTotal = ((IList)list).Count; } else if (list is Array) { nCountTotal = ((Array)list).Length; } indicateur.PushSegment(n, Math.Min(n + c_nNbLectureParLotFils, nValeursCle.Length)); int nNbElements = 0; indicateur.SetBornesSegment(0, nCountTotal); int nFrequence = Math.Min(nCountTotal / 20, 500) + 1; CSessionClient session = CSessionClient.GetSessionUnique(); IInfoUtilisateur infoUser = session != null?session.GetInfoUtilisateur() : null; ///AJOUT DES LIGNES DANS LA TABLE foreach (object obj in list) { CRestrictionUtilisateurSurType restriction = null; if (infoUser != null && obj != null) { restriction = infoUser.GetRestrictionsSur(obj.GetType(), obj is IObjetAContexteDonnee?((IObjetAContexteDonnee)obj).ContexteDonnee.IdVersionDeTravail:null); } nNbElements++; if (nNbElements % nFrequence == 0) { indicateur.SetValue(nNbElements); if (indicateur.CancelRequest) { result.EmpileErreur(I.T("Execution cancelled by the user|118")); return(result); } } bool bShouldImporte = true; DataRow row = null; if (bUtiliserIdObjets) { row = table.Rows.Find(((CObjetDonneeAIdNumerique)obj).Id); bShouldImporte = row == null; } if (bShouldImporte) { row = table.NewRow(); if (bUtiliserIdObjets) { int nId = ((CObjetDonneeAIdNumerique)obj).Id; row[strColonneCle] = nId; listeIds.Add(nId); } //Ajoute les valeurs de champs propres à cette table result = InsereValeursChamps(obj, row, cacheValeurs, restriction); if (!result) { return(result); } if (colFilleDeContrainte != null && nValeursCle.Length > 0) { DataRow rowFille = row; if (tableFilleDeContrainte == table) { if (relationToObjetParent == null) { rowFille[colFilleDeContrainte] = nValeursCle[0]; } else { rowFille[colFilleDeContrainte] = ((CObjetDonnee)obj).Row[relationToObjetParent.ChampsFils[0]]; } } } table.Rows.Add(row); } //Dans tous les cas, met à jour la table dépendante si besoin est ! if (colFilleDeContrainte != null && nValeursCle.Length > 0) { DataRow rowFille = row; if (tableFilleDeContrainte != table) { rowFille = tableFilleDeContrainte.Rows.Find(nValeursCle[0]); rowFille[colFilleDeContrainte] = row[strColonneCle]; } } if (bShouldImporte) { //AJout des données des sous tables non optimisées foreach (ITableExport tbl in TablesFilles) { if (tbl.ChampOrigine != null && !tableTablesFillesToDependanceDirecte.Contains(tbl) && tbl != tableFilleANePasCharger) { bool bChildIsOptimisable = IsOptimisable(tbl, TypeSource); //Impossible de lire en direct object objet = null; if (tbl.ChampOrigine is CDefinitionProprieteDynamiqueThis) { objet = obj; } else { objet = CInterpreteurProprieteDynamique.GetValue(obj, tbl.ChampOrigine, cacheValeurs).Data; } string strNomCol = (string)tableParentsCharges[tbl]; if (strNomCol != null) { if (objet != null) { row[strNomCol] = ((CObjetDonneeAIdNumerique)objet).Id; } else { row[strNomCol] = DBNull.Value; } } else { indicateur.PushSegment(nNbElements, nNbElements + 1); if (objet != null) { IEnumerable tempList; if (objet is IEnumerable) { tempList = (IEnumerable)objet; } else { ArrayList listeObjetUnique = new ArrayList(); listeObjetUnique.Add(objet); tempList = listeObjetUnique; } if (tempList != null) { result = tbl.InsertDataInDataSet( tempList, ds, this, (int)row[table.PrimaryKey[0]], elementAVariablePourFiltres, cacheValeurs, this, bChildIsOptimisable, indicateur); if (!result) { return(result); } } } indicateur.PopSegment(); } } } //vide le cache après chaque objet de la table principale if (tableParente == null) { cacheValeurs.ResetCache(); } } } indicateur.PopSegment(); } indicateur.SetValue(nValeursCle.Length); ///Chargement des relations optimisées int nTable = 0; foreach (DictionaryEntry entry in tableTablesFillesToDependanceDirecte) { nTable++; ITableExport tableFille = (ITableExport)entry.Key; if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueDonneeCumulee) { CDefinitionProprieteDynamiqueDonneeCumulee defCum = (CDefinitionProprieteDynamiqueDonneeCumulee)tableFille.ChampOrigine; //Trouve les données cumulées correspondants aux éléments CListeObjetsDonnees listeInit = (CListeObjetsDonnees)list; CTypeDonneeCumulee typeCumule = new CTypeDonneeCumulee(listeInit.ContexteDonnee); if (!typeCumule.ReadIfExists( defCum.DbKeyTypeDonnee)) { result.EmpileErreur(I.T("The cumulated data type @1 doesn't exist|122", defCum.DbKeyTypeDonnee.ToString())); return(result); } RelationAttribute attr = typeCumule.GetRelationAttributeToType(listeInit.TypeObjets); string strChampIdOuDbKey = ""; if (defCum.DbKeyTypeDonnee.IsNumericalId()) { strChampIdOuDbKey = CTypeDonneeCumulee.c_champId; } else { strChampIdOuDbKey = CObjetDonnee.c_champIdUniversel; } CListeObjetsDonnees listeFils = new CListeObjetsDonnees( listeInit.ContexteDonnee, typeof(CDonneeCumulee), new CFiltreData(strChampIdOuDbKey + " = @1 ", defCum.DbKeyTypeDonnee.GetValeurInDb())); listeFils.ModeSansTri = true; //Optimisation pour ne pas utiliser de dataview result = tableFille.InsertDataInDataSet( listeFils, ds, this, (int[])listeIds.ToArray(typeof(int)), attr, elementAVariablePourFiltres, cacheValeurs, this, true, indicateur); if (!result) { return(result); } } else if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueRelationTypeId) { CDefinitionProprieteDynamiqueRelationTypeId defTypeId = (CDefinitionProprieteDynamiqueRelationTypeId)tableFille.ChampOrigine; RelationTypeIdAttribute relTpIdAttr = defTypeId.Relation; //Trouve les données cumulées correspondants aux éléments CListeObjetsDonnees listeInit = (CListeObjetsDonnees)list; if (listeInit.Count != 0) { CListeObjetsDonnees listeFils = new CListeObjetsDonnees( listeInit.ContexteDonnee, CContexteDonnee.GetTypeForTable(relTpIdAttr.TableFille), new CFiltreData(relTpIdAttr.ChampType + "=@1", listeInit.TypeObjets.ToString())); listeFils.ModeSansTri = true; //Optimisation pour ne pas utiliser de dataview RelationAttribute attrTmp = new RelationAttribute( listeInit.NomTable, ((CObjetDonneeAIdNumerique)listeInit[0]).GetChampId(), relTpIdAttr.ChampId, false, false); result = tableFille.InsertDataInDataSet( listeFils, ds, this, (int[])listeIds.ToArray(typeof(int)), attrTmp, elementAVariablePourFiltres, cacheValeurs, this, true, indicateur); if (!result) { return(result); } } } else if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueThis) { CListeObjetsDonnees listeInit = new CListeObjetsDonnees( ((CListeObjetsDonnees)list).ContexteDonnee, tableFille.ChampOrigine.TypeDonnee.TypeDotNetNatif, true); listeInit.ModeSansTri = true; //Optimisation pour ne pas utiliser de dataview string strChampId = listeInit.ContexteDonnee.GetTableSafe(CContexteDonnee.GetNomTableForType(listeInit.TypeObjets)).PrimaryKey[0].ColumnName; RelationAttribute attrTmp = new RelationAttribute( listeInit.NomTable, strChampId, strChampId, false, false); //Copie les clés dans la clé et dans la valeur de champ externe result = tableFille.InsertDataInDataSet( listeInit, ds, this, (int[])listeIds.ToArray(typeof(int)), attrTmp, elementAVariablePourFiltres, cacheValeurs, this, true, indicateur); if (!result) { return(result); } } else if (tableFille.ChampOrigine != null) { RelationAttribute attr = (RelationAttribute)entry.Value; CListeObjetsDonnees listeFils = new CListeObjetsDonnees( ((CListeObjetsDonnees)list).ContexteDonnee, tableFille.ChampOrigine.TypeDonnee.TypeDotNetNatif, true); listeFils.ModeSansTri = true; //Optimisation pour ne pas utiliser de dataview result = tableFille.InsertDataInDataSet( listeFils, ds, this, (int[])listeIds.ToArray(typeof(int)), attr, elementAVariablePourFiltres, cacheValeurs, this, true, indicateur); if (!result) { return(result); } } else { result = tableFille.InsertDataInDataSet( null, ds, this, (int[])listeIds.ToArray(typeof(int)), null, elementAVariablePourFiltres, cacheValeurs, this, true, indicateur); if (!result) { return(result); } } } return(result); }
public CDefinitionProprieteDynamique[] GetDefinitionsChamps(CObjetPourSousProprietes objet, CDefinitionProprieteDynamique defParente) { List <CDefinitionProprieteDynamique> lstProps = new List <CDefinitionProprieteDynamique>(); if (objet == null) { return(lstProps.ToArray()); } Type tp = objet.TypeAnalyse; if (tp == null) { return(lstProps.ToArray()); } if (!C2iFactory.IsInit()) { return(lstProps.ToArray()); } //Champs custom CRoleChampCustom role = CRoleChampCustom.GetRoleForType(tp); CRestrictionUtilisateurSurType rest = null; CSessionClient session = CSessionClient.GetSessionUnique(); if (session != null) { IInfoUtilisateur info = session.GetInfoUtilisateur(); if (info != null) { rest = info.GetRestrictionsSur(tp, null); } } if (role != null) { CContexteDonnee contexte = CContexteDonneeSysteme.GetInstance(); CListeObjetsDonnees listeChamps = CChampCustom.GetListeChampsForRole(contexte, role.CodeRole); foreach (CChampCustom champ in listeChamps) { if (rest != null) { ERestriction restChamp = rest.GetRestriction(champ.CleRestriction); if ((restChamp & ERestriction.Hide) == ERestriction.Hide) { continue; } } if (champ.ListeValeurs.Count > 0) { CDefinitionProprieteDynamiqueChampCustomDisplayValue def = new CDefinitionProprieteDynamiqueChampCustomDisplayValue(champ); if (champ.Categorie.Trim() != "") { def.Rubrique = champ.Categorie; } else { def.Rubrique = I.T("Complementary informations|59"); } lstProps.Add(def); } } } return(lstProps.ToArray()); }
/// ////////////////////////////////////////////////// ///Démarre une étape. ///Attention, un étape ne peut démarrer que si elle n'est pas déjà démarrée public void RunEtape(int nIdSessionMain, int nIdEtape) { CResultAErreur result = CResultAErreur.True; CDbKey keyUser = null; //Attend la fin des transactions en cours pour la session principale IDatabaseConnexion cnx = null; do { CSessionClient session = CSessionClient.GetSessionForIdSession(IdSession); if (session != null && session.IsConnected) { IInfoUtilisateur info = session.GetInfoUtilisateur(); //TESTDBKEYTODO if (info != null) { keyUser = info.KeyUtilisateur; } try { cnx = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, typeof(CEtapeWorkflow)); } catch //En cas d'erreur, c'est probablement que la session a été fermée, du coup, on peut y aller ! { cnx = null; } System.Threading.Thread.Sleep(50); } else { cnx = null; } }while (cnx != null && cnx.IsInTrans()); lock (typeof(CLockerStartEtape))//S'assure que deux étapes ne démarrent pas en même temps ! { List <CDonneeNotificationWorkflow> lstNotifications = new List <CDonneeNotificationWorkflow>(); CAuthentificationSessionProcess auth = new CAuthentificationSessionProcess(); using (CSessionClient sousSession = CSessionClient.CreateInstance()) { try { Console.WriteLine("Thread : " + System.Diagnostics.Process.GetCurrentProcess().Threads.Count); sousSession.OpenSession(auth, "Workflow step " + nIdEtape, ETypeApplicationCliente.Process); //TESTDBKEYTODO if (keyUser != null) { sousSession.ChangeUtilisateur(keyUser); } using (CContexteDonnee ctx = new CContexteDonnee(sousSession.IdSession, true, true)) { CEtapeWorkflow etape = new CEtapeWorkflow(ctx); int nWaiter = 10; while (!etape.ReadIfExists(nIdEtape) && nWaiter > 0) { //On ne trouve pas l'étape, c'est peut être que l'écriture en base n'est pas completement terminée //On va retenter toutes les 2 secondes pendant 20 secondes, si elle n'existe jamais, //c'est qu'il y a eu suppression (ou au moins non commit). nWaiter--; Thread.Sleep(2000); } if (etape.ReadIfExists(nIdEtape)) { result = etape.InternalSetInfosDemarrageInCurrentContext(); etape.EtatCode = (int)EEtatEtapeWorkflow.Démarrée; result = ctx.SaveAll(true); if (result) { result = etape.InternalRunAndSaveifOk(); } if (result && etape.CodeAffectations.Length > 0 && etape.DateFin == null) { CDonneeNotificationWorkflow donneeWorkflow = new CDonneeNotificationWorkflow( nIdSessionMain, etape.Id, etape.Libelle, etape.CodeAffectations, etape.TypeEtape.ExecutionAutomatique); lstNotifications.Add(donneeWorkflow); // Déclenche l'evenement spécifique au démarrage de l'étape result = etape.EnregistreEvenement(CEtapeWorkflow.c_codeEvenementOnRunStep, true); } if (!result) { NoteErreurSurEtape(etape, result.Erreur.ToString()); return; } } } } catch (Exception e) { } finally { sousSession.CloseSession(); } } if (lstNotifications != null) { CEnvoyeurNotification.EnvoieNotifications(lstNotifications.ToArray()); } } }
//-------------------------------------------------------------------------------- /// <summary> /// Complete les restrictions pour un objet donné /// </summary> /// <param name="restriction"></param> public static void CompleteRestriction(IElementARestrictionsSpecifiques element, CRestrictionUtilisateurSurType restriction) { List <CRelationElement_RestrictionSpecifique> lst = GetRelationsRestrictions(element); if (lst.Count == 0) { return; } CContexteDonnee contexte = element.ContexteDonnee; CSessionClient session = CSessionClient.GetSessionForIdSession(contexte.IdSession); IInfoUtilisateur info = null; //TESTDBKEYTODO CDbKey keyUtilisateur = null; if (session != null) { info = session.GetInfoUtilisateur(); if (info == null) { return; } if (info.GetDonneeDroit(CDroitDeBaseSC2I.c_droitAdministration) != null) { return; } keyUtilisateur = info.KeyUtilisateur; } //Application des restrictions qui s'appliquent à tout le monde foreach (CRelationElement_RestrictionSpecifique rel in lst.ToArray()) { if (rel.Applications.Count == 0) { CListeRestrictionsUtilisateurSurType liste = rel.GroupeRestriction.ListeRestrictions; CRestrictionUtilisateurSurType resTmp = liste.GetRestriction(element.GetType()); restriction.Combine(resTmp); lst.Remove(rel); } } if (lst == null || lst.Count == 0 || info == null) { return; } CDonneesActeurUtilisateur user = new CDonneesActeurUtilisateur(contexte); if (user.ReadIfExists(keyUtilisateur)) { CActeur acteur = user.Acteur; while (acteur != null) { foreach (CRelationElement_RestrictionSpecifique rel in lst.ToArray()) { CRelationElement_RestrictionSpecifique_Application app = rel.GetRelationFor(acteur); if (app != null) { CListeRestrictionsUtilisateurSurType restrictions = rel.GroupeRestriction.ListeRestrictions; CRestrictionUtilisateurSurType resTmp = restrictions.GetRestriction(element.GetType()); restriction.Combine(resTmp); lst.Remove(rel); } } acteur = acteur.ActeurParent; } acteur = user.Acteur; if (lst.Count == 0) { return; } foreach (CGroupeActeur groupe in acteur.TousLesGroupesActeur) { foreach (CRelationElement_RestrictionSpecifique rel in lst.ToArray()) { if (rel.GetRelationFor(groupe) != null) { CListeRestrictionsUtilisateurSurType restrictions = rel.GroupeRestriction.ListeRestrictions; CRestrictionUtilisateurSurType resTmp = restrictions.GetRestriction(element.GetType()); restriction.Combine(resTmp); lst.Remove(rel); } } if (lst.Count == 0) { return; } } foreach (CRelationUtilisateur_Profil relProfil in user.RelationsProfils) { foreach (CRelationElement_RestrictionSpecifique rel in lst.ToArray()) { if (rel.GetRelationFor(relProfil.Profil) != null) { CListeRestrictionsUtilisateurSurType restrictions = rel.GroupeRestriction.ListeRestrictions; CRestrictionUtilisateurSurType resTmp = restrictions.GetRestriction(element.GetType()); restriction.Combine(resTmp); lst.Remove(rel); if (lst.Count == 0) { return; } } } } } }
//------------------------------------ public CResultAErreur Importer(string strFichier, CContexteDonnee contexteDestination) { CResultAErreur result = m_parametre.LectureFichier(strFichier); m_nNbUpdated = 0; m_nNbCreated = 0; if (!result) { return(result); } if (m_bChargerTouteLaCible) { CListeObjetsDonnees lst = new CListeObjetsDonnees(contexteDestination, m_typeCible); lst.AssureLectureFaite(); } //Vérifie que l'utilisateur a le droit de faire un import CSessionClient session = CSessionClient.GetSessionForIdSession(contexteDestination.IdSession); bool bALeDroit = false; if (session != null) { IInfoUtilisateur info = session.GetInfoUtilisateur(); if (info != null) { bALeDroit = info.GetDonneeDroit(CDroitDeBaseSC2I.c_droitImport) != null; } } if (!bALeDroit) { result.EmpileErreur(I.T("Your are not allowed to import data|20048")); return(result); } DataTable table = result.Data as DataTable; if (table == null) { result.EmpileErreur(I.T("Import error, can not read source data|20043")); return(result); } int nParametre = 1; string strFiltre = ""; foreach (CMappageChampImport mappage in Mappages) { if (mappage.IsCle) { result = mappage.GetFiltreCle(m_typeCible, nParametre); if (!result) { return(result); } nParametre++; strFiltre += result.Data.ToString() + " and "; } } CFiltreData filtreCle = null; if (strFiltre.Length > 0) { filtreCle = new CFiltreData(strFiltre.Substring(0, strFiltre.Length - 5)); } foreach (DataRow row in table.Rows) { result = ImporteRow(row, filtreCle, contexteDestination); if (!result) { return(result); } } return(result); }
/// ////////////////////////////////////////////////// ///Lance le calcul public static void DoCalc(CElementsProjetARecalculer lstElements) { CResultAErreur result = CResultAErreur.True; CDbKey keyUser = null; //Attend la fin des transactions en cours pour la session principale IDatabaseConnexion cnx = null; do { CSessionClient session = CSessionClient.GetSessionForIdSession(lstElements.IdSession); if (session != null && session.IsConnected) { IInfoUtilisateur info = session.GetInfoUtilisateur(); //TESTDBKEYOK if (info != null) { keyUser = info.KeyUtilisateur; } try { cnx = CSc2iDataServer.GetInstance().GetDatabaseConnexion(lstElements.IdSession, typeof(CProjet)); } catch //En cas d'erreur, c'est probablement que la session a été fermée, du coup, on peut y aller ! { cnx = null; } System.Threading.Thread.Sleep(50); } else { cnx = null; } }while (cnx != null && cnx.IsInTrans()); lock (typeof(CLockerStartEtape))//S'assure que deux étapes ne démarrent pas en même temps ! { CAuthentificationSessionProcess auth = new CAuthentificationSessionProcess(); using (CSessionClient sousSession = CSessionClient.CreateInstance()) { try { sousSession.OpenSession(auth, "Projet asynchronous calc ", ETypeApplicationCliente.Process); if (keyUser != null) { sousSession.ChangeUtilisateur(keyUser); } using (CContexteDonnee ctx = new CContexteDonnee(sousSession.IdSession, true, true)) { SetModeCalculProjet(ctx); foreach (int nIdProjet in lstElements.IdsProjets) { CProjet projet = new CProjet(ctx); if (projet.ReadIfExists(nIdProjet)) { projet.RecalculateDates(false); } } foreach (int nIdMetaProjet in lstElements.IdsMetaProjets) { CMetaProjet meta = new CMetaProjet(ctx); if (meta.ReadIfExists(nIdMetaProjet)) { meta.UpdateDateDebutPlanifieeFromChilds(false); meta.UpdateDateFinPlanifieeFromChilds(false); meta.UpdateDateDebutReelleFromChilds(false); meta.UpdateDateFinReelleFromChilds(false); meta.CalcProgress(false); } } result = ctx.SaveAll(false); } } catch (Exception e) { } finally { sousSession.CloseSession(); } } } }