def test_reports_admin_permissions(rf): shop = get_default_shop() # We need a shop to exists staff_user = get_default_staff_user(shop) permission_group = get_default_permission_group() staff_user.groups.add(permission_group) request = apply_request_middleware(rf.get("/"), user=staff_user) request.user = staff_user with replace_modules([ReportsAdminModule]): with override_provides("reports", REPORTS): extra_permissions = ReportsAdminModule().get_extra_permissions() assert len(extra_permissions) == 3 assert SalesReport.identifier in extra_permissions assert TotalSales.identifier in extra_permissions assert SalesPerHour.identifier in extra_permissions with admin_only_urls(): view_func = ReportView.as_view() response = view_func(request) response.render() response = view_func(request, pk=None) # "new mode" response.render() assert response.content soup = BeautifulSoup(response.content) assert soup.find("div", {"class": "content-block"}).text == "No reports available" expected_report_identifiers = [] for report_cls in [SalesReport, TotalSales, SalesPerHour]: expected_report_identifiers.append(report_cls.identifier) set_permissions_for_group(permission_group, [report_cls.identifier]) response = view_func(request, pk=None) # "new mode" response.render() assert response.content soup = BeautifulSoup(response.content) for option in soup.find("select", {"id": "id_report"}).findAll("option"): assert option["value"] in expected_report_identifiers
def test_reports_admin_permissions(rf): shop = get_default_shop() # We need a shop to exists staff_user = get_default_staff_user(shop) permission_group = get_default_permission_group() staff_user.groups = [permission_group] request = apply_request_middleware(rf.get("/"), user=staff_user) request.user = staff_user with replace_modules([ReportsAdminModule]): with override_provides("reports", REPORTS): extra_permissions = ReportsAdminModule().get_extra_permissions() assert len(extra_permissions) == 3 assert SalesReport.identifier in extra_permissions assert TotalSales.identifier in extra_permissions assert SalesPerHour.identifier in extra_permissions with admin_only_urls(): view_func = ReportView.as_view() response = view_func(request) response.render() response = view_func(request, pk=None) # "new mode" response.render() assert response.content soup = BeautifulSoup(response.content) assert soup.find("div", {"class": "content-block"}).text == "No reports available" expected_report_identifiers = [] for report_cls in [SalesReport, TotalSales, SalesPerHour]: expected_report_identifiers.append(report_cls.identifier) set_permissions_for_group(permission_group, [report_cls.identifier]) response = view_func(request, pk=None) # "new mode" response.render() assert response.content soup = BeautifulSoup(response.content) for option in soup.find("select", {"id": "id_report"}).findAll("option"): assert option["value"] in expected_report_identifiers
def test_reporting(rf): product_price = 100 product_count = 2 tax_rate = Decimal("0.10") line_count = 1 expected_taxful_total, expected_taxless_total, shop, order = initialize_report_test( product_price, product_count, tax_rate, line_count) with override_provides("reports", [__name__ + ":SalesTestReport"]): data = { "report": SalesTestReport.get_name(), "shop": shop.pk, "date_range": DateRangeChoices.THIS_YEAR.value, "writer": "json", "force_download": 1, } view = ReportView.as_view() request = apply_request_middleware(rf.post("/", data=data)) response = view(request) if hasattr(response, "render"): response.render() assert response.status_code == 200 json_data = json.loads(response.content.decode("utf-8")) assert force_text(SalesTestReport.title) in json_data.get("heading") totals = json_data.get("tables")[0].get("totals") return_data = json_data.get("tables")[0].get("data")[0] assert int(totals.get("product_count", 0)) == product_count assert int(return_data.get("product_count", 0)) == product_count assert int(totals.get("order_count", 0)) == 1 assert int(return_data.get("order_count", 0)) == 1 assert str(expected_taxless_total) in totals.get("taxless_total", "0") assert str(expected_taxful_total) in totals.get("taxful_total", "0") today = date.today() last_year = date(today.year - 1, 1, 1) next_year = date(today.year + 1, 1, 1) # test report without downloading it data = { "report": SalesTestReport.get_name(), "shop": shop.pk, "date_range": DateRangeChoices.CUSTOM.value, "start_date": last_year.strftime("%Y-%m-%d"), "end_date": next_year.strftime("%Y-%m-%d"), "writer": "json", } request = apply_request_middleware(rf.post("/", data=data)) response = view(request) assert response.status_code == 200 soup = BeautifulSoup(response.render().content) soup_text = force_text(soup) assert force_text(SalesTestReport.title) in soup_text assert str(expected_taxless_total) in soup_text assert str(expected_taxful_total) in soup_text
def test_reporting(rf): product_price = 100 product_count = 2 tax_rate = Decimal("0.10") line_count = 1 expected_taxful_total, expected_taxless_total, shop, order = initialize_report_test(product_price, product_count, tax_rate, line_count) with override_provides("reports", [__name__ + ":SalesTestReport"]): data = { "report": SalesTestReport.get_name(), "shop": shop.pk, "date_range": DateRangeChoices.THIS_YEAR.value, "writer": "json", "force_download": 1, } view = ReportView.as_view() request = apply_request_middleware(rf.post("/", data=data)) response = view(request) if hasattr(response, "render"): response.render() assert response.status_code == 200 json_data = json.loads(response.content.decode("utf-8")) assert force_text(SalesTestReport.title) in json_data.get("heading") totals = json_data.get("tables")[0].get("totals") return_data = json_data.get("tables")[0].get("data")[0] assert int(totals.get("product_count", 0)) == product_count assert int(return_data.get("product_count", 0)) == product_count assert int(totals.get("order_count", 0)) == 1 assert int(return_data.get("order_count", 0)) == 1 assert str(expected_taxless_total) in totals.get("taxless_total", "0") assert str(expected_taxful_total) in totals.get("taxful_total", "0") today = date.today() last_year = date(today.year-1, 1, 1) next_year = date(today.year+1, 1, 1) # test report without downloading it data = { "report": SalesTestReport.get_name(), "shop": shop.pk, "date_range": DateRangeChoices.CUSTOM.value, "start_date": last_year.strftime("%Y-%m-%d"), "end_date": next_year.strftime("%Y-%m-%d"), "writer": "json", } request = apply_request_middleware(rf.post("/", data=data)) response = view(request) assert response.status_code == 200 soup = BeautifulSoup(response.render().content) soup_text = force_text(soup) assert force_text(SalesTestReport.title) in soup_text assert str(expected_taxless_total) in soup_text assert str(expected_taxful_total) in soup_text
def test_new_customers_report(rf, admin_user, group_by): with override_provides( "reports", ["shuup.default_reports.reports.new_customers:NewCustomersReport"]): shop = get_default_shop() person_creation_dates = [ datetime(2015, 1, 2), datetime(2015, 1, 1), datetime(2016, 2, 2), ] # create person with NO user for creation_date in person_creation_dates: person = create_random_person() person.created_on = creation_date person.save() user_person_creation_dates = [ datetime(2015, 3, 3), datetime(2015, 3, 3), datetime(2015, 4, 4), datetime(2016, 5, 5), datetime(2016, 6, 6), datetime(2016, 7, 7), ] # create person with users for creation_date in user_person_creation_dates: person = create_random_person() person.user = UserFactory() person.created_on = creation_date person.save() company_creation_dates = [ datetime(2015, 1, 1), datetime(2015, 8, 8), datetime(2015, 9, 9), ] # create company contacts for creation_date in company_creation_dates: company = CompanyFactory() company.created_on = creation_date company.save() data = { "report": NewCustomersReport.get_name(), "shop": shop.pk, "date_range": DateRangeChoices.ALL_TIME.value, "writer": "json", "force_download": 1, "group_by": group_by } view = ReportView.as_view() request = apply_request_middleware(rf.post("/", data=data), user=admin_user) response = view(request) if hasattr(response, "render"): response.render() assert response.status_code == 200 json_data = json.loads(response.content.decode("utf-8")) assert force_text(NewCustomersReport.title) in json_data.get("heading") data = json_data["tables"][0]["data"] if group_by == "%Y": assert len(data) == 3 assert data[0]["date"] == "2015" assert int(data[0]["personcontact"]) == 5 assert int(data[0]["companycontact"]) == 3 assert int(data[0]["users"]) == 3 assert data[1]["date"] == "2016" assert int(data[1]["personcontact"]) == 4 assert int(data[1]["companycontact"]) == 0 assert int(data[1]["users"]) == 3 elif group_by == "%Y-%m": assert len(data) == 10 assert data[0]["date"] == "2015-01" assert int(data[0]["personcontact"]) == 2 assert int(data[0]["companycontact"]) == 1 assert int(data[0]["users"]) == 0 assert data[1]["date"] == "2015-03" assert int(data[1]["personcontact"]) == 2 assert int(data[1]["companycontact"]) == 0 assert int(data[1]["users"]) == 2 assert data[2]["date"] == "2015-04" assert int(data[2]["personcontact"]) == 1 assert int(data[2]["companycontact"]) == 0 assert int(data[2]["users"]) == 1 assert data[3]["date"] == "2015-08" assert int(data[3]["personcontact"]) == 0 assert int(data[3]["companycontact"]) == 1 assert int(data[3]["users"]) == 0 assert data[4]["date"] == "2015-09" assert int(data[4]["personcontact"]) == 0 assert int(data[4]["companycontact"]) == 1 assert int(data[4]["users"]) == 0 assert data[5]["date"] == "2016-02" assert int(data[5]["personcontact"]) == 1 assert int(data[5]["companycontact"]) == 0 assert int(data[5]["users"]) == 0 assert data[6]["date"] == "2016-05" assert int(data[6]["personcontact"]) == 1 assert int(data[6]["companycontact"]) == 0 assert int(data[6]["users"]) == 1 assert data[7]["date"] == "2016-06" assert int(data[7]["personcontact"]) == 1 assert int(data[7]["companycontact"]) == 0 assert int(data[7]["users"]) == 1 assert data[8]["date"] == "2016-07" assert int(data[8]["personcontact"]) == 1 assert int(data[8]["companycontact"]) == 0 assert int(data[8]["users"]) == 1 elif group_by == "%Y-%m-%d": assert len(data) == 11 assert data[0]["date"] == "2015-01-01" assert int(data[0]["personcontact"]) == 1 assert int(data[0]["companycontact"]) == 1 assert int(data[0]["users"]) == 0 assert data[1]["date"] == "2015-01-02" assert int(data[1]["personcontact"]) == 1 assert int(data[1]["companycontact"]) == 0 assert int(data[1]["users"]) == 0 assert data[2]["date"] == "2015-03-03" assert int(data[2]["personcontact"]) == 2 assert int(data[2]["companycontact"]) == 0 assert int(data[2]["users"]) == 2 assert data[3]["date"] == "2015-04-04" assert int(data[3]["personcontact"]) == 1 assert int(data[3]["companycontact"]) == 0 assert int(data[3]["users"]) == 1 assert data[4]["date"] == "2015-08-08" assert int(data[4]["personcontact"]) == 0 assert int(data[4]["companycontact"]) == 1 assert int(data[4]["users"]) == 0 assert data[5]["date"] == "2015-09-09" assert int(data[5]["personcontact"]) == 0 assert int(data[5]["companycontact"]) == 1 assert int(data[5]["users"]) == 0 assert data[6]["date"] == "2016-02-02" assert int(data[6]["personcontact"]) == 1 assert int(data[6]["companycontact"]) == 0 assert int(data[6]["users"]) == 0 assert data[7]["date"] == "2016-05-05" assert int(data[7]["personcontact"]) == 1 assert int(data[7]["companycontact"]) == 0 assert int(data[7]["users"]) == 1 assert data[8]["date"] == "2016-06-06" assert int(data[8]["personcontact"]) == 1 assert int(data[8]["companycontact"]) == 0 assert int(data[8]["users"]) == 1 assert data[9]["date"] == "2016-07-07" assert int(data[9]["personcontact"]) == 1 assert int(data[9]["companycontact"]) == 0 assert int(data[9]["users"]) == 1
def test_product_total_sales_report(rf, admin_user, order_by): with override_provides("reports", [ "shuup.default_reports.reports.product_total_sales:ProductSalesReport" ]): shop = get_default_shop() supplier = get_default_supplier(shop) product1 = create_product("product1", supplier=supplier, shop=shop) product2 = create_product("product2", supplier=supplier, shop=shop) p1_qtd, p1_price, p1_tr, p1_lines = Decimal(3), Decimal(5), Decimal( 0), 5 p2_qtd, p2_price, p2_tr, p2_lines = Decimal(4), Decimal(5), Decimal( 0.95), 3 order = create_order_with_product(product=product1, supplier=supplier, quantity=p1_qtd, taxless_base_unit_price=p1_price, tax_rate=p1_tr, n_lines=p1_lines, shop=shop) order.create_payment(order.taxful_total_price.amount) order2 = create_order_with_product(product=product2, supplier=supplier, quantity=p2_qtd, taxless_base_unit_price=p2_price, tax_rate=p2_tr, n_lines=p2_lines, shop=shop) order2.create_payment(order2.taxful_total_price.amount) data = { "report": ProductSalesReport.get_name(), "shop": shop.pk, "date_range": DateRangeChoices.ALL_TIME.value, "writer": "json", "force_download": 1, "order_by": order_by } view = ReportView.as_view() request = apply_request_middleware(rf.post("/", data=data), user=admin_user) response = view(request) if hasattr(response, "render"): response.render() assert response.status_code == 200 json_data = json.loads(response.content.decode("utf-8")) assert force_text(ProductSalesReport.title) in json_data.get("heading") data = json_data["tables"][0]["data"] assert len(data) == 2 p1_total_qtd = p1_qtd * p1_lines p1_taxless_total = p1_total_qtd * p1_price p1_taxful_total = p1_taxless_total * (1 + p1_tr) p2_total_qtd = p2_qtd * p2_lines p2_taxless_total = p2_total_qtd * p2_price p2_taxful_total = p2_taxless_total * (1 + p2_tr) if order_by == "quantity": p1 = data[0] p2 = data[1] elif order_by == "taxless_total": p1 = data[0] p2 = data[1] else: # order_by == "taxful_total": p1 = data[1] p2 = data[0] precision = Decimal('0.1')**2 assert p1["product"] == product1.name assert Decimal(p1["quantity"]) == p1_total_qtd assert Decimal( p1["taxless_total"]) == p1_taxless_total.quantize(precision) assert Decimal( p1["taxful_total"]) == p1_taxful_total.quantize(precision) assert p2["product"] == product2.name assert Decimal(p2["quantity"]) == p2_total_qtd assert Decimal( p2["taxless_total"]) == p2_taxless_total.quantize(precision) assert Decimal( p2["taxful_total"]) == p2_taxful_total.quantize(precision)
def test_new_customers_report(rf, admin_user, group_by): with override_provides("reports", ["shuup.default_reports.reports.new_customers:NewCustomersReport"]): shop = get_default_shop() person_creation_dates = [ datetime(2015, 1, 2), datetime(2015, 1, 1), datetime(2016, 2, 2), ] # create person with NO user for creation_date in person_creation_dates: person = create_random_person() person.created_on = creation_date person.save() user_person_creation_dates = [ datetime(2015, 3, 3), datetime(2015, 3, 3), datetime(2015, 4, 4), datetime(2016, 5, 5), datetime(2016, 6, 6), datetime(2016, 7, 7), ] # create person with users for creation_date in user_person_creation_dates: person = create_random_person() person.user = UserFactory() person.created_on = creation_date person.save() company_creation_dates = [ datetime(2015, 1, 1), datetime(2015, 8, 8), datetime(2015, 9, 9), ] # create company contacts for creation_date in company_creation_dates: company = CompanyFactory() company.created_on = creation_date company.save() data = { "report": NewCustomersReport.get_name(), "shop": shop.pk, "date_range": DateRangeChoices.ALL_TIME.value, "writer": "json", "force_download": 1, "group_by": group_by } view = ReportView.as_view() request = apply_request_middleware(rf.post("/", data=data), user=admin_user) response = view(request) if hasattr(response, "render"): response.render() assert response.status_code == 200 json_data = json.loads(response.content.decode("utf-8")) assert force_text(NewCustomersReport.title) in json_data.get("heading") data = json_data["tables"][0]["data"] if group_by == "%Y": assert len(data) == 3 assert data[0]["date"] == "2015" assert int(data[0]["personcontact"]) == 5 assert int(data[0]["companycontact"]) == 3 assert int(data[0]["users"]) == 3 assert data[1]["date"] == "2016" assert int(data[1]["personcontact"]) == 4 assert int(data[1]["companycontact"]) == 0 assert int(data[1]["users"]) == 3 elif group_by == "%Y-%m": assert len(data) == 10 assert data[0]["date"] == "2015-01" assert int(data[0]["personcontact"]) == 2 assert int(data[0]["companycontact"]) == 1 assert int(data[0]["users"]) == 0 assert data[1]["date"] == "2015-03" assert int(data[1]["personcontact"]) == 2 assert int(data[1]["companycontact"]) == 0 assert int(data[1]["users"]) == 2 assert data[2]["date"] == "2015-04" assert int(data[2]["personcontact"]) == 1 assert int(data[2]["companycontact"]) == 0 assert int(data[2]["users"]) == 1 assert data[3]["date"] == "2015-08" assert int(data[3]["personcontact"]) == 0 assert int(data[3]["companycontact"]) == 1 assert int(data[3]["users"]) == 0 assert data[4]["date"] == "2015-09" assert int(data[4]["personcontact"]) == 0 assert int(data[4]["companycontact"]) == 1 assert int(data[4]["users"]) == 0 assert data[5]["date"] == "2016-02" assert int(data[5]["personcontact"]) == 1 assert int(data[5]["companycontact"]) == 0 assert int(data[5]["users"]) == 0 assert data[6]["date"] == "2016-05" assert int(data[6]["personcontact"]) == 1 assert int(data[6]["companycontact"]) == 0 assert int(data[6]["users"]) == 1 assert data[7]["date"] == "2016-06" assert int(data[7]["personcontact"]) == 1 assert int(data[7]["companycontact"]) == 0 assert int(data[7]["users"]) == 1 assert data[8]["date"] == "2016-07" assert int(data[8]["personcontact"]) == 1 assert int(data[8]["companycontact"]) == 0 assert int(data[8]["users"]) == 1 elif group_by == "%Y-%m-%d": assert len(data) == 11 assert data[0]["date"] == "2015-01-01" assert int(data[0]["personcontact"]) == 1 assert int(data[0]["companycontact"]) == 1 assert int(data[0]["users"]) == 0 assert data[1]["date"] == "2015-01-02" assert int(data[1]["personcontact"]) == 1 assert int(data[1]["companycontact"]) == 0 assert int(data[1]["users"]) == 0 assert data[2]["date"] == "2015-03-03" assert int(data[2]["personcontact"]) == 2 assert int(data[2]["companycontact"]) == 0 assert int(data[2]["users"]) == 2 assert data[3]["date"] == "2015-04-04" assert int(data[3]["personcontact"]) == 1 assert int(data[3]["companycontact"]) == 0 assert int(data[3]["users"]) == 1 assert data[4]["date"] == "2015-08-08" assert int(data[4]["personcontact"]) == 0 assert int(data[4]["companycontact"]) == 1 assert int(data[4]["users"]) == 0 assert data[5]["date"] == "2015-09-09" assert int(data[5]["personcontact"]) == 0 assert int(data[5]["companycontact"]) == 1 assert int(data[5]["users"]) == 0 assert data[6]["date"] == "2016-02-02" assert int(data[6]["personcontact"]) == 1 assert int(data[6]["companycontact"]) == 0 assert int(data[6]["users"]) == 0 assert data[7]["date"] == "2016-05-05" assert int(data[7]["personcontact"]) == 1 assert int(data[7]["companycontact"]) == 0 assert int(data[7]["users"]) == 1 assert data[8]["date"] == "2016-06-06" assert int(data[8]["personcontact"]) == 1 assert int(data[8]["companycontact"]) == 0 assert int(data[8]["users"]) == 1 assert data[9]["date"] == "2016-07-07" assert int(data[9]["personcontact"]) == 1 assert int(data[9]["companycontact"]) == 0 assert int(data[9]["users"]) == 1
def test_product_total_sales_report(rf, admin_user, order_by): with override_provides("reports", ["shuup.default_reports.reports.product_total_sales:ProductSalesReport"]): shop = get_default_shop() supplier = get_default_supplier() product1 = create_product("product1", supplier=supplier, shop=shop) product2 = create_product("product2", supplier=supplier, shop=shop) p1_qtd, p1_price, p1_tr, p1_lines = Decimal(3), Decimal(5), Decimal(0), 5 p2_qtd, p2_price, p2_tr, p2_lines = Decimal(4), Decimal(5), Decimal(0.95), 3 order = create_order_with_product( product=product1, supplier=supplier, quantity=p1_qtd, taxless_base_unit_price=p1_price, tax_rate=p1_tr, n_lines=p1_lines, shop=shop) order.create_payment(order.taxful_total_price.amount) order2 = create_order_with_product( product=product2, supplier=supplier, quantity=p2_qtd, taxless_base_unit_price=p2_price, tax_rate=p2_tr, n_lines=p2_lines, shop=shop) order2.create_payment(order2.taxful_total_price.amount) data = { "report": ProductSalesReport.get_name(), "shop": shop.pk, "date_range": DateRangeChoices.ALL_TIME.value, "writer": "json", "force_download": 1, "order_by": order_by } view = ReportView.as_view() request = apply_request_middleware(rf.post("/", data=data), user=admin_user) response = view(request) if hasattr(response, "render"): response.render() assert response.status_code == 200 json_data = json.loads(response.content.decode("utf-8")) assert force_text(ProductSalesReport.title) in json_data.get("heading") data = json_data["tables"][0]["data"] assert len(data) == 2 p1_total_qtd = p1_qtd * p1_lines p1_taxless_total = p1_total_qtd * p1_price p1_taxful_total = p1_taxless_total * (1 + p1_tr) p2_total_qtd = p2_qtd * p2_lines p2_taxless_total = p2_total_qtd * p2_price p2_taxful_total = p2_taxless_total * (1 + p2_tr) if order_by == "quantity": p1 = data[0] p2 = data[1] elif order_by == "taxless_total": p1 = data[0] p2 = data[1] else: # order_by == "taxful_total": p1 = data[1] p2 = data[0] precision = Decimal('0.1') ** 2 assert p1["product"] == product1.name assert Decimal(p1["quantity"]) == p1_total_qtd assert Decimal(p1["taxless_total"]) == p1_taxless_total.quantize(precision) assert Decimal(p1["taxful_total"]) == p1_taxful_total.quantize(precision) assert p2["product"] == product2.name assert Decimal(p2["quantity"]) == p2_total_qtd assert Decimal(p2["taxless_total"]) == p2_taxless_total.quantize(precision) assert Decimal(p2["taxful_total"]) == p2_taxful_total.quantize(precision)