private void UpdateProposalClauses(ScrumFactoryEntities context, Proposal proposal, Proposal oldProposal)
        {
            while (oldProposal.Clauses.Count > 0)
            {
                context.ProposalClauses.DeleteObject(oldProposal.Clauses.First());
            }

            foreach (ProposalClause clause in proposal.Clauses)
            {
                context.ProposalClauses.AddObject(clause);
            }
        }
        private void UpdateProposalItems(ScrumFactoryEntities context, Proposal proposal, Proposal oldProposal)
        {
            // get new items added at the proposal and the removed ones
            ProposalItem[] newItems = new ProposalItem[0];
            if (proposal.Items != null)
            {
                newItems = proposal.Items.Where(i => !oldProposal.Items.Any(oi => oi.BacklogItemUId == i.BacklogItemUId)).ToArray();
            }
            ProposalItem[] deletedItems = new ProposalItem[0];
            if (oldProposal.Items != null)
            {
                deletedItems = oldProposal.Items.Where(oi => !proposal.Items.Any(i => i.BacklogItemUId == oi.BacklogItemUId)).ToArray();
            }

            // add and delete proposal items
            foreach (ProposalItem item in newItems)
            {
                context.ProposalItems.AddObject(item);
            }
            foreach (ProposalItem item in deletedItems)
            {
                context.ProposalItems.DeleteObject(item);
            }
        }
        public void SaveProposal(Proposal proposal, bool removeDocument = false)
        {
            using (var context = new ScrumFactoryEntities(this.connectionString)) {
                Proposal oldProposal = GetProjectProposal(proposal.ProjectUId, proposal.ProposalUId);

                using (TransactionScope scope = new TransactionScope()) {
                    // if its a new proposal
                    if (oldProposal == null)
                    {
                        // proposals
                        context.Proposals.AddObject(proposal);

                        // items
                        foreach (ProposalItem pitem in proposal.Items)
                        {
                            context.ProposalItems.AddObject(pitem);
                        }

                        // clauses
                        if (proposal.Clauses != null)
                        {
                            foreach (ProposalClause clause in proposal.Clauses)
                            {
                                context.ProposalClauses.AddObject(clause);
                            }
                        }
                    }
                    // if is an old one
                    else
                    {
                        context.AttachTo("Proposals", oldProposal);
                        context.ApplyCurrentValues <Proposal>("Proposals", proposal);

                        // if is approving a proposal, adds its XAML document
                        if (proposal.ProposalDocument != null)
                        {
                            context.ProposalDocuments.AddObject(proposal.ProposalDocument);
                        }
                        else if (removeDocument)
                        {
                            var doc = context.ProposalDocuments.SingleOrDefault(d => d.ProposalUId == proposal.ProposalUId);
                            if (doc != null)
                            {
                                context.ProposalDocuments.DeleteObject(doc);
                            }
                        }

                        if (oldProposal.Items == null)
                        {
                            oldProposal.Items = new List <ProposalItem>();
                        }

                        if (proposal.Items == null)
                        {
                            proposal.Items = new List <ProposalItem>();
                        }

                        UpdateProposalItems(context, proposal, oldProposal);

                        UpdateProposalClauses(context, proposal, oldProposal);

                        UpdateProposalFixedCosts(context, proposal, oldProposal);
                    }

                    context.SaveChanges();

                    scope.Complete();
                }
            }
        }
        private void UpdateProposalFixedCosts(ScrumFactoryEntities context, Proposal proposal, Proposal oldProposal)
        {
            // make sure no proposal has null collections
            if (proposal.FixedCosts == null)
            {
                proposal.FixedCosts = new List <ProposalFixedCost>();
            }
            if (oldProposal.FixedCosts == null)
            {
                oldProposal.FixedCosts = new List <ProposalFixedCost>();
            }

            ProposalFixedCost[] newCosts = new ProposalFixedCost[0];
            newCosts = proposal.FixedCosts.Where(i => !oldProposal.FixedCosts.Any(oi => oi.ProposalFixedCostUId == i.ProposalFixedCostUId)).ToArray();

            ProposalFixedCost[] deletedCosts = new ProposalFixedCost[0];
            deletedCosts = oldProposal.FixedCosts.Where(oi => !proposal.FixedCosts.Any(i => i.ProposalFixedCostUId == oi.ProposalFixedCostUId)).ToArray();

            ProposalFixedCost[] updatedCosts = new ProposalFixedCost[0];
            updatedCosts = proposal.FixedCosts.Where(oi => oldProposal.FixedCosts.Any(i => i.ProposalFixedCostUId == oi.ProposalFixedCostUId)).ToArray();

            // add/update/delete proposal items
            foreach (ProposalFixedCost cost in newCosts)
            {
                context.ProposalFixedCosts.AddObject(cost);
            }
            foreach (ProposalFixedCost cost in deletedCosts)
            {
                context.ProposalFixedCosts.DeleteObject(cost);
            }
            foreach (ProposalFixedCost cost in updatedCosts)
            {
                context.ApplyCurrentValues <ProposalFixedCost>("ProposalFixedCosts", cost);
            }
        }