Сверка резервирования массовой задачи Carrier с итоговым списанием
Разделяйте зарезервированный баланс, результаты и возврат средств, чтобы понять различия при совместном использовании кошелька.

Локальная запись сверки связывает массовую задачу Carrier с её файлом, итоговыми результатами и данными кошелька, исключая догадки при одновременных расходах.
Для сверки баланса массовых задач Carrier разделяйте оценочное резервирование, итоговое списание и неиспользованный резерв. Сопоставляйте задачу с подготовленным файлом и завершенными результатами, а затем проверяйте, повлияли ли другие операции на общий баланс аккаунта.
Рассматривайте резервирование как незавершенную работу
Вы отправляете файл Carrier, видите уменьшение доступного баланса, а позже получаете CSV-файл с меньшим количеством строк, чем было в исходной загрузке. Само по себе первое изменение баланса не говорит об итоговой стоимости задачи. Массовая отправка резервирует оценочную сумму на время обработки задачи.
CarrierLookup списывает средства за номера, по которым получены результаты, и возвращает неиспользованный резерв на тот же кошелек. Задача, которая завершилась ошибкой на этапе подготовки, возвращает резерв в полном объеме. Эта сверка резерва отличается от отмены пополнения счета или покупки тарифного плана.
Храните три значения отдельно в своих записях: зарезервированную сумму, итоговое списание и сумму возврата. Когда все три значения доступны для одной задачи, ожидаемое соотношение выглядит так: резервирование равно сумме итогового списания и возвращенного резерва. Не заполняйте недоступное значение на уровне задачи разницей баланса всего аккаунта только ради того, чтобы уравнение сошлось.
Создайте запись о задаче на основе отправленного файла
Начинайте с того самого файла, который вы отправили, а не с текущей версии электронной таблицы, которую кто-то мог отредактировать позже. Сохраните хеш файла, выбранную страну, тип услуги carrier_batch, ID задачи и время отправки. Храните файлы с контактными данными в защищенном хранилище и используйте ссылки на них в своей рабочей таблице.
При подготовке массовой задачи исключаются неверные строки, дубликаты, номера без кода страны и номера вне выбранной страны. За исключенные строки списания не производятся. Ваш локальный отчет о подготовке может объяснить некоторые исключения, но различайте свою оценку и количество, фактически сообщенное сервисом.
| Поле локальной рабочей таблицы | Что оно связывает |
|---|---|
| ID задачи и тип услуги | Одну задачу с файлом Carrier, а не всю работу аккаунта |
| Хеш исходного файла и количество строк | Точную версию загрузки |
| Страна и примечания по подготовке | Целевой набор номеров и локальные исключения |
| Временные метки отправки и состояния | Период, в течение которого удерживался резерв |
| Подтверждение резервирования | Сумма удержания, если она отображается в записях задачи или аккаунта |
| Файл результатов, хеш и количество строк | Завершенный вывод для этой задачи |
| Подтверждение итогового списания и возврата | Значения расчетов, где они доступны |
| Другая активность кошелька | Причины, по которым снимки баланса могут не изолировать эту задачу |
| Необъяснимая разница | Видимая неразрешенная сумма, а не вымышленная корректировка |
Это поля в вашей рабочей таблице, а не обещанный API биллинговой ведомости провайдера. Сохраняйте источник каждой суммы, чтобы оператор мог отличить наблюдаемую цифру от вычисленной.
Подсчитывайте завершенные результаты, не считая пустые значения ошибками
Успешная задача Carrier предоставляет один CSV-файл с полями identifier, carrier, underlying_carrier, number_type, country_code, region и city. Используйте идентификаторы, чтобы связать строки вывода с подготовленным вводом. Массовый CSV-файл не содержит поля exists, как в синхронном ответе для нескольких номеров.
Пустое значение оператора или географии означает, что данные были недоступны. Это не является достаточным доказательством того, что строка не обработана или должна быть бесплатной. Завершенные результаты Carrier могут подлежать оплате, даже если поля распределения пусты. Разделяйте полноту полей и количество завершенных результатов при оценке стоимости.
Например, ваш локальный отчет может показывать некоторые дубликаты во входных данных и некоторые завершенные строки вывода с пустыми значениями города. Дубликаты входных данных относятся к сверке предобработки. Пустые города относятся к проверке качества результатов. Вычитание обеих групп из количества оплачиваемых строк смешало бы два разных вопроса.
Подсчитывайте идентификаторы последовательно и проверяйте дубликаты или отсутствующие сопоставления вывода перед расчетом итогов. Если доступные детали задачи не объясняют, почему отправленный идентификатор отсутствует, пометьте разницу как неразрешенную. Не придумывайте код ошибки для номера из-за отсутствия строки в CSV. Используйте состояние задачи и доступные данные сервиса для разрешения ситуации.
Используйте «тихий» кошелек для понимания одной задачи
При изолированном запуске приостановите другую платную работу под вашим контролем и зафиксируйте баланс непосредственно перед отправкой. Запишите наблюдение за резервированием, дождитесь финального состояния задачи и зафиксируйте расчетный баланс, а также любые отображаемые списания или возвраты. Учитывайте пополнения, изменения плана и любые другие движения по счету в период наблюдения.
Если других движений действительно не было, разница между начальным и конечным балансом может подтвердить чистую стоимость задачи. Также полезно сравнить этот результат с количеством завершенных строк и применимой ценой, указанной в ценах CarrierLookup. Сохраняйте цену, использованную в то время, вместо того чтобы молча заменять её на более позднюю.
GET /api/v1/balance считывает текущий balance_micros без создания проверки или списания средств за запрос. Сохраняйте это целое число напрямую и используйте целочисленную арифметику для вычисления разницы; преобразуйте в отображаемую сумму на уровне вашего приложения. Снимок баланса — это наблюдение за аккаунтом, а не детализированная выписка по задаче.
Задача может находиться в состоянии processing, success или failed. Задача в состоянии processing не является завершенной только потому, что одно из значений баланса осталось неизменным. Запрашивайте статус задачи не чаще, чем раз в 30 секунд, и сохраняйте финальное состояние вместе с записью результата.
Объясняйте параллельные расходы, не приписывая их файлу
Проверки Carrier в реальном времени и асинхронные сервисы используют один баланс. Если другая команда выполняет проверки во время работы вашей массовой задачи, начальный баланс минус конечный баланс включает эту работу. Другое массовое резервирование также может оставаться открытым в конце периода, что делает доступный баланс плохим индикатором для расчетных списаний.
В своей рабочей таблице отделяйте суммы, относящиеся к задаче, от движения средств по всему аккаунту. Сверяйте известные другие списания, кредиты и невыполненные резервы, используя доказательства, которые у вас есть. Если остаток не может быть распределен, укажите «неатрибутированная разница общего кошелька» с указанием окна наблюдения. Не приписывайте её той задаче, которая завершилась последней.
Для необъяснимой разницы соберите ID задачи, тип услуги, временные метки, хеш файла, количество подготовленных строк, финальное состояние, количество результатов, наблюдения за балансом и любые доступные детали резервирования или расчетов. Укажите, выполнялись ли параллельно проверки в реальном времени или другие задачи с файлами. Передавайте только минимально необходимые контактные данные через соответствующий канал поддержки; никогда не включайте API-ключ.
Начните со следующей массовой задачи Carrier: сохраните версию ввода и ID задачи вместе перед отправкой. Этот небольшой шаг сделает итоговый CSV-файл, возвращенный резерв и любые оставшиеся расхождения прослеживаемыми до одной и той же работы.
Узнайте больше
Выберите информацию о продукте, которая соответствует следующему шагу в вашем рабочем процессе.