コード例 #1
0
        public async Task <ServiceResult <BudgetFormUploadResult> > UploadBudgetForm(Guid costId, Guid costStageId, Guid costStageRevisionId, UserIdentity userIdentity, IFormFile file)
        {
            //Read the properties from the Properties excel sheet.
            ExcelProperties properties;

            using (var fileStream = file.OpenReadStream())
            {
                properties = _excelCellService.ReadProperties(file.FileName, fileStream);
            }

            //Validate the uploaded budget form is the correct format for the cost being updated.
            var stageForm = await _costStageRevisionService.GetStageDetails <PgStageDetailsForm>(costStageRevisionId);

            string contentType      = stageForm.GetContentType();
            string production       = stageForm.GetProductionType();
            var    validationResult = _budgetFormValidator.IsValid(properties, contentType, production);

            if (!validationResult.Success)
            {
                return(ServiceResult <BudgetFormUploadResult> .CloneFailedResult(validationResult));
            }

            //Read the cost line items
            ExcelCellValueLookup entries;

            using (var fileStream = file.OpenReadStream())
            {
                entries = await _excelCellService.ReadEntries(properties[core.Constants.BudgetFormExcelPropertyNames.LookupGroup], file.FileName, fileStream);
            }

            //Update the currencies in the Cost
            var currencyResult = await _costCurrencyUpdater.Update(entries, userIdentity.Id, costId, costStageRevisionId);

            if (!currencyResult.Success)
            {
                return(ServiceResult <BudgetFormUploadResult> .CloneFailedResult(currencyResult));
            }

            //Update the cost
            var costLineItemResult = await _costLineItemUpdater.Update(entries, userIdentity, costId, costStageRevisionId);

            if (!costLineItemResult.Success)
            {
                return(ServiceResult <BudgetFormUploadResult> .CloneFailedResult(costLineItemResult));
            }

            //Save updates made by _costLineItemUpdater and _costCurrencyUpdater.
            await _efContext.SaveChangesAsync();

            //Add Budget form to GDN using Gdam Core.
            var supportingDocument = await _supportingDocumentsService.GetSupportingDocument(costStageRevisionId, core.Constants.SupportingDocuments.BudgetForm);

            await _supportingDocumentsService.UploadSupportingDocumentRevision(costId, supportingDocument, userIdentity, file);

            var supportingDocumentViewModel = _mapper.Map <SupportingDocumentViewModel>(supportingDocument);

            var costLineItemModels = _mapper.Map <List <CostLineItemViewModel> >(costLineItemResult.Result);

            var budgetFormUploadResult = new BudgetFormUploadResult
            {
                Currencies         = currencyResult.Result,
                CostLineItems      = costLineItemModels,
                SupportingDocument = supportingDocumentViewModel
            };

            var costNumber = await _efContext.Cost.Where(c => c.Id == costId).Select(c => c.CostNumber).SingleAsync();

            await _activityLogService.Log(new BudgetFormUploaded(costNumber, file.FileName, supportingDocument.Id, userIdentity));

            return(new ServiceResult <BudgetFormUploadResult>(budgetFormUploadResult));
        }