from __future__ import annotations
from datetime import date
from typing import TYPE_CHECKING, List, Optional
from pochta.enums import MailCategory, MailType
from pochta.helpers import Order
from pochta.utils import HTTPMethod
if TYPE_CHECKING:
from pochta import Delivery
[docs]class Batches:
"""
Методы API Партий.
Используется через объект :class:`Delivery <pochta.delivery.Delivery>` или вручную.
"""
def __init__(self, client: Delivery) -> None:
"""
Инициализация API Партий.
:param client: API клиент Доставки
"""
self._client = client
[docs] def create_batch(self, shipment_ids: List[str], sending_date: Optional[date] = None) -> dict:
"""
Создание партии из N заказов.
Автоматически создает партию и переносит указанные подготовленные заказы в эту партию.
Если заказы относятся к разным типам и категориям – создается несколько партий.
Заказы распределяются по соответствующим партиям.
Каждому перенесенному заказу автоматически присваивается ШПИ.
https://otpravka.pochta.ru/specification#/batches-create_batch_from_N_orders
:param shipment_ids: Список внутренних идентификаторов заказов
:param sending_date: Дата сдачи в почтовое отделение (yyyy-MM-dd)
:return: Результат операции
"""
url = '/1.0/user/shipment'
if isinstance(sending_date, date):
sending_date = sending_date.isoformat()
params = {'sending-date': sending_date}
res = self._client.request(HTTPMethod.POST, url, data=shipment_ids, params=params)
return res.json()
[docs] def change_sending_date(self, batch_name: int, year: int, month: int, day: int) -> dict:
"""
Изменение дня отправки в почтовое отделение.
Изменяет (устанавливает) новый день отправки в почтовое отделение.
https://otpravka.pochta.ru/specification#/batches-sending_date
:param batch_name: Наименование партии
:param year: Дата сдачи в почтовое отделение: год
:param month: Дата сдачи в почтовое отделение: месяц
:param day: Дата сдачи в почтовое отделение: день
:return: Результат операции
"""
url = f'/1.0/batch/{batch_name}/sending/{year}/{month}/{day}'
res = self._client.request(HTTPMethod.POST, url)
return res.json()
[docs] def move_orders_to_batch(self, batch_name: str, shipment_ids: List[str]) -> dict:
"""
Перенос заказов в партию.
Переносит подготовленные заказы в указанную партию.
Если часть заказов не может быть помещена в партию (тип и категория партии
не соответствует типу и категории заказа) - возвращается json объект с указанием индекса
заказа в переданном массиве и типом ошибки, остальные заказы помещаются в указанную партию.
Каждому перенесенному заказу автоматически присваивается ШПИ.
https://otpravka.pochta.ru/specification#/batches-move_orders_to_batch
:param batch_name: Наименование партии
:param shipment_ids: Список внутренних идентификаторов заказов
:return: Результат операции
"""
url = f'/1.0/batch/{batch_name}/shipment'
res = self._client.request(HTTPMethod.POST, url, data=shipment_ids)
return res.json()
[docs] def find_batch(self, batch_name: str) -> dict:
"""
Поиск партии по наименованию.
Возвращает параметры партии.
https://otpravka.pochta.ru/specification#/batches-find_batch
:param batch_name: Наименование партии
:return: Результат операции
"""
url = f'/1.0/batch/{batch_name}'
res = self._client.request(HTTPMethod.GET, url)
return res.json()
[docs] def find_orders_with_barcode(self, query: str) -> List[dict]:
"""
Поиск заказов с ШПИ.
https://otpravka.pochta.ru/specification#/batches-find_orders_with_barcode
:param query: Условие для поиска: номер заказа или ШПИ
:return: Результат операции
"""
url = '/1.0/shipment/search'
params = {'query': query}
res = self._client.request(HTTPMethod.GET, url, params=params)
return res.json()
[docs] def add_orders_to_batch(self, batch_name: str, orders: List[Order]) -> dict:
"""
Добавление заказов в партию.
Создает массив заказов и помещает непосредственно в партию. Автоматически рассчитывает
и проставляет плату за пересылку. Каждому заказу автоматически присваивается ШПИ.
https://otpravka.pochta.ru/specification#/batches-add_orders_to_batch
:param batch_name: Наименование партии
:param orders: Список заказов
:return: Результат операции
"""
url = f'/1.0/batch/{batch_name}/shipment'
orders = [order.raw for order in orders]
res = self._client.request(HTTPMethod.GET, url, data=orders)
return res.json()
[docs] def delete_order_from_batch(self, shipment_ids: List[str]) -> dict:
"""
Удаление заказов из партии.
https://otpravka.pochta.ru/specification#/batches-delete_order_from_batch
:param shipment_ids: Список внутренних идентификаторов заказов
:return: Результат операции
"""
url = '/1.0/shipment'
res = self._client.request(HTTPMethod.GET, url, data=shipment_ids)
return res.json()
[docs] def get_batch_orders_info(self, batch_name: str,
sort: str = 'asc',
size: Optional[int] = None,
page: Optional[int] = None) -> List[dict]:
"""
Запрос данных о заказах в партии.
https://otpravka.pochta.ru/specification#/batches-get_info_about_orders_in_batch
:param batch_name: Наименование партии
:param sort: Критерии сортировки в формате: asc(по возрастанию) или desc (по убыванию).
По умолчанию порядок сортировки по возрастанию
:param size: Количество записей на странице
:param page: Номер страницы (0..N)
:return: Результат операции
"""
url = f'/1.0/batch/{batch_name}/shipment'
params = {
'sort': sort,
'size': size,
'page': page,
}
res = self._client.request(HTTPMethod.GET, url, params=params)
return res.json()
[docs] def search_all_batches(self, mail_type: Optional[MailType] = None,
mail_category: Optional[MailCategory] = None,
sort: Optional[str] = 'asc',
size: Optional[int] = None,
page: Optional[int] = None) -> List[dict]:
"""
Поиск всех партий.
https://otpravka.pochta.ru/specification#/batches-search_all_batches
:param mail_type: Тип отправления (По умолчанию: ВСЕ)
:param mail_category: Категория отправления (По умолчанию: ВСЕ)
:param sort: Критерии сортировки в формате: asc(по возрастанию) или desc (по убыванию).
По умолчанию порядок сортировки по возрастанию
:param size: Количество записей на странице
:param page: Номер страницы (0..N)
:return: Результат операции
"""
url = '/1.0/batch'
params = {
'mailType': mail_type,
'mailCategory': mail_category,
'sort': sort,
'size': size,
'page': page,
}
res = self._client.request(HTTPMethod.GET, url, params=params)
return res.json()
[docs] def find_order_by_id(self, shipment_id: str) -> dict:
"""
Поиск заказа в партии по внутреннему id.
https://otpravka.pochta.ru/specification#/batches-find_order_by_id
:param shipment_id: Внутренний идентификатор отправления
:return: Результат операции
"""
url = f'/1.0/shipment/{shipment_id}'
res = self._client.request(HTTPMethod.GET, url)
return res.json()