public async Task <IActionResult> OrderExpensesSubItem_Map([FromBody] MondayApiRequest request)
        {
            var extractedSubItemData = await Task.Run(() => _mondayDataProvider.GetCustomEntityList(new Dictionary <string, string>()
            {
                { "SubItem Mapping List (Create SubItem field with 3 numeric columns)", "text" }
            })
                                                      );

            return(Ok(extractedSubItemData.Data));
        }
        public async Task <IActionResult> ExpenseItem_Map([FromBody] MondayApiRequest request)
        {
            var extractedExpenseData = await Task.Run(() => _mondayDataProvider.GetCustomEntityList(new Dictionary <string, string>()
            {
                { "Name", "text" }, { "Expenses", "text" }, { "Date", "date" }
            })
                                                      );

            return(Ok(extractedExpenseData.Data));
        }
        public async Task <IActionResult> ExtractComplete_Unsubscribe([FromBody] MondayApiRequest request)
        {
            // Remove the subscription from your persistent storage based on the unique webhookId
            await _storageService.DownloadFromBlobStorage();

            await _storageService.RemoveAsync(request.Payload.WebHookId.ToString());

            await _storageService.UploadToBlobStorage();

            return(Ok());
        }
        public async Task <IActionResult> OrderItem_Map([FromBody] MondayApiRequest request)
        {
            var extractedOrderData = await Task.Run(() => _mondayDataProvider.GetCustomEntityList(new Dictionary <string, string>()
            {
                { "Customer Name", "text" }, { "Supplier", "text" }, { "Order Number", "text" },
                { "Order Date", "date" }, { "Terms", "text" }, { "Delivery Date", "date" }, { "Delivery Address", "text" },
                { "Document Number", "text" }
            })
                                                    );

            return(Ok(extractedOrderData.Data));
        }
        public async Task <IActionResult> ExtractComplete_Subscribe([FromBody] MondayApiRequest request)
        {
            // Verify authorization header (token expiry, aud or endpoint must match subscription url)
            // Manage and persist subscription details (e.g. subscriptionId, accountId, userId,webhook url)
            // Webhook url is the one that will be used by the uipath workflow to callback or trigger the custom action of the recipe
            await _storageService.DownloadFromBlobStorage();

            await _storageService.StoreAsync(request.Payload);

            await _storageService.UploadToBlobStorage();

            // Return webhook id, if not supplied this will be the same as subscriptionId
            return(Ok());
        }
        public async Task <IActionResult> ExtractDocument([FromBody] MondayApiRequest value, [FromQuery] ExecutionType executionType, [FromQuery] StartJobParamSearch jobParam)
        {
            var headerToken = Request.Headers["Authorization"];
            //JwtPayload JwtPayload = Redirect($"api/auth/PerformVerification?token={headerToken}");
            // Verify JWT token (contains a default redirect URI)
            var jwtPayloadStr = _jwtTokenVerificationService.Verify(headerToken, _configuration["MondayAPI:SS"]);

            if (jwtPayloadStr.Contains("invalid") || jwtPayloadStr.Contains("expired"))
            {
                return(Unauthorized());
            }
            var jwtPayload = JsonConvert.DeserializeObject <JwtPayload>(jwtPayloadStr);

            _accessToken = jwtPayload.shortLivedToken ?? _configuration["MondayAPI:AccessToken"];

            WorkflowInputRequest wfInputReq    = new WorkflowInputRequest();
            InboundFieldValues   inboundValues = value.Payload.InboundFieldValues;

            // Mark as processing
            var item = await _mondayDataProvider.UpdateItem(_accessToken, inboundValues.BoardId, inboundValues.ItemId, "{  \"name\": \"Extracting Document.. Please wait...\"}".Replace("\"", "\\\""));

            // Initialize workflow input values
            wfInputReq.in_ParentItemId = inboundValues.ItemId;
            wfInputReq.in_SS           = _configuration["MondayAPI:SS"];
            // Get webhook url based on the subscribed boards to trigger monday update after extract completion
            string boardId     = inboundValues.BoardId.ToString();
            var    subsPayload = await _storageService.GetAsync(boardId);

            wfInputReq.in_CompletionTriggerUrl = subsPayload?.Data?.WebhookUrl;

            // Get input file/s
            Result <Item[]> items = await _mondayDataProvider.GetItemsDetails(_accessToken, wfInputReq.in_ParentItemId.ToString());

            Item   currentItem = items?.Data.FirstOrDefault();
            JArray filesJArray = JArray.Parse(JObject.Parse(currentItem.ColumnValues.Where(c => c.Id == inboundValues.FileColumnId)
                                                            ?.Single()?.Value)["files"].ToString());
            var fileAssetIds = filesJArray.Select(f => f["assetId"].ToString()).ToList();

            wfInputReq.in_FileUrls = fileAssetIds.Select(f => _mondayDataProvider.GetAssetDetails(_accessToken, f))
                                     .ToDictionary(a => a.Result?.Data.FirstOrDefault().Name, a => a.Result?.Data.FirstOrDefault().PublicUrl);
            if (wfInputReq.in_FileUrls.Count() == 0)
            {
                await _mondayDataProvider.UpdateItem(_accessToken, inboundValues.BoardId, inboundValues.ItemId, "{  \"name\": \"Please attach a file first.\"}".Replace("\"", "\\\""));

                return(Ok());
            }

            // Check subitem columns metadata
            Result <Board[]> boards = await _mondayDataProvider.GetBoardDetails(_accessToken);

            var   currentBoardName = currentItem.Board.Name;
            Board subItemBoard;

            try { subItemBoard = boards?.Data.Where(b => b.Name.ToUpper() == $"SUBITEMS OF {currentBoardName.ToUpper()}")?.Single(); }
            catch (Exception ex) { subItemBoard = null; }

            if (subItemBoard != null)
            {
                var columnList          = subItemBoard.Columns;
                var subItemTemplateDict = new Dictionary <string, string>();
                foreach (Column col in columnList)
                {
                    var colObjectStr = JsonConvert.SerializeObject(col);
                    if (col.type == "name")
                    {
                        subItemTemplateDict.Add(colObjectStr, $"\\\"{col.id}\\\":\\\"<>\\\"");
                    }
                    else
                    {
                        subItemTemplateDict.Add(colObjectStr, $"\\\"{col.id}\\\":<>");
                    }
                }
                wfInputReq.in_SubItemTemplate = subItemTemplateDict;
            }

            // Prepare inputs and start UiPath job for DU
            string inputArgs = JsonConvert.SerializeObject(wfInputReq);

            jobParam.Process          = "Monday";
            jobParam.ProcessExecution = executionType;
            if (jobParam.ProcessExecution == ExecutionType.None)
            {
                await _uiPathOrchestratorService.StartJob(inputArgs, jobParam.Process, jobParam.Folder, jobParam.Machine);
            }
            else
            {
                await _uiPathOrchestratorService.StartJob(inputArgs, jobParam.Process, jobParam.ProcessExecution);
            }
            return(Ok());
        }
        public async Task <IActionResult> ExtractComplete_Action([FromBody] MondayApiRequest request)
        {
            var headerToken = Request.Headers["Authorization"];
            //JwtPayload JwtPayload = Redirect($"api/auth/PerformVerification?token={headerToken}");
            // Verify JWT token (contains a default redirect URI)
            var jwtPayloadStr = _jwtTokenVerificationService.Verify(headerToken, _configuration["MondayAPI:SS"]);

            if (jwtPayloadStr.Contains("invalid") || jwtPayloadStr.Contains("expired"))
            {
                return(Unauthorized());
            }
            var jwtPayload = JsonConvert.DeserializeObject <JwtPayload>(jwtPayloadStr);

            _accessToken = jwtPayload.shortLivedToken ?? _configuration["MondayAPI:AccessToken"];

            ///TODO: Identify what instance of the recipe (subscription) you would like triggered on the monday.com side
            var values = request.Payload.InboundFieldValues;

            // UPDATE ITEM -  Perform mutation on monday board (change_multiple_column_values) using the request body
            string columnValue = JsonConvert.SerializeObject(values.ItemMapping,
                                                             new JsonSerializerSettings {
                NullValueHandling = NullValueHandling.Ignore
            });
            var itemJObject = JsonConvert.DeserializeObject <JObject>(columnValue);

            itemJObject.Property("__groupId__").Remove();
            try
            {
                if (String.IsNullOrEmpty(itemJObject["name"].ToString()))
                {
                    itemJObject["name"] = "Extraction Complete. Customer Name is missing or not mapped.";
                }
            }
            catch (Exception ex) { }
            columnValue = itemJObject.ToString().Replace("\"", "\\\"");
            var item = await _mondayDataProvider.UpdateItem(_accessToken, values.BoardId,
                                                            values.ItemId, columnValue);


            // CREATE SUBITEM -  Perform mutation on monday board (create_subitem) using the request body
            columnValue = JsonConvert.SerializeObject(values.SudoSubitemMapping,
                                                      new JsonSerializerSettings {
                NullValueHandling = NullValueHandling.Ignore
            });
            itemJObject = JsonConvert.DeserializeObject <JObject>(columnValue);
            itemJObject.Property("name").Remove();
            itemJObject.Property("__groupId__").Remove();
            columnValue = itemJObject.PropertyValues().FirstOrDefault().ToString().Replace(",,", ",").Replace(",,", ",");
            var subItemJArray = JsonConvert.DeserializeObject <JArray>(columnValue);

            ///TODO: Implement using Parallel for each
            foreach (JObject subItem in subItemJArray)
            {
                try
                {
                    var subItemName = subItem["name"].ToString();
                    subItem.Property("name").Remove();
                    columnValue = subItem.ToString().Replace("\"", "\\\"");
                    await _mondayDataProvider.CreateSubItem(_accessToken, values.ItemId, subItemName, columnValue);
                }
                catch (Exception)
                {}
            }

            return(Ok("Completed Monday updates for " + values.ItemId));
        }
 public async Task <IActionResult> ProcessExpense([FromBody] MondayApiRequest value)
 {
     // For expenses, the desktop automation is already being done from Document Understanding workflow
     return(Ok());
 }
        public async Task <IActionResult> ProcessOrder([FromBody] MondayApiRequest value, [FromQuery] ExecutionType executionType, [FromQuery] StartJobParamSearch jobParam)
        {
            var headerToken = Request.Headers["Authorization"];
            //JwtPayload JwtPayload = Redirect($"api/auth/PerformVerification?token={headerToken}");
            // Verify JWT token (contains a default redirect URI)
            var jwtPayloadStr = _jwtTokenVerificationService.Verify(headerToken, _configuration["MondayAPI:SS"]);

            if (jwtPayloadStr.Contains("invalid") || jwtPayloadStr.Contains("expired"))
            {
                return(Unauthorized());
            }
            var jwtPayload = JsonConvert.DeserializeObject <JwtPayload>(jwtPayloadStr);

            _accessToken = jwtPayload.shortLivedToken ?? _configuration["MondayAPI:AccessToken"];

            WorkflowInputRequest wfInputReq    = new WorkflowInputRequest();
            InboundFieldValues   inboundValues = value.Payload.InboundFieldValues;

            // Initialize workflow input values
            wfInputReq.in_ParentItemId = inboundValues.ItemId;
            wfInputReq.in_SS           = _configuration["MondayAPI:SS"];
            // Get webhook url based on the subscribed boards to trigger monday update after extract completion
            string boardId     = inboundValues.BoardId.ToString();
            var    subsPayload = await _storageService.GetAsync(boardId);

            wfInputReq.in_CompletionTriggerUrl = subsPayload?.Data?.WebhookUrl;

            // Get inputs
            Result <Item[]> items = await _mondayDataProvider.GetItemsDetails(_accessToken, wfInputReq.in_ParentItemId.ToString());

            try { wfInputReq.in_PoNumber = items?.Data.FirstOrDefault().ColumnValues.Where(c => c.Id == inboundValues.OrderColumnId)?.Single()?.Text; }
            catch (Exception) { wfInputReq.in_PoNumber = new Random().Next(10000, 99999).ToString(); }


            // Prepare inputs and start UiPath job
            string inputArgs = JsonConvert.SerializeObject(wfInputReq);

            jobParam.Process          = "Posting";
            jobParam.ProcessExecution = executionType;
            string postToValue = "SAP BAPI";

            try { postToValue = items?.Data.FirstOrDefault().ColumnValues.Where(c => c.Id == inboundValues.PostToColumnId)?.Single()?.Text; }
            catch (Exception) { }

            if (jobParam.ProcessExecution == ExecutionType.None)
            {
                await _uiPathOrchestratorService.StartJob(inputArgs, jobParam.Process, jobParam.Folder, jobParam.Machine);
            }
            else if (jobParam.ProcessExecution == ExecutionType.Foreground && postToValue != null)
            {
                wfInputReq.in_System = postToValue.Contains(Enum.GetName(typeof(Application), Application.SAP)) ? Enum.GetName(typeof(Application), Application.SAP) : "";
                if (wfInputReq.in_System == Application.SAP.ToString())
                {
                    wfInputReq.in_PostViaBapi = postToValue.Contains(Enum.GetName(typeof(SAP_Interaction), SAP_Interaction.BAPI)) ? "Y" : "N";
                }
                inputArgs = JsonConvert.SerializeObject(wfInputReq);
                await _uiPathOrchestratorService.StartJob(inputArgs, jobParam.Process, jobParam.ProcessExecution);
            }
            else
            {
                await _uiPathOrchestratorService.StartJob(inputArgs, jobParam.Process, jobParam.ProcessExecution);
            }

            // In case no document number
            var templateFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                                            @$ "Workflows\SOPosting\templates\Payload\BodyTemplate_Order.txt");
            var bodyTemplateTrigger = await System.IO.File.ReadAllTextAsync(templateFile);

            bodyTemplateTrigger = bodyTemplateTrigger.Replace("<Document No.>", new Random().Next(10000, 99999).ToString()).Replace("<in_ParentItemId>", wfInputReq.in_ParentItemId.ToString());
            Utilities.WebUtility webUtility = new Utilities.WebUtility(wfInputReq.in_CompletionTriggerUrl);
            string response = await webUtility.PostAsync(bodyTemplateTrigger, new Dictionary <string, List <string> >() { { "Authorization", new List <string>()
                                                                                                                            {
                                                                                                                                wfInputReq.in_SS
                                                                                                                            } } });

            return(Ok());
        }