/// <summary>
        /// Save all Subcontractors Costing Sheets
        /// </summary>
        /// <param name="companyId">companyId</param>
        /// <param name="costingSheetId">costingSheetId</param>
        public void Save(int companyId, int costingSheetId)
        {
            ProjectCostingSheetInformationTDS subcontractorsInformationChanges = (ProjectCostingSheetInformationTDS)Data.GetChanges();

            if (subcontractorsInformationChanges.CombinedSubcontractorsInformation.Rows.Count > 0)
            {
                ProjectCombinedCostingSheetInformationSubcontractorsInformationGateway projectCostingSheetInformationSubcontractorsInformationGateway = new ProjectCombinedCostingSheetInformationSubcontractorsInformationGateway(subcontractorsInformationChanges);

                foreach (ProjectCostingSheetInformationTDS.CombinedSubcontractorsInformationRow row in (ProjectCostingSheetInformationTDS.CombinedSubcontractorsInformationDataTable)subcontractorsInformationChanges.CombinedSubcontractorsInformation)
                {
                    // Insert new costing sheet Subcontractors
                    if ((!row.Deleted) && (!row.InDatabase))
                    {
                        ProjectCombinedCostingSheetSubcontractors subcontractors = new ProjectCombinedCostingSheetSubcontractors(null);
                        subcontractors.InsertDirect(costingSheetId, row.SubcontractorID, row.RefID, row.UnitOfMeasurement, row.Quantity, row.CostCad, row.TotalCostCad, row.CostUsd, row.TotalCostUsd, row.Deleted, row.COMPANY_ID, row.StartDate, row.EndDate, row.Comment, row.ProjectID);
                    }

                    // Update costing sheet Subcontractors
                    if ((!row.Deleted) && (row.InDatabase))
                    {
                        int subcontractorId = row.SubcontractorID;
                        int refId = row.RefID;
                        bool deleted = false;

                        //original values
                        string originalUnitOfMeasurement = projectCostingSheetInformationSubcontractorsInformationGateway.GetUnitOfMeasurementOriginal(costingSheetId, subcontractorId, refId);
                        double originalQuantity = projectCostingSheetInformationSubcontractorsInformationGateway.GetQuantityOriginal(costingSheetId, subcontractorId, refId);
                        decimal originalCostCad = projectCostingSheetInformationSubcontractorsInformationGateway.GetCostCadOriginal(costingSheetId, subcontractorId, refId);
                        decimal originalTotalCostCad = projectCostingSheetInformationSubcontractorsInformationGateway.GetTotalCostCadOriginal(costingSheetId, subcontractorId, refId);
                        decimal originalCostUsd = projectCostingSheetInformationSubcontractorsInformationGateway.GetCostUsdOriginal(costingSheetId, subcontractorId, refId);
                        decimal originalTotalCostUsd = projectCostingSheetInformationSubcontractorsInformationGateway.GetTotalCostUsdOriginal(costingSheetId, subcontractorId, refId);
                        DateTime originalStartDate = projectCostingSheetInformationSubcontractorsInformationGateway.GetStartDateOriginal(costingSheetId, subcontractorId, refId);
                        DateTime originalEndDate = projectCostingSheetInformationSubcontractorsInformationGateway.GetEndDateOriginal(costingSheetId, subcontractorId, refId);

                        //original values
                        string newUnitOfMeasurement = projectCostingSheetInformationSubcontractorsInformationGateway.GetUnitOfMeasurement(costingSheetId, subcontractorId, refId);
                        double newQuantity = projectCostingSheetInformationSubcontractorsInformationGateway.GetQuantity(costingSheetId, subcontractorId, refId);
                        decimal newCostCad = projectCostingSheetInformationSubcontractorsInformationGateway.GetCostCad(costingSheetId, subcontractorId, refId);
                        decimal newTotalCostCad = projectCostingSheetInformationSubcontractorsInformationGateway.GetTotalCostCad(costingSheetId, subcontractorId, refId);
                        decimal newCostUsd = projectCostingSheetInformationSubcontractorsInformationGateway.GetCostUsd(costingSheetId, subcontractorId, refId);
                        decimal newTotalCostUsd = projectCostingSheetInformationSubcontractorsInformationGateway.GetTotalCostUsd(costingSheetId, subcontractorId, refId);
                        DateTime newStartDate = projectCostingSheetInformationSubcontractorsInformationGateway.GetStartDate(costingSheetId, subcontractorId, refId);
                        DateTime newEndDate = projectCostingSheetInformationSubcontractorsInformationGateway.GetEndDate(costingSheetId, subcontractorId, refId);

                        ProjectCombinedCostingSheetSubcontractors subcontractors = new ProjectCombinedCostingSheetSubcontractors(null);
                        subcontractors.UpdateDirect(costingSheetId, subcontractorId, refId, originalUnitOfMeasurement, originalQuantity, originalCostCad, originalTotalCostCad, originalCostUsd, originalTotalCostUsd, deleted, companyId, originalStartDate, originalEndDate, newUnitOfMeasurement, newQuantity, newCostCad, newTotalCostCad, newCostUsd, newTotalCostUsd, deleted, companyId, newStartDate, newEndDate);
                    }

                    // Delete costing sheet Subcontractors
                    if ((row.Deleted) && (row.InDatabase))
                    {
                        ProjectCombinedCostingSheetSubcontractors subcontractors = new ProjectCombinedCostingSheetSubcontractors(null);
                        subcontractors.DeleteDirect(row.CostingSheetID, row.SubcontractorID, row.RefID, row.COMPANY_ID);
                    }
                }
            }
        }