diff --git a/reports.json b/reports.json index 1228caa..f2ec85e 100644 --- a/reports.json +++ b/reports.json @@ -5,12 +5,12 @@ "language":"python", "reports":[ { - "name":"IM all Transactions report", - "readme_file":"reports/all_transactions/readme.md", - "template":"reports/all_transactions/template.xlsx", + "name":"TS Subscriptions", + "readme_file":"reports/TS_products/Readme.md", + "template":"reports/TS_products/template.xlsx", "start_row":2, "start_col":1, - "entrypoint":"reports.all_transactions.entrypoint.generate", + "entrypoint":"reports.TS_products.entrypoint.generate", "audience":[ "provider" ], @@ -22,313 +22,15 @@ "name":"Report period", "description":"Provide the time period to create the report", "required":true - } - ] - }, - { - "name":"IM all Microsoft Transactions report", - "readme_file":"reports/ms_products/readme.md", - "report_spec":"2", - "renderers":[ - { - "id":"xlsx", - "type":"xlsx", - "default":false, - "description":"Export data in Microsoft Excel 2020 format.", - "template":"reports/ms_products/template.xlsx", - "args":{ - "start_row":2, - "start_col":1 - } - }, - { - "id":"json", - "type":"json", - "default":false, - "description":"Export data as JSON" - }, - { - "id":"csv", - "type":"csv", - "default":true, - "description":"Export data as CSV" - } - ], - "entrypoint":"reports.ms_products.entrypoint.generate", - "audience":[ - "provider" - ], - "parameters":[ - { - "id":"date", - "type":"date_range", - "name":"Report period", - "description":"Provide the time period to create the report", - "required":true - } - ] - }, - { - "name":"Billing requests report for syndication partners", - "readme_file":"reports/billing_requests/Readme.md", - "template":"reports/billing_requests/template.xlsx", - "start_row":2, - "start_col":1, - "entrypoint":"reports.billing_requests.entrypoint.generate", - "audience":[ - "provider" - ], - "report_spec":"1", - "parameters":[ - { - "id":"date", - "type":"date_range", - "name":"Report period", - "description":"Provide the time period to create the report", - "required":true - }, - { - "id":"product", - "type":"product", - "name":"Product list", - "required":true, - "description":"Select the products you want to include in report" - } - ] - }, - { - "name":"Billing requests report for syndication partners at line item level", - "readme_file":"reports/billing_requests_line_item/Readme.md", - "template":"reports/billing_requests_line_item/template.xlsx", - "start_row":2, - "start_col":1, - "entrypoint":"reports.billing_requests_line_item.entrypoint.generate", - "audience":[ - "provider", - "vendor" - ], - "report_spec":"1", - "parameters":[ - { - "id":"date", - "type":"date_range", - "name":"Report period", - "description":"Provide the time period to create the report", - "required":true - }, - { - "id":"product", - "type":"product", - "name":"Product list", - "required":true, - "description":"Select the products you want to include in report" - } - ] - }, - { - "name":"AWS Assets report", - "readme_file":"reports/aws_products/Readme.md", - "template":"reports/aws_products/template.xlsx", - "start_row":2, - "start_col":1, - "entrypoint":"reports.aws_products.entrypoint.generate", - "audience":[ - "provider" - ], - "report_spec":"1", - "parameters":[ - { - "id":"date", - "type":"date_range", - "name":"Assets range", - "description":"Provide the time range of assets creation", - "required":true }, { "id":"products", "type":"product", "name":"Product list", "required":true, - "description":"Select the products that represents AWS, ALL option is not valid" - } - ] - }, - { - "name":"SonicWall Subscriptions list report", - "readme_file":"reports/sonicwall_subscriptions/Readme.md", - "entrypoint":"reports.sonicwall_subscriptions.entrypoint.generate", - "audience":[ - "provider", - "vendor" - ], - "report_spec":"2", - "renderers":[ - { - "id":"xlsx", - "type":"xlsx", - "default":true, - "description":"Export data in Microsoft Excel 2020 format.", - "template":"reports/sonicwall_subscriptions/templates/xlsx/template.xlsx", - "args":{ - "start_row":2, - "start_col":1 - } - }, - { - "id":"json", - "type":"json", - "default":false, - "description":"Export data as JSON" - }, - { - "id":"csv", - "type":"csv", - "default":false, - "description":"Export data as CSV" + "description":"Select the products that represents TS, ALL option is not valid" } - ], - "parameters":[ - { - "id":"date", - "type":"date_range", - "name":"Subscription Creation", - "description":"Optional: in case that is desired, report can be limited to subscriptions created in the selected period of time" - }, - { - "id":"product", - "type":"product", - "name":"Product list", - "required":true, - "description":"Select the products that represents SonicWall product that you want to include in report" - }, - { - "id":"mkp", - "type":"marketplace", - "name":"Marketplaces", - "required":true, - "description":"Select the marketplaces you want to include in report" - }, - { - "id":"period", - "type":"checkbox", - "name":"Billing Periods", - "required":true, - "description":"Specify the billing periods to include in report", - "choices":[ - { - "value":"monthly", - "label":"1 Month" - }, - { - "value":"yearly", - "label":"1 Year" - }, - { - "value":"years_2", - "label":"2 Years" - }, - { - "value":"years_3", - "label":"3 Years" - }, - { - "value":"years_4", - "label":"4 Years" - }, - { - "value":"years_5", - "label":"5 Years" - } - ] - }, - { - "id":"status", - "type":"checkbox", - "name":"Subscription status", - "required":true, - "description":"Specify the subscription status to include in report", - "choices":[ - { - "value":"active", - "label":"Active" - }, - { - "value":"processing", - "label":"Processing" - }, - { - "value":"suspended", - "label":"Suspended" - }, - { - "value":"terminating", - "label":"Terminating" - }, - { - "value":"terminated", - "label":"Terminated" - } - ] - } - ] - }, - { - "name":"Open Usage Files report", - "readme_file":"reports/usage_files_status/Readme.md", - "entrypoint":"reports.usage_files_status.entrypoint.generate", - "audience":[ - "provider", - "vendor" - ], - "report_spec":"2", - "renderers":[ - { - "id":"xlsx", - "type":"xlsx", - "default":true, - "description":"Export data in Microsoft Excel 2020 format.", - "template":"reports/usage_files_status/templates/xlsx/template.xlsx", - "args":{ - "start_row":2, - "start_col":1 - } - }, - { - "id":"json", - "type":"json", - "default":false, - "description":"Export data as JSON" - }, - { - "id":"csv", - "type":"csv", - "default":false, - "description":"Export data as CSV" - } - ], - "parameters":[ - - ] - }, - { - "name":"Syndication products for Dragon tool", - "readme_file":"reports/im_syndication_products_availability/Readme.md", - "entrypoint":"reports.im_syndication_products_availability.entrypoint.generate", - "audience":[ - "provider" - ], - "report_spec":"2", - "renderers":[ - { - "id":"json", - "type":"json", - "default":true, - "description":"Export data as JSON" - } - ], - "parameters":[ - ] } ] -} \ No newline at end of file +} diff --git a/reports/TS_products/Readme.md b/reports/TS_products/Readme.md new file mode 100644 index 0000000..f851819 --- /dev/null +++ b/reports/TS_products/Readme.md @@ -0,0 +1,3 @@ +# TS Report + +This report provides a list of assets for TS product and generates a report with specific information diff --git a/reports/all_transactions/__init__.py b/reports/TS_products/__init__.py similarity index 100% rename from reports/all_transactions/__init__.py rename to reports/TS_products/__init__.py diff --git a/reports/TS_products/entrypoint.py b/reports/TS_products/entrypoint.py new file mode 100644 index 0000000..906e7bf --- /dev/null +++ b/reports/TS_products/entrypoint.py @@ -0,0 +1,33 @@ +from connect.client import R +from reports.utils import ( + convert_to_datetime, + get_asset_parameter, + get_value, +) + + + + +def generate(client, parameters, progress_callback): + subscriptions_rql = R() + + if parameters.get("date"): + subscriptions_rql &= R().events.created.at.ge(parameters['date']['after']) + subscriptions_rql &= R().events.created.at.le(parameters['date']['before']) + subscriptions_rql &= R().product.id.oneof(parameters['products']['choices']) + subscriptions_rql &= R().status.ne('draft') + subscriptions = client.assets.filter(subscriptions_rql) + total_subscriptions = subscriptions.count() + progress = 0 + for subscription in subscriptions: + yield ( + subscription['id'], + subscription.get('external_id', "-"), + subscription['status'], + subscription['marketplace']['name'], + subscription['product']['id'], + convert_to_datetime(subscription['events']['created']['at']), + get_asset_parameter(subscription, "vendor_subscription_id") + ) + progress += 1 + progress_callback(progress, total_subscriptions) diff --git a/reports/aws_products/template.xlsx b/reports/TS_products/template.xlsx similarity index 100% rename from reports/aws_products/template.xlsx rename to reports/TS_products/template.xlsx diff --git a/reports/all_transactions/entrypoint.py b/reports/all_transactions/entrypoint.py deleted file mode 100644 index ee8243f..0000000 --- a/reports/all_transactions/entrypoint.py +++ /dev/null @@ -1,294 +0,0 @@ -from cnct import R -from reports.utils import ( - convert_to_datetime, - Progress, - delta, - get_parameter, - get_ta_parameter, -) -from concurrent import futures - -PRODUCTS_TO_SKIP = [ - "CN-165-840-738", - "PRD-410-648-782", - "PRD-351-327-555", -] - - -def generate(client, parameters, progress_callback): - subscriptions_rql = R() - if parameters.get("date"): - subscriptions_rql &= R().events.created.at.ge(parameters['date']['after']) - subscriptions_rql &= R().events.created.at.le(parameters['date']['before']) - subscriptions_rql &= R().status.eq("approved") - subscriptions_rql &= R().type.eq("vendor") - for product in PRODUCTS_TO_SKIP: - subscriptions_rql &= R().asset.product.id.ne(product) - - subscriptions = ( - client.ns('subscriptions') - .collection('requests') - .filter(subscriptions_rql) - .order_by("-events.created.at") - ) - total_subscriptions = subscriptions.count() - - request_types = ["purchase", "change", "cancel"] - requests_rql = R() - if parameters.get("date"): - requests_rql &= R().created.ge(parameters['date']['after']) - requests_rql &= R().created.le(parameters['date']['before']) - requests_rql &= R().status.eq("approved") - requests_rql &= R().asset.connection.type.eq('production') - for product in PRODUCTS_TO_SKIP: - requests_rql &= R().asset.product.id.ne(product) - requests_rql &= R().type.oneof(request_types) - requests = client.requests.filter(requests_rql).order_by("-created") - - total_requests = requests.count() - - progress = Progress(progress_callback, total_subscriptions + total_requests) - - ex = futures.ThreadPoolExecutor( - max_workers=6, - ) - - wait_for = [] - for request in requests: - wait_for.append( - ex.submit( - get_request_record, - client, - request, - progress, - ) - ) - progress.increment() - - for future in futures.as_completed(wait_for): - results = future.result() - for result in results: - yield result - - wait_for = [] - for subscription in subscriptions: - wait_for.append( - ex.submit( - get_subscription_record, - client, - subscription, - progress, - ) - ) - - for future in futures.as_completed(wait_for): - results = future.result() - for result in results: - yield result - - -def get_request_record(client, request, progress): - param_values = get_product_specifics(request, client) - output = [] - for item in request["asset"]["items"]: - try: - if item["quantity"] == "0" and item["old_quantity"] == "0": - continue - output.append( - [ - request["type"].capitalize(), - request["id"], - request["asset"]["product"]["id"], - request["asset"]["product"]["name"], - request["asset"]["connection"]["vendor"]['id'], - request["asset"]["connection"]["vendor"]["name"], - convert_to_datetime(request["created"]), - convert_to_datetime(request["asset"]["events"]["created"]["at"]), - request["asset"]["id"], - request["asset"]["status"], - request["asset"]["external_id"], - request["asset"]["tiers"]["customer"]["name"], - ( - request["asset"]["tiers"]["customer"]["external_id"] - if "external_id" in request["asset"]["tiers"]["customer"] - else request["asset"]["tiers"]["customer"]["external_uid"] - ), - request["asset"]["tiers"]["customer"]["contact_info"]["country"], - request["asset"]["tiers"]["tier1"]["name"], - ( - request["asset"]["tiers"]["tier1"]["external_id"] - if "external_id" in request["asset"]["tiers"]["tier1"] - else request["asset"]["tiers"]["tier1"]["external_uid"] - ), - request["asset"]["tiers"]["tier1"]["contact_info"]["country"], - ( - request["asset"]["tiers"]["tier2"]["name"] - if "name" in request["asset"]["tiers"]["tier2"] - else "-" - ), - ( - request["asset"]["tiers"]["tier2"]["external_id"] - if "external_id" in request["asset"]["tiers"]["tier2"] - else "-" - ), - ( - request["asset"]["tiers"]["tier2"]["contact_info"]["country"] - if request["asset"]["tiers"]["tier2"] - and "country" in request["asset"]["tiers"]["tier2"]["contact_info"] - else "-" - ), - item["global_id"], - item["mpn"], - item["display_name"], - item.get("period", item.get("item_type")), - item["old_quantity"], - item["quantity"], - delta(item["old_quantity"], item["quantity"]), - request["asset"]["connection"]["provider"]["id"], - request["asset"]["connection"]["provider"]["name"], - request["asset"]["marketplace"]["id"], - request["asset"]["marketplace"]["name"], - request["asset"]["contract"].get("type", "distribution").capitalize(), - param_values["microsoft_domain"], - param_values["subscription_id"], - param_values["ms_customer_id"], - param_values["microsoft_order_id"], - param_values["microsoft_plan_subscription_id"], - param_values["microsoft_tier1_mpn"], - param_values["awsAccountEmail"], - param_values["awsAccountName"], - param_values["awsOrderedSupportLevel"], - param_values["awsAccountId"], - ] - ) - except Exception: - pass - progress.increment() - return output - - -def get_subscription_record(client, subscription, progress): - param_values = get_product_specifics(subscription, client) - output = [] - try: - for item in subscription["items"]: - output.append( - [ - subscription["type"].capitalize() + " Billing", - subscription["id"], - subscription["asset"]["product"]["id"], - subscription["asset"]["product"]["name"], - subscription["asset"]["connection"]["vendor"]['id'], - subscription["asset"]["connection"]["vendor"]["name"], - convert_to_datetime(subscription["events"]["created"]["at"]), - convert_to_datetime(subscription["asset"]["events"]["created"]["at"]), - subscription["asset"]["id"], - subscription["asset"]["status"], - subscription["asset"]["external_id"], - subscription["asset"]["tiers"]["customer"]["name"], - ( - subscription["asset"]["tiers"]["customer"]["external_id"] - if "external_id" in subscription["asset"]["tiers"]["customer"] - else subscription["asset"]["tiers"]["customer"]["external_uid"] - ), - subscription["asset"]["tiers"]["customer"]["contact_info"]["country"], - subscription["asset"]["tiers"]["tier1"]["name"], - ( - subscription["asset"]["tiers"]["tier1"]["external_id"] - if "external_id" in subscription["asset"]["tiers"]["tier1"] - else subscription["asset"]["tiers"]["tier1"]["external_uid"] - ), - subscription["asset"]["tiers"]["tier1"]["contact_info"]["country"], - ( - subscription["asset"]["tiers"]["tier2"]["name"] - if "tier2" in subscription["asset"]["tiers"] - else "-" - ), - ( - subscription["asset"]["tiers"]["tier2"]["external_id"] - if "tier2" in subscription["asset"]["tiers"] - else "-" - ), - ( - subscription["asset"]["tiers"]["tier2"]["contact_info"]["country"] - if "tier2" in subscription["asset"]["tiers"] - else "-" - ), - item["global_id"], - item["mpn"], - item["display_name"], - item.get("period", item.get("item_type")), - 0, - ( - "unlimited" if item["quantity"] == -1 else item["quantity"] - ), - ( - "unlimited" if item["quantity"] == -1 else item["quantity"] - ), - subscription["asset"]["connection"]["provider"]["id"], - subscription["asset"]["connection"]["provider"]["name"], - subscription["asset"]["marketplace"]["id"], - subscription["asset"]["marketplace"]["name"], - ( - "Syndication" - if "CRU" in subscription["asset"]["contract"]["id"] - else "Distribution" - ), - param_values["microsoft_domain"], - param_values["subscription_id"], - param_values["ms_customer_id"], - param_values["microsoft_order_id"], - param_values["microsoft_plan_subscription_id"], - param_values["microsoft_tier1_mpn"], - param_values["awsAccountEmail"], - param_values["awsAccountName"], - param_values["awsOrderedSupportLevel"], - param_values["awsAccountId"], - ] - ) - except Exception: - pass - progress.increment() - return output - - -def get_product_specifics(request, client): - values = { - "microsoft_domain": "-", - "subscription_id": "-", - "ms_customer_id": "-", - "microsoft_order_id": "-", - "microsoft_plan_subscription_id": "-", - "microsoft_tier1_mpn": "-", - "awsAccountEmail": "-", - "awsAccountName": "-", - "awsOrderedSupportLevel": "-", - "awsAccountId": "-", - } - if request["asset"]["connection"]["vendor"]["id"] == "VA-888-104": - values["microsoft_domain"] = get_parameter(request, "microsoft_domain") - sub_id = get_parameter(request, "subscription_id") - if sub_id == "-": - sub_id = get_parameter(request, "microsoft_subscription_id") - values["subscription_id"] = sub_id - cust_id = get_parameter(request, "ms_customer_id") - if cust_id == "-": - cust_id = get_parameter(request, "customer_id") - values["ms_customer_id"] = cust_id - order_id = get_parameter(request, "microsoft_order_id") - if order_id == "-": - order_id = get_parameter(request, "csp_order_id") - values["microsoft_plan_subscription_id"] = get_parameter( - request, - "microsoft_plan_subscription_id", - ) - values["microsoft_order_id"] = order_id - values["microsoft_tier1_mpn"] = get_ta_parameter(request, "tier1", "tier1_mpn", client) - elif request["asset"]["connection"]["vendor"]["id"] == "VA-919-258": - values["awsAccountEmail"] = get_parameter(request, "awsAccountEmail") - values["awsAccountName"] = get_parameter(request, "awsAccountName") - values["awsOrderedSupportLevel"] = get_parameter( - request, "awsOrderedSupportLevel" - ) - values["awsAccountId"] = get_parameter(request, "awsAccountId") - return values diff --git a/reports/all_transactions/readme.md b/reports/all_transactions/readme.md deleted file mode 100644 index b3f37a9..0000000 --- a/reports/all_transactions/readme.md +++ /dev/null @@ -1,7 +0,0 @@ -# All transactions report - -This report provides an overview of all requests and billing requests for a given range of dates. -Report includes: - * All syndicated and direct transactions - * AWS Product specific data - * Microsoft products specific data \ No newline at end of file diff --git a/reports/all_transactions/template.xlsx b/reports/all_transactions/template.xlsx deleted file mode 100644 index 235284b..0000000 Binary files a/reports/all_transactions/template.xlsx and /dev/null differ diff --git a/reports/aws_products/Readme.md b/reports/aws_products/Readme.md deleted file mode 100644 index 183dca6..0000000 --- a/reports/aws_products/Readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# AWS Report - -This report provides a list of assets for AWS product and generates a report with AWS specific information \ No newline at end of file diff --git a/reports/aws_products/__init__.py b/reports/aws_products/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/reports/aws_products/entrypoint.py b/reports/aws_products/entrypoint.py deleted file mode 100644 index 37aaf5e..0000000 --- a/reports/aws_products/entrypoint.py +++ /dev/null @@ -1,89 +0,0 @@ -from cnct import R -from reports.utils import ( - convert_to_datetime, - get_asset_parameter, - get_value, -) - -awsmpn = {} - - -def get_aws_mpn(client, account, product): - if awsmpn.get(account): - return awsmpn.get(account) - rql_filter = R() - rql_filter &= R().product.id.eq(product) - rql_filter &= R().account.id.eq(account) - tc = client.ns('tier').configs.filter(rql_filter).first() - if tc: - for param in tc['params']: - if param['id'] == 'awsApnId': - awsmpn['account'] = param.get('value', '-') - return param.get('value', '-') - return '-' - - -def warm_up_tcs(client, products): - rql_filter = R() - rql_filter &= R().product.id.oneof(products) - tcs = client.ns('tier').configs.filter(rql_filter).all() - for tc in tcs: - if not awsmpn.get(f'{tc["account"]["id"]}_{tc["product"]["id"]}'): - for param in tc['params']: - if param['id'] == 'awsApnId': - awsmpn[f'{tc["account"]["id"]}_{tc["product"]["id"]}'] = param.get('value', '-') - - -def get_awsmpn(account, product): - return awsmpn.get(f'{account}_{product}', '-') - - -def generate(client, parameters, progress_callback): - warm_up_tcs(client, parameters['products']['choices']) - subscriptions_rql = R() - if not parameters.get("products") or len(parameters['products']['choices']) < 1: - raise RuntimeError("AWS products was not selected") - if parameters.get("date"): - subscriptions_rql &= R().events.created.at.ge(parameters['date']['after']) - subscriptions_rql &= R().events.created.at.le(parameters['date']['before']) - subscriptions_rql &= R().product.id.oneof(parameters['products']['choices']) - subscriptions_rql &= R().status.ne('draft') - subscriptions = client.assets.filter(subscriptions_rql) - total_subscriptions = subscriptions.count() - progress = 0 - for subscription in subscriptions: - yield ( - subscription['id'], - subscription.get('external_id', "-"), - subscription['status'], - subscription['marketplace']['name'], - subscription['product']['id'], - convert_to_datetime(subscription['events']['created']['at']), - get_asset_parameter(subscription, "awsAccountId"), - get_asset_parameter(subscription, "awsAccountEmail"), - get_value(subscription['tiers'], "customer", "external_id"), - get_value(subscription['tiers'], "customer", "name"), - get_value(subscription['tiers']["customer"], "contact_info", "address_line1"), - get_value(subscription['tiers']["customer"], "contact_info", "address_line2"), - get_value(subscription['tiers']["customer"], "contact_info", "city"), - get_value(subscription['tiers']["customer"], "contact_info", "state"), - get_value(subscription['tiers']["customer"], "contact_info", "postal_code"), - get_value(subscription['tiers']["customer"], "contact_info", "country"), - get_value(subscription['tiers']["customer"]["contact_info"], "contact", "email"), - get_asset_parameter(subscription, "isGovernmentEntity"), - get_asset_parameter(subscription, "useAccountFor"), - get_asset_parameter(subscription, "orderMode"), - get_value(subscription['tiers'], "tier1", "external_id"), - get_value(subscription['tiers'], "tier1", "name"), - get_value(subscription['tiers']["tier1"], "contact_info", "address_line1"), - get_value(subscription['tiers']["tier1"], "contact_info", "address_line2"), - get_value(subscription['tiers']["tier1"], "contact_info", "city"), - get_value(subscription['tiers']["tier1"], "contact_info", "state"), - get_value(subscription['tiers']["tier1"], "contact_info", "postal_code"), - get_value(subscription['tiers']["tier1"], "contact_info", "country"), - get_value(subscription['tiers']["tier1"]["contact_info"], "contact", "email"), - # get_aws_mpn(client, get_value(subscription['tiers'], "tier1", 'id'), subscription['product']['id']) - get_awsmpn(get_value(subscription['tiers'], "tier1", 'id'), subscription['product']['id']) - ) - progress += 1 - progress_callback(progress, total_subscriptions) diff --git a/reports/billing_requests/Readme.md b/reports/billing_requests/Readme.md deleted file mode 100644 index fb69323..0000000 --- a/reports/billing_requests/Readme.md +++ /dev/null @@ -1,6 +0,0 @@ -# Billing Requests Report -This report provides a view of all billing transactions generated by syndication partners, in other words, NOT by Ingram Micro Cloud - -Report accepts to limit the output by: -* List of products -* List of marketplaces \ No newline at end of file diff --git a/reports/billing_requests/__init__.py b/reports/billing_requests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/reports/billing_requests/entrypoint.py b/reports/billing_requests/entrypoint.py deleted file mode 100644 index 851fb04..0000000 --- a/reports/billing_requests/entrypoint.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2021, CloudBlue -# All rights reserved. -# - -from connect.client import R - -from reports.utils import convert_to_datetime, get_basic_value, get_value - - -def generate(client, parameters, progress_callback): - requests = _get_requests(client, parameters) - - progress = 0 - total = requests.count() - - for request in requests: - connection = request['asset']['connection'] - yield ( - request['id'], - convert_to_datetime(request['period']['from']), - convert_to_datetime(request['period']['to']), - get_basic_value(request['period'], 'delta'), - get_basic_value(request['period'], 'uom'), - get_value(request['asset']['tiers'], 'customer', 'id'), - get_value(request['asset']['tiers'], 'customer', 'name'), - get_value(request['asset']['tiers'], 'customer', 'external_id'), - get_value(request['asset']['tiers'], 'tier1', 'id'), - get_value(request['asset']['tiers'], 'tier1', 'name'), - get_value(request['asset']['tiers'], 'tier1', 'external_id'), - get_value(request['asset']['tiers'], 'tier2', 'id'), - get_value(request['asset']['tiers'], 'tier2', 'name'), - get_value(request['asset']['tiers'], 'tier2', 'external_id'), - get_value(request['asset']['connection'], 'provider', 'id'), - get_value(request['asset']['connection'], 'provider', 'name'), - get_value(request['asset']['connection'], 'vendor', 'id'), - get_value(request['asset']['connection'], 'vendor', 'name'), - get_value(request['asset'], 'product', 'id'), - get_value(request['asset'], 'product', 'name'), - get_value(request, 'asset', 'id'), - get_value(request, 'asset', 'external_id'), - get_value(request, 'asset', 'status'), - get_value(request['asset'], 'connection', 'type'), - get_value(connection, 'hub', 'id') if 'hub' in connection else '', - get_value(connection, 'hub', 'name') if 'hub' in connection else '', - ) - progress += 1 - progress_callback(progress, total) - - -def _get_requests(client, parameters): - query = R() - query &= R().created.ge(parameters['date']['after']) - query &= R().created.le(parameters['date']['before']) - query &= R().asset.connection.provider.id.ne('PA-239-689') - - if parameters.get('product') and parameters['product']['all'] is False: - query &= R().asset.product.id.oneof(parameters['product']['choices']) - if parameters.get('mkp') and parameters['mkp']['all'] is False: - query &= R().asset.marketplace.id.oneof(parameters['mkp']['choices']) - if parameters.get('hub') and parameters['hub']['all'] is False: - query &= R().asset.connection.hub.id.oneof(parameters['hub']['choices']) - - return client.ns('subscriptions').requests.filter(query) diff --git a/reports/billing_requests/template.xlsx b/reports/billing_requests/template.xlsx deleted file mode 100644 index 02f0954..0000000 Binary files a/reports/billing_requests/template.xlsx and /dev/null differ diff --git a/reports/billing_requests_line_item/Readme.md b/reports/billing_requests_line_item/Readme.md deleted file mode 100644 index cf60b89..0000000 --- a/reports/billing_requests_line_item/Readme.md +++ /dev/null @@ -1,7 +0,0 @@ -# Billing Requests Report at line item level -This report provides a view of all billing transactions generated for a given period of time -The generated report will provide a row for each item on the billing request and will include vendor billing requests and provider ones if any. -Report accepts to limit the output by: -* List of products -* List of marketplaces -* List of hubs \ No newline at end of file diff --git a/reports/billing_requests_line_item/__init__.py b/reports/billing_requests_line_item/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/reports/billing_requests_line_item/entrypoint.py b/reports/billing_requests_line_item/entrypoint.py deleted file mode 100644 index 52d1907..0000000 --- a/reports/billing_requests_line_item/entrypoint.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2021, CloudBlue -# All rights reserved. -# - -from connect.client import R - -from reports.utils import convert_to_datetime, get_basic_value, get_value - - -def generate(client, parameters, progress_callback): - requests = _get_requests(client, parameters) - - progress = 0 - total = requests.count() - - for request in requests: - connection = request['asset']['connection'] - for item in request['items']: - yield ( - request['id'], - convert_to_datetime(request['period']['from']), - convert_to_datetime(request['period']['to']), - get_basic_value(request['period'], 'delta'), - get_basic_value(request['period'], 'uom'), - get_basic_value(item['billing'], 'cycle_number'), - get_basic_value(item, 'global_id'), - get_basic_value(item, 'display_name'), - get_basic_value(item, 'item_type'), - get_basic_value(item, 'type'), - get_basic_value(item, 'mpn'), - get_basic_value(item, 'period'), - get_basic_value(item, 'quantity'), - get_value(request['asset']['tiers'], 'customer', 'id'), - get_value(request['asset']['tiers'], 'customer', 'name'), - get_value(request['asset']['tiers'], 'customer', 'external_id'), - get_value(request['asset']['tiers'], 'tier1', 'id'), - get_value(request['asset']['tiers'], 'tier1', 'name'), - get_value(request['asset']['tiers'], 'tier1', 'external_id'), - get_value(request['asset']['tiers'], 'tier2', 'id'), - get_value(request['asset']['tiers'], 'tier2', 'name'), - get_value(request['asset']['tiers'], 'tier2', 'external_id'), - get_value(request['asset']['connection'], 'provider', 'id'), - get_value(request['asset']['connection'], 'provider', 'name'), - get_value(request['asset']['connection'], 'vendor', 'id'), - get_value(request['asset']['connection'], 'vendor', 'name'), - get_value(request['asset'], 'product', 'id'), - get_value(request['asset'], 'product', 'name'), - get_value(request, 'asset', 'id'), - get_value(request, 'asset', 'external_id'), - get_value(request, 'asset', 'status'), - get_value(request['asset'], 'connection', 'type'), - get_value(connection, 'hub', 'id') if 'hub' in connection else '', - get_value(connection, 'hub', 'name') if 'hub' in connection else '', - ) - progress += 1 - progress_callback(progress, total) - - -def _get_requests(client, parameters): - query = R() - query &= R().created.ge(parameters['date']['after']) - query &= R().created.le(parameters['date']['before']) - query &= R().asset.connection.provider.id.ne('PA-239-689') - - if parameters.get('product') and parameters['product']['all'] is False: - query &= R().asset.product.id.oneof(parameters['product']['choices']) - if parameters.get('mkp') and parameters['mkp']['all'] is False: - query &= R().asset.marketplace.id.oneof(parameters['mkp']['choices']) - if parameters.get('hub') and parameters['hub']['all'] is False: - query &= R().asset.connection.hub.id.oneof(parameters['hub']['choices']) - - return client.ns('subscriptions').requests.filter(query) diff --git a/reports/billing_requests_line_item/template.xlsx b/reports/billing_requests_line_item/template.xlsx deleted file mode 100644 index 48e479e..0000000 Binary files a/reports/billing_requests_line_item/template.xlsx and /dev/null differ diff --git a/reports/im_syndication_products_availability/Readme.md b/reports/im_syndication_products_availability/Readme.md deleted file mode 100644 index 43136c4..0000000 --- a/reports/im_syndication_products_availability/Readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Syndication products list for dragon - -This report provides a json report to populate dragon tool \ No newline at end of file diff --git a/reports/im_syndication_products_availability/__init__.py b/reports/im_syndication_products_availability/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/reports/im_syndication_products_availability/entrypoint.py b/reports/im_syndication_products_availability/entrypoint.py deleted file mode 100644 index 7517429..0000000 --- a/reports/im_syndication_products_availability/entrypoint.py +++ /dev/null @@ -1,41 +0,0 @@ -from connect.client import R - -def generate( - client=None, - parameters=None, - progress_callback=None, - renderer_type=None, - extra_context_callback=None, -): - syndication_group = 'PRG-5440-3996' - products=client.ns( - 'catalog' - ).collection( - 'groups' - )[syndication_group].products.all().order_by('name') - total_products = products.count() - progress = 0 - for prod in products: - product = client.products[prod['id']].get() - output = { - 'id': product['id'], - 'name': product['name'], - 'vendor_id': product['owner']['id'], - 'vendor_name': product['owner']['name'] - } - rql = R() - rql &= R().product.id.eq(product['id']) - rql &= R().status.eq('listed') - listings = client.listings.filter(rql).all() - marketplaces = [] - for listing in listings: - marketplaces.append( - { - 'id': listing['contract']['marketplace']['id'], - 'name': listing['contract']['marketplace']['name'] - } - ) - output['marketplaces'] = marketplaces - yield output - progress += 1 - progress_callback(progress, total_products) diff --git a/reports/ms_products/__init__.py b/reports/ms_products/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/reports/ms_products/entrypoint.py b/reports/ms_products/entrypoint.py deleted file mode 100644 index 0de7af2..0000000 --- a/reports/ms_products/entrypoint.py +++ /dev/null @@ -1,357 +0,0 @@ -from cnct import R -from reports.utils import ( - convert_to_datetime, - convert_to_datetime_subscription, - Progress, - delta, - get_parameter, - get_ta_parameter, -) -from concurrent import futures - - -HEADERS = ( - 'Request Type', 'Request ID', 'Product ID', 'Product Name', 'Vendor ID', 'Vendor Name', - 'Request Created At', 'Subscription Created At', 'Subscription ID', 'Subscription Status', - 'Subscription External ID', 'Subscription Customer', 'Customer external id', - 'Customer Country', 'Tier 1 Company name', 'Tier 1 External Id', 'Tier 1 Country location', - 'Tier 2 Company name', 'Tier 2 External Id', 'Tier 2 Country location', 'Item ID', 'Item MPN', - 'Item Description', 'Item Period', 'Item Old Quantity', 'Item Quantity', 'Item delta', - 'Provider ID', 'Provider Name', 'Source MKP', 'MKP Name', 'Contract Type', - 'Microsoft Tier1 Domain', 'Microsoft Subscription ID', 'Microsoft Customer ID', - 'Microsoft Order ID', 'Microsoft Subscription Plan', 'Microsoft Tier1 MPN', -) - -TC_CACHE = {} - -PRODUCTS = [ - 'PRD-814-505-018', - 'PRD-561-716-033', - 'PRD-275-843-418', - 'PRD-812-485-361', - 'PRD-587-782-348', - 'PRD-102-273-313', - 'PRD-376-475-231', - 'PRD-108-220-568', - 'PRD-757-861-019', - 'PRD-546-033-870', - 'PRD-245-602-328', - 'PRD-721-371-117', - 'PRD-813-681-506', - 'PRD-612-640-519', - 'PRD-812-360-509' - ] - -def generate( - client=None, - parameters=None, - progress_callback=None, - renderer_type=None, - extra_context_callback=None, -): - init_tc_cache() - #limit = client.default_limit - client.default_limit = 1000 - # populate_ta_cache(parameters, client) - #client.default_limit = limit - subscriptions_rql = R() - - if parameters.get("date"): - subscriptions_rql &= R().events.created.at.ge(parameters['date']['after']) - subscriptions_rql &= R().events.created.at.le(parameters['date']['before']) - subscriptions_rql &= R().status.eq("approved") - subscriptions_rql &= R().type.eq("vendor") - if parameters.get('mkp') and parameters['mkp']['all'] is False: - subscriptions_rql &= R().asset.marketplace.id.oneof(parameters['mkp']['choices']) - subscriptions_rql &= R().asset.product.id.oneof(PRODUCTS) - - subscriptions = ( - client.ns('subscriptions') - .collection('requests') - .filter(subscriptions_rql) - .order_by("-events.created.at") - ) - total_subscriptions = subscriptions.count() - - request_types = ["purchase", "change", "cancel"] - requests_rql = R() - if parameters.get("date"): - requests_rql &= R().created.ge(parameters['date']['after']) - requests_rql &= R().created.le(parameters['date']['before']) - requests_rql &= R().status.eq("approved") - requests_rql &= R().asset.connection.type.eq('production') - requests_rql &= R().asset.product.id.oneof(PRODUCTS) - if parameters.get('mkp') and parameters['mkp']['all'] is False: - requests_rql &= R().asset.marketplace.id.oneof(parameters['mkp']['choices']) - requests_rql &= R().type.oneof(request_types) - requests = client.requests.filter(requests_rql) - - total_requests = requests.count() - total_progress = total_subscriptions + total_requests - progress = Progress(progress_callback, total_progress) - - ex = futures.ThreadPoolExecutor() - - if renderer_type == 'csv': - yield HEADERS - - - wait_for = [] - for request in requests: - wait_for.append( - ex.submit( - get_request_record, - client, - request, - progress, - ) - ) - progress.increment() - - for future in futures.as_completed(wait_for): - results = future.result() - for result in results: - if renderer_type == 'json': - yield { - HEADERS[idx].replace(' ', '_').lower(): value - for idx, value in enumerate(result) - } - else: - yield result - - wait_for = [] - for subscription in subscriptions: - wait_for.append( - ex.submit( - get_subscription_record, - client, - subscription, - progress, - ) - ) - progress.increment() - - for future in futures.as_completed(wait_for): - results = future.result() - for result in results: - if renderer_type == 'json': - yield { - HEADERS[idx].replace(' ', '_').lower(): value - for idx, value in enumerate(result) - } - else: - yield result - - -def get_request_record(client, request, progress): - param_values = get_product_specifics(request, client) - output = [] - for item in request["asset"]["items"]: - try: - if item["quantity"] == "0" and item["old_quantity"] == "0": - continue - output.append( - [ - request["type"].capitalize(), - request["id"], - request["asset"]["product"]["id"], - request["asset"]["product"]["name"], - request["asset"]["connection"]["vendor"]['id'], - request["asset"]["connection"]["vendor"]["name"], - convert_to_datetime(request["created"]), - convert_to_datetime(request["asset"]["events"]["created"]["at"]), - request["asset"]["id"], - request["asset"]["status"], - request["asset"]["external_id"], - request["asset"]["tiers"]["customer"]["name"], - ( - request["asset"]["tiers"]["customer"]["external_id"] - if "external_id" in request["asset"]["tiers"]["customer"] - else request["asset"]["tiers"]["customer"]["external_uid"] - ), - request["asset"]["tiers"]["customer"]["contact_info"]["country"], - request["asset"]["tiers"]["tier1"]["name"], - ( - request["asset"]["tiers"]["tier1"]["external_id"] - if "external_id" in request["asset"]["tiers"]["tier1"] - else request["asset"]["tiers"]["tier1"]["external_uid"] - ), - request["asset"]["tiers"]["tier1"]["contact_info"]["country"], - ( - request["asset"]["tiers"]["tier2"]["name"] - if "name" in request["asset"]["tiers"]["tier2"] - else "-" - ), - ( - request["asset"]["tiers"]["tier2"]["external_id"] - if "external_id" in request["asset"]["tiers"]["tier2"] - else "-" - ), - ( - request["asset"]["tiers"]["tier2"]["contact_info"]["country"] - if request["asset"]["tiers"]["tier2"] - and "country" in request["asset"]["tiers"]["tier2"]["contact_info"] - else "-" - ), - item["global_id"], - item["mpn"], - item["display_name"], - item.get("period", item.get("item_type")), - item["old_quantity"], - item["quantity"], - delta(item["old_quantity"], item["quantity"]), - request["asset"]["connection"]["provider"]["id"], - request["asset"]["connection"]["provider"]["name"], - request["asset"]["marketplace"]["id"], - request["asset"]["marketplace"]["name"], - request["asset"]["contract"].get("type", "distribution").capitalize(), - param_values["microsoft_domain"], - param_values["subscription_id"], - param_values["ms_customer_id"], - param_values["microsoft_order_id"], - param_values["microsoft_plan_subscription_id"], - param_values["microsoft_tier1_mpn"], - ] - ) - except Exception: - pass - return output - - -def get_subscription_record(client, subscription, progress): - param_values = get_product_specifics(subscription, client) - output = [] - try: - for item in subscription["items"]: - output.append( - [ - subscription["type"].capitalize() + " Billing", - subscription["id"], - subscription["asset"]["product"]["id"], - subscription["asset"]["product"]["name"], - subscription["asset"]["connection"]["vendor"]['id'], - subscription["asset"]["connection"]["vendor"]["name"], - convert_to_datetime_subscription(subscription["events"]["created"]["at"]), - convert_to_datetime_subscription(subscription["asset"]["events"]["created"]["at"]), - subscription["asset"]["id"], - subscription["asset"]["status"], - subscription["asset"]["external_id"], - subscription["asset"]["tiers"]["customer"]["name"], - ( - subscription["asset"]["tiers"]["customer"]["external_id"] - if "external_id" in subscription["asset"]["tiers"]["customer"] - else subscription["asset"]["tiers"]["customer"]["external_uid"] - ), - subscription["asset"]["tiers"]["customer"]["contact_info"]["country"], - subscription["asset"]["tiers"]["tier1"]["name"], - ( - subscription["asset"]["tiers"]["tier1"]["external_id"] - if "external_id" in subscription["asset"]["tiers"]["tier1"] - else subscription["asset"]["tiers"]["tier1"]["external_uid"] - ), - subscription["asset"]["tiers"]["tier1"]["contact_info"]["country"], - ( - subscription["asset"]["tiers"]["tier2"]["name"] - if "tier2" in subscription["asset"]["tiers"] - else "-" - ), - ( - subscription["asset"]["tiers"]["tier2"]["external_id"] - if "tier2" in subscription["asset"]["tiers"] - else "-" - ), - ( - subscription["asset"]["tiers"]["tier2"]["contact_info"]["country"] - if "tier2" in subscription["asset"]["tiers"] - else "-" - ), - item["global_id"], - item["mpn"], - item["display_name"], - item.get("period", item.get("item_type")), - 0, - ( - "unlimited" if item["quantity"] == -1 else item["quantity"] - ), - ( - "unlimited" if item["quantity"] == -1 else item["quantity"] - ), - subscription["asset"]["connection"]["provider"]["id"], - subscription["asset"]["connection"]["provider"]["name"], - subscription["asset"]["marketplace"]["id"], - subscription["asset"]["marketplace"]["name"], - ( - "Syndication" - if "CRU" in subscription["asset"]["contract"]["id"] - else "Distribution" - ), - param_values["microsoft_domain"], - param_values["subscription_id"], - param_values["ms_customer_id"], - param_values["microsoft_order_id"], - param_values["microsoft_plan_subscription_id"], - param_values["microsoft_tier1_mpn"], - ] - ) - except Exception as e: - print(e) - return output - - -def get_product_specifics(request, client): - values = { - "microsoft_domain": "-", - "subscription_id": "-", - "ms_customer_id": "-", - "microsoft_order_id": "-", - "microsoft_plan_subscription_id": "-", - "microsoft_tier1_mpn": "-", - } - if request["asset"]["connection"]["vendor"]["id"] == "VA-888-104": - values["microsoft_domain"] = get_parameter(request, "microsoft_domain") - sub_id = get_parameter(request, "subscription_id") - if sub_id == "-": - sub_id = get_parameter(request, "microsoft_subscription_id") - values["subscription_id"] = sub_id - cust_id = get_parameter(request, "ms_customer_id") - if cust_id == "-": - cust_id = get_parameter(request, "customer_id") - values["ms_customer_id"] = cust_id - order_id = get_parameter(request, "microsoft_order_id") - if order_id == "-": - order_id = get_parameter(request, "csp_order_id") - values["microsoft_plan_subscription_id"] = get_parameter( - request, - "microsoft_plan_subscription_id", - ) - values["microsoft_order_id"] = order_id - values["microsoft_tier1_mpn"] = get_param_mpn(request, client) - return values - -def init_tc_cache(): - for product in PRODUCTS: - TC_CACHE[product] = {} - -def get_param_mpn(request, client): - if request['asset']['tiers']['tier1']['id'] in TC_CACHE[request['asset']['product']['id']]: - return TC_CACHE[request['asset']['product']['id']][request['asset']['tiers']['tier1']['id']] - mpn = get_ta_parameter(request, 'tier1', 'tier1_mpn', client) - TC_CACHE[request['asset']['product']['id']][request['asset']['tiers']['tier1']['id']] = mpn - return mpn - -def populate_ta_cache(parameters, client): - rql = R() - rql &= R().product.id.oneof(PRODUCTS) - if parameters.get('mkp') and parameters['mkp']['all'] is False: - rql &= R().marketplace.id.oneof(parameters['mkp']['choices']) - tcs = client.ns('tier').collection('configs').filter(rql) - for tc in tcs: - if tc['product']['id'] not in TC_CACHE: - TC_CACHE[tc['product']['id']] = {} - TC_CACHE[tc['product']['id']][tc['account']['id']] = get_param_value(tc['params'], 'tier1_mpn') - -def get_param_value(params, param_id): - for param in params: - if param_id == param['id']: - return param['value'] if 'value' in param else '-' - return '-' \ No newline at end of file diff --git a/reports/ms_products/readme.md b/reports/ms_products/readme.md deleted file mode 100644 index 53647e5..0000000 --- a/reports/ms_products/readme.md +++ /dev/null @@ -1,8 +0,0 @@ -# Microsoft Products transactions report - -This report provides an overview of all requests and billing requests for a given range of dates. -Report includes: - * All syndicated and direct transactions - * Microsoft products specific data - -**IMPORTANT**: Select the Microsoft products only \ No newline at end of file diff --git a/reports/ms_products/template.xlsx b/reports/ms_products/template.xlsx deleted file mode 100644 index 5cc3d5a..0000000 Binary files a/reports/ms_products/template.xlsx and /dev/null differ diff --git a/reports/sonicwall_subscriptions/Readme.md b/reports/sonicwall_subscriptions/Readme.md deleted file mode 100644 index 0c67793..0000000 --- a/reports/sonicwall_subscriptions/Readme.md +++ /dev/null @@ -1,11 +0,0 @@ -# SonicWall Subscription List Report - -This report provides a view of all subscriptions available at your account with exclusive parameters from SonicWall Products - -Report accepts to limit the output by: - -* Subscription creation date range -* List of products -* List of marketplaces -* Billing period -* Subscription status \ No newline at end of file diff --git a/reports/sonicwall_subscriptions/__init__.py b/reports/sonicwall_subscriptions/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/reports/sonicwall_subscriptions/entrypoint.py b/reports/sonicwall_subscriptions/entrypoint.py deleted file mode 100644 index 61cba8b..0000000 --- a/reports/sonicwall_subscriptions/entrypoint.py +++ /dev/null @@ -1,127 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2021, CloudBlue -# All rights reserved. -# - -from connect.client import R - -from reports.utils import convert_to_datetime, get_value, get_asset_parameter - -HEADERS = ( - 'Subscription ID', 'Subscription External ID', 'Subscription Type', - 'Creation date', 'Updated date', 'Status', 'Billing Period', - 'Anniversary Day', 'Anniversary Month', 'Contract ID', 'Contract Name', - 'Customer ID', 'Customer Name', 'Customer External ID', - 'Tier 1 ID', 'Tier 1 Name', 'Tier 1 External ID', - 'Tier 2 ID', 'Tier 2 Name', 'Tier 2 External ID', - 'Provider Account ID', 'Provider Account name', - 'Vendor Account ID', 'Vendor Account Name', - 'Product ID', 'Product Name', 'Hub ID', 'Hub Name', - 'Original PO Number', 'Vendor Subscription ID', -) - - -def generate( - client=None, - parameters=None, - progress_callback=None, - renderer_type=None, - extra_context_callback=None, -): - subscriptions = _get_subscriptions(client, parameters) - total = subscriptions.count() - progress = 0 - if renderer_type == 'csv': - yield HEADERS - progress += 1 - total += 1 - progress_callback(progress, total) - - for subscription in subscriptions: - if renderer_type == 'json': - yield { - HEADERS[idx].replace(' ', '_').lower(): value - for idx, value in enumerate(_process_line(subscription)) - } - else: - yield _process_line(subscription) - progress += 1 - progress_callback(progress, total) - - -def _get_subscriptions(client, parameters): - query = R() - if parameters.get('date') and parameters['date']['after'] != '': - query &= R().events.created.at.ge(parameters['date']['after']) - query &= R().events.created.at.le(parameters['date']['before']) - if parameters.get('product') and parameters['product']['all'] is False: - query &= R().product.id.oneof(parameters['product']['choices']) - if parameters.get('mkp') and parameters['mkp']['all'] is False: - query &= R().marketplace.id.oneof(parameters['mkp']['choices']) - if parameters.get('period') and parameters['period']['all'] is False: - query &= R().billing.period.uom.oneof(parameters['period']['choices']) - if parameters.get('status') and parameters['status']['all'] is False: - query &= R().status.oneof(parameters['status']['choices']) - - return client.ns('subscriptions').assets.filter(query) - - -def calculate_period(delta, uom): - if delta == 1: - if uom == 'monthly': - return 'Monthly' - return 'Yearly' - else: - if uom == 'monthly': - return f'{int(delta)} Months' - return f'{int(delta)} Years' - - -def get_anniversary_day(subscription_billing): - if 'anniversary' in subscription_billing and 'day' in subscription_billing['anniversary']: - return subscription_billing['anniversary']['day'] - return '-' - - -def get_anniversary_month(subscription_billing): - if 'anniversary' in subscription_billing and 'month' in subscription_billing['anniversary']: - return subscription_billing['anniversary']['month'] - return '-' - -def _process_line(subscription): - return ( - subscription.get('id'), - subscription.get('external_id', '-'), - get_value(subscription, 'connection', 'type'), - convert_to_datetime(subscription['events']['created']['at']), - convert_to_datetime(subscription['events']['updated']['at']), - subscription.get('status'), - calculate_period( - subscription['billing']['period']['delta'], - subscription['billing']['period']['uom'], - ) if 'billing' in subscription else '-', - get_anniversary_day(subscription['billing']) if 'billing' in subscription else '-', - get_anniversary_month(subscription['billing']) if 'billing' in subscription else '-', - subscription['contract']['id'] if 'contract' in subscription else '-', - subscription['contract']['name'] if 'contract' in subscription else '-', - get_value(subscription.get('tiers', ''), 'customer', 'id'), - get_value(subscription.get('tiers', ''), 'customer', 'name'), - get_value(subscription.get('tiers', ''), 'customer', 'external_id'), - get_value(subscription.get('tiers', ''), 'tier1', 'id'), - get_value(subscription.get('tiers', ''), 'tier1', 'name'), - get_value(subscription.get('tiers', ''), 'tier1', 'external_id'), - get_value(subscription.get('tiers', ''), 'tier2', 'id'), - get_value(subscription.get('tiers', ''), 'tier2', 'name'), - get_value(subscription.get('tiers', ''), 'tier2', 'external_id'), - get_value(subscription['connection'], 'provider', 'id'), - get_value(subscription['connection'], 'provider', 'name'), - get_value(subscription['connection'], 'vendor', 'id'), - get_value(subscription['connection'], 'vendor', 'name'), - get_value(subscription, 'product', 'id'), - get_value(subscription, 'product', 'name'), - get_value(subscription['connection'], 'hub', 'id'), - get_value(subscription['connection'], 'hub', 'name'), - get_asset_parameter(subscription, 'previous_contract_number'), - get_asset_parameter(subscription, 'vendor_subscription_id'), - ) diff --git a/reports/sonicwall_subscriptions/templates/xlsx/template.xlsx b/reports/sonicwall_subscriptions/templates/xlsx/template.xlsx deleted file mode 100644 index 81e9fed..0000000 Binary files a/reports/sonicwall_subscriptions/templates/xlsx/template.xlsx and /dev/null differ diff --git a/reports/usage_files_status/Readme.md b/reports/usage_files_status/Readme.md deleted file mode 100644 index 7b6b484..0000000 --- a/reports/usage_files_status/Readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Usage File Status - -This report provides an export of usage files that had been created more than 24 hours ago and are not closed at the moment of report execution. diff --git a/reports/usage_files_status/__init__.py b/reports/usage_files_status/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/reports/usage_files_status/entrypoint.py b/reports/usage_files_status/entrypoint.py deleted file mode 100644 index 0231273..0000000 --- a/reports/usage_files_status/entrypoint.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2021, CloudBlue -# All rights reserved. -# - -from connect.client import R -from reports.utils import convert_to_datetime, get_value -from datetime import datetime - -HEADERS = ( - 'id', - 'vendor id', - 'vendor', - 'product id', - 'product', - 'provider id', - 'provider name', - 'marketplace id', - 'marketplace', - 'records uploaded', - 'records pending', - 'records accepted', - 'records closed', - 'created at', - 'accepted at', - 'closed at', - 'status', -) - - -def generate( - client=None, - parameters=None, - progress_callback=None, - renderer_type=None, - extra_context_callback=None, -): - usage_files = _get_uf(client, parameters) - total = usage_files.count() - progress = 0 - now = datetime.now() - if renderer_type == 'csv': - yield HEADERS - total += 1 - progress += 1 - progress_callback(progress, total) - for uf in usage_files: - hours, rest = divmod((now - datetime.strptime(get_value(uf['events'], 'created', 'at'), '%Y-%m-%dT%H:%M:%S+00:00')).total_seconds(), 3600) - if int(hours) <= 24: - continue - if renderer_type == 'json': - yield { - HEADERS[idx].replace(' ', '_').lower(): value - for idx, value in enumerate(_process_line(uf)) - } - else: - yield _process_line(uf) - progress += 1 - progress_callback(progress, total) - - -def _process_line(usage_file): - return ( - usage_file['id'], - usage_file['vendor']['id'], - usage_file['vendor']['name'], - usage_file['product']['id'], - usage_file['product']['name'], - usage_file['provider']['id'], - usage_file['provider']['name'], - usage_file['marketplace']['id'], - usage_file['marketplace']['name'], - usage_file['stats'].get('uploaded', 0), - usage_file['stats'].get('pending', 0), - usage_file['stats'].get('accepted', 0), - usage_file['stats'].get('closed', 0), - convert_to_datetime(get_value(usage_file['events'], 'created', 'at')), - convert_to_datetime(get_value(usage_file['events'], 'accepted', 'at')), - convert_to_datetime(get_value(usage_file['events'], 'closed', 'at')), - usage_file['status'], - ) - - -def _get_uf(client, parameters): - rql = R() - rql &= R().status.oneof(['pending', 'accepted']) - return client.ns('usage').collection('files').filter(rql).order_by('-created.at') \ No newline at end of file diff --git a/reports/usage_files_status/templates/xlsx/template.xlsx b/reports/usage_files_status/templates/xlsx/template.xlsx deleted file mode 100644 index f8e4231..0000000 Binary files a/reports/usage_files_status/templates/xlsx/template.xlsx and /dev/null differ