using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using Centron.BusinessLogic; using Centron.BusinessLogic.Administration.Settings; using Centron.BusinessLogic.Sales.Receipts; using Centron.BusinessLogic.Sales.Receipts.DataAndResults; using Centron.BusinessLogic.Warehousing; using Centron.BusinessLogic.WebServices.Sales.Receipts; using Centron.Data.WebServices.Sales.Receipts; using Centron.Data.WebServices.Sales.Receipts.DeliveryLists; using Centron.Data.WebServices.Sales.Receipts.Invoices; using Centron.Data.WebServices.Sales.Receipts.Orders; using Centron.Interfaces; using Centron.Interfaces.Administration.Environment; using Centron.Interfaces.BL; using Centron.Interfaces.Sales.Receipts; using Centron.Interfaces.Sales.Receipts.InsertReceipts; using Centron.Tests.EndToEnd.Infrastructure; using Centron.Tests.EndToEnd.Infrastructure.Verifier; using CentronSoftware.Centron.WebServices.EntitiesWrongPlace.Sales.Receipts.DataAndResults; using CentronSoftware.Centron.WebServices.Extensions; using Xunit; namespace Centron.Tests.EndToEnd.Tests.PartListBarcodes; public static class PartListBarcodeTestHelper { public const int CustomerI3D = 10026; public const int PartListArticleI3D = 52; public const int PartListArticleBarcodeI3D = 504; public const int PartListArticleAlternativeBarcodeI3D = 443; public const int ChildArticleI3D = 139; public const int ChildArticleBarcodeI3D1 = 511; public const int ChildArticleBarcodeI3D2 = 512; public static void PrepareDatabase(EndToEndTest allGoodTest) { allGoodTest.Sql($"UPDATE dbo.ARTIK SET StkListe = 1, SNStueckliste = 1 WHERE I3D = {PartListArticleI3D}"); allGoodTest.Sql($"UPDATE dbo.ARTIK SET BarcodeScanen = 1 WHERE I3D = {ChildArticleI3D}"); allGoodTest.Sql($"UPDATE dbo.Stammdat SET WertMemo = '' WHERE I3D = {(int)AppSettingsConst.DeliveryListStartFreeText}"); allGoodTest.Sql($"UPDATE dbo.Stammdat SET WertText = '' WHERE I3D = {(int)AppSettingsConst.DeliveryListEndFreeText}"); // Set DTALastschrift to 0, so we are not required to select a correct sepa-mandate (Bankverbindung/Mandat) allGoodTest.Sql("UPDATE dbo.Zahkond SET DTALastschrift = 0"); allGoodTest.Sql("ALTER TABLE RechKopf DROP COLUMN LcmStatus"); } public static ReceiptOrderDTO CreateOrder() { using var session = new BLSession(); var currentUser = CommonMethodsHelper.GetUser(session); var createNewReceiptResult = session.GetBL().CreateNewReceipt( CentronObjectKindNumeric.OrderClass, currentUser, CustomerI3D, new CreateReceiptData { IgnoreCallbacks = true, }, addressI3D: null, contactPersonI3D: null, insertSalutationAndAgreement: false, ignoreDefaultContract: true, insertCustomerDiscount: false); var order = (ReceiptOrderDTO)createNewReceiptResult.ThrowIfError().Receipt; var partListItem = (ReceiptOrderItemDTO)session.GetBL().CreateArticleReceiptItems( order, isExternalArticle: false, PartListArticleI3D, externalArticleKind: null, externalArticleId: null, warehouseI3D: -1, currentUser, CreateArticleReceiptItemsConfig.None()).ThrowIfError().ReceiptItems.First(); var childItem = (ReceiptOrderItemDTO)session.GetBL().CreateArticleReceiptItems( order, isExternalArticle: false, ChildArticleI3D, externalArticleKind: null, externalArticleId: null, warehouseI3D: -1, currentUser, CreateArticleReceiptItemsConfig.None()).ThrowIfError().ReceiptItems.First(); partListItem.InternalPosition = 0; partListItem.Barcodes = new List { new() { BarcodeI3D = PartListArticleBarcodeI3D, IsActive = true, } }; childItem.InternalPosition = 1; childItem.Indent = 1; childItem.QuantityComplete = 2; childItem.Barcodes = new List { new() { BarcodeI3D = ChildArticleBarcodeI3D1, IsActive = true, OwnerBarcodeI3D = PartListArticleBarcodeI3D }, new() { BarcodeI3D = ChildArticleBarcodeI3D2, IsActive = true, OwnerBarcodeI3D = PartListArticleBarcodeI3D }, }; order.Items = new List { partListItem, childItem }; return order; } public static ReceiptDeliveryListDTO ForwardOrderToDeliveryList(int orderI3D) => (ReceiptDeliveryListDTO)ForwardReceipt(CentronObjectKindNumeric.OrderClass, orderI3D, CentronObjectKindNumeric.DeliveryListClass); public static ReceiptInvoiceDTO ForwardDeliveryListToInvoice(int deliveryListI3D) => (ReceiptInvoiceDTO)ForwardReceipt(CentronObjectKindNumeric.DeliveryListClass, deliveryListI3D, CentronObjectKindNumeric.InvoiceClass); public static ReceiptBaseDTO ForwardReceipt(CentronObjectKindNumeric fromKind, int fromI3D, CentronObjectKindNumeric toKind) { using var session = new BLSession(); return session.GetBL().ForwardReceipt( toKind, CommonMethodsHelper.GetUser(session).User, new ForwardReceiptData { IgnoreCallbacks = true, CreateReceiptData = new CreateReceiptData { IgnoreCallbacks = true, }, CreateReceiptItemsFromExistingItemsData = new List { new() { IgnoreCallbacks = true, }, }, }, new List { new() { ReceiptKind = fromKind, ReceiptI3D = fromI3D }, }, receiptProjectLayoutItemI3DsToForward: null, InsertReceiptTakeoverOptions.Reference, onlyTakeoverAvailableQuantity: false, ignoreDefaultContract: true).ThrowIfError().Receipt; } public static ReceiptBaseDTO SaveReceipt(ReceiptBaseDTO receipt) { using var session = new BLSession(); return session.GetBL().SaveReceipt( receipt, CommonMethodsHelper.GetUser(session).User, new SaveReceiptData(), autoLockIfNewReceipt: false, CreatedThroughApplication.WebServices, receiptTemplateFolderI3D: null).ThrowIfError().Receipt; } public static ResultException SaveReceiptShouldFail(ReceiptBaseDTO receipt) { try { SaveReceipt(receipt); throw new Exception("This should not be reached. An error was expected in SaveReceipt"); } catch (ResultException exception) { return exception; } } public static ReceiptBaseDTO CreateNewVersion(CentronObjectKindNumeric receiptKind, int receiptI3D) { using var session = new BLSession(); return session.GetBL().CreateNewVersion( receiptKind, receiptI3D, version: null, newContactPersonI3D: null, CommonMethodsHelper.GetUser(session).User, new CreateNewVersionData { IgnoreCallbacks = true, }).ThrowIfError().Receipt; } public static void AssertBarcodesInPartList() => AssertBarcodes(barcode1InPartList:true, barcode2InPartList:true); public static void AssertBarcodesNotInPartList() => AssertBarcodes(barcode1InPartList:false, barcode2InPartList:false); public static void AssertBarcodes(bool barcode1InPartList, bool barcode2InPartList, int? mainBarcodeI3D = null) { using var session = new BLSession(); mainBarcodeI3D ??= PartListArticleBarcodeI3D; var mainBarcode = session.GetBL().GetBarCode2ByI3D(mainBarcodeI3D.Value); var alternativeBarcode = session.GetBL().GetBarCode2ByI3D(mainBarcodeI3D.Value == PartListArticleBarcodeI3D ? PartListArticleAlternativeBarcodeI3D : PartListArticleBarcodeI3D); var childBarcode1 = session.GetBL().GetBarCode2ByI3D(ChildArticleBarcodeI3D1); var childBarcode2 = session.GetBL().GetBarCode2ByI3D(ChildArticleBarcodeI3D2); if (barcode1InPartList || barcode2InPartList) { Assert.Equal(1, mainBarcode.SNPartsList); } else { Assert.True(mainBarcode.SNPartsList is null or 0); } Assert.True(alternativeBarcode.SNPartsList is null or 0); if (barcode1InPartList) { Assert.Equal(mainBarcodeI3D.Value, childBarcode1.OwnerPositionI3D); } else { Assert.Null(childBarcode1.OwnerPositionI3D); } if (barcode2InPartList) { Assert.Equal(mainBarcodeI3D.Value, childBarcode2.OwnerPositionI3D); } else { Assert.Null(childBarcode2.OwnerPositionI3D); } } public static void SplitUpPartList(ReceiptBaseDTO receipt) { var items = receipt.GetReceiptItems(); items[0].Set((IReceiptItemWithFormatting f) => f.Expanded, null); items[1].Set((IReceiptItemWithFormatting f) => f.Indent, 0); items[1].Get((IReceiptItemWithBarcodes f) => f.Barcodes)[0].OwnerBarcodeI3D = null; items[1].Get((IReceiptItemWithBarcodes f) => f.Barcodes)[1].OwnerBarcodeI3D = null; } public static void CreatePartList(ReceiptBaseDTO receipt) { var items = receipt.GetReceiptItems(); items[0].Set((IReceiptItemWithFormatting f) => f.Expanded, true); items[1].Set((IReceiptItemWithFormatting f) => f.Indent, 1); items[1].Get((IReceiptItemWithBarcodes f) => f.Barcodes)[0].OwnerBarcodeI3D = PartListArticleBarcodeI3D; items[1].Get((IReceiptItemWithBarcodes f) => f.Barcodes)[1].OwnerBarcodeI3D = PartListArticleBarcodeI3D; } }