public void Criar(Guid metaunidadeId, MetadaUnidadeporFamilia mMetadaUnidadeporFamilia, List <Model.OrcamentoDetalhado> lstOrcamentoDetalhado, Guid familiaId)
        {
            var lstOrcamentoporSegSubFamilia = (from x in lstOrcamentoDetalhado
                                                group x by string.Format("{0}/{1}/{2}", x.Segmento.Id, x.Familia.Id, x.SubFamilia.Id));

            foreach (var OrcaSegSubFamilia in lstOrcamentoporSegSubFamilia)
            {
                MetadaUnidadeporSubfamilia mMetadaUnidadeporSubfamilia;
                mMetadaUnidadeporSubfamilia = RepositoryService.MetadaUnidadeporSubfamilia.Obter(OrcaSegSubFamilia.First().SubFamilia.Id, mMetadaUnidadeporFamilia.ID.Value);
                if (mMetadaUnidadeporSubfamilia == null)
                {
                    mMetadaUnidadeporSubfamilia    = new MetadaUnidadeporSubfamilia(RepositoryService.NomeDaOrganizacao, RepositoryService.IsOffline, RepositoryService.Provider);
                    mMetadaUnidadeporSubfamilia.ID = Guid.NewGuid();
                    mMetadaUnidadeporSubfamilia.UnidadedeNegocio = mMetadaUnidadeporFamilia.UnidadedeNegocio;
                    mMetadaUnidadeporSubfamilia.Ano           = mMetadaUnidadeporFamilia.Ano;
                    mMetadaUnidadeporSubfamilia.Trimestre     = mMetadaUnidadeporFamilia.Trimestre;
                    mMetadaUnidadeporSubfamilia.Segmento      = new Lookup(OrcaSegSubFamilia.First().Segmento.Id, SDKore.Crm.Util.Utility.GetEntityName <Model.Segmento>());
                    mMetadaUnidadeporSubfamilia.Familia       = new Lookup(OrcaSegSubFamilia.First().Familia.Id, SDKore.Crm.Util.Utility.GetEntityName <Model.FamiliaProduto>());
                    mMetadaUnidadeporSubfamilia.Subfamilia    = new Lookup(OrcaSegSubFamilia.First().SubFamilia.Id, SDKore.Crm.Util.Utility.GetEntityName <Model.SubfamiliaProduto>());
                    mMetadaUnidadeporSubfamilia.MetadaFamilia = new Lookup(mMetadaUnidadeporFamilia.ID.Value, SDKore.Crm.Util.Utility.GetEntityName <Model.OrcamentodaUnidadeporFamilia>());
                    mMetadaUnidadeporSubfamilia.Nome          = (mMetadaUnidadeporFamilia.Nome + " - " + OrcaSegSubFamilia.First().SubFamilia.Name).Length > 99 ? (mMetadaUnidadeporFamilia.Nome + " - " + OrcaSegSubFamilia.First().SubFamilia.Name).Substring(1, 99) : (mMetadaUnidadeporFamilia.Nome + " - " + OrcaSegSubFamilia.First().SubFamilia.Name);

                    RepositoryService.MetadaUnidadeporSubfamilia.Create(mMetadaUnidadeporSubfamilia);
                }

                ServiceMetadaUnidadeporProduto.Criar(metaunidadeId, mMetadaUnidadeporSubfamilia, OrcaSegSubFamilia.ToList(), OrcaSegSubFamilia.First().SubFamilia.Id, mMetadaUnidadeporFamilia.MetadoSegmento.Id);
            }
        }
        public List <MetadaUnidadeporFamilia> ListarValoresPorUnidadeNegocio(Guid unidadeNegocioId, int ano, Domain.Enum.OrcamentodaUnidade.Trimestres?trimestre = null)
        {
            var lista = new List <MetadaUnidadeporFamilia>();

            string fetch = @"<fetch aggregate='true' no-lock='true' >
                              <entity name='itbc_potencialdosupervisorporfamilia' >
                                <attribute name='itbc_familiadoprodutoid' alias='familia' groupby='true' />
                                <attribute name='itbc_potencialplanejado' alias='valor_planejado' aggregate='sum' />
                                <attribute name='itbc_potencialrealizado' alias='valor_realizado' aggregate='sum' />
                                <attribute name='itbc_segmentoid' alias='segmento' groupby='true' />
                                <attribute name='itbc_trimestre' alias='trimestre' groupby='true' />
                                <filter type='and' >
                                  <condition attribute='itbc_ano' operator='eq' value='{0}' />
                                  <condition attribute='itbc_unidadedenegocioid' operator='eq' value='{1}' />
                                  {2}
                                </filter>
                              </entity>
                            </fetch>";

            string filterTrimestre = string.Empty;

            if (trimestre.HasValue)
            {
                filterTrimestre = string.Format(@"<condition attribute='itbc_trimestre' operator='eq' value='{0}' />", (int)trimestre.Value);
            }

            fetch = string.Format(fetch, ano, unidadeNegocioId, filterTrimestre);

            var retrieveMultiple = new RetrieveMultipleRequest()
            {
                Query = new FetchExpression(fetch)
            };

            EntityCollection collection = ((RetrieveMultipleResponse)this.Execute(retrieveMultiple)).EntityCollection;

            foreach (var item in collection.Entities)
            {
                var familia  = ((EntityReference)((AliasedValue)item.Attributes["familia"]).Value);
                var segmento = ((EntityReference)((AliasedValue)item.Attributes["segmento"]).Value);

                var potencial = new MetadaUnidadeporFamilia(OrganizationName, IsOffline, Provider)
                {
                    MetaPlanejada = ((Money)((AliasedValue)item.Attributes["valor_planejado"]).Value).Value,
                    MetaRealizada = ((Money)((AliasedValue)item.Attributes["valor_realizado"]).Value).Value,
                    Familia       = new SDKore.DomainModel.Lookup(familia.Id, familia.Name, familia.LogicalName),
                    Segmento      = new SDKore.DomainModel.Lookup(segmento.Id, segmento.Name, segmento.LogicalName),
                    Trimestre     = ((OptionSetValue)((AliasedValue)item.Attributes["trimestre"]).Value).Value
                };

                lista.Add(potencial);
            }

            return(lista);
        }