Организация программного взаимодействия со службой доставки заказов APLIX через интерфейс веб­сервисов по протоколу SOAP
1. Введение
         Сервис предназначен для обеспечения полного цикла информационного
взаимодействия в рамках оказания услуг по доставке заказов (отправлений) до
получателей. Под полным циклом взаимодействия подразумевается следующие
функции:
-проверку допустимости габаритно­весовых характеристик (ГВХ) отправления;
-расчет стоимости различных способов доставки по заданному адресу
получателя и ГВХ;
-расчет стоимости упаковки и маркировки отправления, а при необходимости ­
предоставление детализации этих затрат;
-прием и хранение детализированной информации по каждому отправлению
(товарное наполнение, адрес получателя и отправителя, стоимость доставки,
объявленная ценность, вариант упаковки и способ доставки);
-подготовка реестров, актов приёма­передачи товарных вложений;
-предоставление информации по отслеживанию отправлений.
2. Предварительные требования к потребителю
         Для организации информационного взаимодействия с использованием
описываемого в настоящем документе веб­сервиса потребителю информации
необходимо:
1. Заключить договор с ООО «Апликс» на оказание услуг по доставке заказов (после
заключения договора потребителю будут предоставлены логин и пароль для доступа к
веб­сервису).
2. Разработать программный клиент, соответствующий требованиям, изложенным в
настоящем документе;
3. Доступ к веб­сервису
         Получить доступ к сервису можно через сеть интернет по адресу:
Для тестирования и отладки необходимо использовать экземпляр сервиса с учетными
данными: http://z.aplix.loc/post/ws/Delivery.1cws?wsdl
Пароль: test
Логин: test
4. Описание XML­схемы (XDTO­пакет)

Описание составных типов, используемых в веб­сервисе приведено в XML­схеме ниже

[xml]

[/xml]

5. Описание процесса информационного взаимодействия

Информационное взаимодействие производится по инициативе системы­потребителя информации. Процесс взаимодействия состоит из следующих шагов:

1. Проверка габаритно­весовых характеристик товарного вложения. Система­потребитель
вызывает метод веб­сервиса CheckDimensions и передает список товаров с указанием
длины, ширины, высоты, веса и количества каждого товара в планируемом
отправлении. В ответ на вызов метода система­потребитель получает ответ:
превышены или нет предельные значения габаритов и веса, попутно для справки метод
возвращает суммарную длину, ширину, высоту и вес отправления после решения
задачи «оптимальной укладки», а также текстовый комментарий результата проверки;
2. Получение возможных вариантов доставки. Система­потребитель вызывает метод
веб­сервиса CalculateShippingCost и передает адрес получателя, состав товарного
вложения, тип упаковки и объявленной ценности. В ответ на вызов метода
система­потребитель получает ответ: список возможных вариантов доставки с
указанием стоимости доставки, ориентировочной длительности доставки, а также
справочной информации (режим работы и местонахождение почтового отделения). Для
получения детализации расчета стоимости затрат на подготовку и отправку
отправления метод возвращает уникальный идентификатор запроса, по которому в
дальнейшем можно будет запросить детализацию, используя метод GetDetailsOfCost.
3. Размещение заказа в системе исполнителя. Система­потребитель вызывает метод
веб­сервиса PushOrder и передает номер и дату заказа, уникальный идентификатор
заказа, информацию о получателе, включая его адрес и телефон, объявленную
ценность и сумму наложенного платежа, состав товарного вложения, тип упаковки и
выбранный способ доставки. В ответ на вызов метода система­потребитель получает
идентификатор заказа в системе исполнителя.
4. Детализация затрат на упаковку и маркировку отправления. Система­потребитель
вызывает метод веб­сервиса GetDetailsOfCost и передает идентификатор расчета,
который был получен при вызове метода CalculateShippingCost, а также идентификатор
метода доставки.
5. Размещение реестра заказов в системе исполнителя. Система­потребитель вызывает
метод веб­сервиса PushReestr и передает идентификатор реестра, его номер, дату,
ожидаемую дату передачи заказов исполнителю и собственно список идентификаторов
заказов, которые входят в данные реестр.
6. Получение трек­номеров по заказам. Периодически (рекомендуется вызывать метод не
чаще чем 1 раз в час) система­потребитель вызывает метод веб­сервиса
GetTrackNumbers и передает дату и время последнего успешного получения списка
трек­номеров. В ответ метод GetTrackNumbers возвращает список трек­номеров,
которые были привязаны к заказам за промежуток времени с указанной даты по
текущее время.

6 Описание методов веб­сервиса Delivery
6.1 Метод CheckDimensions

Синтаксис:

Boolean CheckDimenshions(Dimensions[] DimensionsList,

Out float Length,

Out float Width,

Out float Height,

Out float Weight,

Out string Comment)

Параметры:

Имя параметра Входной / Выходной Тип Описание
DimensionsList входной Dimensions[] Массив
габаритно­весовых
характеристик товаров
Length выходной float Длина посылки
Width выходной float Ширина посылки
Height выходной float Высота посылки
Weight выходной float Вес посылки
Comment выходной float Текстовое описание при превышении
предельных значений габаритно­весовых
характеристик

Описание:

В метод передается список габаритно­весовых характеристик всех товаров
(DimensionsList). После расчета выходные параметры Length, Width, Height (длина,
ширина и высота соответственно) заполняются габаритами посылки, после решения
задачи «оптимальной укладки», а в параметр Weight передается суммарный вес всех
товаров, без учета упаковочных материалов. В том случае если габариты отправления
превышают предельные значения в параметр Comment передается текстовое описание
несоответствия.

Возвращаемое значение: Метод возвращает булево значение True, если
габаритно­весовые характеристики не превышают предельных значений и доставка
возможна хотя бы одним доступным способом, иначе False. Предположительно данный
метод может использоваться на стороне клиента для оперативной оценки
принципиальной возможности отправки заказа и своевременного принятия каких­либо
решений, если сделать этого невозможно.

6.1.1 Пример вызова метода CheckDimensions
[php]
ws.Credentials = new NetworkCredential("test", "test");
// Предположим, что в корзине 2 позиции и необходимо проверить не превышают ли он
ограничения по допустимым габаритам и весу
aplix.Dimensions[] Dimensions = new aplix.Dimensions[2];
aplix.Dimensions Item;
Item = new aplix.Dimensions();
Item.Length = 0.130f;
Item.Width = 0.100f;
Item.Height = 0.001f;
Item.Weight = 0.1f;
Item.Qty = 2;
Dimensions[0] = Item;
Item = new aplix.Dimensions();
Item.Length = 0.1331f;
Item.Width = 0.0998f;
Item.Height = 0.0788f;
Item.Weight = 0.575f;
Item.Qty = 1;
Dimensions[1] = Item;
// Выходные параметры
float Length;
float Width;
float Height;
float Weight;
string Comment;
// Выполнить проверку габаритно‐весовых характеристик
bool Result = ws.CheckDimenshions(Dimensions, out Length, out Width, out Height, outWeight, out Comment);
// Визуализация результата
Response.Write("Result:<b>" + Result.ToString() + "</b>");
Response.Write("Length:<b>" + Length.ToString() + "</b>");
Response.Write("Width:<b>" + Width.ToString() + "</b>");
Response.Write("Height:<b>" + Height.ToString() + "</b>");
Response.Write("Weight:<b>" + Weight.ToString() + "</b>");
Response.Write("Weight:<b>" + Comment + "</b>");

[/php]

6.2 Метод CalculateShippingCost
Синтаксис:
Long CalculateShippingCost(string OrderNumber,
Float DeclaredCost,
Goods[] Goods,
Address Address,
Byte TypeOfSeal,
Boolean SturdyPackaging,
Boolean CashOnDelivery,
Out DeliveryType[] Types,
Out string Comments)Параметры:

Имя параметра Входной / Выходной Тип Описание
OrderNumber входной string Номер заказа, если известен в системе
потребителя. Если будет задан, то расчет
в будущем будет привязан к заказу.
DeclaredCost входной Float Объявленная ценность отправления. На
указанную сумму будет оформленная
страховка.
Goods входной Goods[] Список товаров массив структур
(Артикул,
Наименование,
Длина,
Ширина, Высота, Вес, Количество)
Address входной Address Адрес получателя (структура: Почтовый
индекс,
Регион,
Район,
Город,
Населенный пункт, Улица, Дом, Корпус,
Картира)
TypeOfSeal входной Byte Вариант
уплотнения,
возможные
значения:1 ­Не требуется

2 ­Пузырчатая пленка

3­ Наполнитель

SturdyPackagin

g

входной Boolean Обязательно ли требуется жесткая
упаковка
CashOnDelivery входной Boolean Требуется ли наложенный платеж
Types выходной DeliveryType[] Список доступных вариантов доставки
Comments выходной DeliveryType[] Список доступных вариантов доставки

Описание:

Метод по заданным параметрам выдает список доступных вариантов доставки
(выходной параметр Types) в виде массива структур <Идентификатор способа доставки, Наименование способа доставки, Себестоимость доставки, Страховую премию, Затраты на упаковку и маркировку, Адрес нахождения почтового отделения, либо точки самовывоза, Режим работы почтового отделения, либо точки самовывоза, Минимальное количество дней доставки, Максимальное количество дней доставки, Доп.информация>. Если в процессе расчета возникли какие­либо исключения, то
описание ошибки будет возвращено в параметр Comments.

Возвращаемое значение:

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

6.2.1 Пример вызова метода CalculateShippingCost
[php]
aplix.Delivery ws = new aplix.Delivery();
ws.Credentials = new NetworkCredential("test", "test");
// 684005, Камчатский край, Елизовский р‐н, Елизово г, Ленинская ул, дом No 16
aplix.Address Address = new aplix.Address();
Address.Index = "684005";
Address.Region = "Камчатский край";
Address.District = "Елизовский р‐н";
Address.City = "Елизово г";
Address.Street = "Ленинская ул";
Address.Home = "16";
// Предположим, что заказ состоит из 2 позиций
aplix.Goods[] Goods = new aplix.Goods[2];
aplix.Goods Item;
Item = new aplix.Goods();
Item.SKU = "216293";
Item.Name = "карта памяти SDXC 64Gb Class 10 Transcend";
Item.Length = 0.130f;
Item.Width = 0.100f;
Item.Height = 0.001f;
Item.Weight = 0.1f;
Item.Qty = 2;
Goods[0] = Item;
Item = new aplix.Goods();
Item.SKU = "499687";
Item.Name = "зеркальный фотоаппарат Canon EOS 650D Kit Tamron AF 18‐270mm Black";
Item.Length = 0.1331f;
Item.Width = 0.0998f;
Item.Height = 0.0788f;
Item.Weight = 0.575f;
Item.Qty = 1;
Goods[1] = Item;
//Заполним параметры для калькулятора
string OrderNumber="1234567890";
float DeclaredCost = 36370;
sbyte TypeOfSeal = 1;
bool SturdyPackaging = true;
bool CashOnDelivery = false;
aplix.DeliveryType[] Types; string Comments;
//Вызов калькулятора
long Status = ws.CalculateShippingCost(OrderNumber, DeclaredCost, Goods, Address,TypeOfSeal, SturdyPackaging,CashOnDelivery, out Types, out Comments);
//Визуализация результата
Response.Write("Id расчета:<b>"+Status.ToString()+"</b>
");
Response.Write("Доп.информация по расчету:<b>" + Comments + "</b>
");
Response.Write(@"</pre>
");
foreach (aplix.DeliveryType type in Types) {
Response.Write(""+ " "+ " "+ " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " "); }
Response.Write("
<table border="1">
<tbody>
<tr>
<th>TypeId</th>
<th>TypeName</th>
<th>TypeDescription</th>
<th>Cost</th>
<th>Insurance</th>
<th>PostalRate</th>
<th>PreparingCost</th>
<th>Address</th>
<th>Worktime</th>
<th>MinPeriod</th>
<th>MaxPeriod</th>
<th>AdditionalInformation</th>
</tr>
<tr>
<td>" + type.TypeId.ToString() + "</td>
<td>" + type.TypeName + "</td>
<td>" + type.TypeDescription + "</td>
<td>" + type.Cost.ToString() + "</td>
<td>" + type.Insurance.ToString() + "</td>
<td>" + type.PostalRate.ToString() + "</td>
<td>" + type.PreparingCost.ToString() + "</td>
<td>" + type.Address + "</td>
<td>" + type.Worktime + "</td>
<td>" + type.MinPeriod.ToString() + "</td>
<td>" + type.MaxPeriod.ToString() + "</td>
<td>" + type.AdditionalInformation + "</td>
</tr>
</tbody>
</table>
<pre>");
}
[/php]
6.3 Метод PushOrder
Синтаксис:
    Long PushOrder(
          ID,
          Number,
          Date,
          Customer,
          DeclaredCost,
          AmountToBePaid,
          DeliveryTypeId,
          TypeOfSeal,
          SturdyPackaging,
          Activity,
          Goods,
          DeliveryDate,
          StartTimeDelivery,
          EndTimeDelivery,
          Сomment,
          ShipperId,
          Marker)
Параметры:

Имя параметра Входной / Выходной Тип Описание
ID входной String Идентификатор заказа в системе
потребителя (уникальное значение)
Number входной String Номер заказа в системе потребителя
(будет распечатываться в комментариях
при маркировке отправлений)
Date входной DateTime Дата заказа в системе потребителя (будет
распечатываться в комментариях при
маркировке отправлений
Customer входной Customer Информация о покупателя, струкутра
<ФИО, адрес, адрес электронной почты и телефон>
DeclaredCost входной Float Объявленная ценность отправления. На
указанную сумму будет оформленная
страховка.
AmountToBeP
aid
входной Float Сумма
к
оплате.
Если
заказ
предоплаченю то 0.
DeliveryTypeId входной Int Идентификатор выбранного способа
доставки.
TypeOfSeal входной Int Вариант
уплотнения,
возможные
значения:
1­Не требуется
2­Пузырчатая пленка
3­Наполнитель
SturdyPackaging входной Boolean Обязательно ли требуется жесткая
упаковка
Activity входной Boolean Актуальность заказа. True – если заказ
актуален, False – если заказ отменен.
Goods входной Goods[] Список товаров
DeliveryDate входной DateTime Дата доставки, заполняется если выбрана
курьерская доставка
StartTimeDeliv
ery
входной Int Желаемое
время
доставки
«С»,
заполняется если выбрана курьерская
доставка
EndTimeDelivery входной Int Желаемое время доставки «До»,
заполняется если выбрана курьерская
доставка
Сomment входной String Комментарий к заказу
ShipperId входной String Идентификатор
отправителя,
заполняется
если
у контрагента
несколько интернет магазинов
Marker входной String Маркер заказа, заполняется если
отправления маркируются метками
APLIX.RU

Описание:
Метод размещает информацию о заказе в системе исполнителя. Система­потребитель
передает номер и дату заказа, уникальный идентификатор заказа, информацию о
получателе, включая его адрес и телефон, объявленную ценность, сумму наложенного
платежа если таковая есть, состав товарного вложения, тип упаковки и выбранный
способ и детали доставки.

Возвращаемое значение:
Метод возвращает уникальный идентификатор заказа в системе исполнителя.

6.3.1 Пример вызова метода PushOrder
[php]
aplix.Delivery ws = new aplix.Delivery();
ws.Credentials = new NetworkCredential("test", "test");
// Подготовим струкутру "Получатель отправления"
aplix.Customer Customer = new aplix.Customer();
// 684005, Камчатский край, Елизовский р‐н, Елизово г, Ленинская ул, дом No 16
aplix.Address Address = new aplix.Address();
Address.Index = "684005";
Address.Region = "Камчатский край";
Address.District = "Елизовский р‐н";
Address.City = "Елизово г";
Address.Street = "Ленинская ул";
Address.Home = "16";
Customer.Address = Address;
Customer.ID = "psv@vardex.ru";
Customer.Name = "Сергей";
Customer.Email = "psv@vardex.ru";
Customer.Phone = "+7(916)975‐53‐54";
//Заполним параметры заказа
string ID = "2013‐1234567890"; // Уникальный идентификатор заказа в системе клиента
string Number = "1234567890"; // Номер заказа в системе клиента
DateTime Date = new DateTime(2013, 08, 30);
float DeclaredCost = 36350.0f; // Объявленная ценность
float AmountToBePaid = 0; // Нет наложенного платежа
int DeliveryTypeId = 4; // ЕМС
sbyte TypeOfSeal = 2; // Пузырчатая пленка
bool SturdyPackaging = true; // Жесткая упаковка (для хрупких вещей)
bool Activity = true; // Документ актуален
// Предположим, что заказ состоит из 2 позиций
aplix.Goods[] Goods = new aplix.Goods[2];
aplix.Goods Item;
Item = new aplix.Goods();
Item.SKU = "216293";
Item.Name = "карта памяти SDXC 64Gb Class 10 Transcend";
Item.Length = 0.130f;
Item.Width = 0.100f;
Item.Height = 0.001f;
Item.Weight = 0.1f;
Item.Qty = 1;
Item.Price = 2080.0f;
Item.VATRate = "НДС18";
Goods[0] = Item;
Item = new aplix.Goods();
Item.SKU = "499687";
Item.Name = "зеркальный фотоаппарат Canon EOS 650D Kit Tamron AF 18‐270mm Black";
Item.Length = 0.1331f;
Item.Width = 0.0998f;
Item.Height = 0.0788f;
Item.Weight = 0.575f;
Item.Qty = 1;
Item.Price = 34270.0f;
Item.VATRate = "НДС18";
Goods[1] = Item;
DateTime DeliveryDate = new DateTime(2013, 09, 05); //Доставка на 05 09 2013 года
int StartTimeDelivery = 10; // интервал доставки с 10
int EndTimeDelivery = 14; // до 14
string Comment = "Тестовый заказ";
//Впулить заказ в систему
long OrderId = ws.PushOrder(ID, Number, Date, Customer, DeclaredCost, AmountToBePaid,DeliveryTypeId, TypeOfSeal, SturdyPackaging, Activity, Goods, DeliveryDate, StartTimeDelivery,EndTimeDelivery, Comment, "", "");
Response.Write("Id заказа:<b>" + OrderId.ToString() + "</b>
");
[/php]
6.4 Метод GetDetailsOfCost
Синтаксис:        DetailsOfCostList GetDetailsOfCost (ID, TypeId) Параметры:

Входной / Выходной
Тип
Описание 

входной
Long
Идентификатор расчета (уникальное значение), полученный при вызове метода CalculateShippingCost 

входной
Int
Идентификатор варианта доставки, по которому необходимо получить детализацию

Имя параметра
ID TypeId

Описание: Метод возвращает детализированный список затрат на маркировку и упаковку отправления по заданным идентификатору расчета и идентификатору варианта доставки. Возвращаемое значение: Метод возвращает массив структур
[xml]

[/xml]

Каждый элемент массива содержит описание затраты, количество, цену и стоимость.

6.4.1 Пример вызова метода GetDetailsOfCost
[php]
aplix.Delivery ws = new aplix.Delivery();
ws.Credentials = new NetworkCredential("test", "test");
long ID = 168; // Идентификатор расчета, полученный методом CalculateShippingCost
int TypeId = 3; // Почтовая доставка
// Получим детализацию расчета
aplix.DetailsOfCost[] Details = ws.GetDetailsOfCost(ID, TypeId);
//Визуализация результата
Response.Write("Id расчета:<b>" + ID.ToString() + "</b>
");
Response.Write("Id метода доставки:<b>" + TypeId.ToString() + "</b>
");
Response.Write(@"</pre>
");
foreach (aplix.DetailsOfCost DetailOfCost in Details)
{
Response.Write("" + " " + " " + " " + " " + " ");
}
Response.Write("
<table border="1">
<tbody>
<tr>
<th>Description</th>
<th>Price</th>
<th>Qty</th>
<th>Cost</th>
</tr>
<tr>
<td>" + DetailOfCost.Description + "</td>
<td>" + DetailOfCost.Price.ToString() + "</td>
<td>" + DetailOfCost.Qty.ToString() + "</td>
<td>" + DetailOfCost.Cost.ToString() + "</td>
</tr>
</tbody>
</table>
<pre>");
[/php]
6.5 Метод PushReestr
Синтаксис: Long PushOrder (ID, Number, Date, DateOfShipment, IDs) Параметры:

Входной / Выходной
Тип
Описание 

входной
String
Идентификатор реестра в системе потребителя (уникальное значение) 

входной
String
Идентификатор варианта доставки, по которому необходимо получить детализацию 

входной
DateTime
Дата реестра (будет распечатываться в актах приема­передачи отправлений) 

входной
DateTime
Ожидаемая дата передачи отправлений исполнителю 

входной
String[]
Массив идентификаторов заказов, которые включаются в данный реестр

Имя параметра
ID Number Date DateOfShipment IDs

Описание: Метод размещает информацию о реестре в системе исполнителя. Система­потребитель передает номер и дату реестра, уникальный идентификатор реестра, ожидаемую дату передачи отправлений исполнителю. Возвращаемое значение: Метод возвращает уникальный идентификатор реестра в системе исполнителя.

6.5.1 Пример вызова метода PushReestr
[php]
aplix.Delivery ws = new aplix.Delivery();
ws.Credentials = new NetworkCredential("test", "test");
// Список идентификаторов заказов, которые входят в данный реестр
string[] IDs={"2013‐1234567890", "2013‐1234567891"};
// Уникальный идентификатор реестра в системе клиента
string ID = "2013‐r12345";
// Номер реестра в системе клиента
string Number = "r12345";
// Дата формирования реестра в системе клиента
DateTime Date = new DateTime(2013, 10, 22);
// Предполагаемая дата передачи заказов на доставку
DateTime DateOfShipment = new DateTime(2013, 10, 23);
// Получим детализацию расчета
long ReestID = ws.PushReestr(ID, Number, Date, DateOfShipment, IDs);
//Визуализация результата
Response.Write("Id реестра:<b>" + ReestID.ToString() + "</b>
");
[/php]
6.6 Метод GetTrackNumbers
Синтаксис: DateTime GetTrackNumbers (DateOfLastGetting, TrackNumbers) Параметры:

Входной / Выходной
Тип
Описание 

входной
DateTime
Дата последнего успешного получения трек­номеров. Параметр используется для того чтобы сократить объем передаваемых данных и не дублировать данные, которые были выгружены ранее. 

входной
TrackNumber[]
Массив трек­номеров по заказам

Имя параметра
DateOfLastGetting TrackNumbers

Описание: Метод возвращает список трек­номеров, которые были привязаны к заказам за период с DateOfLastGetting по текущее время. Результата помещается в выходной параметр TrackNumbers. Свойство Activity имеет значение true, если трек­номер актуален, иначе ложь. Возможны ситуации, когда отправлению присваивается один трек­номер, а по истечении некоторого второй трек номер, в этом случае трек­номер, присвоенный изначально становиться не актуальным. Возвращаемое значение: Метод возвращает дату и время на которое актуальны выгружаемые данные. Данное значение необходимо использовать при следующем вызове метода GetTrackNumbers в параметре DateOfLastGetting.

6.6.1 Пример вызова метода GetTrackNumbers
[php]
aplix.Delivery ws = new aplix.Delivery();
ws.Credentials = new NetworkCredential("test", "test");
// Дата последнего удачного получения треков
DateTime DateOfLastGetting = new DateTime(2013, 08, 01);
aplix.TrackNumber[] TrackNumbers;
// Получим список трек‐номеров
DateTime NewDateOfLastGetting = ws.GetTrackNumbers(DateOfLastGetting, out TrackNumbers);
//Визуализация результата
Response.Write("NewDateOfLastGetting: <b>" + NewDateOfLastGetting.ToString() +"</b>
");
Response.Write(@"</pre>
");
foreach (aplix.TrackNumber TrackNumber in TrackNumbers)
{
Response.Write("" + " " + " " + " " + " ");
}
Response.Write("
<table border="1">
<tbody>
<tr>
<th>OrderID</th>
<th>TrackNumber</th>
<th>Activity</th>
</tr>
<tr>
<td>" + TrackNumber.OrderID.ToString() + "</td>
<td>" + TrackNumber.Number + "</td>
<td>" + TrackNumber.Activity+ "</td>
</tr>
</tbody>
</table>
<pre>");
[/php]