Загрузка данных в xml формате

В Forecast NOW! можно загружать следующие данные в xml формате:

Данные о продажах, классификации и параметрах товара может содержаться в одном файле

Загрузка истории продаж

Данные по продажам сохраняются в тэге <sales>. Каждой продаже соответствует запись с тэгом <sale>.

Запись продажи содержит в виде атрибутов:

storage - склад (код склада)

product – id товара

client - клиент (доступно только в версии Enterprise (под ключ))

date – дата продажи

аmount – количество проданного товара за день (суммарно или в разрезе клиента, если используется поклиентская детализация, доступная только с версии Enterprise (Под ключ)

cost – выручка (объём продаж в ценах реализации)

purchaseCost – себестоимость (объём продаж в ценах закупки)

lostDemand – упущенный спрос

Выгружается в том случае, если имеется информация о точном размере упущенного спроса по товару за конкретный день

profit – прибыль

В виде элементов содержатся:

  • Остатки (<rest>):

amount - фактический остаток товара на конец дня (весь остаток на складе на конец дня, включая резерв)

inTransit – количество товара в пути на конец дня

inOrder - количество товара в размещенных заказах на конец дня

inReserve – количество товара в резерве на конец дня

backorder – не выполненный заказ на конец дня

  • Цены (<salePrice>):

sell – цена продажи (в случае нескольких продаж по разной цене указывается средневзвешенная цена продажи)

purchase – цена закупки (в случае нескольких продаж/поступлений разных партий товара с разной ценой закупки указывается средневзвешенная цена закупки) ъ

discount – учётная цена

Запись по товару выгружается в следующих случаях:
  • Была продажа
  • Изменился остаток (перемещение, продажа и пр.), кол-во товара в пути (проведение документа, отмена проведения, приход товара и пр.), кол-во товара в заказе (размещение-закрытие заказа), кол-во товара в резерве (снятие резерва, открытие резерва),

Продажи должны отражать реальные факты продажи без перемещений товаров и прочих событий, не имеющих отношения к реальной продаже.

Если появляется запись по товару, то в ней должна содержаться информация по всем полям

Пример файла

<export_data>
    <sales>
        <sale amount="1.00" cost="2.00" purchaseCost="1.00" storage="s1" product="p1" date="2019-07-15"  profit="1.00">
            <rest amount="10.00" inTransit="2.00" inOrder="0.00" inReserve="1.00"/>
            <salePrice sell="2.00" purchase="1.00"/>
 </sale>
        <sale amount="0.00" cost="0.00" purchaseCost="0.00" storage="s1" product="p1" date="2019-07-16"  profit="0.00">
            <rest amount="12.00" inTransit="0.00" inOrder="0.00" inReserve="1.00"/>
            <salePrice sell="2.00" purchase="1.00"/>
 </sale>
        <sale amount="0.00" cost="0.00" purchaseCost="0.00" storage="s1" product="p1" date="2019-07-17"  profit="0.00">
            <rest amount="12.00" inTransit="5.00" inOrder="0.00" inReserve="1.00"/>
            <salePrice sell="2.00" purchase="1.00"/>
 </sale>
        <sale amount="0.00" cost="0.00" purchaseCost="0.00" storage="s1" product="p1" date="2019-07-18"  profit="0.00">
            <rest amount="12.00" inTransit="5.00" inOrder="0.00" inReserve="0.00"/>
            <salePrice sell="2.00" purchase="1.00"/>
        </sale>
    </sales>
</export_data>

  1. прошла продажа - появилась запись по товару
  2. изменился остаток на складе - появилась запись по товару
  3. изменился размер товара в пути - появилась запись по товару
  4. изменился резерв - появилась запись по товару

Список возможных ошибок при загрузке

Пропущен обязательный атрибут

Необъявленное пространство имён

Нет информации о продажах

Несуществующая дата

Неверное значение

Противоречивые данные о продажах

Обнаружен неизвестный атрибут элемента

Обнаружен неизвестный элемент «название элемента»

Неверная структура файла

Неверный формат даты

Файл пуст

Противоречивые наборы параметров

Противоречивые параметры

Ожидается закрытие элемента

Недопустимое значение атрибута

Пустая строка в значении атрибута

Пропущен символ '='(равно)

Пропущен символ ' '(пробел)

Неверное значение атрибута «название атрибута»

Незакрытый элемент

Пропущено имя атрибута

В документе присутствует незакрытый элемент

В документе присутствуют символы, не предусмотренные моделью

Не предусмотренные моделью символы или запись

Непредусмотренное значение

Некорректное значение

Не удалось открыть файл

Пустой набор элементов

Противоречивые данные для группы

Противоречивые данные для товара

Цикл в классификации

Дублирование свойства группы

Схема загрузки истории продаж в xml

Файл импорта должен соответствовать схеме, проверить соответствие можно при помощи программного обеспечения.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <!--Ограничение для double-->
 <xsd:simpleType name="moreThanZeroDouble">
  <xsd:restriction base="xsd:decimal">
   <xsd:minInclusive value="0"/>
  </xsd:restriction>
 </xsd:simpleType>
 <!--Ограничение для int-->
 <xsd:simpleType name="moreThanZeroInteger">
  <xsd:restriction base="xsd:integer">
   <xsd:minInclusive value="0"/>
  </xsd:restriction>
 </xsd:simpleType>
 <xsd:element name="export_data">
  <xsd:complexType>
   <xsd:choice maxOccurs="unbounded" minOccurs="0">
    <xsd:sequence>
     <xsd:element maxOccurs="unbounded" minOccurs="0" name="sales">
      <!--Секция истории продаж-->
      <xsd:complexType>
       <xsd:sequence>
        <!--Одна запись продажи-->
        <xsd:element maxOccurs="unbounded" minOccurs="1" name="sale">
         <xsd:complexType>
          <xsd:sequence>
           <!--Элемент остатков (необязательный)-->
           <xsd:element maxOccurs="1" minOccurs="0" name="rest">
            <xsd:complexType>
             <xsd:simpleContent>
              <xsd:extension base="xsd:string">
               <!--Атрибут остатки (необязательный)-->
               <xsd:attribute use="optional" name="amount" type="xsd:decimal"/>
               <!--Атрибут остатки 'в пути' (необязательный)-->
               <xsd:attribute use="optional" name="inTransit" type="xsd:decimal"/>
               <!--Атрибут остатки 'заказано' (необязательный)-->
               <xsd:attribute use="optional" name="inOrder" type="xsd:decimal"/>
               <!--Атрибут остатки 'в резерве' (необязательный)-->
               <xsd:attribute use="optional" name="inReserve" type="xsd:decimal"/>
               <!--Атрибут остатки 'backorder' (необязательный)-->
               <xsd:attribute use="optional" name="backorder" type="xsd:decimal"/>
              </xsd:extension>
             </xsd:simpleContent>
            </xsd:complexType>
           </xsd:element>
           <!--Элемент цен (необязательный)-->
           <xsd:element maxOccurs="1" minOccurs="0" name="salePrice">
            <xsd:complexType>
             <xsd:simpleContent>
              <xsd:extension base="xsd:string">
               <!--Атрибут с ценой продажи (обязательный)-->
               <xsd:attribute use="required" name="sell" type="moreThanZeroDouble"/>
               <!--Атрибут с ценой закупа (обязательный)-->
               <xsd:attribute use="required" name="purchase" type="moreThanZeroDouble"/>
               <!--Атрибут с ценой учёта (необязательный)-->
               <xsd:attribute use="optional" name="discount" type="moreThanZeroDouble"/>
              </xsd:extension>
             </xsd:simpleContent>
            </xsd:complexType>
           </xsd:element>
          </xsd:sequence>
          <!--Атрибут с наименованием склада (необязательный)-->
          <xsd:attribute default="" use="optional" name="storage" type="xsd:string"/>
          <!--Атрибут с наименованием товара (обязательный)-->
          <xsd:attribute use="required" name="product" type="xsd:string"/>
          <!--Атрибут с наименованием клиента (необязательный)-->
          <xsd:attribute default="" use="optional" name="client" type="xsd:string"/>
          <!--Атрибут с количеством продаж (обязательный)-->
          <xsd:attribute use="required" name="amount" type="xsd:decimal"/>
          <!--Атрибут со стоимостью (необязательный)-->
          <xsd:attribute default="0" use="optional" name="cost" type="xsd:decimal"/>
          <!--Атрибут с стоимостью закупа (необязательный)-->
          <xsd:attribute default="0" use="optional" name="purchaseCost" type="xsd:decimal"/>
          <!--Атрибут с датой (обязательный)-->
          <xsd:attribute use="required" name="date" type="xsd:date"/>
          <!--Атрибут с упущенным спросом (необязательный)-->
          <xsd:attribute default="0" use="optional" name="lostDemand" type="xsd:decimal"/>
          <!--Атрибут с прибылью (необязательный)-->
          <xsd:attribute default="0" use="optional" name="profit" type="xsd:decimal"/>
         </xsd:complexType>
        </xsd:element>
       </xsd:sequence>
      </xsd:complexType>
      <!--Блок проверки на противоречивость-->
      <xsd:unique name="suspiciousSales">
       <xsd:selector xpath="sale"/>
       <xsd:field xpath="@storage"/>
       <xsd:field xpath="@product"/>
       <xsd:field xpath="@client"/>
       <xsd:field xpath="@date"/>
      </xsd:unique>
     </xsd:element>
    </xsd:sequence>
   </xsd:choice>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>
</file>

Загрузка классификации

Данные по классификации сохраняются в тэге <ontology>. Данные могут содержать информацию по группам в тэге <ontologyClass> и информацию по конкретным товарам в тэге <ontologyProduct>.

Информация о группе храниться в тэге <ontologyClass>.

Атрибутами тэга являются:

id – наименование группы parentId – наименование родительской группы

У разных групп не может быть одинакового id

Тэг может содержать подэлементы <property> с единственным атрибутом id соответствующие свойствам группы с определённым названием.

Зарезервированными ключевыми словами для стандартных свойств являются: Вес, Объем, Название, Поставщик, Длина, Ширина, Высота, Вес брутто, Вес нетто

Информация по товарам храниться в тэге <ontologyProduct>.

id – наименование товара

parentId – группа товара

Тэг может содержать подэлементы <propertyValue> с атрибутами property и value соответствующие наименованию свойства и его значению товара.

Классификация, содержащая группы товаров должны быть полной - содержать весь активный ассортимент

Пример файла

<export_data>
    <ontology>
        <ontologyClass id="Все товары">
            <property id="Название"/>
        </ontologyClass>
        <ontologyClass id="Группа" parentId="Все товары">
            <property id="Поставщик"/>
        </ontologyClass>
        <ontologyProduct id="111111 parentId="Группа">
            <propertyValue property="Название" value="Товар1"/>
            <propertyValue property="Поставщик" value="Поставщик1"/>
        </ontologyProduct>
    </ontology>
</export_data> 

Загрузка параметров

Данные по параметрам сохраняются в тэге <properties> в виде набора элементов <itemProperties>.

Данные тэга <itemProperties> соответствуют параметрам товара. В виде атрибутов тэга заданы склад (storage) и id товара (product). Тэг содержит множество подэлементов <property>, каждый из которых соответствует значению (атрибут value) определённого параметра (атрибут id).

названия парметров

Пример файла

<export_data>
    <properties>
        <itemProperties storage="s1" product="p2">
            <property id="Минимальная дата" value="2016-03-18"/>
            <property id="Зона хранения" value="area1"/>
        </itemProperties>
    </properties>
</export_data>

Ожидаемые поступления с датами

<export_data>
<arrivals>
<arrival date="" storage="" product="" report="" value=""/>
...
</arrivals>
</export_data>

date=дата ожидаемого прихода

storage=склад

product=уникальный идентификатор

report=ID/название заказа

value= количество товара в пути

Пример

<export_data>
<arrivals>
<arrival date="2017-12-22" storage="s2" product="p2" report="report" value="616.00"/>
.....
<arrival date="2017-12-24" storage="s1" product="p1" report="report1" value="33.00"/>
</arrivals>
</export_data>

Загрузка комплекса данных

Данные по продажам, классификации и параметрам в формате xml можно загружать из одного файла.

В интерфейсе программы это можно сделать через Данные - Загрузить - комплекс данных

В диалоге нужно указать режим (обновление/замена) для истории продаж, параметров и классификации, а также сохранять ли значения свойств в классификации при замене и имя файла:

Также загрузка доступна в автоматическом режиме при помощи команды

import --all "путь к файлу" "путь к базе" [-r | -a] {-s}. 
[-r | -a] - режим загрузки (замена или обновление)
 {-s | --save-properties} - нужно ли сохранять свойства в классификации при замене.

Для комплексного файла можно указывать режим загрузки для каждого типа данных отдельно при помощи флагов:

--removesales и --updatesales - замена и обновление продаж соответственно
--removeparameters и --updateparameters - параметров
--removeontology и --updateontology - классификации

Пример:

import --all source target  --removesales --updateparameters --removeontology - продажи и классификация будут загружены с заменой, а параметры в режиме обновления
import --all source target -r - всё загрузится в режиме замены
import --all source target -r --updateontology - всё загрузится в режиме замены, а классификация в режиме обновления