diff --git a/Billing-Report-2023-08-22.xlsx b/Billing-Report-2023-08-22.xlsx new file mode 100644 index 0000000..7efd4f2 Binary files /dev/null and b/Billing-Report-2023-08-22.xlsx differ diff --git a/Billing-Report-2023-08-23.xlsx b/Billing-Report-2023-08-23.xlsx new file mode 100644 index 0000000..13aeb6f Binary files /dev/null and b/Billing-Report-2023-08-23.xlsx differ diff --git a/billing.log b/billing.log index 8ee2963..2aa551a 100644 --- a/billing.log +++ b/billing.log @@ -174,3 +174,543 @@ 2023-08-16 16:19:34,230 - billing_reports - INFO - Folder already in list: 31976 2023-08-16 16:19:34,254 - billing_reports - INFO - Folder already in list: 31915 2023-08-16 16:19:34,255 - billing_reports - INFO - Folder already in list: 32155 +2023-08-17 16:37:29,329 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,330 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,331 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,331 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,331 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,332 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,332 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,333 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,334 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,334 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,335 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,335 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,336 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,336 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,337 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,338 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,338 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,339 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,340 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,340 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,340 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,341 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,344 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,346 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,348 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,350 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,350 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,351 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,351 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,353 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,354 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,355 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,356 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,356 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,358 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,360 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,361 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,363 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,364 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,366 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,367 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,368 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,369 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,370 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,373 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,374 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,375 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,376 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,377 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,378 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,379 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,380 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,380 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,381 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,381 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,381 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,382 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,382 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,383 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,384 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,385 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,386 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,387 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,388 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,389 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,389 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,390 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,391 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,393 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,395 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,396 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,397 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,398 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,400 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,401 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,405 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,406 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,406 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,407 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,407 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,408 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,409 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,409 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,410 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,410 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,411 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-17 16:37:29,462 - billing_reports - INFO - Folder already in list: 31976 +2023-08-17 16:37:29,487 - billing_reports - INFO - Folder already in list: 31915 +2023-08-17 16:37:29,487 - billing_reports - INFO - Folder already in list: 32155 +2023-08-22 09:40:42,665 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,667 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,668 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,669 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,670 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,670 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,672 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,673 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,676 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,677 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,679 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,680 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,682 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,684 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,685 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,686 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,687 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,688 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,689 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,690 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,691 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,692 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,692 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,693 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,694 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,694 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,695 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,695 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,696 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,696 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,696 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,697 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,698 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,698 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,698 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,699 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,699 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,700 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,700 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,701 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,701 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,702 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,702 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,703 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,704 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,704 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,704 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,705 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,705 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,706 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,707 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,708 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,708 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,709 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,709 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,710 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,710 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,710 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,711 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,711 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,712 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,713 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,713 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,714 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,715 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,716 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,716 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,717 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,719 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,721 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,721 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,722 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,723 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,724 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,725 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,729 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,730 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,730 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,731 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,731 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,732 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,732 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,733 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,734 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,734 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,735 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 09:40:42,784 - billing_reports - INFO - Folder already in list: 31976 +2023-08-22 09:40:42,808 - billing_reports - INFO - Folder already in list: 31915 +2023-08-22 09:40:42,808 - billing_reports - INFO - Folder already in list: 32155 +2023-08-22 10:00:22,524 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,525 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,526 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,526 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,527 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,528 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,529 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,530 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,530 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,531 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,532 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,532 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,533 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,534 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,534 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,535 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,536 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,537 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,537 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,538 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,538 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,539 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,540 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,541 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,541 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,542 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,542 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,543 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,543 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,544 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,545 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,545 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,546 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,546 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,547 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,548 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,548 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,549 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,549 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,550 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,550 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,550 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,551 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,552 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,553 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,553 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,554 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,554 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,555 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,557 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,558 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,558 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,559 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,559 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,560 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,560 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,561 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,562 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,562 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,562 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,563 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,564 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,565 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,565 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,566 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,567 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,568 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,568 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,571 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,573 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,573 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,574 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,575 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,577 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,577 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,582 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,583 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,583 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,584 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,584 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,585 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,585 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,586 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,586 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,587 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,588 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 10:00:22,641 - billing_reports - INFO - Folder already in list: 31976 +2023-08-22 10:00:22,665 - billing_reports - INFO - Folder already in list: 31915 +2023-08-22 10:00:22,665 - billing_reports - INFO - Folder already in list: 32155 +2023-08-22 14:18:07,459 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,460 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,461 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,461 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,462 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,463 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,464 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,464 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,465 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,466 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,466 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,467 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,468 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,468 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,469 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,470 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,471 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,471 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,472 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,472 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,473 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,474 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,474 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,475 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,476 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,476 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,477 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,477 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,478 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,478 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,479 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,479 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,480 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,480 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,481 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,481 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,482 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,482 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,483 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,483 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,484 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,484 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,485 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,486 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,487 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,487 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,488 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,488 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,489 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,489 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,491 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,491 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,492 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,493 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,493 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,494 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,494 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,494 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,495 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,495 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,496 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,497 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,497 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,498 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,499 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,500 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,500 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,501 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,501 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,503 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,504 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,506 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,507 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,507 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,508 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,510 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,510 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,515 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,516 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,516 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,517 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,517 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,518 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,518 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,519 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,520 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,520 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:07,521 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 14:18:08,152 - billing_reports - INFO - Folder already in list: 31976 +2023-08-22 14:18:08,178 - billing_reports - INFO - Folder already in list: 31915 +2023-08-22 14:18:08,178 - billing_reports - INFO - Folder already in list: 32155 +2023-08-22 17:25:31,657 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,658 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,659 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,659 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,660 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,661 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,662 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,662 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,663 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,664 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,664 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,665 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,666 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,666 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,667 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,667 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,668 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,668 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,669 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,669 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,670 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,671 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,671 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,672 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,673 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,673 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,674 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,675 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,675 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,676 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,677 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,677 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,677 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,678 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,678 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,679 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,680 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,680 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,681 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,681 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,682 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,682 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,683 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,684 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,684 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,685 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,685 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,685 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,686 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,686 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,688 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,689 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,689 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,690 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,691 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,691 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,692 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,692 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,693 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,693 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,694 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,694 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,695 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,695 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,696 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,697 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,698 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,698 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,699 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,700 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,702 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,704 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,704 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,705 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,706 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,707 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,708 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,713 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,714 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,714 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,715 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,715 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,716 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,716 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,717 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,717 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,718 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:31,719 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-22 17:25:32,117 - billing_reports - INFO - Folder already in list: 31976 +2023-08-22 17:25:32,141 - billing_reports - INFO - Folder already in list: 31915 +2023-08-22 17:25:32,141 - billing_reports - INFO - Folder already in list: 32155 +2023-08-23 16:21:22,781 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,783 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,784 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,784 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,785 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,786 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,787 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,787 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,788 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,789 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,789 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,790 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,791 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,791 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,792 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,792 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,793 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,793 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,794 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,794 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,795 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,795 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,796 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,797 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,797 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,798 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,798 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,799 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,799 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,800 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,801 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,801 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,802 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,802 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,803 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,803 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,804 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,804 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,804 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,805 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,805 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,806 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,807 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,807 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,808 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,808 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,809 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,809 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,809 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,810 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,811 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,812 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,813 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,813 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,813 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,814 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,814 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,815 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,816 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,816 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,817 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,817 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,818 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,819 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,819 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,820 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,821 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,821 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,822 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,824 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,825 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,827 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,827 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,828 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,829 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,830 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,831 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,836 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,836 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,837 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,838 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,838 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,839 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,839 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,840 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,841 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,842 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:22,844 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment +2023-08-23 16:21:23,208 - billing_reports - INFO - Folder already in list: 31976 +2023-08-23 16:21:23,229 - billing_reports - INFO - Folder already in list: 31915 +2023-08-23 16:21:23,229 - billing_reports - INFO - Folder already in list: 32155 diff --git a/hp-billing-report.ipynb b/hp-billing-report.ipynb index 277d8b4..834789e 100644 --- a/hp-billing-report.ipynb +++ b/hp-billing-report.ipynb @@ -95,92 +95,94 @@ "name": "stderr", "output_type": "stream", "text": [ - "2023-08-16 16:19:34,115 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,117 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,118 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,118 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,119 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,119 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,120 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,121 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,122 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,123 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,124 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,124 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,125 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,126 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,126 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,127 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,128 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,128 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,129 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,129 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,130 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,131 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,131 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,132 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,133 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,134 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,134 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,135 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,135 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,136 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,136 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,137 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,138 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,138 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,139 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,139 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,140 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,140 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,141 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,141 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,142 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,142 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,143 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,144 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,144 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,145 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,145 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,146 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,147 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,149 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,149 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,150 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,151 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,151 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,152 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,152 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,153 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,153 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,154 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,155 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,155 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,156 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,157 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,157 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,158 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,159 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,160 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,160 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,162 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,165 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,165 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,166 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,167 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,168 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,169 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,174 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,175 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,175 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,176 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,176 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,177 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,178 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,178 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,179 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,179 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", - "2023-08-16 16:19:34,180 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n" + "2023-08-23 16:21:22,781 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,783 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,784 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,784 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,785 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,786 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,787 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,787 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,788 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,789 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,789 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,790 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,791 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,791 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,792 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,792 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,793 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,793 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,794 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,794 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,795 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,795 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,796 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,797 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,797 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,798 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,798 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,799 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,799 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,800 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,801 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,801 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,802 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,802 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,803 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,803 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,804 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,804 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,804 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,805 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,805 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,806 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,807 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,807 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,808 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,808 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,809 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,809 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,809 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,810 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,811 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,812 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,813 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,813 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,813 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,814 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,814 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,815 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,816 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,816 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,817 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,817 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,818 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,819 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,819 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,820 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,821 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,821 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,822 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,824 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,825 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,827 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,827 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,828 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,829 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,830 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,831 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,836 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,836 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,837 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,838 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,838 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,839 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,839 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,840 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,841 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,842 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n", + "2023-08-23 16:21:22,844 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n" ] } ], @@ -210,6 +212,9 @@ "# Output to JSON file\n", "foldersTracker = []\n", "vanityMap = {}\n", + "deviceTypes = {}\n", + "for type in lattice.getNodeTypes():\n", + " deviceTypes[type[\"id\"]] = type[\"name\"]\n", "for node in nodes:\n", " if not node[\"uniqueId\"][-6:] in [\":00:00\", \":00:30\"]:\n", " if not node[\"folderId\"] in foldersTracker:\n", @@ -222,7 +227,7 @@ " pfolder = _findItem(foldermap, folder[\"parentFolderId\"])\n", " ppfolder = _findItem(foldermap, pfolder[\"parentFolderId\"])\n", " customer = ppfolder[\"name\"]\n", - " vanityMap[node[\"uniqueId\"]] = {\"deviceName\": deviceName, \"customer\": customer, \"latitude\": latitude, \"longitude\": longitude}\n", + " vanityMap[node[\"uniqueId\"]] = {\"deviceName\": deviceName, \"deviceType\": deviceTypes[node[\"nodeTypeId\"]], \"customer\": customer, \"latitude\": latitude, \"longitude\": longitude}\n", " else:\n", " logger.info(\"Folder does not exist: \" + str(node[\"folderId\"]))\n", " else:\n", @@ -274,24 +279,181 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "mistaway_data = {}\n", + "from shapely.geometry import Point, Polygon\n", + "\n", + "denali_east = Polygon([(31.441289, -102.175343),(31.467676, -101.936571), (31.321496, -101.943604),(31.304714, -102.139878) ])\n", + "jitterbug = []\n", "for key, value in vanityMap.items():\n", - " customer = value[\"customer\"]\n", - " device = value[\"deviceName\"]\n", - " if not device in [\"Melinda 252\"]:\n", - " if customer not in mistaway_data:\n", - " mistaway_data[customer] = {f\"HPSO-1\": {}}\n", - " mistaway_data[customer][\"HPSO-1\"][device] = {\n", - " \"Sales Price\": 75,\n", - " \"Platform Cost\": 10,\n", - " \"Platform\": \"Mistaway\", # \"thingsboard\", \"mistaway\"\n", - " \"Cellular Cost\": 15,\n", - " \"Billing Type\": \"Stand-Alone\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n", - " }\n", + " customer = value[\"customer\"]\n", + " device = value[\"deviceName\"]\n", + " type = value[\"deviceType\"]\n", + " location = Point(value[\"latitude\"], value[\"longitude\"])\n", + " if not device in [\"Melinda 252\"]:\n", + " cellular_cost = 15\n", + " so = \"HPSO-1\"\n", + " price = 75\n", + " billing_type = \"Stand-Alone\"\n", + " if customer not in mistaway_data:\n", + " mistaway_data[customer] = {}\n", + " \n", + " if customer == \"CrownQuest\":\n", + " if device == \"LimeQuest 6 SR 1-1\":\n", + " so = \"LimeQuest SO\"\n", + " price = 75\n", + " billing_type = \"Stand-Alone\"\n", + " elif \"Wilkinson 39\" in device or device in [\"Wilkinson 37 WS 1-9B\", \"Wilkinson 37 WS 1-9B\", \"Free 40 WS 1-2\", \"Free 40 WS 1-4\", \"Free 40 WS 1-1\"]:\n", + " so = \"Wilkinson 39 Field\"\n", + " price = 0\n", + " billing_type = \"AP-bundled\"\n", + " cellular_cost = 0\n", + " if so not in mistaway_data[customer]:\n", + " mistaway_data[customer][so] = {}\n", + " if \"Wilkinson 39 AP\" not in mistaway_data[customer][so]:\n", + " mistaway_data[customer][so][\"Wilkinson 39 AP\"] = {\n", + " \"Sales Price\": 250,\n", + " \"Platform Cost\": 0,\n", + " \"Platform\": \"Mistaway\", # \"thingsboard\", \"mistaway\"\n", + " \"Cellular Cost\": 15,\n", + " \"Billing Type\": \"AP\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n", + " }\n", + " elif \"Wilkinson 37\" in device or device in [\"Wilkinson 33 WS 3-1\", \"Wilkinson 33 WS 4-1\", \"Wilkinson 34 WS 2-10\", \"Wilkinson 34 WS 1-8\"]:\n", + " so = \"Wilkinson 37 Field\"\n", + " price = 0\n", + " billing_type = \"AP-bundled\"\n", + " cellular_cost = 0\n", + " if so not in mistaway_data[customer]:\n", + " mistaway_data[customer][so] = {}\n", + " if \"Wilkinson 37 AP\" not in mistaway_data[customer][so]:\n", + " mistaway_data[customer][so][\"Wilkinson 37 AP\"] = {\n", + " \"Sales Price\": 250,\n", + " \"Platform Cost\": 0,\n", + " \"Platform\": \"Mistaway\", # \"thingsboard\", \"mistaway\"\n", + " \"Cellular Cost\": 15,\n", + " \"Billing Type\": \"AP\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n", + " }\n", + " elif \"Wilkinson 33\" in device or \"Wilkinson 34\" in device or \"Wilkinson 1\" in device or \"Wilkinson 4\" in device:\n", + " so = \"Wilkinson 33-34 Field\"\n", + " price = 0\n", + " billing_type = \"AP-bundled\"\n", + " cellular_cost = 0\n", + " if so not in mistaway_data[customer]:\n", + " mistaway_data[customer][so] = {}\n", + " if \"Wilkinson 33-34 AP\" not in mistaway_data[customer][so]:\n", + " mistaway_data[customer][so][\"Wilkinson 33-34 AP\"] = {\n", + " \"Sales Price\": 250,\n", + " \"Platform Cost\": 0,\n", + " \"Platform\": \"Mistaway\", # \"thingsboard\", \"mistaway\"\n", + " \"Cellular Cost\": 15,\n", + " \"Billing Type\": \"AP\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n", + " }\n", + " elif \"Free 40\" in device or \"Free 32\" in device:\n", + " so = \"Free Field\"\n", + " price = 0\n", + " billing_type = \"AP-bundled\"\n", + " cellular_cost = 0\n", + " if so not in mistaway_data[customer]:\n", + " mistaway_data[customer][so] = {}\n", + " if \"Free AP\" not in mistaway_data[customer][so]:\n", + " mistaway_data[customer][so][\"Free AP\"] = {\n", + " \"Sales Price\": 250,\n", + " \"Platform Cost\": 0,\n", + " \"Platform\": \"Mistaway\", # \"thingsboard\", \"mistaway\"\n", + " \"Cellular Cost\": 15,\n", + " \"Billing Type\": \"AP\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n", + " }\n", + " elif \"LimeQuest 5\" in device or \"LimeQuest 10\" in device:\n", + " so = \"LimeQuest Field\"\n", + " price = 0\n", + " billing_type = \"AP-bundled\"\n", + " cellular_cost = 0\n", + " if so not in mistaway_data[customer]:\n", + " mistaway_data[customer][so] = {}\n", + " if \"LimeQuest AP\" not in mistaway_data[customer][so]:\n", + " mistaway_data[customer][so][\"LimeQuest AP\"] = {\n", + " \"Sales Price\": 250,\n", + " \"Platform Cost\": 0,\n", + " \"Platform\": \"Mistaway\", # \"thingsboard\", \"mistaway\"\n", + " \"Cellular Cost\": 15,\n", + " \"Billing Type\": \"AP\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n", + " }\n", + " elif \"LimeQuest 5\" in device or \"LimeQuest 10\" in device:\n", + " so = \"LimeQuest Field\"\n", + " price = 0\n", + " billing_type = \"AP-bundled\"\n", + " cellular_cost = 0\n", + " if so not in mistaway_data[customer]:\n", + " mistaway_data[customer][so] = {}\n", + " if \"LimeQuest AP\" not in mistaway_data[customer][so]:\n", + " mistaway_data[customer][so][\"LimeQuest AP\"] = {\n", + " \"Sales Price\": 250,\n", + " \"Platform Cost\": 0,\n", + " \"Platform\": \"Mistaway\", # \"thingsboard\", \"mistaway\"\n", + " \"Cellular Cost\": 15,\n", + " \"Billing Type\": \"AP\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n", + " }\n", + " elif \"Horton 23\" in device or \"Horton 34\" in device:\n", + " so = \"Horton Field\"\n", + " price = 0\n", + " billing_type = \"AP-bundled\"\n", + " cellular_cost = 0\n", + " if so not in mistaway_data[customer]:\n", + " mistaway_data[customer][so] = {}\n", + " if \"Horton AP\" not in mistaway_data[customer][so]:\n", + " mistaway_data[customer][so][\"Horton AP\"] = {\n", + " \"Sales Price\": 250,\n", + " \"Platform Cost\": 0,\n", + " \"Platform\": \"Mistaway\", # \"thingsboard\", \"mistaway\"\n", + " \"Cellular Cost\": 15,\n", + " \"Billing Type\": \"AP\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n", + " } \n", + " elif type == \"advvfdipp\" or type == \"ipp\":\n", + " so = \"Santa Rosa\"\n", + " elif type == \"rigpump\":\n", + " so = \"Rig Pump\"\n", + " elif type == \"transferlite\":\n", + " so = \"Transfer\"\n", + " elif customer == \"Patriot Resources\":\n", + " so = \"Patriot Resources\"\n", + " price = 100\n", + " elif customer == \"Keagan Faudree Water\":\n", + " so = \"Keagan Faudree Water\"\n", + " elif customer == \"Summit Petroleum\":\n", + " if location.x >= 31.654963:\n", + " so = \"Banay\"\n", + " price = 75\n", + " elif location.within(denali_east):\n", + " so = \"Denali East\"\n", + " if type == \"dual_flowmeter\":\n", + " price = 75\n", + " elif type == \"plcfreshwater\":\n", + " price = 55\n", + " cellular_cost = 0\n", + " billing_type = \"Networked\"\n", + " else: #if location.within(jitterbug):\n", + " so = \"Jitterbug\"\n", + " if type == \"dual_flowmeter\":\n", + " price = 75\n", + " elif type == \"plcfreshwater\":\n", + " price = 55\n", + " cellular_cost = 0\n", + " billing_type = \"Networked\"\n", + " \n", + " \n", + " if so not in mistaway_data[customer]:\n", + " mistaway_data[customer][so] = {}\n", + "\n", + " mistaway_data[customer][so][device] = {\n", + " \"Sales Price\": price,\n", + " \"Platform Cost\": 10,\n", + " \"Platform\": \"Mistaway\", # \"thingsboard\", \"mistaway\"\n", + " \"Cellular Cost\": cellular_cost,\n", + " \"Billing Type\": billing_type # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n", + " }\n", " \n", " \n", " " @@ -323,7 +485,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -332,22 +494,97 @@ " for c in customers.data:\n", " cname = c.name\n", " cid = c.id.id\n", - " if cname != \"Test Company\":\n", + " if cname not in [\"Test Company\", \"Amerus Safety Solutions\"]:\n", + " #create new company if it doesn't exist\n", " if cname not in thingsboard_data:\n", - " thingsboard_data[cname] = {f\"HPSO-1\": {}}\n", + " thingsboard_data[cname] = {}\n", + " #get devices of a company\n", " devices = rest_client.get_customer_devices(customer_id=cid, page_size=pageSize, page=page)\n", + " #go through each device and store its data in the dict\n", " for device in devices.data:\n", + " cellular_cost = 15\n", + " #fix naming to work with JSON/dict\n", " if '\"' in device.name:\n", " deviceName = device.name.replace('\"', 'in')\n", " else:\n", " deviceName = device.name\n", - " thingsboard_data[cname][\"HPSO-1\"][deviceName] = {\n", - " \"Sales Price\": 75,\n", - " \"Platform Cost\": 0,\n", - " \"Platform\": \"ThingsBoard\", # \"thingsboard\", \"mistaway\"\n", - " \"Cellular Cost\": 15,\n", - " \"Billing Type\": \"Stand-Alone\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n", - " }\n", + " # Sort Device details\n", + " if cname == \"Chuda Resources\":\n", + " so = \"Water Wells\"\n", + " price = 75\n", + " billing_type = \"Stand-Alone\"\n", + " elif cname == \"Henry Petroleum\":\n", + " so = \"Check Meters\"\n", + " price = 50\n", + " billing_type = \"Stand-Alone\"\n", + " elif cname == \"Faskens\":\n", + " if device.type == \"tankalarms\":\n", + " so = \"Tanks\"\n", + " billing_type = \"Stand-Alone\"\n", + " price = 50\n", + " elif device.type in [\"advvfdipp\", \"plcfreshwater\"]:\n", + " so = \"Water Wells\"\n", + " billing_type = \"Stand-Alone\"\n", + " price = 50\n", + " elif device.type == \"plcpond\":\n", + " so = \"Ponds\"\n", + " billing_type = \"Stand-Alone\"\n", + " price = 50\n", + " else:\n", + " so = \"HPSO-1\"\n", + " billing_type = \"Stand-Alone\"\n", + " price = 50\n", + " elif cname == \"Henry Resources\":\n", + " if deviceName == \"Pearl Central\":\n", + " so = \"Henry Resources\"\n", + " price = 300\n", + " billing_type = \"Stand-Alone-WiFi\"\n", + " else:\n", + " so = \"Henry Resources\"\n", + " price = 275\n", + " billing_type = \"Stand-Alone\"\n", + " elif cname == \"ConocoPhillips\":\n", + " if device.type == \"flowmeterskid\":\n", + " so = \"Portable Meter\"\n", + " price = 50\n", + " billing_type = \"Stand-Alone\"\n", + " elif device.type == \"plcfreshwater\":\n", + " so = \"Water Well\"\n", + " price = 50\n", + " cellular_cost = 0\n", + " billing_type = \"Networked\"\n", + " elif device.type == \"advvfdipp\":\n", + " so = \"Santa Rosa\"\n", + " price = 50\n", + " billing_type = \"Stand-Alone\"\n", + " elif device.type == \"Gateway\":\n", + " so = \"AP\"\n", + " price = 0\n", + " billing_type = \"AP-bundled\"\n", + " elif device.type == \"cpdualflowmeter\":\n", + " so = \"Pond/Flowmeter\"\n", + " price = 50\n", + " billing_type = \"Networked\"\n", + " elif cname == \"Saulsbury Ventures\":\n", + " so = \"Saulsbury Ventures\"\n", + " price = 50\n", + " billing_type = \"Stand-Alone\"\n", + " else:\n", + " so = \"HPSO-1\"\n", + " price = 50\n", + " billing_type = \"Stand-Alone\"\n", + " \n", + " #make a new Sales Order if it doesn't exist\n", + " if so not in thingsboard_data[cname]:\n", + " thingsboard_data[cname][so] = {}\n", + " #add device to Sales Order under Company\n", + " thingsboard_data[cname][so][deviceName] = {\n", + " \"Sales Price\": price,\n", + " \"Platform Cost\": 0,\n", + " \"Platform\": \"ThingsBoard\", # \"thingsboard\", \"mistaway\"\n", + " \"Cellular Cost\": cellular_cost,\n", + " \"Billing Type\": billing_type # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n", + " }\n", " return thingsboard_data" ] }, @@ -374,7 +611,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -383,7 +620,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -403,47 +640,36 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'CrownQuest': {'HPSO-1': {'Nail Ranch 37 SR 2-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wrage 21 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wrage 28 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 WS 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 1 WS 1-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 1 WS 1-10B': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 4 WS 1-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 34 WS 10-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CQ Wrage Ranch 32 SR 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 10-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson Ranch 34 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 2 SR 3-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 38 SR 2-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 25 SR 2-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 28 SR 3-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 38 SR 1-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 3 SR 3-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 28 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 28 SR 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Guitar 22 SR 3-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson Ranch 33 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson Ranch 35 SR 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson Ranch 1 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Limequest Transfer Lite': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'S. Wilkinson Transfer Lite': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 2 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton Transfer Lite': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'South Wilkinson Transfer #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson Ranch 37 SR 2-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 WS 1-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 32 WS 2-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 32 WS 3-10C': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 WS 6-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 WS 1-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 WS 1-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 32 WS 3-10A': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 9-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 10-3A': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 10-3B': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 10-1B': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 6-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 32 WS 3-10B': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 9-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 6-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 2-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 8-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 7-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 4-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 5-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 8-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 6-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 6-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 34 WS 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 34 WS 1-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 5-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 5-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 5-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 1-9B': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 1-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 1 WS 9-4B': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'ToolBox South': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 7-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 34 WS 1-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 3-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free Transfer Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 5-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 5-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 6-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 7-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 4-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 8-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 1-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 2-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 10-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 3-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 2-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 1-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 3-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 3-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 5-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 10-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 4-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 2-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson Ranch 39 SR 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 1-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 8-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 1-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 10 WS 3-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wrage 33 SR 3-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'N. Wilkinson Transfer Lite': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 10-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 9-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 1 WS 2-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 ws 10-1A': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 1-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 1 WS 1-10A': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 34 WS 1-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 ws 3-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 6-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 SR 2-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 7-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 12 SR 1-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 6-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 6 SR 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 1 WS 2-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 10-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 2-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 WS 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'ToolBox North': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 10-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 37 SR 3-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 8-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 5-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LLL 6 SR 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 2-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 10-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #11': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #12': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Summit Petroleum': {'HPSO-1': {'Bowling WW 4-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 7-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 5-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Bowling WW 37-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 504': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Florence WW #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Florence WW #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Madelyn Kate #3 WW': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jessica WW #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 107-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 107-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jessica WW #7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Carmanita WW 12-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Carmanita WW 12-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay North Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay South Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay South Inlet': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Carmanita WW 12-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 8-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 8-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 6-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Carmanita WW 12-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Caden WW #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Caden WW #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Caden WW #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Caden WW #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Lisa WW #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Madeline WW #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Caden WW #6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Laurie Gwen WW #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jessica WW #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jessica WW #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jessica WW #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Denali East Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 8-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jessica WW #5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Map Rock Transfer Pump Monitor': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay North Pit Inlet #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay North Pit Outlet #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Yvonne Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Denali Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Cindy #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Cindy #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Cindy #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Lindsey #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Elizabeth 1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Railway 12-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Railway 12-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Elizabeth B1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Elizabeth B2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rhonda 1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Sec 46 #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Cynthia 1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nancy #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nancy #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rhonda Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jitterbug 28-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Reagan #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Aurora 7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Aurora 8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Aurora 9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Aurora 10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Aurora 11': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Aurora 6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RebJean #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri #6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RobJane #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RobJane #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RebJean #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RobJane #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Kelsey #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Stephanie 41 #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Kelsey #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Stephanie 41 #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RobJane #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Mary 43 #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Mary 43 #5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Mary 43 #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Mary 43 #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'KD #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'KD #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'KD #7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'KD #5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Bobbie #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Bobbie #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Elizabeth A1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Patty #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rhonda 2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri Transfer Pump Monitor': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Trumann 1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Trumann 3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Trumann 4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Trumann 5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Trumann 2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Patty #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Kate A1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Kate A2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Kate B1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tessa Lyn': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Patty #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Smith #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Smith #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Dorcus': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Monique #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Monique #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Monique #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Dawn #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Dawn #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Yvonne Transfer Pump 3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Yvonne Transfer Pump 2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Yvonne Transfer Pump 1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Bobbie #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Kelsey Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 5-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 8-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 806 North': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 806 South': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Denali East Inlet': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Lindsey #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Lindsey #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Denali East Transfer Pump Monitor': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Map Rock Transfer Pump Monitor #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Dawn Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Barnett 19-2 WW': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Laney A #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Barnett 24-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nancy Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 6-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW #7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 7-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Penny North': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Penny South': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri Pit Inlet': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Baylee Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Keegan Faudree Water': {'HPSO-1': {'Faudree Frac Pit Pump #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Faudree Frac Pit Pump #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Faudree West Tank Transfer': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Faudree East Transfer': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Henry Resources': {'HPSO-1': {'Melinda 252': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Gwendolyn SWD Transfer Station': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Benners North': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Avery Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Lisa Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RankinBaker SWD': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wynn Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Sadie Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Benners Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Denise Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Emma Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Hollis Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Meredith Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'John J Bush Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Joshua Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Gwendolyn 23': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Noel Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Gwendolyn 24': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Gila S2': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Pearl Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Benedum Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Wishbone Water': {'HPSO-1': {'Wishbone Water #27 SR': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wishbone Water Well #14 SR': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wishbone/SM Booster Station': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Patriot Resources': {'HPSO-1': {'Transfer Addax Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Saulsbury Ventures': {'HPSO-1': {'Power Plant Transfer': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Triple 4in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'InHand-Demo': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Dove Lease Checkmeter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Single 12in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Chuda Resources': {'HPSO-1': {'Chuda Flow Meter #1': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Chuda Flow Meter #4': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Chuda Flow Meter #2': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Chuda Flow Meter #3': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Faskens': {'HPSO-1': {'BV-602': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BZ-201': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AU-3401': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BP Pond': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BL-3201': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BW-72': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AW Battery': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BZ-202': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BN Pond': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BE-71': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CI-401': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BJ-701': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BI-31': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BE-601': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BP-201': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AA-101': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AV-701': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'FB-501': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BQ-41': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BX-101': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BN-2202': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Fee BM Battery': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BP Battery': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BK-1701': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BQ-301': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Valve Controller': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BV-601': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AW-901': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CG-701': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AS-11': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BL-3401': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BE-51': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BW-041': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CG-601': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BM-1501': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BX-901': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CI-501': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AT-101': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BX-902': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AW-3401': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BN-301': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BV Battery': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'S-601': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CF Pond': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BY-501': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BK-801': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CI-1301': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BP-601': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CF-1501': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BV-101': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BJ-101': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AA Pond': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Amerus Safety Solutions': {'HPSO-1': {'Camera Trailer 107': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 200': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 129': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 202': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 206': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 201': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 102': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 110': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 203': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 204': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 116': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 101': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 127': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 109': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 128': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 112': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 114': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 120': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 119': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 103': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 100': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 205': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 105': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 106': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 126': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 111': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 115': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 117': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 122': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 113': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 104': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 108': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 123': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 130': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Henry Petroleum': {'HPSO-1': {'Davis Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Great Western Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Francis Hill Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Foundation Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wess Hill Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Lively Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Glasscock Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Mann Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Test Company': {'HPSO-1': {'HP Test Location 2': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'HP Test Location': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'ConocoPhillips': {'HPSO-1': {'CRMWD': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 42': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 35': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 36': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 41': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 39': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 37': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well B 36': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 45': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 34': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 43': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 46': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 38': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 40': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 44': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Prod Well 27': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 30': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 29': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 31': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 28': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Pond A Gateway': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Headlee 3401 WS in3 Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Purity-B': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'HP Inlet - 10in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 33': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 32': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree Gateway': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'HP Outlet - 8in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Parks Inlet #2 - 10in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Yukon A': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Parks Inlet #1- 10in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Pond A': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Purity-A': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Yukon B': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, '12in Flow Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Parks Outlet - 6in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 22': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 14': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree Pond': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 17': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 26': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 13': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 21': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 20': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 19': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 25': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 15': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 16': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 18': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 23': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}}\n" - ] - } - ], - "source": [ - "print(excel_data)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "#Build report from data" - ] - }, - { - "cell_type": "code", - "execution_count": 25, + "execution_count": 41, "metadata": {}, "outputs": [], "source": [ + "#Build report from data\n", "import xlsxwriter\n", "import pandas as pd\n", "\n", "# Create a new Excel writer object\n", - "with pd.ExcelWriter(\"output.xlsx\", engine=\"xlsxwriter\") as writer:\n", + "with pd.ExcelWriter(f\"Billing-Report-{dt.date(dt.now())}.xlsx\", engine=\"xlsxwriter\") as writer:\n", + " # Formats\n", + " bold_format = writer.book.add_format({'bold': True})\n", + " header_format = writer.book.add_format({'bold': True, 'center_across': True, 'border': True, 'bottom': True})\n", + " currency_format = writer.book.add_format({'num_format': \"[$$-409]#,##0.00\"})\n", + " bold_currency_format = writer.book.add_format({'num_format': \"[$$-409]#,##0.00\", 'bold': True})\n", + " highlight_format = writer.book.add_format({'bg_color': \"yellow\"})\n", + " # Setting up overview sheet\n", + " overview = writer.book.add_worksheet(\"Overview\")\n", + " overview_row = 1\n", + " overview.write(0,0, \"Customer\", header_format)\n", + " overview.write(0,1, \"Revenue\", header_format)\n", + " overview.write(0,2, \"Platform Cost\", header_format)\n", + " overview.write(0,3, \"Cellular Cost\", header_format)\n", + " overview.write(0,4, \"Profit\", header_format)\n", "\n", + " \n", " # Loop through customers\n", " for customer, orders in excel_data.items():\n", - " \n", " rows = []\n", - "\n", + " counts = {}\n", " # Loop through each sales order for the customer\n", " for order, items in orders.items():\n", " for item, details in items.items():\n", @@ -453,21 +679,59 @@ " }\n", " row.update(details)\n", " rows.append(row)\n", - " \n", + " counts[order] = len(items)\n", + " \n", " # Convert the data to a DataFrame\n", " df = pd.DataFrame(rows)\n", " \n", " # Sort by sales order\n", " df = df.sort_values(by=\"Sales Order\")\n", - " \n", + " \n", " # Write to a specific sheet in the Excel file\n", " df.to_excel(writer, sheet_name=customer, index=False)\n", - "\n", " for column in df:\n", " column_length = max(df[column].astype(str).map(len).max(), len(column))\n", " col_idx = df.columns.get_loc(column)\n", - " writer.sheets[customer].set_column(col_idx, col_idx, column_length)\n", - " " + " if col_idx in [2,3,5]:\n", + " writer.sheets[customer].set_column(col_idx, col_idx, column_length, currency_format)\n", + " else:\n", + " writer.sheets[customer].set_column(col_idx, col_idx, column_length)\n", + " \n", + " # Get the dimensions of the dataframe.\n", + " (max_row, max_col) = df.shape\n", + " #Apply highlighting\n", + " writer.sheets[customer].conditional_format(f\"G2:G{max_row+1}\", {\"type\": \"text\", \"criteria\": \"not containing\", \"value\": \"AP-bundled\", \"format\": highlight_format})\n", + "\n", + " #writer.sheets[customer].set_column(2,3,None,currency_format)\n", + " #manually adding extra calculated values\n", + " sales_formula = f\"C2:C{max_row+1}\"\n", + " platform_formula = f\"D2:D{max_row+1}\"\n", + " cellular_formula = f\"F2:F{max_row+1}\"\n", + " profit_formula = f\"=B{max_row+3} - B{max_row+4} - B{max_row+5}\"\n", + " writer.sheets[customer].write(f'A{max_row+3}', \"Revenue\", bold_format)\n", + " writer.sheets[customer].write(f'A{max_row+4}', \"Platform Cost\", bold_format)\n", + " writer.sheets[customer].write(f'A{max_row+5}', \"Cellular Cost\", bold_format)\n", + " writer.sheets[customer].write(f'A{max_row+6}', \"Profit\", bold_format)\n", + " writer.sheets[customer].write(f'B{max_row+3}', '=SUM(' + sales_formula + ')', bold_currency_format)\n", + " writer.sheets[customer].write(f'B{max_row+4}', '=SUM(' + platform_formula + ')', bold_currency_format)\n", + " writer.sheets[customer].write(f'B{max_row+5}', '=SUM(' + cellular_formula + ')', bold_currency_format)\n", + " writer.sheets[customer].write_formula(f'B{max_row+6}', profit_formula, bold_currency_format)\n", + " for ind,order in enumerate(counts):\n", + " writer.sheets[customer].write(f'A{max_row+8+ind}', order)\n", + " writer.sheets[customer].write(f'B{max_row+8+ind}', counts[order])\n", + " overview.write(overview_row,0, customer)\n", + " overview.write(overview_row,1, f\"='{customer}'!B{max_row+3}\")\n", + " overview.write(overview_row,2, f\"='{customer}'!B{max_row+4}\")\n", + " overview.write(overview_row,3, f\"='{customer}'!B{max_row+5}\")\n", + " overview.write(overview_row,4, f\"='{customer}'!B{max_row+6}\")\n", + " overview_row += 1\n", + " overview.write(overview_row,0, \"Total\", bold_format)\n", + " overview.write(overview_row,1, f\"=SUM(B2:B{overview_row})\", bold_currency_format)\n", + " overview.write(overview_row,2, f\"=SUM(C2:C{overview_row})+399\", bold_currency_format)\n", + " overview.write(overview_row,3, f\"=SUM(D2:D{overview_row})\", bold_currency_format)\n", + " overview.write(overview_row,4, f\"=B{overview_row+1} - C{overview_row+1} - D{overview_row+1}\", bold_currency_format)\n", + "\n", + " overview.set_column(0,4, 18)" ] } ], diff --git a/hp-billing-report.py b/hp-billing-report.py new file mode 100644 index 0000000..cb78117 --- /dev/null +++ b/hp-billing-report.py @@ -0,0 +1,534 @@ +# %% +import lattice +import logging +import json + +logger = logging.getLogger('billing_reports') +logger.setLevel(logging.INFO) + +fh = logging.FileHandler('/Users/nico/Documents/Github/hp-billing-report/billing.log') +fh.setLevel(logging.INFO) + +ch = logging.StreamHandler() +ch.setLevel(logging.ERROR) + +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +fh.setFormatter(formatter) +ch.setFormatter(formatter) + +logger.addHandler(fh) +logger.addHandler(ch) + +# %% +#Mistaway data collection +from datetime import datetime as dt + +json_file_output = False +console_output = False + +# %% +nodes = lattice.getNodes() + +# %% +# Find a value for a given key in a given dictionary +def _findItem(obj, key): + if key in obj: return obj[key] + for k, v in obj.items(): + if isinstance(v,dict): + item = _findItem(v, key) + if item is not None: + return item + +# %% +# recursively go through folders to build folder structure +def putFolder(folder, fs): + try: + if not folder["id"] == folder["parentFolderId"]: + parent = _findItem(fs, folder["parentFolderId"]) + parent[folder["id"]] = folder + putFolder(parent,fs) + else: + fs[folder["id"]] = folder + return fs + except Exception as e: + logger.error(f"Exception in putFolder: {e}") + + +# %% +# Go through every folder and build a proper folder structure +# Output to JSON file +folders = lattice.getFolders() +foldermap = {} +#print(json.dumps(folders, indent=4)) +for folder in folders: + logger.debug(folder) + putFolder(folder,foldermap) +if console_output: + print(json.dumps(foldermap, indent=4)) +if json_file_output: + with open("./folderMap" + str(dt.date(dt.now())) +".json", "w") as f: + json.dump(foldermap, f, indent=4) + +# %% +# Go through every node and collect unique device id (MAC) +# Output to JSON file +foldersTracker = [] +vanityMap = {} +deviceTypes = {} +for type in lattice.getNodeTypes(): + deviceTypes[type["id"]] = type["name"] +for node in nodes: + if not node["uniqueId"][-6:] in [":00:00", ":00:30"]: + if not node["folderId"] in foldersTracker: + foldersTracker.append(node["folderId"]) + folder = _findItem(foldermap, node["folderId"]) + if folder: + deviceName = folder["name"] + latitude = folder["location"]["lat"] + longitude = folder["location"]["lng"] + pfolder = _findItem(foldermap, folder["parentFolderId"]) + ppfolder = _findItem(foldermap, pfolder["parentFolderId"]) + customer = ppfolder["name"] + vanityMap[node["uniqueId"]] = {"deviceName": deviceName, "deviceType": deviceTypes[node["nodeTypeId"]], "customer": customer, "latitude": latitude, "longitude": longitude} + else: + logger.info("Folder does not exist: " + str(node["folderId"])) + else: + logger.info("Folder already in list: " + str(node["folderId"])) +#print(vanityMap) +if json_file_output: + with open("./deviceMap" + str(dt.date(dt.now())) +".json", "w") as f: + json.dump(vanityMap, f, indent=4) + + +# %% +""" +Data to be collected: + { + "customer":{ + "sales_order": { + "billable_item_1": { + "sales_price": 75, + "platform_cost": 10, + "platform": "thingsboard", # "thingsboard", "mistaway" + "cellular_cost": 15, + "billing_type": "stand-alone" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + }, + "billable_item_2:{...}, + ... + }, + "sales_order_2":{...} + }, + "customer_2":{...} + } +""" + +# %% +mistaway_data = {} +from shapely.geometry import Point, Polygon + +denali_east = Polygon([(31.441289, -102.175343),(31.467676, -101.936571), (31.321496, -101.943604),(31.304714, -102.139878) ]) +jitterbug = [] +for key, value in vanityMap.items(): + customer = value["customer"] + device = value["deviceName"] + type = value["deviceType"] + location = Point(value["latitude"], value["longitude"]) + if not device in ["Melinda 252"]: + cellular_cost = 15 + so = "HPSO-1" + price = 75 + billing_type = "Stand-Alone" + if customer not in mistaway_data: + mistaway_data[customer] = {} + + if customer == "CrownQuest": + if device == "LimeQuest 6 SR 1-1": + so = "LimeQuest SO" + price = 75 + billing_type = "Stand-Alone" + elif "Wilkinson 39" in device or device in ["Wilkinson 37 WS 1-9B", "Wilkinson 37 WS 1-9B", "Free 40 WS 1-2", "Free 40 WS 1-4", "Free 40 WS 1-1"]: + so = "Wilkinson 39 Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "Wilkinson 39 AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["Wilkinson 39 AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif "Wilkinson 37" in device or device in ["Wilkinson 33 WS 3-1", "Wilkinson 33 WS 4-1", "Wilkinson 34 WS 2-10", "Wilkinson 34 WS 1-8"]: + so = "Wilkinson 37 Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "Wilkinson 37 AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["Wilkinson 37 AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif "Wilkinson 33" in device or "Wilkinson 34" in device or "Wilkinson 1" in device or "Wilkinson 4" in device: + so = "Wilkinson 33-34 Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "Wilkinson 33-34 AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["Wilkinson 33-34 AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif "Free 40" in device or "Free 32" in device: + so = "Free Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "Free AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["Free AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif "LimeQuest 5" in device or "LimeQuest 10" in device: + so = "LimeQuest Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "LimeQuest AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["LimeQuest AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif "LimeQuest 5" in device or "LimeQuest 10" in device: + so = "LimeQuest Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "LimeQuest AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["LimeQuest AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif "Horton 23" in device or "Horton 34" in device: + so = "Horton Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "Horton AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["Horton AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif type == "advvfdipp" or type == "ipp": + so = "Santa Rosa" + elif type == "rigpump": + so = "Rig Pump" + elif type == "transferlite": + so = "Transfer" + elif customer == "Patriot Resources": + so = "Patriot Resources" + price = 100 + elif customer == "Keagan Faudree Water": + so = "Keagan Faudree Water" + elif customer == "Summit Petroleum": + if location.x >= 31.654963: + so = "Banay" + price = 75 + elif location.within(denali_east): + so = "Denali East" + if type == "dual_flowmeter": + price = 75 + elif type == "plcfreshwater": + price = 55 + cellular_cost = 0 + billing_type = "Networked" + else: #if location.within(jitterbug): + so = "Jitterbug" + if type == "dual_flowmeter": + price = 75 + elif type == "plcfreshwater": + price = 55 + cellular_cost = 0 + billing_type = "Networked" + + + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + + mistaway_data[customer][so][device] = { + "Sales Price": price, + "Platform Cost": 10, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": cellular_cost, + "Billing Type": billing_type # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + + + + +# %% +#ThingsBoard data collection +from tb_rest_client.rest_client_ce import * +from tb_rest_client.rest import ApiException + +# %% +# ThingsBoard REST API URL +url = "https://hp.henrypump.cloud" +# Default Tenant Administrator credentials +username = "henry.pump.automation@gmail.com" +password = "Henry Pump @ 2022" + +# %% +def getDevices(rest_client, customers, page=0, pageSize=500): + thingsboard_data = {} + for c in customers.data: + cname = c.name + cid = c.id.id + if cname not in ["Test Company", "Amerus Safety Solutions"]: + #create new company if it doesn't exist + if cname not in thingsboard_data: + thingsboard_data[cname] = {} + #get devices of a company + devices = rest_client.get_customer_devices(customer_id=cid, page_size=pageSize, page=page) + #go through each device and store its data in the dict + for device in devices.data: + cellular_cost = 15 + #fix naming to work with JSON/dict + if '"' in device.name: + deviceName = device.name.replace('"', 'in') + else: + deviceName = device.name + # Sort Device details + if cname == "Chuda Resources": + so = "Water Wells" + price = 75 + billing_type = "Stand-Alone" + elif cname == "Henry Petroleum": + so = "Check Meters" + price = 50 + billing_type = "Stand-Alone" + elif cname == "Faskens": + if device.type == "tankalarms": + so = "Tanks" + billing_type = "Stand-Alone" + price = 50 + elif device.type in ["advvfdipp", "plcfreshwater"]: + so = "Water Wells" + billing_type = "Stand-Alone" + price = 50 + elif device.type == "plcpond": + so = "Ponds" + billing_type = "Stand-Alone" + price = 50 + else: + so = "HPSO-1" + billing_type = "Stand-Alone" + price = 50 + elif cname == "Henry Resources": + if deviceName == "Pearl Central": + so = "Henry Resources" + price = 300 + billing_type = "Stand-Alone-WiFi" + else: + so = "Henry Resources" + price = 275 + billing_type = "Stand-Alone" + elif cname == "ConocoPhillips": + if device.type == "flowmeterskid": + so = "Portable Meter" + price = 50 + billing_type = "Stand-Alone" + elif device.type == "plcfreshwater": + so = "Water Well" + price = 50 + cellular_cost = 0 + billing_type = "Networked" + elif device.type == "advvfdipp": + so = "Santa Rosa" + price = 50 + billing_type = "Stand-Alone" + elif device.type == "Gateway": + so = "AP" + price = 0 + billing_type = "AP-bundled" + elif cname == "Saulsbury Ventures": + so = "Saulsbury Ventures" + price = 50 + billing_type = "Stand-Alone" + else: + so = "HPSO-1" + price = 50 + billing_type = "Stand-Alone" + + #make a new Sales Order if it doesn't exist + if so not in thingsboard_data[cname]: + thingsboard_data[cname][so] = {} + #add device to Sales Order under Company + thingsboard_data[cname][so][deviceName] = { + "Sales Price": price, + "Platform Cost": 0, + "Platform": "ThingsBoard", # "thingsboard", "mistaway" + "Cellular Cost": cellular_cost, + "Billing Type": billing_type # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + return thingsboard_data + +# %% +def getThingsBoardData(url, username, password): + # Creating the REST client object with context manager to get auto token refresh + with RestClientCE(base_url=url) as rest_client: + try: + # Auth with credentials + rest_client.login(username=username, password=password) + # Get customers > get devices under a target customer > get keys for devices > get data for devices + customers = rest_client.get_customers(page_size="100", page="0") + thingsboard_data = getDevices(rest_client=rest_client, customers=customers) + return thingsboard_data + except ApiException as e: + logger.error(e) + return False + +# %% +thingsboard_data = getThingsBoardData(url, username,password) + +# %% +#Mixing data from Mistaway and ThingsBoard +excel_data = {} +excel_data.update(mistaway_data) +for customer in thingsboard_data.keys(): + if customer in excel_data: + for so in thingsboard_data[customer].keys(): + if so in excel_data[customer]: + excel_data[customer][so].update(thingsboard_data[customer][so]) + else: + excel_data[customer].update(thingsboard_data[customer]) + else: + excel_data[customer] = thingsboard_data[customer] + + +# %% +#Build report from data +import xlsxwriter +import pandas as pd + +def highlight_rows(row): + """Function to apply row highlighting for non 'AP-bundled' billing types.""" + return 'background-color: yellow' if row['Billing Type'] != 'AP-bundled' else '' + + +# Create a new Excel writer object +with pd.ExcelWriter(f"Billing-Report-{dt.date(dt.now())}.xlsx", engine="xlsxwriter") as writer: + overview = writer.book.add_worksheet("Overview") + overview_row = 1 + overview.write(0,1, "Revenue") + overview.write(0,2, "Platform Cost") + overview.write(0,3, "Cellular Cost") + overview.write(0,4, "Profit") + # Loop through customers + for customer, orders in excel_data.items(): + + rows = [] + counts = {} + # Loop through each sales order for the customer + for order, items in orders.items(): + for item, details in items.items(): + """ + details_copy = details.copy() + details_copy["item"] = item + details_copy["order"] = order if item.endswith("1") else "" # Display order only once per customer + rows.append(details_copy) + """ + row = { + "Sales Order": order, + "Location": item + } + row.update(details) + rows.append(row) + counts[order] = len(items) + + # Convert the data to a DataFrame + df = pd.DataFrame(rows) + + # Sort by sales order + df = df.sort_values(by="Sales Order") + #df = df.sort_values(by=["order", "item"]) + + + # Apply the highlighting + df_style = df.style.applymap(lambda x: highlight_rows({'Billing Type': x}) if isinstance(x, str) else "", subset=['Billing Type']) + + # Write to a specific sheet in the Excel file + #df.to_excel(writer, sheet_name=customer, index=False) + df_style.to_excel(writer, sheet_name=customer, index=False, header=True) + for column in df: + column_length = max(df[column].astype(str).map(len).max(), len(column)) + col_idx = df.columns.get_loc(column) + writer.sheets[customer].set_column(col_idx, col_idx, column_length) + # Get the dimensions of the dataframe. + (max_row, max_col) = df.shape + #manually adding extra calculated values + sales_formula = f"C2:C{max_row+1}" + platform_formula = f"D2:D{max_row+1}" + cellular_formula = f"F2:F{max_row+1}" + profit_formula = f"=B{max_row+3} - B{max_row+4} - B{max_row+5}" + writer.sheets[customer].write(f'A{max_row+3}', "Revenue") + writer.sheets[customer].write(f'A{max_row+4}', "Platform Cost") + writer.sheets[customer].write(f'A{max_row+5}', "Cellular Cost") + writer.sheets[customer].write(f'A{max_row+6}', "Profit") + writer.sheets[customer].write(f'B{max_row+3}', '=SUM(' + sales_formula + ')', ) + writer.sheets[customer].write(f'B{max_row+4}', '=SUM(' + platform_formula + ')', ) + writer.sheets[customer].write(f'B{max_row+5}', '=SUM(' + cellular_formula + ')', ) + writer.sheets[customer].write_formula(f'B{max_row+6}', profit_formula, ) + for ind,order in enumerate(counts): + writer.sheets[customer].write(f'A{max_row+8+ind}', order) + writer.sheets[customer].write(f'B{max_row+8+ind}', counts[order]) + overview.write(overview_row,0, customer) + overview.write(overview_row,1, f"='{customer}'!B{max_row+3}") + overview.write(overview_row,2, f"='{customer}'!B{max_row+4}") + overview.write(overview_row,3, f"='{customer}'!B{max_row+5}") + overview.write(overview_row,4, f"='{customer}'!B{max_row+6}") + overview_row += 1 + overview.write(overview_row,0, "Total") + overview.write(overview_row,1, f"=SUM(B2:B{overview_row})") + overview.write(overview_row,2, f"=SUM(C2:C{overview_row})+399") + overview.write(overview_row,3, f"=SUM(D2:D{overview_row})") + overview.write(overview_row,4, f"=B{overview_row+1} - C{overview_row+1} - D{overview_row+1}") + + overview.set_column(0,4, 18) + +# %% + + + diff --git a/mistawayData.py b/mistawayData.py new file mode 100644 index 0000000..53cd836 --- /dev/null +++ b/mistawayData.py @@ -0,0 +1,265 @@ +#Mistaway data collection +import lattice, logging +from shapely.geometry import Point, Polygon +from datetime import datetime as dt + +logger = logging.getLogger('billing_reports') +logger.setLevel(logging.INFO) +ch = logging.StreamHandler() +ch.setLevel(logging.INFO) +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +ch.setFormatter(formatter) +logger.addHandler(ch) + +# Find a value for a given key in a given dictionary +def _findItem(obj, key): + if key in obj: return obj[key] + for k, v in obj.items(): + if isinstance(v,dict): + item = _findItem(v, key) + if item is not None: + return item + + +# recursively go through folders to build folder structure +def putFolder(folder, fs): + try: + if not folder["id"] == folder["parentFolderId"]: + parent = _findItem(fs, folder["parentFolderId"]) + parent[folder["id"]] = folder + putFolder(parent,fs) + else: + fs[folder["id"]] = folder + return fs + except Exception as e: + logger.debug(f"Exception in putFolder: {e}") + +def getMistAwayData(): + # Go through every folder and build a proper folder structure + # Output to JSON file + nodes = lattice.getNodes() + folders = lattice.getFolders() + foldermap = {} + for folder in folders: + logger.debug(folder) + putFolder(folder,foldermap) + + # Go through every node and collect unique device id (MAC) + # Output to JSON file + foldersTracker = [] + vanityMap = {} + deviceTypes = {} + for type in lattice.getNodeTypes(): + deviceTypes[type["id"]] = type["name"] + for node in nodes: + if not node["uniqueId"][-6:] in [":00:00", ":00:30"]: + if not node["folderId"] in foldersTracker: + foldersTracker.append(node["folderId"]) + folder = _findItem(foldermap, node["folderId"]) + if folder: + deviceName = folder["name"] + latitude = folder["location"]["lat"] + longitude = folder["location"]["lng"] + pfolder = _findItem(foldermap, folder["parentFolderId"]) + ppfolder = _findItem(foldermap, pfolder["parentFolderId"]) + customer = ppfolder["name"] + vanityMap[node["uniqueId"]] = {"deviceName": deviceName, "deviceType": deviceTypes[node["nodeTypeId"]], "customer": customer, "latitude": latitude, "longitude": longitude} + else: + logger.info("Folder does not exist: " + str(node["folderId"])) + else: + logger.info("Folder already in list: " + str(node["folderId"])) + + """ + Data to be collected: + { + "customer":{ + "sales_order": { + "billable_item_1": { + "sales_price": 75, + "platform_cost": 10, + "platform": "thingsboard", # "thingsboard", "mistaway" + "cellular_cost": 15, + "billing_type": "stand-alone" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + }, + "billable_item_2:{...}, + ... + }, + "sales_order_2":{...} + }, + "customer_2":{...} + } + """ + + mistaway_data = {} + + denali_east = Polygon([(31.441289, -102.175343),(31.467676, -101.936571), (31.321496, -101.943604),(31.304714, -102.139878) ]) + for _, value in vanityMap.items(): + customer = value["customer"] + device = value["deviceName"] + type = value["deviceType"] + location = Point(value["latitude"], value["longitude"]) + if not device in ["Melinda 252"]: + cellular_cost = 15 + so = "HPSO-1" + price = 75 + billing_type = "Stand-Alone" + if customer not in mistaway_data: + mistaway_data[customer] = {} + + if customer == "CrownQuest": + if device == "LimeQuest 6 SR 1-1": + so = "LimeQuest SO" + price = 75 + billing_type = "Stand-Alone" + elif "Wilkinson 39" in device or device in ["Wilkinson 37 WS 1-9B", "Wilkinson 37 WS 1-9B", "Free 40 WS 1-2", "Free 40 WS 1-4", "Free 40 WS 1-1"]: + so = "Wilkinson 39 Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "Wilkinson 39 AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["Wilkinson 39 AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif "Wilkinson 37" in device or device in ["Wilkinson 33 WS 3-1", "Wilkinson 33 WS 4-1", "Wilkinson 34 WS 2-10", "Wilkinson 34 WS 1-8"]: + so = "Wilkinson 37 Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "Wilkinson 37 AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["Wilkinson 37 AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif "Wilkinson 33" in device or "Wilkinson 34" in device or "Wilkinson 1" in device or "Wilkinson 4" in device: + so = "Wilkinson 33-34 Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "Wilkinson 33-34 AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["Wilkinson 33-34 AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif "Free 40" in device or "Free 32" in device: + so = "Free Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "Free AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["Free AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif "LimeQuest 5" in device or "LimeQuest 10" in device: + so = "LimeQuest Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "LimeQuest AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["LimeQuest AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif "LimeQuest 5" in device or "LimeQuest 10" in device: + so = "LimeQuest Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "LimeQuest AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["LimeQuest AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif "Horton 23" in device or "Horton 34" in device: + so = "Horton Field" + price = 0 + billing_type = "AP-bundled" + cellular_cost = 0 + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + if "Horton AP" not in mistaway_data[customer][so]: + mistaway_data[customer][so]["Horton AP"] = { + "Sales Price": 250, + "Platform Cost": 0, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": 15, + "Billing Type": "AP" # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + elif type == "advvfdipp" or type == "ipp": + so = "Santa Rosa" + elif type == "rigpump": + so = "Rig Pump" + elif type == "transferlite": + so = "Transfer" + elif customer == "Patriot Resources": + so = "Patriot Resources" + price = 100 + elif customer == "Keagan Faudree Water": + so = "Keagan Faudree Water" + elif customer == "Summit Petroleum": + if location.x >= 31.654963: + so = "Banay" + price = 75 + elif location.within(denali_east): + so = "Denali East" + if type == "dual_flowmeter": + price = 75 + elif type == "plcfreshwater": + price = 55 + cellular_cost = 0 + billing_type = "Networked" + else: #if location.within(jitterbug): + so = "Jitterbug" + if type == "dual_flowmeter": + price = 75 + elif type == "plcfreshwater": + price = 55 + cellular_cost = 0 + billing_type = "Networked" + + + if so not in mistaway_data[customer]: + mistaway_data[customer][so] = {} + + mistaway_data[customer][so][device] = { + "Sales Price": price, + "Platform Cost": 10, + "Platform": "Mistaway", # "thingsboard", "mistaway" + "Cellular Cost": cellular_cost, + "Billing Type": billing_type # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + return mistaway_data + + + \ No newline at end of file diff --git a/output.xlsx b/output.xlsx deleted file mode 100644 index 2285f65..0000000 Binary files a/output.xlsx and /dev/null differ diff --git a/reportBuilder.py b/reportBuilder.py new file mode 100644 index 0000000..8e84477 --- /dev/null +++ b/reportBuilder.py @@ -0,0 +1,155 @@ +#Build report from data +import pandas as pd +from datetime import datetime as dt +import os, boto3 +from thingsBoardData import getThingsBoardData +from mistawayData import getMistAwayData +import logging + +from email.mime.multipart import MIMEMultipart +from email import encoders +from email.mime.base import MIMEBase + +logger = logging.getLogger('billing_reports') +logger.setLevel(logging.INFO) +ch = logging.StreamHandler() +ch.setLevel(logging.INFO) +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +ch.setFormatter(formatter) +logger.addHandler(ch) + +ses = boto3.client('ses') +EMAIL_FROM_ADDRESS = "alerts@henry-pump.com" +email_to = [ + "nmelone@henry-pump.com" + ] + +#Get Mistaway Data +mistaway_data = getMistAwayData() +#Get ThingsBoard Data +thingsboard_data = getThingsBoardData(os.environ["url"], os.environ["username"],os.environ["password"]) +#Mixing data from Mistaway and ThingsBoard +excel_data = {} +excel_data.update(mistaway_data) +for customer in thingsboard_data.keys(): + if customer in excel_data: + for so in thingsboard_data[customer].keys(): + if so in excel_data[customer]: + excel_data[customer][so].update(thingsboard_data[customer][so]) + else: + excel_data[customer].update(thingsboard_data[customer]) + else: + excel_data[customer] = thingsboard_data[customer] + +def reportBuilder(event, context): + # Create a new Excel writer object + with pd.ExcelWriter(f"/tmp/Remote-Monitoring-Report-{dt.date(dt.now())}.xlsx", engine="xlsxwriter") as writer: + # Formats + bold_format = writer.book.add_format({'bold': True}) + header_format = writer.book.add_format({'bold': True, 'center_across': True, 'border': True, 'bottom': True}) + currency_format = writer.book.add_format({'num_format': "[$$-409]#,##0.00"}) + bold_currency_format = writer.book.add_format({'num_format': "[$$-409]#,##0.00", 'bold': True}) + highlight_format = writer.book.add_format({'bg_color': "yellow"}) + # Setting up overview sheet + overview = writer.book.add_worksheet("Overview") + overview_row = 1 + overview.write(0,0, "Customer", header_format) + overview.write(0,1, "Revenue", header_format) + overview.write(0,2, "Platform Cost", header_format) + overview.write(0,3, "Cellular Cost", header_format) + overview.write(0,4, "Profit", header_format) + + + # Loop through customers + for customer, orders in excel_data.items(): + rows = [] + counts = {} + # Loop through each sales order for the customer + for order, items in orders.items(): + for item, details in items.items(): + row = { + "Sales Order": order, + "Location": item + } + row.update(details) + rows.append(row) + counts[order] = len(items) + + # Convert the data to a DataFrame + df = pd.DataFrame(rows) + + # Sort by sales order + df = df.sort_values(by="Sales Order") + + # Write to a specific sheet in the Excel file + df.to_excel(writer, sheet_name=customer, index=False) + for column in df: + column_length = max(df[column].astype(str).map(len).max(), len(column)) + col_idx = df.columns.get_loc(column) + if col_idx in [2,3,5]: + writer.sheets[customer].set_column(col_idx, col_idx, column_length, currency_format) + else: + writer.sheets[customer].set_column(col_idx, col_idx, column_length) + + # Get the dimensions of the dataframe. + (max_row, max_col) = df.shape + #Apply highlighting + writer.sheets[customer].conditional_format(f"G2:G{max_row+1}", {"type": "text", "criteria": "not containing", "value": "AP-bundled", "format": highlight_format}) + + #writer.sheets[customer].set_column(2,3,None,currency_format) + #manually adding extra calculated values + sales_formula = f"C2:C{max_row+1}" + platform_formula = f"D2:D{max_row+1}" + cellular_formula = f"F2:F{max_row+1}" + profit_formula = f"=B{max_row+3} - B{max_row+4} - B{max_row+5}" + writer.sheets[customer].write(f'A{max_row+3}', "Revenue", bold_format) + writer.sheets[customer].write(f'A{max_row+4}', "Platform Cost", bold_format) + writer.sheets[customer].write(f'A{max_row+5}', "Cellular Cost", bold_format) + writer.sheets[customer].write(f'A{max_row+6}', "Profit", bold_format) + writer.sheets[customer].write(f'B{max_row+3}', '=SUM(' + sales_formula + ')', bold_currency_format) + writer.sheets[customer].write(f'B{max_row+4}', '=SUM(' + platform_formula + ')', bold_currency_format) + writer.sheets[customer].write(f'B{max_row+5}', '=SUM(' + cellular_formula + ')', bold_currency_format) + writer.sheets[customer].write_formula(f'B{max_row+6}', profit_formula, bold_currency_format) + for ind,order in enumerate(counts): + writer.sheets[customer].write(f'A{max_row+8+ind}', order) + writer.sheets[customer].write(f'B{max_row+8+ind}', counts[order]) + overview.write(overview_row,0, customer) + overview.write(overview_row,1, f"='{customer}'!B{max_row+3}") + overview.write(overview_row,2, f"='{customer}'!B{max_row+4}") + overview.write(overview_row,3, f"='{customer}'!B{max_row+5}") + overview.write(overview_row,4, f"='{customer}'!B{max_row+6}") + overview_row += 1 + overview.write(overview_row,0, "Total", bold_format) + overview.write(overview_row,1, f"=SUM(B2:B{overview_row})", bold_currency_format) + overview.write(overview_row,2, f"=SUM(C2:C{overview_row})+399", bold_currency_format) + overview.write(overview_row,3, f"=SUM(D2:D{overview_row})", bold_currency_format) + overview.write(overview_row,4, f"=B{overview_row+1} - C{overview_row+1} - D{overview_row+1}", bold_currency_format) + + overview.set_column(0,4, 18) + + send_email() + +def send_email(): + attachment = MIMEBase('application', 'octet-stream') + attachment.set_payload(open(f"/tmp/Remote-Monitoring-Report-{dt.date(dt.now())}.xlsx", "rb").read()) + encoders.encode_base64(attachment) + msg = MIMEMultipart('alternative') + msg['Subject'] = f"Remote Monitoring Report - {dt.date(dt.now())}" + msg['From'] = "alerts@henry-pump.com" + msg['To'] = ", ".join(email_to) + + filename = f"Remote-Monitoring-{dt.date(dt.now())} .xlsx" + attachment.add_header('Content-Disposition', 'attachment', filename=filename) + + msg.attach(attachment) + response = ses.send_raw_email( + Source=EMAIL_FROM_ADDRESS, + Destinations=email_to, + RawMessage={ + 'Data': msg.as_string() + }, + FromArn='', + SourceArn='', + ReturnPathArn='' + ) + return response diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..686da03 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +click==8.1.3 +pandas==1.4.2 +Requests==2.31.0 +Shapely==2.0.1 +tb_rest_client==3.5 +xlsxwriter==3.1.2 diff --git a/thingsBoardData.py b/thingsBoardData.py new file mode 100644 index 0000000..9f489e4 --- /dev/null +++ b/thingsBoardData.py @@ -0,0 +1,130 @@ +#ThingsBoard data collection +from tb_rest_client.rest_client_ce import * +from tb_rest_client.rest import ApiException +import logging + +logger = logging.getLogger('billing_reports') +logger.setLevel(logging.INFO) +ch = logging.StreamHandler() +ch.setLevel(logging.INFO) +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +ch.setFormatter(formatter) +logger.addHandler(ch) + +def getDevices(rest_client, customers, page=0, pageSize=500): + thingsboard_data = {} + for c in customers.data: + cname = c.name + cid = c.id.id + if cname not in ["Test Company", "Amerus Safety Solutions"]: + #create new company if it doesn't exist + if cname not in thingsboard_data: + thingsboard_data[cname] = {} + #get devices of a company + devices = rest_client.get_customer_devices(customer_id=cid, page_size=pageSize, page=page) + #go through each device and store its data in the dict + for device in devices.data: + cellular_cost = 15 + #fix naming to work with JSON/dict + if '"' in device.name: + deviceName = device.name.replace('"', 'in') + else: + deviceName = device.name + # Sort Device details + if cname == "Chuda Resources": + so = "Water Wells" + price = 75 + billing_type = "Stand-Alone" + elif cname == "Henry Petroleum": + so = "Check Meters" + price = 50 + billing_type = "Stand-Alone" + elif cname == "Faskens": + if device.type == "tankalarms": + so = "Tanks" + billing_type = "Stand-Alone" + price = 50 + elif device.type in ["advvfdipp", "plcfreshwater"]: + so = "Water Wells" + billing_type = "Stand-Alone" + price = 50 + elif device.type == "plcpond": + so = "Ponds" + billing_type = "Stand-Alone" + price = 50 + else: + so = "HPSO-1" + billing_type = "Stand-Alone" + price = 50 + elif cname == "Henry Resources": + if deviceName == "Pearl Central": + so = "Henry Resources" + price = 300 + billing_type = "Stand-Alone-WiFi" + else: + so = "Henry Resources" + price = 275 + billing_type = "Stand-Alone" + elif cname == "ConocoPhillips": + if device.type == "flowmeterskid": + so = "Portable Meter" + price = 50 + billing_type = "Stand-Alone" + elif device.type == "plcfreshwater": + so = "Water Well" + price = 50 + cellular_cost = 0 + billing_type = "Networked" + elif device.type == "advvfdipp": + so = "Santa Rosa" + price = 50 + billing_type = "Stand-Alone" + elif device.type == "Gateway": + so = "AP" + price = 0 + billing_type = "AP-bundled" + elif device.type == "cpdualflowmeter": + so = "Pond/Flowmeter" + price = 50 + billing_type = "Networked" + elif cname == "Saulsbury Ventures": + so = "Saulsbury Ventures" + price = 50 + billing_type = "Stand-Alone" + else: + so = "HPSO-1" + price = 50 + billing_type = "Stand-Alone" + + #make a new Sales Order if it doesn't exist + if so not in thingsboard_data[cname]: + thingsboard_data[cname][so] = {} + #add device to Sales Order under Company + thingsboard_data[cname][so][deviceName] = { + "Sales Price": price, + "Platform Cost": 0, + "Platform": "ThingsBoard", # "thingsboard", "mistaway" + "Cellular Cost": cellular_cost, + "Billing Type": billing_type # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi" + } + return thingsboard_data + + +def getThingsBoardData(url, username, password): + # Creating the REST client object with context manager to get auto token refresh + with RestClientCE(base_url=url) as rest_client: + try: + # Auth with credentials + rest_client.login(username=username, password=password) + # Get customers > get devices under a target customer > get keys for devices > get data for devices + customers = rest_client.get_customers(page_size="100", page="0") + thingsboard_data = getDevices(rest_client=rest_client, customers=customers) + return thingsboard_data + except ApiException as e: + logger.error(e) + return False + + + + +