Beispiel #1
0
        public static Boolean AlteraEstagio(Object operadoraId, List <String> ids, List <String> numeros, ContratoStatusHistorico.eStatus estagio)
        {
            PersistenceManager pm = new PersistenceManager();

            pm.BeginTransactionContext();

            try
            {
                String letra = ""; Int32 numero = -1; Int32 qtdZeros = -1; Object ret = null;
                String qry = "SELECT contrato_id FROM contrato WHERE contrato_operadoraId=" + operadoraId + " AND contrato_numero='";

                for (int i = 0; i < ids.Count; i++)
                {
                    ret = LocatorHelper.Instance.ExecuteScalar(qry + numeros[i] + "'", null, null, pm);
                    if (ret != null && ret != DBNull.Value)
                    {
                        pm.Commit(); pm = null;
                        return(false);
                    }

                    NonQueryHelper.Instance.ExecuteNonQuery("UPDATE conferencia SET conferencia_prazo=null, conferencia_depto=" + Convert.ToInt32(estagio).ToString() + " WHERE conferencia_id=" + ids[i], pm);

                    letra = EntityBase.PrimeiraPosicaoELetra(numeros[i]);
                    if (letra != "")
                    {
                        numero   = Convert.ToInt32(numeros[i].Replace(letra, ""));
                        qtdZeros = numeros[i].Replace(letra, "").Length;
                    }
                    else
                    {
                        numero   = Convert.ToInt32(numeros[i]);
                        qtdZeros = numeros[i].Length;
                    }

                    ContratoStatusHistorico.Salvar(numero, qtdZeros, letra, operadoraId, estagio, pm);
                }

                pm.Commit();
                return(true);
            }
            catch (Exception ex)
            {
                pm.Rollback();
                throw ex;
            }
            finally
            {
                pm = null;
            }
        }
        public Boolean SalvarSaida(AlmoxMovimentacao movimentacao, ref String msgRetorno)
        {
            movimentacao.TipoDeMovimentacao = (int)AlmoxMovimentacao.TipoMovimentacao.Saida;
            PersistenceManager pm = new PersistenceManager();

            pm.BeginTransactionContext();

            AlmoxProduto prod = new AlmoxProduto();

            prod.ID = movimentacao.ProdutoID;
            pm.Load(prod);

            AlmoxTipoProduto tipo = new AlmoxTipoProduto();

            tipo.ID = prod.TipoProdutoID;
            pm.Load(tipo);

            //checa se o intervalo a ser retirado é válido
            Boolean result = false;

            if (tipo.Numerado)
            {
                result = AlmoxMovimentacao.ExisteIntervalo(movimentacao.NumeracaoInicial,
                                                           movimentacao.NumeracaoFinal, prod.OperadoraID, movimentacao.QtdZerosAEsquerda, movimentacao.Letra);

                if (!result)
                {
                    msgRetorno = "Intervalo inválido.";
                    pm.Rollback();
                    pm = null;
                    return(false);
                }

                result = AlmoxContratoImpresso.ExisteIntervaloRetirado(movimentacao.NumeracaoInicial,
                                                                       movimentacao.NumeracaoFinal, movimentacao.QtdZerosAEsquerda, movimentacao.Letra, prod.OperadoraID, pm);

                if (result)
                {
                    msgRetorno = "Intervalo já retirado do estoque.";
                    pm.Rollback();
                    pm = null;
                    return(false);
                }
            }
            else
            {
                //checa se tem em estoque
                if (prod.QTD < movimentacao.QTD)
                {
                    msgRetorno = "Quantidade indisponível no estoque.";
                    pm.Rollback();
                    pm = null;
                    return(false);
                }
            }

            try
            {
                pm.Save(movimentacao);

                //altera os dados flutuantes da movimentacao de entrada
                if (movimentacao.MovimentacaoID != null)
                {
                    AlmoxMovimentacao fonte = new AlmoxMovimentacao();
                    fonte.ID = movimentacao.MovimentacaoID;
                    pm.Load(fonte);
                    fonte.QTDFlutuante -= movimentacao.QTD;

                    if (tipo.Numerado)
                    {
                        fonte.NumeracaoInicialFlutuante += movimentacao.NumeracaoFinal;
                    }
                    else
                    {
                        fonte.NumeracaoInicialFlutuante += movimentacao.QTD;
                    }

                    pm.Save(fonte);

                    if (movimentacao.SubTipoDeMovimentacao == (int)AlmoxMovimentacao.SubTipoMovimentacao.Normal)
                    {
                        //seta o relacionamento entre corretor e a proposta
                        String numero = "";
                        for (int i = movimentacao.NumeracaoInicial; i <= movimentacao.NumeracaoFinal; i++)
                        {
                            ProdutoCorretor pc = new ProdutoCorretor();
                            pc.AgenteID      = movimentacao.UsuarioRetiradaID;
                            pc.ProdutoID     = movimentacao.ProdutoID;
                            pc.ProdutoNumero = i;
                            pc.ProdutoQTD    = movimentacao.QTD;
                            pc.EntradaID     = movimentacao.MovimentacaoID;
                            pm.Save(pc);

                            if (tipo.Numerado)
                            {
                                #region gera numero do contrato impresso

                                //if (movimentacao.QtdZerosAEsquerda > 0)
                                //{
                                //    String mascara = new String('0', movimentacao.QtdZerosAEsquerda);
                                //    numero = String.Format("{0:" + mascara + "}", i);
                                //}
                                //else
                                //    numero = i.ToString();

                                //if (!String.IsNullOrEmpty(movimentacao.Letra))
                                //    numero = movimentacao.Letra + numero;
                                numero = i.ToString();
                                #endregion

                                AlmoxContratoImpresso.SetaProdutor(
                                    movimentacao.UsuarioRetiradaID, movimentacao.ProdutoID,
                                    numero, movimentacao.Letra, movimentacao.QtdZerosAEsquerda, pm);

                                ContratoStatusHistorico.Salvar(i, movimentacao.QtdZerosAEsquerda,
                                                               movimentacao.Letra, prod.OperadoraID, ContratoStatusHistorico.eStatus.ComCorretor, pm);
                            }
                        }
                    }
                }

                //altera a quantidade disponível em estoque
                prod.QTD -= movimentacao.QTD;
                pm.Save(prod);

                pm.Commit();  //commit!
            }
            catch (Exception ex)
            {
                pm.Rollback();
                throw ex;
            }
            finally
            {
                pm = null;
            }

            return(true);
        }
        public Boolean SalvarEntrada(AlmoxMovimentacao movimentacao, ref String msgRetorno, Object operadoraId)
        {
            AlmoxProduto prod = new AlmoxProduto();

            prod.ID = movimentacao.ProdutoID;
            prod.Carregar();


            AlmoxTipoProduto tipo = new AlmoxTipoProduto();

            tipo.ID = prod.TipoProdutoID;
            tipo.Carregar();

            if ((AlmoxMovimentacao.SubTipoMovimentacao)movimentacao.SubTipoDeMovimentacao ==
                AlmoxMovimentacao.SubTipoMovimentacao.Normal)
            {
                if (tipo.Numerado)
                {
                    //checa se existe
                    Boolean existe = AlmoxMovimentacao.ExisteIntervalo(
                        movimentacao.NumeracaoInicial, movimentacao.NumeracaoFinal, operadoraId,
                        movimentacao.QtdZerosAEsquerda, movimentacao.Letra);

                    if (existe)
                    {
                        msgRetorno = "Intervalo de numeração inválido.";
                        return(false);
                    }
                }
            }
            else if ((AlmoxMovimentacao.SubTipoMovimentacao)movimentacao.SubTipoDeMovimentacao ==
                     AlmoxMovimentacao.SubTipoMovimentacao.Devolucao)
            {
                //checa se existe
                Boolean existe = AlmoxMovimentacao.ExisteIntervalo(
                    movimentacao.NumeracaoInicial, movimentacao.NumeracaoFinal, operadoraId,
                    movimentacao.QtdZerosAEsquerda, movimentacao.Letra);

                if (!existe)
                {
                    msgRetorno = "Intervalo de numeração inálido.";
                    return(false);
                }

                //checa se foi retirado do estoque. se nao foi, nao deixa devolver
                existe = AlmoxMovimentacao.ExisteIntervaloRetirado(movimentacao.NumeracaoInicial,
                                                                   movimentacao.NumeracaoFinal, prod.ID, movimentacao.QtdZerosAEsquerda, movimentacao.Letra);

                if (!existe)
                {
                    msgRetorno = "Impossível gravar esse intervalo de numeração.<br>Ele está em estoque integral ou parcialmente.";
                    return(false);
                }
            }

            movimentacao.TipoDeMovimentacao = (int)AlmoxMovimentacao.TipoMovimentacao.Entrada;
            PersistenceManager pm = new PersistenceManager();

            pm.TransactionContext();

            try
            {
                pm.Save(movimentacao);

                prod.QTD += movimentacao.QTD;
                pm.Save(prod);

                //cria os contratos impressos
                if ((AlmoxMovimentacao.SubTipoMovimentacao)movimentacao.SubTipoDeMovimentacao ==
                    AlmoxMovimentacao.SubTipoMovimentacao.Normal && tipo.Numerado)
                {
                    for (int i = movimentacao.NumeracaoInicial; i <= movimentacao.NumeracaoFinal; i++)
                    {
                        AlmoxContratoImpresso aci = new AlmoxContratoImpresso();
                        aci.Numero            = i;
                        aci.QtdZerosAEsquerda = movimentacao.QtdZerosAEsquerda;

                        if (!String.IsNullOrEmpty(movimentacao.Letra))
                        {
                            aci.Letra = movimentacao.Letra;
                        }

                        #region gera numero do contrato impresso

                        //if (movimentacao.QtdZerosAEsquerda > 0)
                        //{
                        //String mascara = new String('0', movimentacao.QtdZerosAEsquerda);
                        //    aci.Numero = String.Format("{0:" + mascara + "}", i);
                        //}
                        //else
                        //    aci.Numero = i;

                        //if (!String.IsNullOrEmpty(movimentacao.Letra))
                        //    aci.Numero = movimentacao.Letra + aci.Numero;
                        #endregion

                        aci.MovID     = movimentacao.ID;
                        aci.ProdutoID = movimentacao.ProdutoID;
                        pm.Save(aci);

                        //gera log historico de alteracao de status
                        ContratoStatusHistorico.Salvar(i, movimentacao.QtdZerosAEsquerda, movimentacao.Letra, operadoraId, ContratoStatusHistorico.eStatus.NoEstoque, pm);
                    }
                }
                //remove impresso do corretor
                else if (tipo.Numerado && (AlmoxMovimentacao.SubTipoMovimentacao)movimentacao.SubTipoDeMovimentacao == AlmoxMovimentacao.SubTipoMovimentacao.Devolucao)
                {
                    String numero = "";
                    for (int i = movimentacao.NumeracaoInicial; i <= movimentacao.NumeracaoFinal; i++)
                    {
                        #region gera numero do contrato impresso

                        //numero = EntityBase.GeraNumeroDeContrato(i, movimentacao.QtdZerosAEsquerda, movimentacao.Letra);
                        ////if (movimentacao.QtdZerosAEsquerda > 0)
                        ////{
                        ////    String mascara = new String('0', movimentacao.QtdZerosAEsquerda);
                        ////    numero = String.Format("{0:" + mascara + "}", i);
                        ////}
                        ////else
                        ////    numero = i.ToString();

                        ////if (!String.IsNullOrEmpty(movimentacao.Letra))
                        ////    numero = movimentacao.Letra + numero;
                        #endregion

                        //checa se foi usando em contrato. se foi, nao deixa devolver
                        if (Contrato.NumeroDeContratoEmUso(i.ToString(), movimentacao.Letra, movimentacao.QtdZerosAEsquerda, operadoraId, pm))
                        {
                            pm.Rollback();
                            msgRetorno = "O contrato de número " + numero + " está em uso.";;
                            return(false);
                        }

                        //remove do produtor
                        AlmoxContratoImpresso.RetiraDeProdutor(movimentacao.ProdutoID, i, movimentacao.Letra, movimentacao.QtdZerosAEsquerda, pm);

                        //gera log historico de alteracao de status
                        ContratoStatusHistorico.Salvar(i, movimentacao.QtdZerosAEsquerda, movimentacao.Letra, operadoraId, ContratoStatusHistorico.eStatus.NoEstoque, pm);
                    }
                }

                if ((AlmoxMovimentacao.SubTipoMovimentacao)movimentacao.SubTipoDeMovimentacao ==
                    AlmoxMovimentacao.SubTipoMovimentacao.Devolucao)
                {
                    //remove do corretor
                    if (tipo.Numerado)
                    {
                        Boolean result = false;
                        for (int i = movimentacao.NumeracaoInicial; i <= movimentacao.NumeracaoFinal; i++)
                        {
                            result = ProdutoCorretor.Remove(
                                movimentacao.UsuarioRetiradaID, prod.ID, i, 0, pm);

                            if (!result)
                            {
                                pm.Rollback();
                                msgRetorno = "Não foi possível efetivar a operação.\\nCertifique-se de ter informados corretamente os parâmetros.";
                                return(false);
                            }
                        }
                    }
                    else
                    {
                        Boolean result = ProdutoCorretor.Remove(
                            movimentacao.UsuarioRetiradaID, prod.ID, 0, movimentacao.QTD, pm);

                        if (!result)
                        {
                            pm.Rollback();
                            msgRetorno = "Não foi possível efetivar a operação.\\nCertifique-se de ter informado corretamente os parâmetros.";
                            return(false);
                        }
                    }
                }

                pm.Commit();
            }
            catch (Exception ex)
            {
                pm.Rollback();
                throw ex;
            }
            finally
            {
                pm = null;
            }

            return(true);
        }
Beispiel #4
0
        /// <summary>
        /// Altera o status dos atendimentos para "concluído" e efetiva as ações.
        /// </summary>
        /// <param name="atendimentoIDs">Lista de ids de atendimentos a serem processados.</param>
        public void EfetivaAtendimento(List <String> atendimentoItemIDs)
        {
            PersistenceManager pm = new PersistenceManager();

            pm.BeginTransactionContext();

            Atendimento atendimento;

            try
            {
                IList <AtendimentoItem> itensAtendimento = AtendimentoItem.CarregaAtendimentoItens(atendimentoItemIDs, pm);
                if (itensAtendimento != null)
                {
                    Object               contratoId = null;
                    String[]             arrAux     = null, arrAux2 = null;
                    ContratoBeneficiario cb         = null;

                    foreach (AtendimentoItem item in itensAtendimento)
                    {
                        item.Status = (Int32)Atendimento.eStatus.Concluido; //true;
                        pm.Save(item);

                        atendimento = new Atendimento(item.AtendimentoId);
                        pm.Load(atendimento);

                        if (eTipoAtendimentoItem.SegundaViaCartao == ((eTipoAtendimentoItem)item.Tipo))
                        {
                            #region Marca o beneficiário para segunda via de cartao

                            arrAux     = item.BeneficiarioIds.Split(',');
                            contratoId = Contrato.CarregaContratoID(atendimento.OperadoraID, atendimento.NumeroContrato, pm);

                            for (int i = 0; i < arrAux.Length; i++)
                            {
                                //TODO: criar uma sobrecarga que recebe um array de beneficiarioIDs e faz a alteração de forma atomica
                                ContratoBeneficiario.AlteraStatusBeneficiario(contratoId, arrAux[i], ContratoBeneficiario.eStatus.SegundaViaCartaoPendente, pm);
                            }

                            #endregion
                        }
                        if (eTipoAtendimentoItem.CancelamentoContrato == ((eTipoAtendimentoItem)item.Tipo))
                        {
                            #region Marca o contrato para cancelamento

                            contratoId = Contrato.CarregaContratoID(atendimento.OperadoraID, atendimento.NumeroContrato, pm);
                            ContratoBeneficiario titular = ContratoBeneficiario.CarregarTitular(contratoId, pm);
                            titular.Status = (Int32)ContratoBeneficiario.eStatus.CancelamentoPendente;
                            pm.Save(titular);

                            #endregion

                            #region Cancela o contrato e adiciona histórico

                            contratoId = Contrato.CarregaContratoID(atendimento.OperadoraID, atendimento.NumeroContrato, pm);
                            Contrato.AlteraStatusDeContrato(contratoId, true, pm);

                            #endregion
                        }
                        else if (eTipoAtendimentoItem.AdicionarBeneficiarios == ((eTipoAtendimentoItem)item.Tipo))
                        {
                            #region Adiciona o beneficiario como ContratoBeneficiario NOVO, calcula o novo valor do contrato, a vigencia dele, e atualiza as cobrancas

                            arrAux  = item.BeneficiarioIds.Split(',');
                            arrAux2 = item.ParentescoIds.Split(',');
                            DateTime dataAdmissao = atendimento.DataHora;
                            contratoId = Contrato.CarregaContratoID(atendimento.OperadoraID, atendimento.NumeroContrato, pm);

                            for (int i = 0; i < arrAux.Length; i++)
                            {
                                cb                  = new ContratoBeneficiario();
                                cb.Ativo            = true;
                                cb.BeneficiarioID   = arrAux[i];// bId;
                                cb.ContratoID       = contratoId;
                                cb.Data             = dataAdmissao;
                                cb.ParentescoID     = arrAux2[i]; //obter info da classe atendimento
                                cb.Tipo             = (Int32)ContratoBeneficiario.TipoRelacao.Dependente;
                                cb.Status           = (Int32)ContratoBeneficiario.eStatus.Novo;
                                cb.NumeroSequencial = ContratoBeneficiario.ProximoNumeroSequencial(contratoId, arrAux[i], pm);
                                pm.Save(cb);
                            }

                            ContratoStatusHistorico.Salvar(atendimento.NumeroContrato, atendimento.OperadoraID, ContratoStatusHistorico.eStatus.BeneficiarioAdicionado, pm);

                            #endregion
                        }
                        else if (eTipoAtendimentoItem.AlteracaoCadastro == ((eTipoAtendimentoItem)item.Tipo))
                        {
                            #region Marca o ContratoBeneficiario como pendente para ENVIAR para a operadora

                            contratoId = Contrato.CarregaContratoID(atendimento.OperadoraID, atendimento.NumeroContrato, pm);

                            arrAux = item.BeneficiarioIds.Split(',');
                            foreach (String benefID in arrAux)
                            {
                                cb        = ContratoBeneficiario.CarregarPorContratoEBeneficiario(contratoId, benefID, pm);
                                cb.Status = (Int32)ContratoBeneficiario.eStatus.AlteracaoCadastroPendente;
                                pm.Save(cb);
                            }

                            ContratoStatusHistorico.Salvar(atendimento.NumeroContrato, atendimento.OperadoraID, ContratoStatusHistorico.eStatus.BeneficiarioAlterado, pm);

                            #endregion
                        }
                        else if (eTipoAtendimentoItem.CancelarBeneficiarios == ((eTipoAtendimentoItem)item.Tipo))
                        {
                            #region Marca os beneficiarios para cancelamento

                            contratoId = Contrato.CarregaContratoID(atendimento.OperadoraID, atendimento.NumeroContrato, pm);
                            arrAux     = item.BeneficiarioIds.Split(',');
                            DateTime dataCancelamento = atendimento.DataHora;
                            foreach (String benefID in arrAux)
                            {
                                cb                = ContratoBeneficiario.CarregarPorContratoEBeneficiario(contratoId, benefID, pm);
                                cb.Status         = (Int32)ContratoBeneficiario.eStatus.ExclusaoPendente;
                                cb.Ativo          = false;
                                cb.DataInativacao = dataCancelamento;
                                pm.Save(cb);
                            }

                            ContratoStatusHistorico.Salvar(atendimento.NumeroContrato, atendimento.OperadoraID, ContratoStatusHistorico.eStatus.BeneficiarioCancelado, pm);

                            #endregion
                        }
                        else if (eTipoAtendimentoItem.MudancaDePlano == ((eTipoAtendimentoItem)item.Tipo))
                        {
                            #region Marca o titular para mudança de plano do contrato

                            contratoId = Contrato.CarregaContratoID(atendimento.OperadoraID, atendimento.NumeroContrato, pm);

                            cb        = ContratoBeneficiario.CarregarTitular(contratoId, pm);
                            cb.Status = (Int32)ContratoBeneficiario.eStatus.MudancaPlanoPendente;
                            pm.Save(cb);
                            ContratoStatusHistorico.Salvar(atendimento.NumeroContrato, atendimento.OperadoraID, ContratoStatusHistorico.eStatus.MudancaDePlano, pm);

                            #endregion

                            #region Altera o plano, calcula novo valor, a vigencia dele, modifica as cobranças

                            //contratoId = Contrato.CarregaContratoID(atendimento.OperadoraID, atendimento.NumeroContrato, pm);
                            Contrato contrato = new Contrato(contratoId);
                            pm.Load(contrato);

                            contrato.PlanoID        = item.PlanoId;
                            contrato.TipoAcomodacao = item.AcomodacaoId;
                            pm.Save(contrato);

                            DateTime dataAlteracao = atendimento.DataHora;

                            //Historico de alteracao de planos
                            ContratoPlano cp = new ContratoPlano();
                            cp.ContratoID     = contratoId;
                            cp.PlanoID        = item.PlanoId;
                            cp.TipoAcomodacao = item.AcomodacaoId;
                            cp.Data           = atendimento.DataHora;
                            pm.Save(cp);

                            //contratoADMid = contrato.ContratoADMID;

                            //CalendarioAdmissaoVigencia.CalculaDatasDeVigenciaEVencimento(contratoADMid,
                            //    dataAlteracao, out vigencia, out vencimento, out diaSemJuros, out valorDataLimite, pm);

                            //cobrancas = Cobranca.CarregarTodas(contratoId, pm);
                            //if (cobrancas != null && cobrancas.Count > 0)
                            //{
                            //    foreach (Cobranca cobranca in cobrancas)
                            //    {
                            //        if (((Cobranca.eTipo)cobranca.Tipo) == Cobranca.eTipo.Dupla ||
                            //            ((Cobranca.eTipo)cobranca.Tipo) == Cobranca.eTipo.Complementar)
                            //        { continue; }

                            //        if (cobranca.DataVencimento >= vigencia)
                            //        {
                            //            cobranca.Valor = Contrato.CalculaValorDaProposta(contratoId, cobranca.DataVencimento, pm);
                            //            pm.Save(cobranca);
                            //        }
                            //    }
                            //}
                            #endregion
                        }
                    }
                }

                pm.Commit();
            }
            catch (Exception ex)
            {
                pm.Rollback();
                throw ex;
            }
            finally
            {
                pm = null;
            }
        }
Beispiel #5
0
        public void Salvar(Contrato contrato, ContratoBeneficiario titular, IList <ContratoBeneficiario> dependentes, Object[] fichas, Object usuarioLiberadorID, IList <AdicionalBeneficiario> adicionalBeneficiario, Conferencia conferencia, Decimal valorTotal, bool gerarCobranca = true)
        {
            Decimal            valorTotalContrato = 0;
            PersistenceManager pm = new PersistenceManager();

            pm.BeginTransactionContext();

            //TODO: checar se o contrato foi retirado do estoque (almox_contrato_impresso -> almox_contratoimp_produtorId <> null)
            //      se nao, seta para o produtor da proposta

            try
            {
                Boolean novoContrato = contrato.ID == null;

                if (novoContrato)
                {
                    //calcula o codigo de cobranca para o contrato.
                    String qry = "SELECT MAX(contrato_codcobranca) FROM contrato";
                    object ret = LocatorHelper.Instance.ExecuteScalar(qry, null, null, pm);
                    if (ret == null || ret == DBNull.Value)
                    {
                        ret = 0;
                    }
                    contrato.CodCobranca = Convert.ToInt32(ret) + 1;
                }

                //Salva o contrato.
                pm.Save(contrato);

                #region gera primeria cobranca
                if (novoContrato && gerarCobranca)
                {
                    //gera a primeira cobranca ja paga
                    Cobranca cobranca = new Cobranca();
                    cobranca.Cancelada           = false;
                    cobranca.ComissaoPaga        = true;
                    cobranca.ContratoCodCobranca = Convert.ToString(contrato.CodCobranca);
                    cobranca.DataCriacao         = DateTime.Now;
                    cobranca.DataPgto            = contrato.Admissao;
                    cobranca.DataVencimento      = contrato.Admissao;
                    cobranca.Pago       = true;
                    cobranca.Parcela    = 1;
                    cobranca.PropostaID = contrato.ID;
                    cobranca.Tipo       = (int)Cobranca.eTipo.Normal;
                    cobranca.Valor      = valorTotal;
                    cobranca.ValorPgto  = cobranca.Valor;
                    pm.Save(cobranca);

                    List <CobrancaComposite> composite = new List <CobrancaComposite>();
                    Contrato.CalculaValorDaProposta2(cobranca.PropostaID, cobranca.DataVencimento, pm, false, true, ref composite, false);
                    CobrancaComposite.Salvar(cobranca.ID, composite, pm);
                    composite = null;
                }
                #endregion

                if (usuarioLiberadorID != null)
                {
                    Contrato.SetaUsuarioLiberador(contrato.ID, usuarioLiberadorID, pm);
                }

                //Salva o titular
                titular.ContratoID       = contrato.ID;
                titular.NumeroSequencial = 0;
                titular.Vigencia         = contrato.Vigencia;

                if (titular.BeneficiarioID == null)
                {
                    titular.BeneficiarioID = ContratoBeneficiario.CarregaTitularID(contrato.ID, pm);
                }
                if (titular.ID == null)
                {
                    titular.ID = ContratoBeneficiario.CarregaID_ParaTitular(contrato.ID, pm);
                }
                //if (titular.ID != null) { pm.Load(titular); } nao pode carregar, pois sobrescreve dados preenchidos na tela
                else
                {
                    titular.Tipo = Convert.ToInt32(ContratoBeneficiario.TipoRelacao.Titular);
                }

                //if (titular.ID == null) { titular.Status = (Int32)ContratoBeneficiario.eStatus.Novo; }
                /*else*/ if (titular.Status == Convert.ToInt32(ContratoBeneficiario.eStatus.Incluido))
                {
                    valorTotalContrato += titular.Valor;
                }

                if (novoContrato)
                {
                    titular.Status = (Int32)ContratoBeneficiario.eStatus.Novo; titular.Data = contrato.Admissao; titular.Vigencia = contrato.Vigencia;
                }
                pm.Save(titular);

                #region Salva os dependentes

                if (dependentes != null)
                {
                    CalendarioVencimento rcv = null;
                    DateTime             vigencia = DateTime.MinValue, vencimento = DateTime.MinValue; Int32 diasDataSemJuros = 0; Object valorDataLimite = null;
                    foreach (ContratoBeneficiario dependente in dependentes)
                    {
                        if (dependente.NumeroSequencial < 0)
                        {
                            dependente.NumeroSequencial = ContratoBeneficiario.ProximoNumeroSequencial(contrato.ID, dependente.BeneficiarioID, pm);
                        }

                        dependente.ContratoID = contrato.ID;

                        if (dependente.ID == null)
                        {
                            dependente.Status = (Int32)ContratoBeneficiario.eStatus.Novo;

                            if (novoContrato)
                            {
                                dependente.Vigencia = contrato.Vigencia;
                            }
                            else
                            {
                                CalendarioAdmissaoVigencia.CalculaDatasDeVigenciaEVencimento(contrato.ContratoADMID,
                                                                                             dependente.Data, out vigencia, out vencimento, out diasDataSemJuros, out valorDataLimite, out rcv, pm);
                                dependente.Vigencia = vigencia;
                            }
                        }
                        else if (dependente.Status == (Int32)ContratoBeneficiario.eStatus.Incluido)
                        {
                            valorTotalContrato += dependente.Valor;
                        }

                        pm.Save(dependente);
                    }
                }
                #endregion

                //Salva as fichas de saúde dos beneficiários
                Boolean aprovadoPeloDepto = true;
                if (fichas != null && fichas.Length > 0) //&& Convert.ToInt32(contrato.ID) != 152685)
                {
                    foreach (IList <ItemDeclaracaoSaudeINSTANCIA> lista in fichas)
                    {
                        if (lista == null)
                        {
                            continue;
                        }
                        foreach (ItemDeclaracaoSaudeINSTANCIA item in lista)
                        {
                            //Se id==null, tenta achar pelo id do beneficiario e do item de ficha de saude
                            if (item.ID == null)
                            {
                                item.ID = ItemDeclaracaoSaudeINSTANCIA.CarregarID(
                                    item.BeneficiarioID, item.ItemDeclaracaoID, pm);
                            }

                            if (item.ID != null)
                            {
                                pm.Save(item);
                            }
                            else if (item.Sim)
                            {
                                pm.Save(item);
                            }

                            //se tem positivacao sem aprovacao do técnico, a proposta fica pendente
                            if (item.Sim && !item.AprovadoPeloDeptoTecnico && aprovadoPeloDepto == true)
                            {
                                aprovadoPeloDepto = false;
                            }
                        }
                    }
                }

                if (novoContrato && !aprovadoPeloDepto) //se o contrato é novo e há positivacoes nas fichas de saude SEM a aprovacao do Depto. Tecnico:
                {
                    contrato.Pendente = true;
                    pm.Save(contrato);
                }

                //salva os produtos adicionais contratados
                if (adicionalBeneficiario != null)
                {
                    foreach (AdicionalBeneficiario ad in adicionalBeneficiario)
                    {
                        ad.PropostaID = contrato.ID;
                        pm.Save(ad);
                    }
                }

                ////checa historico de planos e atualiza a última entrada se necessário.
                //ContratoPlano obj = ContratoPlano.CarregarAtual(contrato.ID, pm);
                //if (obj != null)
                //{
                //    if (Convert.ToString(obj.PlanoID) != Convert.ToString(contrato.PlanoID))
                //    {
                //        obj.PlanoID = contrato.PlanoID;
                //        pm.Save(obj);
                //    }

                //    obj = null;
                //}

                //checa almoxarifado - contrato impresso
                String letra = "";
                if (PrimeiraPosicaoELetra(contrato.Numero))
                {
                    letra = contrato.Numero.Substring(0, 1);
                }

                AlmoxContratoImpresso aci = null;
                //if (!String.IsNullOrEmpty(letra))
                //    aci = AlmoxContratoImpresso.Carregar(contrato.OperadoraID, contrato.Numero.Replace(letra, ""), letra, -1, pm);
                //else
                //    aci = AlmoxContratoImpresso.Carregar(contrato.OperadoraID, contrato.Numero, letra, -1, pm);

                if (aci != null && aci.AgenteID == null)
                {
                    aci.AgenteID = contrato.DonoID;
                    aci.Data     = contrato.Data;
                    pm.Save(aci);
                }
                else if (aci == null)
                {
                    #region IMPOSSIVEL
                    //aci = new AlmoxContratoImpresso();
                    //aci.AgenteID = contrato.DonoID;
                    //aci.Data = contrato.Data;
                    //aci.MovID = null; //?????
                    //aci.Numero = contrato.Numero;
                    //aci.OperadoraID = contrato.OperadoraID;
                    //aci.ProdutoID = null; //?????
                    ////pm.Save(aci);
                    #endregion
                }

                //Altera status da proposta em conferencia / cadastro
                if (conferencia != null)
                {
                    conferencia.Carregar();
                    conferencia.Departamento = 6; //TODO: corrigir (Int32)ContratoStatusHistorico.eStatus.Cadastrado;
                    pm.Save(conferencia);

                    ContratoStatusHistorico.Salvar(contrato.Numero, contrato.OperadoraID, ContratoStatusHistorico.eStatus.Cadastrado, pm);
                }
                else if (novoContrato)
                {
                    ContratoStatusHistorico.Salvar(contrato.Numero, contrato.OperadoraID, ContratoStatusHistorico.eStatus.Cadastrado, pm);
                }

                //Checa se é necessário gravar o valor total do contrato
                if (valorTotalContrato > 0)
                {
                    ContratoValor.InsereNovoValorSeNecessario(contrato.ID, valorTotalContrato, pm);
                }

                pm.Commit();
            }
            catch (Exception ex)
            {
                pm.Rollback();
                throw ex;
            }
            finally
            {
                pm = null;
            }
        }