public List <DatColStockModel> MapToDatCol(Int32 vendorId, List <Model.WehkampStockMutation> mutations)
        {
            using (var pDb = new PetaPoco.Database(Environments.Current.Connection, "System.Data.SqlClient"))
            {
                int connectorID = pDb.FirstOrDefault <int>(@"select connectorid from contentproduct where vendorid = @0 and isassortment = 1", vendorId);

                int    shopNumber           = ConnectorHelper.GetStoreNumber(connectorID);
                int    differenteShopNumber = VendorHelper.GetDifferenceShopNumber(vendorId);
                string employeeNumber       = VendorHelper.GetEmployeeNumber(vendorId);
                var    salesSlipNumber      = ReceiptHelper.GetSlipNumber(vendorId);

                int _receiptIndex       = GenericSlipNumberHelper.GetSlipNumberForTransfer(vendorId, ReceiptHelper.STOCK_SALESSLIP_RECEIPT_NUMBER_SETTING_KEY);
                int _receiptIndexSurplu = GenericSlipNumberHelper.GetSlipNumberForTransfer(vendorId, ReceiptHelper.STOCK_SALESSLIP_RECEIPT_NUMBER_SETTING_KEY_SURPLUS);
                mutations.ForEach(mutation =>
                {
                    _index += 200;

                    var line = new DatColStockModel
                    {
                        StoreNumber                    = (mutation.MutationQuantity > 0 ? differenteShopNumber : shopNumber).ToString("D3") + " 01",
                        EmployeeNumber                 = employeeNumber,
                        ReceiptNumber                  = salesSlipNumber,
                        TransactionType                = "20",
                        DateNotified                   = mutation.MutationDate.ToString("yyyyMMddHHmm"),
                        RecordType                     = "01",
                        SubType                        = "00",
                        NumberOfSkus                   = Math.Abs(mutation.MutationQuantity),
                        MancoOrSurplus                 = mutation.MutationQuantity > 0 ? shopNumber : differenteShopNumber,
                        FixedField1                    = "000000000+",
                        RecordSequence                 = _index,
                        FixedField2                    = "000",
                        FixedField3                    = "000000000+",
                        FixedField4                    = "000",
                        FixedField5                    = "000000000+",
                        FixedField6                    = "000",
                        OriginalSellingPrice           = (int)Math.Round(PriceHelper.GetPrice(mutation.ProductID, vendorId) * 100),
                        FixedField7                    = "00",
                        ArticleNumberColorCodeSizeCode = ProductHelper.GetPFAItemNumber(mutation.Articlenumber, mutation.Colorcode, mutation.ProductID),
                        Barcode                        = BarcodeHelper.GetBarcode(mutation.ProductID),
                        Receipt                        = string.Format("{0}{1}{2}", 0, mutation.MutationQuantity > 0 ? differenteShopNumber.ToString("D3") : shopNumber.ToString(), _receiptIndex.ToString().PadLeft(4, '0')),
                        TaxCode                        = "1",
                        EmployeeNumber2                = employeeNumber,
                        ScannedWithBarcodeReader       = 0
                    };

                    _list.Add(line);
                });
                ReceiptHelper.IncrementSalesSlipNumber(ref salesSlipNumber, vendorId, ReceiptHelper.STOCK_SALESSLIP_NUMBER_SETTINGKEY);

                return(_list);
            }
        }
        protected override void Process()
        {
            using (var unit = GetUnitOfWork())
            {
                var vendors = unit.Scope.Repository <Vendor>().GetAll().ToList().Where(c => ((VendorType)c.VendorType).Has(VendorType.SupportsPFATransferOrders)).ToList();

                var orderLedgerRepo = unit.Scope.Repository <OrderLedger>();

                foreach (var vendor in vendors)
                {
                    var rule = vendor.ContentProducts.FirstOrDefault(c => c.IsAssortment);

                    rule.ThrowIfNull("Publication rule with IsAssortment is missing for vendor " + vendor.Name);

                    IQueryable <OrderLine> lines = unit.Scope.Repository <OrderLine>().GetAll(x => x.Order.OrderType == (int)OrderTypes.ReturnOrder && x.Order.ConnectorID == rule.ConnectorID && x.OrderLedgers.Any(y => y.Status == (int)OrderLineStatus.StockReturnRequestConfirmation));

                    IQueryable <OrderLine> processed = unit.Scope.Repository <OrderLine>().GetAll(x => x.Order.OrderType == (int)OrderTypes.ReturnOrder && x.Order.ConnectorID == rule.ConnectorID && x.OrderLedgers.Any(y => y.Status == (int)OrderLineStatus.ProcessedStockReturnRequestConfirmation));

                    var ledgerRepo = unit.Scope.Repository <OrderLedger>();

                    var storeID              = ConnectorHelper.GetStoreNumber(rule.ConnectorID);
                    var employeeNumber       = VendorHelper.GetEmployeeNumber(vendor.VendorID);
                    int differenceShopNumber = VendorHelper.GetReturnDifferenceShopNumber(vendor.VendorID);

                    lines = lines.Except(processed);

                    var toProcess = lines.GroupBy(line => line.Order).ToList().Select(c => new
                    {
                        Order      = c.Key,
                        OrderLines = c.ToList()
                    }).ToList();

                    foreach (var order in toProcess)
                    {
                        int recordSequenceDetail          = 0;
                        int recordSequeceCompleteShipment = 200;

                        //get all three different shop numbers
                        var salesSlipNumber = GenericSlipNumberHelper.GetSlipNumberForTransfer(vendor.VendorID, ReceiptHelper.STOCK_SALESSLIP_RECEIPT_NUMBER_SETTING_KEY);
                        int salesSlipNumber_OtherFilials = 0; //used for any line with warehouse code != 982


                        var salesSlipNumberComplete = salesSlipNumber;
                        var salesSlipNumberShop     = salesSlipNumberComplete;

                        var fileEngine = new FileHelperEngine(typeof(ReturnOrderDatcolModel));
                        var returns    = new List <ReturnOrderDatcolModel>();

                        var fileName = String.Format("{0}{1}", "returnOrders", DateTime.Now.ToString("yyyyMMddHHmmss"));

                        //process contents
                        DateTime messageTime = order.OrderLines.FirstOrDefault().OrderLedgers.FirstOrDefault(c => c.Status == (int)OrderLineStatus.StockReturnRequestConfirmation).LedgerDate.ToLocalTime();
                        int      totalSkus   = 0;

                        if (order.OrderLines.Any(c => c.WareHouseCode != differenceShopNumber.ToString()))
                        {
                            salesSlipNumber_OtherFilials = GenericSlipNumberHelper.GetSlipNumberForTransfer(vendor.VendorID, ReceiptHelper.STOCK_SALESSLIP_RECEIPT_NUMBER_SETTING_KEY);
                        }

                        foreach (var orderLine in order.OrderLines)
                        {
                            var detailSalesSlipNumber = salesSlipNumber;

                            var ledger = orderLine.OrderLedgers.FirstOrDefault(c => c.Status == (int)OrderLineStatus.StockReturnRequestConfirmation);
                            totalSkus += ledger.Quantity.Value;

                            recordSequenceDetail += 200;

                            if (orderLine.WareHouseCode != differenceShopNumber.ToString())
                            {
                                returns.Add(GetDetailLevel(storeID, employeeNumber, salesSlipNumber, salesSlipNumber_OtherFilials, ledger.LedgerDate.ToLocalTime(), ledger.Quantity.Value, differenceShopNumber, recordSequenceDetail, orderLine.ProductID.Value, vendor.VendorID));
                            }

                            else
                            {
                                returns.Add(GetDetailLevel(storeID, employeeNumber, salesSlipNumber, salesSlipNumber, ledger.LedgerDate.ToLocalTime(), ledger.Quantity.Value, differenceShopNumber, recordSequenceDetail, orderLine.ProductID.Value, vendor.VendorID));
                            }
                        }

                        var codes = order.OrderLines.Select(c => c.WareHouseCode).Where(c => !string.IsNullOrEmpty(c));

                        if (codes.Any(c => c != differenceShopNumber.ToString()))
                        {
                            returns.Add(GetCompleteLevel(storeID, employeeNumber, salesSlipNumberComplete, salesSlipNumber_OtherFilials, messageTime, totalSkus, differenceShopNumber));
                        }

                        foreach (var orderLineFilial in order.OrderLines.Where(c => !string.IsNullOrEmpty(c.WareHouseCode) && c.WareHouseCode != differenceShopNumber.ToString()).GroupBy(c => c.WareHouseCode).ToList())
                        {
                            var salesSlipNumber_Difference = GenericSlipNumberHelper.GetSlipNumberForTransfer(vendor.VendorID, ReceiptHelper.STOCK_SALESSLIP_RECEIPT_NUMBER_SETTING_KEY_SURPLUS);
                            foreach (var orderLine in orderLineFilial)
                            {
                                recordSequenceDetail += 200;
                                var ledger = orderLine.OrderLedgers.FirstOrDefault(c => c.Status == (int)OrderLineStatus.StockReturnRequestConfirmation);

                                returns.Add(GetDetailLevelForStore(int.Parse(orderLine.WareHouseCode), employeeNumber, salesSlipNumberShop, salesSlipNumber_Difference, messageTime, ledger.Quantity.Value, differenceShopNumber, recordSequenceDetail, orderLine.ProductID.Value, vendor.VendorID));
                            }
                        }

                        if (returns.Count > 0)
                        {
                            var file = fileEngine.WriteString(returns);
                            var path = CommunicatorService.GetMessagePath(vendor.VendorID, PfaCommunicator.Objects.Models.MessageTypes.WehkampReturn);
                            File.WriteAllText(Path.Combine(path.MessagePath, fileName), file);
                        }

                        foreach (var line in order.OrderLines)
                        {
                            line.SetStatus(OrderLineStatus.ProcessedStockReturnRequestConfirmation, ledgerRepo);
                        }
                    }
                    unit.Save();
                }
            }
        }