Как создать заказ в Shopware 6 через API

Я переношу магазин со старой платформы на Shopware 6. Мне нужно перенести заказы, и у меня возникают проблемы с этим. Я использую API, который вызывается скриптом, имеющим доступ к базе данных старой платформы. Я уже подтолкнул почти все другие объекты (клиенты, продукты, медиа, категории, ссылки между ними) с помощью API, и он отлично работает. В документации кажется, что сначала нужно создать корзину, а затем с помощью действия создать ее в заказе, затем добавить адрес заказа, оплату и перевести состояния с помощью действий на то, что требуется.

Для этого нет точного руководства, поэтому я закончил тем, что попытался отправить запрос POST с данными заказа на конечную точку order следующим образом:

array:12 [
  "orderNumber" => "100000546"
  "price" => array:6 [
    "netPrice" => 47.3519
    "totalPrice" => 50.32
    "positionPrice" => 50.32
    "calculatedTaxes" => array:1 [
      0 => array:3 [
        "tax" => 3.314633
        "taxRate" => 7
        "price" => 50.32
      ]
    ]
    "taxRules" => array:1 [
      0 => array:2 [
        "taxRate" => 7
        "percentage" => 100
      ]
    ]
    "taxStatus" => "gross"
  ]
  "shippingCosts" => array:5 [
    "unitPrice" => 4.95
    "totalPrice" => 4.95
    "quantity" => 1
    "calculatedTaxes" => array:1 [
      0 => array:3 [
        "tax" => 0.3465
        "taxRate" => 7
        "price" => 4.95
      ]
    ]
    "taxRules" => array:1 [
      0 => array:2 [
        "taxRate" => 7
        "percentage" => 100
      ]
    ]
  ]
  "billingAddressId" => "9f27c3c98dfe4e47ad2a9493da5807bc"
  "currencyId" => "b7d2554b0ce847cd82f3ac9bd1c0dfca"
  "languageId" => "2fbb5fe2e29a4d70aa5854ce7ce3e20b"
  "salesChannelId" => "d1d7fc6faedb4600afd0cfe68f627f6d"
  "orderDateTime" => "2014-11-03 08:27:43"
  "currencyFactor" => 1
  "stateId" => "8089405ce1e046f1819823d847125d25"
  "lineItems" => array:1 [
    0 => array:6 [
      "identifier" => "5158757ba32b489faf70fcd7c4578604"
      "productId" => "5158757ba32b489faf70fcd7c4578604"
      "quantity" => 10
      "label" => "Some product"
      "position" => 1
      "price" => array:5 [
        "unitPrice" => 3.64
        "totalPrice" => 36.3551
        "quantity" => 10
        "calculatedTaxes" => array:1 [
          0 => array:3 [
            "tax" => 0.2548
            "taxRate" => 7
            "price" => 36.3551
          ]
        ]
        "taxRules" => array:1 [
          0 => array:2 [
            "taxRate" => 7
            "percentage" => 100
          ]
        ]
      ]
    ]
  ]
  "orderCustomer" => array:6 [
    "customerId" => "cafedb542f2f488e99375192092c9032"
    "salutationId" => "08f9cf197c0643ac98590948cf5dd9f8"
    "firstName" => "xx
    "lastName" => "xx
    "email" => "xx
    "customerNumber" => "10020"
  ]
]

Это создает заказ в базе данных, но я не вижу его в списке заказов в админке (admin#/sw/order/index) - на самом деле он разбивает список, когда я пытаюсь изменить страницу списка. Если я открою другой заказ, а затем заменю идентификатор заказа на тот, который я создал, я могу открыть его, но в нем нет поля с подробностями. Я могу видеть только предметы, статус и документы. Я подозревал, что это связано с тем, что нет связанной информации об оплате и доставке, поэтому я добавил также order_address объект через API, а затем попытался создать order_delivery, чтобы у меня было состояние для отправки. К сожалению, я получаю это, когда пытаюсь создать такую ​​сущность с состоянием:

    0 => {#8643
      +"code": "FRAMEWORK__WRITE_CONSTRAINT_VIOLATION"
      +"status": "400"
      +"detail": "This field is write-protected. (Got: "crud" scope and "system" is required)"
      +"template": "This field is write-protected. (Got: "%s" scope and "%s" is required)"
      +"meta": {#8655
        +"parameters": array:2 [
          0 => "crud"
          1 => "system"
        ]
      }
      +"source": {#8664
        +"pointer": "/0/stateIdstateId"
      }
    }

И я застрял. Мне нужна помощь. Могу ли я добавить к запросу какой-нибудь переключатель для принудительной записи (создать токен с system областью действия?) В поле stateId? Или мне надо выполнить действие? Но опять же, я не могу выполнить действие, если для объекта order_delivery уже установлено значение _10 _...

Я все равно делаю это правильно? Пытаясь создать сущности напрямую (эти заказы служат просто архивом, все они уже выполнены)?


person Radix Salvilines    schedule 14.10.2020    source источник


Ответы (1)


Возможно, вам стоит использовать плагины миграции из Shopware для sw5 и sw6. Они описаны здесь Процесс миграции. И вы можете найти эти плагины на GitHub https://github.com/shopware/SwagMigrationAssistant и https://github.com/shopware/SwagMigrationConnector

person Valerii Pravoslavnyi    schedule 15.10.2020
comment
К сожалению, эти плагины не поддерживают Magento версии 1.8 (это то, на чем работает старый магазин, из которого я импортирую), он начинается с 1.9. Однако я подумываю загрузить его и внести изменения для работы с 1.8, по крайней мере, данные, которые мне нужны (только заказы). - person Radix Salvilines; 16.10.2020
comment
Какая жалость! Подобную проблему я решил следующим образом. В старом магазине я подготавливаю все данные и отправляю запрос на конечную точку пользовательского API администратора. Затем в моей бизнес-логике конечной точки я могу реализовать все, что мне нужно. - person Valerii Pravoslavnyi; 16.10.2020