//Verifica quais processos ja estão com prazo de adequação expirado ou com prazo de 60 dias expirado.
        private List <AdoptionProcess> FilterExpiredProcesses(List <AdoptionProcess> processes)
        {
            for (int i = processes.Count - 1; i > -1; i--)
            {
                if (processes[i].Task == ProcessTasks.Adequacy)
                {
                    var days = (DateTime.Now - processes[i].ModifiedOn).TotalDays;
                    if (days > 10)
                    {
                        EmailSenderAdoption.SendEmail("*****@*****.**", "",
                                                      $"Notificação do Banco de Áreas PCJ - Adoção (Processo {processes[i].Protocol})", "", EmailTypes.AdequacyExpired);

                        processes[i].Task      = ProcessTasks.Completion;
                        processes[i].Condition = ProcessConditions.Canceled;
                    }
                }

                if (processes[i].Task == ProcessTasks.Await)
                {
                    var days = (DateTime.Now - processes[i].ModifiedOn).TotalDays;
                    if (days > 60)
                    {
                        EmailSenderAdoption.SendEmail("*****@*****.**", "",
                                                      $"Notificação do Banco de Áreas PCJ - Adoção (Processo {processes[i].Protocol})", "", EmailTypes.TimeExpired);

                        processes[i].Task      = ProcessTasks.Completion;
                        processes[i].Condition = ProcessConditions.Canceled;
                    }
                }
            }
            return(processes);
        }
        public async Task <bool> UpdateTechnicalAnalysis([FromServices] DataContext context, [FromBody] AdoptionTechnicalAnalysis model)
        {
            var process = await context.AdoptionProcesses
                          .AsNoTracking()
                          .FirstOrDefaultAsync(x => x.AdoptionProcessId == model.ProcessId);

            process.IsPendent = true;

            var technicalAnalysis = await context.AdoptionTechnicalAnalyses
                                    .AsNoTracking()
                                    .FirstOrDefaultAsync(x => x.AdoptionTechnicalAnalysisId == model.AdoptionTechnicalAnalysisId);

            var applicant = await context.AdoptionApplicants
                            .AsNoTracking()
                            .Include(x => x.AdoptionInterlocutor)
                            .FirstOrDefaultAsync(x => x.AdoptionApplicantId == process.AdoptionApplicantId);

            if (model.Status == "Adequar")
            {
                process.Task = ProcessTasks.Adequacy;

                EmailSenderAdoption.SendEmail(applicant.AdoptionInterlocutor.Email, "*****@*****.**",
                                              $"Notificação do Banco de Áreas PCJ - Adoção (Processo {process.Protocol})", applicant.AdoptionInterlocutor.FullName, EmailTypes.TechnicalAnalysisAdequacy);
            }
            if (model.Status == "Aceitar")
            {
                process.Task = ProcessTasks.Completion;

                EmailSenderAdoption.SendEmail(applicant.AdoptionInterlocutor.Email, "*****@*****.**",
                                              $"Notificação do Banco de Áreas PCJ - Adoção (Processo {process.Protocol})", applicant.AdoptionInterlocutor.FullName, EmailTypes.TechnicalAnalysisAccept);
            }
            if (model.Status == "Aguardar")
            {
                process.Task = ProcessTasks.Await;

                EmailSenderAdoption.SendEmail(applicant.AdoptionInterlocutor.Email, "*****@*****.**",
                                              $"Notificação do Banco de Áreas PCJ - Adoção (Processo {process.Protocol})", applicant.AdoptionInterlocutor.FullName, EmailTypes.TechnicalAnalysisAwait);
            }

            technicalAnalysis = model;
            context.Update(technicalAnalysis);
            context.Update(process);

            return((await context.SaveChangesAsync()) > 0);
        }
        public async Task <ActionResult <AdoptionAnalysis> > PostAnalysis(
            [FromServices] DataContext context,
            [FromBody] AdoptionAnalysis model,
            int id)
        {
            if (ModelState.IsValid)
            {
                var process = await context.AdoptionProcesses
                              .AsNoTracking()
                              .FirstOrDefaultAsync(x => x.AdoptionTechnicalAnalysisId == id);

                var applicant = await context.AdoptionApplicants
                                .AsNoTracking()
                                .Include(x => x.AdoptionInterlocutor)
                                .FirstOrDefaultAsync(x => x.AdoptionApplicantId == process.AdoptionApplicantId);

                var technicalAnalysis = await context.AdoptionTechnicalAnalyses
                                        .AsNoTracking()
                                        .FirstOrDefaultAsync(x => x.AdoptionTechnicalAnalysisId == id);

                model.AdoptionTechnicalAnalysisId = id;

                context.Add(model);
                await context.SaveChangesAsync();

                EmailSenderAdoption.SendEmail(
                    applicant.AdoptionInterlocutor.Email,
                    "*****@*****.**",
                    $"Notificação do Banco de Áreas PCJ - Adoção (Processo {process.Protocol})",
                    applicant.AdoptionInterlocutor.FullName,
                    EmailTypes.Analysis,
                    model.Note
                    );

                return(model);
            }
            else
            {
                return(BadRequest(ModelState));
            }
        }
        public async Task <ActionResult> PostApplicant(
            [FromServices] DataContext context,
            [ModelBinder(BinderType = typeof(JsonWithFilesFormDataModelBinder))] AdoptionApplicant model,
            IFormFile fileObligationDocument)
        {
            if (ModelState.IsValid)
            {
                AdoptionProcess process = new AdoptionProcess();

                DateTime date = DateTime.Now;
                process.CreatedOn  = model.ModifiedOn;
                process.ModifiedOn = model.ModifiedOn;
                process.IsPendent  = true;
                process.Protocol   = String.Format("{0:yyyyMMddHHmmss}", date);
                process.AdoptionTechnicalAnalysis = new AdoptionTechnicalAnalysis();
                process.AdoptionAdequacy          = new AdoptionAdequacy();
                process.Task      = ProcessTasks.TechnicalAnalysis;
                process.Condition = ProcessConditions.Active;
                process.CreatedBy = model.ModifiedBy;

                model.AdoptionObligation.DocumentsAttachmentPath = await AddFileAttachment(fileObligationDocument, process.Protocol);

                process.AdoptionApplicant = model;

                context.AdoptionProcesses.Add(process);
                context.AdoptionApplicants.Add(model);
                await context.SaveChangesAsync();

                EmailSenderAdoption.SendEmail(model.AdoptionInterlocutor.Email, "*****@*****.**",
                                              $"Notificação do Banco de Áreas PCJ - Adoção (Processo {process.Protocol})", model.AdoptionInterlocutor.FullName, EmailTypes.Begin);

                return(Ok());
            }
            else
            {
                return(BadRequest(ModelState));
            }
        }
 public AdocaoController(ApplicationDbContext context, UserManager <Utilizador> userManager)
 {
     _userManager = userManager;
     _context     = context;
     _emailSender = new EmailSenderAdoption(context);
 }
        public async Task <bool> UpdateProcess([FromServices] DataContext context, [FromBody] AdoptionProcess model)
        {
            var process = await context.AdoptionProcesses
                          .AsNoTracking()
                          .FirstOrDefaultAsync(x => x.AdoptionProcessId == model.AdoptionProcessId);

            var applicant = await context.AdoptionApplicants
                            .AsNoTracking()
                            .Include(x => x.AdoptionInterlocutor)
                            .FirstOrDefaultAsync(x => x.AdoptionApplicantId == process.AdoptionApplicantId);

            process = model;

            if (process.Status == "Encerrar")
            {
                process.Task      = ProcessTasks.Completed;
                process.Condition = ProcessConditions.Concluded;

                if (process.AdoptionTechnicalAnalysis.Status == "Adequar" && process.AdoptionAdequacy.Status == "Expirado")
                {
                    EmailSenderAdoption.SendEmail(applicant.AdoptionInterlocutor.Email, "*****@*****.**",
                                                  $"Notificação do Banco de Áreas PCJ - Adoção (Processo {process.Protocol})", applicant.AdoptionInterlocutor.FullName, EmailTypes.CompletionAdequacyExpired);
                }

                if (process.AdoptionTechnicalAnalysis.Status == "Adequar" && process.AdoptionAdequacy.Status == "Finalizar")
                {
                    EmailSenderAdoption.SendEmail(applicant.AdoptionInterlocutor.Email, "*****@*****.**",
                                                  $"Notificação do Banco de Áreas PCJ - Adoção (Processo {process.Protocol})", applicant.AdoptionInterlocutor.FullName, EmailTypes.CompletionAdequacy);
                }

                if (process.AdoptionTechnicalAnalysis.Status == "Aguardar")
                {
                    EmailSenderAdoption.SendEmail(applicant.AdoptionInterlocutor.Email, "*****@*****.**",
                                                  $"Notificação do Banco de Áreas PCJ - Adoção (Processo {process.Protocol})", applicant.AdoptionInterlocutor.FullName, EmailTypes.CompletionAwait);
                }

                if (process.AdoptionTechnicalAnalysis.Status == "Aceita")
                {
                    EmailSenderAdoption.SendEmail(applicant.AdoptionInterlocutor.Email, "*****@*****.**",
                                                  $"Notificação do Banco de Áreas PCJ - Adoção (Processo {process.Protocol})", applicant.AdoptionInterlocutor.FullName, EmailTypes.Completion);
                }

                process.AdoptionAdequacy          = null;
                process.AdoptionApplicant         = null;
                process.AdoptionTechnicalAnalysis = null;

                context.Update(process);

                return((await context.SaveChangesAsync()) > 0);
            }
            if (process.Status == "Reanalisar" && process.Task == ProcessTasks.Completion)
            {
                EmailSenderAdoption.SendEmail(applicant.AdoptionInterlocutor.Email, "*****@*****.**",
                                              $"Notificação do Banco de Áreas PCJ - Adoção (Processo {process.Protocol})", applicant.AdoptionInterlocutor.FullName, EmailTypes.CompletionReanalyze);

                process.Status    = "";
                process.Task      = ProcessTasks.TechnicalAnalysis;
                process.IsPendent = model.IsPendent;
            }

            process.AdoptionAdequacy          = null;
            process.AdoptionApplicant         = null;
            process.AdoptionTechnicalAnalysis = null;

            context.Update(process);

            return((await context.SaveChangesAsync()) > 0);
        }