public long AddMainTask(MainTask iMainTask)
        {
            if (iMainTask == null)
            {
                throw new Exception("La tâche principale est null");
            }

            if (iMainTask.TaskType == MainTaskTypeEnum.ProjectDeveloppement && iMainTask.ExternalProjectId == null)
            {
                throw new Exception("Une tâche de type projet requiert un numéro de projet");
            }

            if (iMainTask.Status != MainTaskStatusEnum.Requested &&
                iMainTask.Status != MainTaskStatusEnum.Waiting)
            {
                throw new Exception("Le statut ne permet pas la création de la tâche");
            }

            if (iMainTask.Status == MainTaskStatusEnum.Requested && iMainTask.PackageId != null)
            {
                throw new Exception("Le statut requested ne permet l'attachement à un package");
            }

            long newMainTaskId = 0;

            using (var ts = new TransactionScope())
            {
                if (iMainTask.PackageId != null)
                {
                    var affectedPackage = GetPackageById((long)iMainTask.PackageId, GranularityEnum.Nude);
                    if (affectedPackage.Status == PackageStatusEnum.Developpement)
                    {
                        iMainTask.Status     = MainTaskStatusEnum.Dev;
                        iMainTask.OpenedDate = DateTime.Now;
                    }
                    else if (affectedPackage.Status == PackageStatusEnum.Canceled ||
                             affectedPackage.Status == PackageStatusEnum.Production ||
                             affectedPackage.Status == PackageStatusEnum.Staging)
                    {
                        throw new Exception("Il n'est pas possible d'affecter une tâche au package avec ce status");
                    }
                    else if (affectedPackage.Status == PackageStatusEnum.Waiting)
                    {
                        //ne rien faire
                    }
                    else
                    {
                        throw new Exception(affectedPackage.Status.ToStringWithEnumName());
                    }
                }

                var entity = new T_E_MainTask();
                entity.Merge(iMainTask);
                newMainTaskId = DBReleaseDataService.AddMainTask(entity);

                //SubTask
                foreach (var subTaskItem in iMainTask.SubTasks.Enum())
                {
                    subTaskItem.MainTaskId = newMainTaskId;
                    AddSubTask(subTaskItem);
                }

                //ProductLine
                foreach (var productLineItem in iMainTask.ProductLines.Enum())
                {
                    var productLineTaskEntity = new T_E_ProductLineTask();
                    productLineTaskEntity.ProductLineTaskId = -1;
                    productLineTaskEntity.MainTaskId        = newMainTaskId;
                    productLineTaskEntity.ProductLineId     = productLineItem.ProductLineId;
                    DBProductDataService.Add <T_E_ProductLineTask>(productLineTaskEntity);
                }

                ts.Complete();
            }
            return(newMainTaskId);
        }