/// <summary>
        /// Save all data to database (direct)
        /// </summary>
        /// <param name="companyId">companyId</param>
        public void Save(int companyId)
        {
            ProjectNavigatorTDS changes = (ProjectNavigatorTDS)Data.GetChanges();

            if (changes != null)
            {
                if (changes.ProjectOtherCostsBudget.Rows.Count > 0)
                {
                    ProjectNavigatorProjectOtherCostsBudgetGateway projectNavigatorProjectOtherCostsBudgetGateway = new ProjectNavigatorProjectOtherCostsBudgetGateway(changes);

                    foreach (ProjectNavigatorTDS.ProjectOtherCostsBudgetRow row in (ProjectNavigatorTDS.ProjectOtherCostsBudgetDataTable)changes.ProjectOtherCostsBudget)
                    {
                        // Insert new work function budget
                        if ((!row.Deleted) && (!row.InDatabase))
                        {
                            ProjectOtherCostsBudget projectOtherCostsBudget = new ProjectOtherCostsBudget(null);
                            projectOtherCostsBudget.InsertDirect(row.ProjectID, row.Category, row.RefID, row.Budget, row.Deleted, row.COMPANY_ID);
                        }

                        // Update work function budget
                        if ((!row.Deleted) && (row.InDatabase))
                        {
                            int projectId = row.ProjectID;
                            int refId = row.RefID;
                            bool originalDeleted = false;
                            int originalCompanyId = companyId;

                            // original values
                            decimal originalBudget = projectNavigatorProjectOtherCostsBudgetGateway.GetBudgetOriginal(projectId, row.Category, refId);

                            // new values
                            decimal newBudget = projectNavigatorProjectOtherCostsBudgetGateway.GetBudget(projectId, row.Category, refId);

                            ProjectOtherCostsBudget projectOtherCostsBudget = new ProjectOtherCostsBudget(null);
                            projectOtherCostsBudget.UpdateDirect(projectId, row.Category, refId, originalBudget, originalDeleted, originalCompanyId, projectId, row.Category, refId, newBudget, originalDeleted, originalCompanyId);
                        }

                        // Delete work function budget
                        if ((row.Deleted) && (row.InDatabase))
                        {
                            ProjectOtherCostsBudget projectOtherCostsBudget = new ProjectOtherCostsBudget(null);
                            projectOtherCostsBudget.DeleteDirect(row.ProjectID, row.Category, row.RefID, row.Budget, row.Deleted, row.COMPANY_ID);
                        }
                    }
                }
            }
        }
 // ////////////////////////////////////////////////////////////////////////
 // PUBLIC METHODS
 //
 /// <summary>
 /// LoadAllByProjectId
 /// </summary>
 /// <param name="projectId">projectId</param>              
 public void LoadAllByProjectId(int projectId)
 {
     ProjectNavigatorProjectOtherCostsBudgetGateway projectNavigatorProjectOtherCostsBudgetGateway = new ProjectNavigatorProjectOtherCostsBudgetGateway(Data);
     projectNavigatorProjectOtherCostsBudgetGateway.LoadAllByProjectId(projectId);
 }