Example #1
0
        public void PgPurchaseOrder_schema_validation()
        {
            // Arrange
            var pgPurchaseOrder = new PgPurchaseOrder
            {
                TotalAmount   = 123,
                CostNumber    = "TestCostNumber1",
                PaymentAmount = 111,
                AccountCode   = "TestAccountCode",
                BasketName    = "TestBasketName",
                CategoryId    = "MGCCode",
                Currency      = "CurrencyName",
                DeliveryDate  = DateTime.Parse("2017-08-09T11:26:45.345Z"),
                Description   = "TestDescription",
                GL            = "GLCode",
                GrNumbers     = new[] { "Number1" },
                IONumber      = "IONumber",
                ItemIdCode    = "ItemIdCode",
                LongText      = new PgPurchaseOrder.LongTextField
                {
                    AN = new List <string> {
                        "AN1"
                    },
                    BN = new List <string> {
                        "BN1"
                    },
                    VN = new List <string> {
                        "VN1"
                    }
                },
                TNumber            = "TNUmber",
                RequisitionerEmail = "RequisitionerEmail",
                PoNumber           = "PONumber",
                StartDate          = DateTime.Parse("2017-08-30T11:26:45.345Z"),
                Vendor             = "VendorCode",
                Commodity          = "CostTypeBuyoutTypeCombined"
            };
            var serialized = JsonConvert.SerializeObject(pgPurchaseOrder, Formatting.None, SerializerSettings);

            // Act
            var jobject = JObject.Parse(serialized);

            // Assert
            jobject.IsValid(_schema, out IList <string> errors).Should().BeTrue(GetSchemaValidationAssertionReason(errors));
        }
        public async Task <PgPurchaseOrder> GetPurchaseOrder(CostStageRevisionStatusChanged stageRevisionStatusChanged)
        {
            var costData = await _efContext.Cost
                           .Include(c => c.LatestCostStageRevision)
                           .ThenInclude(csr => csr.CostStage)
                           .Where(c => c.Id == stageRevisionStatusChanged.AggregateId)
                           .Include(c => c.Parent)
                           .ThenInclude(p => p.Agency)
                           .Select(c => new
            {
                BrandName                 = c.Project.Brand != null ? c.Project.Brand.Name : string.Empty,
                CostNumber                = c.CostNumber,
                CostId                    = c.Id,
                StageDetailsData          = c.LatestCostStageRevision.StageDetails.Data,
                ProductionDetailsData     = c.LatestCostStageRevision.ProductDetails.Data,
                LatestCostStageRevisionId = c.LatestCostStageRevision.Id,
                AgencyLabels              = c.Parent.Agency.Labels,
                CostStageRevisionKey      = c.LatestCostStageRevision.CostStage.Key,
                CostStageRevisionName     = c.LatestCostStageRevision.CostStage.Name,
                Requisitioner             = c.LatestCostStageRevision.Approvals
                                            .Where(a => a.Type == ApprovalType.Brand && a.Requisitioners.Any())
                                            .SelectMany(a => a.Requisitioners)
                                            .Select(r => r.CostUser)
                                            .FirstOrDefault(),
                CostType     = c.CostType,
                ExchangeRate = c.ExchangeRate
            })
                           .FirstOrDefaultAsync();

            if (costData == null)
            {
                _logger.Error($"Couldn't find cost with id {stageRevisionStatusChanged.AggregateId}");
                return(null);
            }

            var purchaseOrderDto = new PgPurchaseOrderDTO
            {
                BrandName                 = costData.BrandName,
                CostNumber                = costData.CostNumber,
                StageDetailsData          = costData.StageDetailsData,
                ProductionDetailsData     = costData.ProductionDetailsData,
                LatestCostStageRevisionId = costData.LatestCostStageRevisionId,
                AgencyLabels              = costData.AgencyLabels,
                CostStageRevisionKey      = costData.CostStageRevisionKey,
                CostStageRevisionName     = costData.CostStageRevisionName,
                RequisitionerEmail        = costData.Requisitioner?.Email,
                TNumber = costData.Requisitioner?.FederationId
            };

            var stageDetailsForm      = JsonConvert.DeserializeObject <PgStageDetailsForm>(purchaseOrderDto.StageDetailsData);
            var productionDetailsForm = purchaseOrderDto.ProductionDetailsData != null?JsonConvert.DeserializeObject <PgProductionDetailsForm>(purchaseOrderDto.ProductionDetailsData) : null;

            var paymentAmount = await GetTotals(stageRevisionStatusChanged.CostStageRevisionId, costData.ExchangeRate);

            var applicableCurrencyCode = await _currencyService.GetCurrencyCode(stageDetailsForm.AgencyCurrency, productionDetailsForm);

            var ledgerMaterialCode = await _ledgerMaterialCode.GetLedgerMaterialCodes(purchaseOrderDto.LatestCostStageRevisionId);

            var purchaseOrderResponse = await _customDataService.GetCustomData <PgPurchaseOrderResponse>(purchaseOrderDto.LatestCostStageRevisionId, CustomObjectDataKeys.PgPurchaseOrderResponse);

            var paymentDetails = await _customDataService.GetCustomData <PgPaymentDetails>(purchaseOrderDto.LatestCostStageRevisionId, CustomObjectDataKeys.PgPaymentDetails);

            var purchaseOrder = new PgPurchaseOrder
            {
                BasketName         = GetBasketName(purchaseOrderDto, stageDetailsForm),
                Description        = GetDescription(purchaseOrderDto, stageDetailsForm),
                TotalAmount        = paymentAmount.TotalAmount,
                PaymentAmount      = paymentAmount.PaymentAmount,
                StartDate          = stageRevisionStatusChanged.TimeStamp,
                CostNumber         = purchaseOrderDto.CostNumber ?? "",
                Currency           = applicableCurrencyCode,
                CategoryId         = ledgerMaterialCode?.MgCode ?? "",
                GL                 = ledgerMaterialCode?.GlCode ?? "",
                DeliveryDate       = GetDeliveryDate(stageRevisionStatusChanged.TimeStamp),
                IONumber           = !string.IsNullOrEmpty(paymentDetails?.IoNumber) ? $"00{paymentDetails.IoNumber}" : "",
                LongText           = GetLongTextField(stageRevisionStatusChanged, purchaseOrderDto, stageDetailsForm, purchaseOrderResponse, paymentAmount.PaymentAmount, applicableCurrencyCode, costData.CostType),
                TNumber            = purchaseOrderDto.TNumber ?? "",
                RequisitionerEmail = purchaseOrderDto.RequisitionerEmail ?? "",
                Vendor             = GetVendor(purchaseOrderDto, productionDetailsForm) ?? "",
                PoNumber           = paymentDetails?.PoNumber ?? "",
                AccountCode        = purchaseOrderResponse?.AccountCode ?? "",
                ItemIdCode         = purchaseOrderResponse?.ItemIdCode ?? "",
                GrNumbers          = await GetGrNumbers(stageRevisionStatusChanged),
                Commodity          = GetCommodity(costData.CostType, stageDetailsForm)
            };

            return(purchaseOrder);
        }