private void Configure(ConverterConfigurator <SecondContractDocument <SecondContractDocumentBody>, SecondContractDocumentBody, InnerDocument, InnerDocument, InnerDocument> subConfigurator)
        {
            subConfigurator.Target(data => data.OrdersNumber).Set(message => message.BeginningOfMessage.DocumentMessageIdentification.DocumentIdentifier);
            subConfigurator.ConfigureDateOrUtcNow("137", data => data.OrdersDate);
            subConfigurator.ConfigureDate("50", data => data.ReceivingDate);

            subConfigurator.Target(data => data.CurrencyCode).Set(message => (from details in message.Currency.CurrencyDetails
                                                                              where details.UsageCodeQualifier == "2" && details.TypeCodeQualifier == "4"
                                                                              select details.IdentificationCode).FirstOrDefault(),
                                                                  s => defaultConverter.Convert(s));

            subConfigurator.Target(data => data.FlowType).Set(message => message.FreeText.Any(y => y.TextSubjectCodeQualifier == "DEL")
                                                                             ? defaultConverter.Convert(message.FreeText.FirstOrDefault(y => y.TextSubjectCodeQualifier == "DEL").TextReference.FreeTextValueCode)
                                                                             : message.FreeText.Any(y => y.TextSubjectCodeQualifier == "ZZZ" && y.TextLiteral.FreeTextValue[0] == "Fresh")
                                                                                 ? "fresh"
                                                                                 : defaultConverter.Convert(message.SG28.FirstOrDefault().FreeText.FirstOrDefault(y => y.TextSubjectCodeQualifier == "DEL" && y.TextReference.CodeListResponsibleAgencyCode == "ZZZ").TextReference.FreeTextValueCode));

            subConfigurator.Target(data => data.TransportDetails.VehicleNumber)
            .Set(message => message.SG10.FirstOrDefault(sg10 => sg10.DetailsOfTransport.TransportStageCodeQualifier == "1").DetailsOfTransport.TransportIdentification.TransportMeansIdentificationName);

            subConfigurator.Target(data => data.FreeText).Set(message => ArrayStringConverter.ToString(message.FreeText.FirstOrDefault(freeText => freeText.TextSubjectCodeQualifier == "ZZZ" || freeText.TextSubjectCodeQualifier == "PUR" || freeText.TextSubjectCodeQualifier == "AAI").TextLiteral.FreeTextValue));

            subConfigurator.GoTo(x => x, x => x.References).ConfigureReference("BO", data => data.BlanketOrdersNumber);

            subConfigurator.If(message => !string.IsNullOrEmpty(message.ControlTotal.FirstOrDefault(cnt => cnt.Control.ControlTotalTypeCodeQualifier == "11").Control.ControlTotalValue))
            .Target(data => data.OrdersTotalPackageQuantity)
            .Set(message => decimalConverter.ToDecimal(message.ControlTotal.FirstOrDefault(cnt => cnt.Control.ControlTotalTypeCodeQualifier == "11").Control.ControlTotalValue));

            subConfigurator.ConfigureMonetaryAmountsInfo(new MonetaryAmountConfig <InnerDocument>("79", x => x.RecadvTotal),
                                                         new MonetaryAmountConfig <InnerDocument>(new[] { "77", "9" }, x => x.TotalWithVAT));

            subConfigurator.GoTo(x => x.DespatchParties.Each().PartyInfo, message => message.PartiesArray.Where(sg2 => sg2.NameAndAddress.PartyFunctionCodeQualifier == "PW").Current())
            .ConfigureParty <SecondContractDocument <SecondContractDocumentBody>, InnerDocument, SG2, SG3, SG5>();

            subConfigurator.GoTo(data => data.Transports.Each(),
                                 message => message.SG10.Where(sg10 => sg10.DetailsOfTransport.TransportStageCodeQualifier == "20")
                                 .SelectMany(sg10 => DefaultIfNullOrEmpty(sg10.SG11),
                                             (sg10, sg11) => new
            {
                sg10.DetailsOfTransport.TransportMeans.TransportMeansDescription,
                TypeOfTransportCode = defaultConverter.Convert(sg10.DetailsOfTransport.TransportMeans.TransportMeansDescriptionCode),
                sg11.DateTimePeriod
            })
                                 .Where(x => !string.IsNullOrEmpty(x.TypeOfTransportCode) || !string.IsNullOrEmpty(x.TransportMeansDescription) || x.DateTimePeriod != null)
                                 .Current())
            .BatchSet((x, y) => new Batch
            {
                { x.TypeOfTransport, y.TransportMeansDescription },
                { x.TypeOfTransportCode, y.TypeOfTransportCode },
                { x.DeliveryDateForVehicle, dateTimePeriodConverter.ToDateTime(y.DateTimePeriod.FirstOrDefault(period => period.DateTimePeriodGroup.FunctionCodeQualifier == "232").DateTimePeriodGroup) },
            });

            ConfigureGoodItems(subConfigurator.GoTo(data => data.GoodItems.Each(), message => message.SG28.Current()));
        }
Example #2
0
        private void ConfigureGoodItems(ConverterConfigurator <InnerDocument, CommonGoodItem, SecondContractDocument <SecondContractDocumentBody>, SG28, SG28> configurator)
        {
            configurator.Target(sg26 => sg26.LineItem.LineItemIdentifier).Set(item => (item.CurrentIndex() + 1).ToString());
            configurator.Target(sg26 => sg26.LineItem.ItemNumberIdentification.ItemIdentifier).Set(item => item.GTIN);

            configurator.GoTo(sg26 => sg26.AdditionalProductId[0]).BatchSet(
                (additionalProductId, item) => new Batch
            {
                { additionalProductId.ProductIdentifierCodeQualifier, "z" },
                { additionalProductId.ItemNumberIdentification[0].ItemTypeIdentificationCode, "IN" },
                { additionalProductId.ItemNumberIdentification[0].ItemIdentifier.NotNull(), item.BuyerProductId }
            }
                );

            configurator.GoTo(sg26 => sg26.AdditionalProductId[1]).BatchSet(
                (additionalProductId, item) => new Batch
            {
                { additionalProductId.ProductIdentifierCodeQualifier, "q" },
                { additionalProductId.ItemNumberIdentification[0].ItemTypeIdentificationCode, "SA" },
                { additionalProductId.ItemNumberIdentification[0].ItemIdentifier.NotNull(), item.SupplierProductId }
            }
                );

            configurator.Target(sg26 => sg26.Quantity[0].QuantityDetails.Quantity).Set(item => decimalConverter.ToString(item.Quantity.Value));
            configurator.Target(sg26 => sg26.Quantity[0].QuantityDetails.MeasurementUnitCode).Set(item => defaultConverter.Convert(item.Quantity.MeasurementUnitCode));

            configurator.Target(sg26 => sg26.MonetaryAmount[0].MonetaryAmountGroup.MonetaryAmountTypeCodeQualifier).Set("203");
            configurator.Target(sg26 => sg26.MonetaryAmount[0].MonetaryAmountGroup.MonetaryAmount).Set(item => item.PriceSummary, s => StaticPriceFormatter.FormatPrice(s));

            configurator.Target(message => message.DateTimePeriod[0])
            .Set(data => data.ExpireDate, dateTime => StaticDateTimePeriodConverter.ToDateTimePeriod(dateTime, "36", "102"));

            configurator.If(data => !string.IsNullOrEmpty(data.SerialNumber)).GoTo(gin => gin.GoodsIdentityNumber[0]).BatchSet(
                (gin, item) => new Batch
            {
                { gin.ObjectIdentificationCodeQualifier, "BN" },
                { gin.IdentityNumberRange[0].ObjectIdentifier, ArrayStringConverter.ToArrayString(item.SerialNumber, 35, 2) }
            });

            configurator.GoTo(sg26 => sg26.FreeText.Each(), item => item.FreeTexts(defaultConverter).ToArray().Current()).BatchSet(
                (ft, data) => new Batch
            {
                { ft.TextSubjectCodeQualifier, data.TextSubjectCodeQualifier },
                { ft.TextReference.FreeTextValueCode, data.FreeTextFunctionCode },
                { ft.TextLiteral.FreeTextValue, data.TextLiteral.FreeTextValue }
            });
        }
        public static IEnumerable <FreeText> FreeTexts(this CommonGoodItem item, DefaultConverter defaultConverter)
        {
            if (item == null)
            {
                yield break;
            }

            if (item.FlowType != null)
            {
                yield return(new FreeText
                {
                    TextSubjectCodeQualifier = "DEL",
                    FreeTextFunctionCode = "ZZZ",
                    TextLiteral = new TextLiteral {
                        FreeTextValue = new[] { defaultConverter.Convert(item.FlowType) }
                    },
                });
            }

            var freeTextItems = new[]
            {
                new { subjectCodeQualifier = "PRD", value = item.Dimensions },
                new { subjectCodeQualifier = "ACB", value = item.Comment },
            };

            foreach (var freeTextItem in freeTextItems)
            {
                if (freeTextItem.value != null)
                {
                    yield return new FreeText
                           {
                               TextSubjectCodeQualifier = freeTextItem.subjectCodeQualifier,
                               TextLiteral = new TextLiteral {
                                   FreeTextValue = ArrayStringConverter.ToArrayString(freeTextItem.value, 512, 5)
                               },
                           }
                }
                ;
            }
        }
        public static void ConfigurePartyName <TSecondContract, TData, TSG2, TPartyInfo>(
            this ConverterConfigurator <TSecondContract, TSG2, TData, TPartyInfo, TPartyInfo> configurator)
            where TSG2 : INameAndAddressContainer
            where TPartyInfo : IContainsRussianPartyInfo
        {
            configurator.Target(party => party.RussianPartyInfo.IPInfo.LastName)
            .Set(sg2 => sg2.NameAndAddress.PartyNameType.PartyName[0])
            .NullifyIf(party => party.RussianPartyInfo.RussianPartyType != RussianPartyType.IP);
            configurator.Target(party => party.RussianPartyInfo.IPInfo.FirstName)
            .Set(sg2 => sg2.NameAndAddress.PartyNameType.PartyName[1])
            .NullifyIf(party => party.RussianPartyInfo.RussianPartyType != RussianPartyType.IP);

            configurator.If(sg2 => sg2.NameAndAddress.PartyNameType.PartyName != null)
            .Target(party => party.RussianPartyInfo.ULInfo.Name)
            .Set(sg2 => sg2.NameAndAddress.PartyNameType.PartyName, strings => ArrayStringConverter.ToString(strings))
            .NullifyIf(party => party.RussianPartyInfo.RussianPartyType != RussianPartyType.UL);

            configurator.If(sg2 => sg2.NameAndAddress.PartyNameType.PartyName == null)
            .Target(party => party.RussianPartyInfo.ULInfo.Name)
            .Set(sg2 => sg2.NameAndAddress.NameAndAddressGroup.NameAndAddressDescription, strings => ArrayStringConverter.ToString(strings))
            .NullifyIf(party => party.RussianPartyInfo.RussianPartyType != RussianPartyType.UL);
        }
        public static void ConfigureNameAndAddress <TInner, TSecondContract>(ConverterConfigurator <TInner, PartyInfo, TSecondContract, NameAndAddress, NameAndAddress> configurator, TestConverterContext context, DefaultConverter defaultConverter)
        {
            configurator.Target(nameAndAddress => nameAndAddress.PartyNameType.PartyName)
            .Set(party => party.RussianPartyInfo.RussianPartyType == RussianPartyType.IP
                                          ? new[] { party.RussianPartyInfo.IPInfo.LastName, party.RussianPartyInfo.IPInfo.FirstName, party.RussianPartyInfo.IPInfo.MiddleName }
                                          : ArrayStringConverter.ToArrayString(party.RussianPartyInfo.ULInfo.Name, 35, 5));

            configurator.Target(nameAndAddress => nameAndAddress.PartyNameType.PartyNameFormatCode)
            .Set(party => party.RussianPartyInfo.RussianPartyType == RussianPartyType.IP ? "IP" : "UL");

            var addressConfigurator = configurator.GoTo(address => address, party => party.PartyAddress);

            addressConfigurator.If((x, address) => address.CityName != null ||
                                   address.CountrySubEntityDetails.CountrySubEntityNameCode != null ||
                                   address.CountrySubEntityDetails.CountrySubEntityName != null ||
                                   address.PostalIdentificationCode != null ||
                                   address.Street.StreetAndNumberOrPostBoxIdentifier != null)
            .Target(address => address.CountryNameCode)
            .Set(address => defaultConverter.Convert(address.AddressType == AddressType.Russian ? "643" : address.ForeignAddressInfo.CountryCode));

            var useSemicolon = new[] { MutatorsContextType.None }.Contains(context.MutatorsContextType);

            addressConfigurator.Target(address => address.Street.StreetAndNumberOrPostBoxIdentifier)
            .Set(address => address.AddressType == AddressType.Russian
                                                   ? new[] { address.RussianAddressInfo.Street, address.RussianAddressInfo.House, address.RussianAddressInfo.Flat }.JoinIgnoreEmpty(useSemicolon ? "; " : ", ")
                                                   : address.ForeignAddressInfo.Address,
                 s => ArrayStringConverter.ToArrayString(s, 35, 4));

            addressConfigurator.Target(address => address.CityName)
            .Set(address => address.AddressType == AddressType.Russian
                                                   ? new[] { address.RussianAddressInfo.City, address.RussianAddressInfo.Village }.JoinIgnoreEmpty(", ") : null);

            addressConfigurator.Target(address => address.CountrySubEntityDetails.CountrySubEntityName)
            .Set(address => address.AddressType == AddressType.Russian
                                                   ? new[] { defaultConverter.Convert(address.RussianAddressInfo.RegionCode), address.RussianAddressInfo.District }.JoinIgnoreEmpty(", ") : null);

            addressConfigurator.Target(address => address.PostalIdentificationCode)
            .Set(address => address.AddressType == AddressType.Russian ? address.RussianAddressInfo.PostalCode : null);
        }
        public static void ConfigureCommonGoodItemInfo <TSecondContract, TSecondContractGoodItem, TData, TGoodItem>(
            this ConverterConfigurator <TSecondContract, TSecondContractGoodItem, TData, TGoodItem, TGoodItem> configurator)
            where TSecondContractGoodItem : ISecondContractGoodItemWithAdditionalInfo
            where TGoodItem : GoodItemWithAdditionalInfo
        {
            ConfigureGoodItemBaseInfo(configurator);

            var typeOfUnitConfigurator = configurator.GoTo(goodItem => goodItem, lin => lin.ItemDescription.Where(id => id.DescriptionFormatCode == "C"));

            typeOfUnitConfigurator.Target(goodItem => goodItem.IsReturnableContainer)
            .Set(x => x.FirstOrDefault(code => code.ItemDescriptionGroup.ItemDescriptionCode == "RC").ItemDescriptionGroup.ItemDescriptionCode,
                 rc => rc == "RC");
            typeOfUnitConfigurator.Target(goodItem => goodItem.TypeOfUnit)
            .Set(x => x.FirstOrDefault().ItemDescriptionGroup.ItemDescriptionCode,
                 type => defaultConverter.Convert(type));

            configurator.Target(goodItem => goodItem.Name).Set(goodItem => (from description in goodItem.ItemDescription
                                                                            where description.ItemCharacteristic.ItemCharacteristicCode == null
                                                                            where description.ItemDescriptionGroup.ItemDescription.Length > 0
                                                                            select description.ItemDescriptionGroup.ItemDescription).FirstOrDefault(), strings => ArrayStringConverter.ToString(strings));
        }
        public static void ConfigurePartyAddress <TSecondContract, TData>(
            this ConverterConfigurator <TSecondContract, NameAndAddress, TData, PartyInfo, PartyInfo> configurator)
        {
            configurator.Target(party => party.PartyAddress.AddressType)
            .Set(nameAndAddress => defaultConverter.Convert(nameAndAddress.CountryNameCode), code => GetAddressType(code));
            configurator.Target(party => party.PartyAddress.ForeignAddressInfo.CountryCode)
            .Set(nameAndAddress => nameAndAddress.CountryNameCode,
                 s => defaultConverter.Convert(s),
                 s => s != null && defaultConverter.Convert(s) == null,
                 s => new TestText {
                Text = s
            })
            .NullifyIf(party => party.PartyAddress.AddressType != AddressType.Foreign);

            configurator.Target(party => party.PartyAddress.ForeignAddressInfo.Address)
            .Set(nameAndAddress => nameAndAddress.Street.StreetAndNumberOrPostBoxIdentifier, strings => ArrayStringConverter.ToString(strings))
            .NullifyIf(party => party.PartyAddress.AddressType != AddressType.Foreign);

            configurator.GoTo(x => x.PartyAddress).ConfigureRussianPartyAddress();
            configurator.Target(party => party.PartyAddress.RussianAddressInfo).NullifyIf(party => party.PartyAddress.AddressType != AddressType.Russian);
        }
 public static void ConfigureRussianPartyAddress <TSecondContract, TData, TPartyInfo>(this ConverterConfigurator <TSecondContract, NameAndAddress, TData, TPartyInfo, TPartyInfo> configurator)
     where TPartyInfo : IContainsRussianPartyAdress, IContainsAddressType
 {
     configurator.Target(party => party.RussianAddressInfo.City)
     .Set(nameAndAddress => nameAndAddress.CityName)
     .NullifyIf(party => party.AddressType != AddressType.Russian);
     configurator.Target(party => party.RussianAddressInfo.Street)
     .Set(nameAndAddress => nameAndAddress.Street.StreetAndNumberOrPostBoxIdentifier, strings => ArrayStringConverter.ToString(strings))
     .NullifyIf(party => party.AddressType != AddressType.Russian);
 }