public MyTrainingDTO MyTrainingOperation(MyTrainingOperationParam param)
        {
            Log.WriteWarning("MyTrainingOperation:Username={0},operation={1}", SecurityInfo.SessionData.Profile.UserName, param.Operation);

            using (var trans = Session.BeginSaveTransaction())
            {
                var        dbProfile = Session.Load <Profile>(SecurityInfo.SessionData.Profile.GlobalId);
                MyTraining dbCycle   = null;
                if (param.Operation == MyTrainingOperationType.Start || param.Operation == MyTrainingOperationType.Simulate)
                {
                    dbCycle = param.MyTraining.Map <MyTraining>();
                    ensureCanStartMyTraining(dbCycle, dbProfile);
                    dbCycle.Profile = dbProfile;
                    if (dbCycle is A6WTraining)
                    {
                        startA6WTraining(param, (A6WTraining)dbCycle, dbProfile);
                    }
                    else if (dbCycle is SupplementCycle)
                    {
                        SupplementsCycleDTO cycleDto = (SupplementsCycleDTO)param.MyTraining;
                        startSupplementsCycle(param, (SupplementCycle)dbCycle, dbProfile, cycleDto.SupplementsCycleDefinitionId);
                    }
                    Session.Flush();
                    ProfileStatisticsUpdater.UpdateTrainindDay(Session, dbProfile);
                }
                else
                {
                    dbCycle = StopMyTraining(param.MyTraining.GlobalId, dbProfile);
                }
                Session.SaveOrUpdate(dbCycle);

                if (param.Operation != MyTrainingOperationType.Simulate)
                {//for simulate we must reject all changes in the db
                    trans.Commit();
                }

                return(dbCycle.Map <MyTrainingDTO>());
            }
        }