public JsonResult CreateProductivityUnit([FromBody] ProductivityUnitViewModel data)
        {
            try
            {
                if (data != null)
                {
                    data.CreateUser = User.Identity.Name;
                    UnidadesProdutivas CObject = DBProductivityUnits.ParseToDb(data);
                    CObject = DBProductivityUnits.Create(CObject);

                    if (CObject != null)
                    {
                        List <DBProjectBillingViewModel> CreatedPBillings = new List <DBProjectBillingViewModel>();
                        //Create Billing Projects
                        if (data.BillingProjects.Count > 0)
                        {
                            data.BillingProjects.ForEach(x =>
                            {
                                x.Active             = true;
                                x.ProductivityUnitNo = CObject.NºUnidadeProdutiva;
                                x.CreateUser         = User.Identity.Name;
                                x.Selected           = false;
                                CreatedPBillings.Add(DBProjectBilling.ParseToViewModel(DBProjectBilling.Create(DBProjectBilling.ParseToDB(x))));
                            });
                        }

                        data = DBProductivityUnits.ParseToViewModel(CObject);
                        data.BillingProjects = CreatedPBillings;
                        data.eReasonCode     = 1;
                    }
                    else
                    {
                        data.eReasonCode = 3;
                        data.eMessage    = "Ocorreu um erro ao inserir os dados na base de dados.";
                    }
                }
            }
            catch (Exception ex)
            {
                data.eReasonCode = 2;
                data.eMessage    = "Ocorreu um erro ao criar a Unidade Produtiva.";
            }
            return(Json(data));
        }
        public JsonResult GetProductivityUnitData([FromBody] int ProductivityUnitNo)
        {
            UnidadesProdutivas        ProductivityUnitDB = DBProductivityUnits.GetById(ProductivityUnitNo);
            ProductivityUnitViewModel result             = new ProductivityUnitViewModel();

            if (ProductivityUnitDB != null)
            {
                result = DBProductivityUnits.ParseToViewModel(ProductivityUnitDB);

                result.BillingProjects = DBProjectBilling.ParseListToViewModel(DBProjectBilling.GetByNUnidadeProdutiva(result.ProductivityUnitNo));
                result.CoffeeShops     = DBCoffeeShops.ParseListToViewModel(DBCoffeeShops.GetByNUnidadeProdutiva(result.ProductivityUnitNo), _config.NAVDatabaseName, _config.NAVCompanyName);
            }
            else
            {
                result.ProductivityUnitNo = new int();
                result.BillingProjects    = new List <DBProjectBillingViewModel>();
                result.CoffeeShops        = new List <CoffeeShopViewModel>();
            }

            //Get Project Movements Values

            if (String.IsNullOrEmpty(result.ProjectKitchen))
            {
                List <MovimentosDeProjeto> KMovements = DBProjectMovements.GetByProjectNo(result.ProjectKitchen);
                result.ProjectKitchenTotalMovs = KMovements.Where(x => x.PreçoTotal.HasValue).Sum(x => x.PreçoTotal.Value);
            }

            if (String.IsNullOrEmpty(result.ProjectSubsidiaries))
            {
                List <MovimentosDeProjeto> SMovements = DBProjectMovements.GetByProjectNo(result.ProjectSubsidiaries);
                result.ProjectSubsidiariesTotalMovs = SMovements.Where(x => x.PreçoTotal.HasValue).Sum(x => x.PreçoTotal.Value);
            }

            if (String.IsNullOrEmpty(result.ProjectWasteFeedstock))
            {
                List <MovimentosDeProjeto> WMovements = DBProjectMovements.GetByProjectNo(result.ProjectWasteFeedstock);
                result.ProjectWasteFeedstockTotalMovs = WMovements.Where(x => x.PreçoTotal.HasValue).Sum(x => x.PreçoTotal.Value);
            }

            return(Json(result));
        }
        public JsonResult UpdateProductivityUnit([FromBody] ProductivityUnitViewModel data)
        {
            try
            {
                if (data != null)
                {
                    data.CreateUser = User.Identity.Name;
                    UnidadesProdutivas CObject = DBProductivityUnits.ParseToDb(data);
                    CObject = DBProductivityUnits.GetById(CObject.NºUnidadeProdutiva);

                    if (CObject != null)
                    {
                        CObject.Descrição    = data.Description;
                        CObject.Estado       = data.Status;
                        CObject.NºCliente    = data.ClientNo;
                        CObject.CódigoRegião = data.CodeRegion;
                        CObject.CódigoCentroResponsabilidade = data.CodeResponsabilityCenter;
                        CObject.CódigoÁreaFuncional          = data.CodeFunctionalArea;
                        CObject.DataInícioExploração         = data.StartDateExploration != "" && data.StartDateExploration != null?DateTime.Parse(data.StartDateExploration) : (DateTime?)null;

                        CObject.DataFimExploração = data.EndDateExploration != "" && data.EndDateExploration != null?DateTime.Parse(data.EndDateExploration) : (DateTime?)null;

                        CObject.Armazém                = data.Warehouse;
                        CObject.ArmazémFornecedor      = data.WarehouseSupplier;
                        CObject.ProjetoCozinha         = data.ProjectKitchen;
                        CObject.ProjetoDesperdícios    = data.ProjectWaste;
                        CObject.ProjetoDespMatPrimas   = data.ProjectWasteFeedstock;
                        CObject.ProjetoMatSubsidiárias = data.ProjectSubsidiaries;
                        CObject.DataHoraModificação    = DateTime.Now;
                        CObject.UtilizadorModificação  = User.Identity.Name;
                        DBProductivityUnits.Update(CObject);


                        //Get Project Billing Projets
                        List <ProjetosFaturação> ExistingPBillings = DBProjectBilling.GetByNUnidadeProdutiva(CObject.NºUnidadeProdutiva);

                        List <DBProjectBillingViewModel> PBillingsToCreate = data.BillingProjects.Where(pb => !ExistingPBillings.Any(x => x.NºUnidadeProdutiva == pb.ProductivityUnitNo && x.NºProjeto == pb.ProjectNo)).ToList();
                        List <ProjetosFaturação>         PBillingsToDelete = ExistingPBillings.Where(x => !data.BillingProjects.Any(pb => x.NºUnidadeProdutiva == pb.ProductivityUnitNo && x.NºProjeto == pb.ProjectNo)).ToList();

                        //Create Billing Projects
                        PBillingsToCreate.ForEach(x =>
                        {
                            x.Active             = true;
                            x.ProductivityUnitNo = CObject.NºUnidadeProdutiva;
                            x.CreateUser         = User.Identity.Name;
                            x.Selected           = false;
                            DBProjectBilling.Create(DBProjectBilling.ParseToDB(x));
                        });

                        PBillingsToDelete.ForEach(x =>
                        {
                            DBProjectBilling.Delete(x);
                        });

                        ExistingPBillings.ForEach(x =>
                        {
                            DBProjectBillingViewModel PBToUpdate = data.BillingProjects.Where(pb => x.NºUnidadeProdutiva == pb.ProductivityUnitNo && x.NºProjeto == pb.ProjectNo).FirstOrDefault();
                            x.NºProjeto             = PBToUpdate.ProjectNo;
                            x.UtilizadorModificação = User.Identity.Name;
                            x.DataHoraModificação   = DateTime.Now;
                            DBProjectBilling.Update(x);
                        });

                        data             = DBProductivityUnits.ParseToViewModel(CObject);
                        data.eReasonCode = 1;
                    }
                    else
                    {
                        data.eReasonCode = 3;
                        data.eMessage    = "Ocorreu um erro ao atualizar os dados na base de dados.";
                    }
                }
            }
            catch (Exception ex)
            {
                data.eReasonCode = 2;
                data.eMessage    = "Ocorreu um erro ao atualizar a Unidade Produtiva.";
            }
            return(Json(data));
        }