'use strict';

var _classCallCheck = require('@babel/runtime/helpers/classCallCheck');
var _createClass = require('@babel/runtime/helpers/createClass');
var index = require('./index-7d6992d6.js');
var basketModel = require('@crystaldesign/basket-model');
var DivaUtils = require('@crystaldesign/diva-utils');
require('@babel/runtime/helpers/slicedToArray');
require('@babel/runtime/helpers/asyncToGenerator');
require('@babel/runtime/helpers/defineProperty');
require('@babel/runtime/regenerator');
require('@babel/runtime/helpers/objectWithoutProperties');
require('@babel/runtime/helpers/toConsumableArray');
require('axios');
require('@crystaldesign/basket-handler');
require('socket.io-client');
require('@babel/runtime/helpers/typeof');

function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

var _classCallCheck__default = /*#__PURE__*/_interopDefaultLegacy(_classCallCheck);
var _createClass__default = /*#__PURE__*/_interopDefaultLegacy(_createClass);
var DivaUtils__default = /*#__PURE__*/_interopDefaultLegacy(DivaUtils);

var LOG = DivaUtils__default["default"].initLog('Planner', 'WEB-PLANNER-LOGIC');
//Der in einem Set gemergte Optionsbaum
var PfisterWWSHandler = /*#__PURE__*/function () {
  function PfisterWWSHandler() {
    _classCallCheck__default["default"](this, PfisterWWSHandler);
  }
  return _createClass__default["default"](PfisterWWSHandler, [{
    key: "repairWWSFlags",
    value: function repairWWSFlags(articles, orderLines) {
      //Reparatur der Send To Sap geschichte:
      //sollte im Pfister WWS/warenwirtschaftFile gepflegt werden

      var partlistArticles = {};
      //partlistarticles aller article werden auch überprüft
      for (var iKey in articles) {
        if (articles[iKey].partlistArticles) {
          for (var jKey in articles[iKey].partlistArticles) {
            partlistArticles[jKey] = articles[iKey].partlistArticles[jKey];
          }
        }
      }
      for (var i = 0; i < orderLines.length; i++) {
        if (articles[orderLines[i].BasketID] || partlistArticles[orderLines[i].BasketID]) {
          var orderLineItem = orderLines[i],
            article = articles[orderLines[i].BasketID];
          if (!article) article = partlistArticles[orderLines[i].BasketID];
          if (article.sendToSap && article.sendToSap == '0') {
            orderLineItem.SendToSAP = '0';
          }

          //ACHTUNG: früher konnte man bei SendToSAP hier eine Artikelnummer hinterlegen, die hier als ArtikelNr des Hauptartikels übernommen wurde.
          //Neuerdings kann man Artikelnr auch über RetailTypeNr pflegen, das hat VORRANG

          if (article.retailTypeNr) {
            //VORRANG 1: RetailTypeNr (Pfister ArtikelNr) in Categorymanager Artikel-Katalogübersicht
            orderLineItem.SendToSAP = '';
            //actOrderlineData.ConfigArticleCodex = this.ArticleData.RetailArticleNr;
          } else if (article.sendToSap && article.sendToSap != '' && article.sendToSap != '0') {
            //VORRANG 2: SendToSap als Artikelnummer im CE
            orderLineItem.SendToSAP = '2';
            orderLineItem.ConfigArticleCodex = article.sendToSap;
          }
          //VORRANG 1: RetailTypeNr (ZKAT Artikel)  in Categorymanager Artikel-Katalogübersicht
          //Kann sein dass diese Variante nur für flache Artikel greift ????
          else if (article.retailArticleNr && (orderLineItem.ConfigArticleCodex == '' || !orderLineItem.ConfigArticleCodex)) {
            orderLineItem.ConfigArticleCodex = article.retailArticleNr;
          }
          if (article.isPartListArticle) {
            if (article.supplierOrderCodex) {
              orderLineItem.ConfigArticleCodex = article.retailArticleNr;
            }
            if (article.retailPrefix == 'SAP') {
              orderLineItem.SendToSAP = '2'; //Artikel soll auch im Warenkorb gelistet werden, damit der Preis stimmt
              orderLineItem.ConfigArticleCodex = article.retailArticleNr;
            } else if (article.retailPrefix == 'ZKAT') {
              orderLineItem.SendToSAP = '';
              orderLineItem.RuleDesc = article.ruleDesc;
              if (article.typeNr && article.typeNr != '' && !article.supplierOrderCodex) {
                orderLineItem.ConfigArticleCodex = article.typeNr;
              }
            } else if (!article.retailPrefix || article.typeNr && article.typeNr != '') {
              orderLineItem.ConfigArticleCodex = article.typeNr;
            }
          }
          if (article.hasPartlistArticle) {
            //Artikel für welche bereits Stücklisten die Bestellung darstellen müssen nicht in die Bestellung eingehen -> actOrderlineData.RetailArticleNr = ""
            if (!article.retailPrefix && article.mainPrice == 0) {
              orderLineItem.RetailArticleNr = '';
            }
          }
        }
      }
      return orderLines;
    }
  }, {
    key: "getWWSData",
    value: function getWWSData(basket, set, orderSet, orderlines, ignoreSap) {
      /*SendToSAP Orderlines
          "" - normale Orderline - generiert keine SAP Orderline
          "0" - Grundelemente bei Jutzler sind Hülsenartikel und dürfen nicht explizit als SAPOrderLine generiert werden, da diese über Optionsbaum definiert werden
          "1" - diese Orderline wurde über den Optionsbaum generiert, diese soll jetzt eine SAPOrderline übernommen werden, aber nicht mehr als Orderline (ist im Optionsbaum des Hülenartikels ja bereits betimmt)
          "2" - diese Orderline wurde Artikel verplant, diese soll jetzt als SAPOrderline UND als DivaOrderline übernommen werden
          */

      //Basket.SAPOrderLines = [];

      //SapPosnr auf die des aktuellen Sets setzten
      var sapOrderlines = [];
      var hasSapOrderline = false;
      var hasPartListArticles = false;
      var blindSAPOrderLines = [];
      var mySapPosNr = 0;
      var articles = set.getDivaArticles(undefined, true);
      //Pfisterspezifische flags werden hier gesetzt und nicht bei der allgemeinen Erstellung des OrderSets.
      if (!orderSet.SetArticleNrPrefix) {
        orderSet.SetArticleNrPrefix = 'ZKAT';
      }
      orderSet.OrigZKATNr = set.CatalogData.retailArticleNr;
      if (!orderSet.OrigZKATNr || !orderSet.SetArticleNr) {
        //falls OrigZKATNr nicht im Katalog gesetzt ist wird aber trotzdem versucht die ZKAT aus den Partlistarticles zu holen
        var firstPartlistArticle = orderlines.find(function (article) {
          return article.IsPartlistArticle && article.RetailArticleNrPrefix == 'ZKAT';
        });
        if (firstPartlistArticle) {
          orderSet.OrigZKATNr = firstPartlistArticle.RetailArticleNr;
          orderSet.SetArticleNr = firstPartlistArticle.RetailArticleNr;
        } else {
          //eine default ZKAt 123456 wird gesetzt wenn die Partlistarticles nur SAP sind
          orderSet.OrigZKATNr = '123456';
          orderSet.SetArticleNr = '123456';
        }
      }
      if (!orderSet.OrigZKATNr || !orderSet.SetArticleNr || !orderSet.SetArticleNrPrefix) {
        LOG.error(new DivaUtils.DivaError('During saving process a required fields are undefined', {
          code: 'WC_0008',
          custom: {
            OrigZKATNr: orderSet.OrigZKATNr,
            SetArticleNr: orderSet.SetArticleNr,
            SetArticleNrPrefix: orderSet.SetArticleNrPrefix
          }
        }));
      }
      // //jira Ticket 1670
      // if (orderSet.SetArticleNrPrefix == "SAP") {
      //   orderSet.OrigZKATNr = undefined;
      // }

      //jetzt alle Orderlines analysieren und schauen, ob es SAP Orderline gibt

      if (orderSet.SetArticleNr && orderSet.SetArticleNrPrefix == 'SAP' && !ignoreSap) {
        sapOrderlines.push(new basketModel.SAPOrderLineData(orderSet.SetID, orderSet.SetArticleNr, orderSet.SetArticleNrPrefix, DivaUtils__default["default"].stripTags(orderlines.map(function (ol) {
          return ol.Name;
        }).join(', ')), '1', orderSet.SetPrice, 1, false, orderlines.map(function (ol) {
          return ol.BasketID;
        })));
        return {
          SAPOrderLines: sapOrderlines,
          orderlines: orderlines
        };
      }
      for (var j = 0; j < orderlines.length; j++) {
        var _orderLineItem$VKPric, _orderLineItem$VKPric2;
        var orderLineItem = orderlines[j];
        var found = -1;
        var article = articles[orderLineItem.BasketID];
        var orderLinePrice = (_orderLineItem$VKPric = (_orderLineItem$VKPric2 = orderLineItem.VKPrice) === null || _orderLineItem$VKPric2 === void 0 ? void 0 : _orderLineItem$VKPric2.BruttoPrice) !== null && _orderLineItem$VKPric !== void 0 ? _orderLineItem$VKPric : orderLineItem.Price;
        if (orderLineItem.HasPartlistArticle) {
          var _article$mainBruttoPr;
          orderLinePrice = (_article$mainBruttoPr = article.mainBruttoPrice) !== null && _article$mainBruttoPr !== void 0 ? _article$mainBruttoPr : article.mainPrice;
        }
        if (orderLineItem.IsPartlistArticle && orderSet.CatalogCodex != 'ATLANTIS_2019') {
          hasPartListArticles = true;
        }

        //hier prüfen, ob Artikel mit SendToSap explizit ausgeflaggt ist
        //SendTo SAP über Optionsbaum "1" oder explizit beim Artikel "2" (wird z.B. bei Hoppekits)
        //if (debugPlArticleHandler) debug("AddOrderAndSAPline: " + this.Name + " SendToSAP:" + this.SendToSAP);

        if ((!orderLineItem.HasPartlistArticle || !!orderLinePrice) && !orderLineItem.NoPrice) {
          //bei Partlist Hauptartikel welche keinen Preis haben, diese nicht in die SAP Orderline geben

          if (orderLineItem.SendToSAP && orderLineItem.SendToSAP != '') {
            // wenn "0", "1" oder "2"
            if (Number(orderLineItem.SendToSAP) > 0) {
              // wenn "1" oder "2" eine SAPOrderline erstellen
              hasSapOrderline = true;
              for (var i = 0; i < sapOrderlines.length; i++) {
                //jedes  anzeigen
                if (orderLineItem.SetID == sapOrderlines[i].SetID && orderLineItem.ConfigArticleCodex == sapOrderlines[i].ArticleNr && (orderLineItem.Name == sapOrderlines[i].Name && orderLinePrice == sapOrderlines[i].Price || orderLineItem.SendToSAP != '3')) {
                  found = i;
                }
              }
              if (found == -1) {
                var _articleNrPrefix = orderLineItem.SendToSAP == '3' ? 'ZKAT' : 'SAP';
                mySapPosNr++;
                var newSapOrderLine = new basketModel.SAPOrderLineData(orderLineItem.SetID, orderLineItem.ConfigArticleCodex ? orderLineItem.ConfigArticleCodex : orderLineItem.ArticleCodex, _articleNrPrefix, orderLineItem.Name, mySapPosNr.toString(), Math.round(orderLinePrice * (_articleNrPrefix == 'ZKAT' ? orderLineItem.Quantity : 1)),
                //bei zakt nummern die quantity nicht in die saporderlines schrieben da diese aus oder
                //Orderlines in den EK Text übernommen werden und so die quantity bereits als info übernommen wurde
                _articleNrPrefix == 'ZKAT' ? 1 : orderLineItem.Quantity, false, [orderLineItem.BasketID]);
                sapOrderlines.push(newSapOrderLine);
              } else {
                if (orderLinePrice != 0 && orderLinePrice != undefined || orderLineItem.RelatedToSubItem != 'OPTAUFDOPP') {
                  sapOrderlines[found].addQuantity(orderLineItem.Quantity);
                  sapOrderlines[found].basketIds.push(orderLineItem.BasketID);
                }
              }
            }
          } else {
            var articleNrPrefix = 'ZKAT';
            var useSAPArticleNumberInEKText = true;
            //wenn keine Orderlines des Sets als SapOrderline gelistet wurden,
            //dann jetzt für die unterschiedlichen ZKAT Artikelnummer innerhalb eines SETS eigene SAPOrderline listen

            //Wenn Artikel.SubRetailTypeNr gesetzt ist, dann ist es ein SAPartikel
            if (orderLineItem.SubRetailTypeNr) {
              orderLineItem.RetailArticleNr = orderLineItem.SubRetailTypeNr;
              articleNrPrefix = 'SAP';
              useSAPArticleNumberInEKText = false;
            }
            //wenn beim Artikel eine SAP Nummer hinterlegt ist soll diese vor der ZKAT gegriffen werden
            else if (orderLineItem.RetailTypeNr) {
              orderLineItem.RetailArticleNr = orderLineItem.RetailTypeNr;
              articleNrPrefix = 'SAP';
              useSAPArticleNumberInEKText = false;
            }
            for (var i = 0; i < blindSAPOrderLines.length; i++) {
              //jedes  anzeigen
              if (orderLineItem.SetID == blindSAPOrderLines[i].SetID && orderLineItem.RetailArticleNr == blindSAPOrderLines[i].ArticleNr) {
                found = i;
              }
            }
            if (orderLineItem.RetailArticleNr == undefined) {
              LOG.debug('Fehler beim speichern! RetailArticleNr ist nicht definiert', 'WC_0008');
            }
            if (found == -1) {
              mySapPosNr++;
              var newSapOrderLine = new basketModel.SAPOrderLineData(orderLineItem.SetID, orderLineItem.RetailArticleNr, articleNrPrefix, orderLineItem.Name, mySapPosNr.toString(), Math.round(orderLinePrice * (articleNrPrefix == 'ZKAT' ? orderLineItem.Quantity : 1)),
              //bei zakt nummern die quantity nicht in die saporderlines schrieben da diese aus oder
              //Orderlines in den EK Text übernommen werden und so die quantity bereits als info übernommen wurde
              articleNrPrefix == 'ZKAT' ? 1 : orderLineItem.Quantity, useSAPArticleNumberInEKText, [orderLineItem.BasketID]);
              blindSAPOrderLines.push(newSapOrderLine);
            } else {
              if (!orderLineItem.ArticlePlaceholder) {
                if (articleNrPrefix == 'SAP') {
                  if (orderLinePrice != 0 && orderLinePrice != undefined || orderLineItem.RelatedToSubItem != 'OPTAUFDOPP') {
                    blindSAPOrderLines[found].Quantity += orderLineItem.Quantity;
                  }
                } else {
                  if (orderLinePrice != 0 && orderLinePrice != undefined) blindSAPOrderLines[found].Price += Math.round(orderLinePrice * orderLineItem.Quantity);
                }
                blindSAPOrderLines[found].basketIds.push(orderLineItem.BasketID);
              }
            }
            for (var i = 0; i < orderlines.length; i++) {
              if (orderLineItem.BasketID == orderlines[i].BasketID) found = i;
            }
            if (!orderLineItem.ArticlePlaceholder) {
              if (found != -1) orderlines[found] = orderLineItem;
            }
          }
        }
        if (orderLineItem.DontAddToFinalOrderLine) {
          orderlines.splice(j, 1);
          j--;
        }
      }
      if (!hasSapOrderline || hasPartListArticles) {
        //z.B. Hasena wir über diese Methodic in die SAPOrderline geschalten
        if (sapOrderlines.length == 0 && orderSet.SetArticleNr && blindSAPOrderLines.length == 0) {
          // wenn keine SapOrderline generiert wurde und wenn aktuelles Set eine ZKAT Nummer hat
          var newSapOrderLine = new basketModel.SAPOrderLineData(orderSet.SetID, orderSet.SetArticleNr, orderSet.SetArticleNrPrefix, '', '1', Math.round(orderSet.SetPrice), orderSet.SetQuantity, false, orderlines.map(function (ol) {
            return ol.BasketID;
          }));
          sapOrderlines.push(newSapOrderLine);
        } else {
          sapOrderlines = sapOrderlines.concat(blindSAPOrderLines);
        }
      }
      if (orderSet.BruttoSetPrice) orderSet.SetPrice = orderSet.BruttoSetPrice;
      return {
        SAPOrderLines: sapOrderlines,
        orderlines: orderlines
      };
    }
  }, {
    key: "getCustomIdsForProductsMatch",
    value: function getCustomIdsForProductsMatch(set) {
      var _set$basketConfigVari;
      var articles = set.getDivaArticles();
      var ols = index.articleHandlerInstance.getOrderLinesOfArticles(articles, undefined, false, !!((_set$basketConfigVari = set.basketConfigVariants) !== null && _set$basketConfigVari !== void 0 && _set$basketConfigVari.length));
      if (!(ols !== null && ols !== void 0 && ols.length)) return [];
      var orderlines = this.repairWWSFlags(articles, ols);
      var _ref = this.getWWSData({}, set, {
          SetQuantity: 1,
          SetPrice: set.getSetPrice(),
          SetID: set.getSetId(),
          CatalogCodex: set.getCatalogCodex(),
          SetArticleNr: set.SetArticleNr ? set.SetArticleNr : set.CatalogData.retailArticleNr,
          SetArticleNrPrefix: set.SetArticleNrPrefix
        }, orderlines, true),
        SAPOrderLines = _ref.SAPOrderLines;
      return {
        customProductNrsPair: SAPOrderLines.filter(function (sapOl) {
          return sapOl.ArticleNrPrefix === 'ZKAT';
        }).map(function (sapOl) {
          return {
            customProductNrs: sapOl.ArticleNr,
            basketIds: sapOl.basketIds
          };
        }),
        matchPrefix: 'SAP'
      };
    }
  }]);
}();

exports["default"] = PfisterWWSHandler;
