diff --git a/.phpunit.result.cache b/.phpunit.result.cache index f99c92f..5c31fc1 100644 --- a/.phpunit.result.cache +++ b/.phpunit.result.cache @@ -1 +1 @@ -{"version":2,"defects":{"Tests\\Feature\\ProductPriceTest::test_product_list_returns_price_for_store_level":8,"Tests\\Feature\\ProductPriceTest::test_store_without_level_is_rejected":8,"Tests\\Feature\\ProductPriceTest::test_batch_price_updates_and_notifies_affected_stores":7,"Tests\\Feature\\ProductPriceTest::test_price_matrix_structure":8,"Tests\\Feature\\StoreOrderTest::test_place_order_snapshots_level_price_and_recalculates":8,"Tests\\Feature\\StoreOrderTest::test_client_supplied_amount_is_ignored":8,"Tests\\Feature\\StoreOrderTest::test_product_without_level_price_rejected":8,"Tests\\Feature\\StoreOrderTest::test_cancel_only_pending_orders":8,"Tests\\Feature\\StoreOrderTest::test_summarized_order_cannot_be_cancelled":8,"Tests\\Feature\\StoreOrderTest::test_order_data_isolated_between_stores":8,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_orders_by_product":7,"Tests\\Feature\\PurchaseGenerateTest::test_generate_writes_back_order_status":7,"Tests\\Feature\\PurchaseGenerateTest::test_generate_without_pending_orders_fails":8,"Tests\\Feature\\PurchaseGenerateTest::test_generate_is_idempotent":7,"Tests\\Feature\\AllocationTest::test_allocation_conserves_amount_with_tail_correction":7,"Tests\\Feature\\AllocationTest::test_allocation_follows_order_ratio":7,"Tests\\Feature\\AllocationTest::test_allocation_is_idempotent":7,"Tests\\Feature\\AllocationTest::test_allocation_rejected_without_actual_amount":8,"Tests\\Feature\\MiniAuthTest::test_login_creates_user_and_issues_token":7,"Tests\\Feature\\MiniAuthTest::test_phone_binding_matches_store":8,"Tests\\Feature\\MiniAuthTest::test_phone_no_match_stays_pending":8,"Tests\\Feature\\ExportTest::test_export_xlsx_with_encoded_chinese_filename":7,"Tests\\Feature\\CartTest::test_list_with_prices_amounts_and_totals":7,"Tests\\Feature\\CartTest::test_list_marks_off_shelf_item_unbuyable":7,"Tests\\Feature\\DebugCartListTest::test_dump_cart_list_response":5,"Tests\\Feature\\ProductCostPriceTest::test_create_product_with_cost_and_percent_pricing":7,"Tests\\Feature\\ProductCostPriceTest::test_create_percent_row_without_percent_fails":7,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_cost_only_notifies_percent_level_stores":7,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_empty_row_rejected":7,"Tests\\Feature\\MiniAuthTest::test_disabled_user_cannot_login":8,"Tests\\Feature\\MiniAuthTest::test_mini_token_cannot_access_admin_api":8,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_percent_row_update":7,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_mixed_row_updates_cost_and_level":7,"Tests\\Feature\\ReconciliationTest::test_build_creates_reconciliation_items":8,"Tests\\Feature\\ReconciliationTest::test_build_filters_by_supplier":8,"Tests\\Feature\\ReconciliationTest::test_update_item_recalculates_diff_and_header":8,"Tests\\Feature\\ReconciliationTest::test_toggle_reconciled_flag":8,"Tests\\Feature\\ReconciliationTest::test_settle_creates_settlements_per_store":8,"Tests\\Feature\\ProductCostPriceTest::test_mini_list_returns_actual_price_without_cost_price":8,"Tests\\Feature\\ProductCostPriceTest::test_mini_order_uses_actual_price_for_percent_row":8,"Tests\\Feature\\ProductCostPriceTest::test_mini_cart_uses_actual_price_for_percent_row":8,"Tests\\Feature\\StoreOrderTest::test_container_update_recalculates_amounts":8,"Tests\\Feature\\StoreOrderTest::test_container_update_allowed_in_editable_statuses":8,"Tests\\Feature\\StoreOrderTest::test_container_update_rejected_in_other_statuses":8,"Tests\\Feature\\StoreOrderTest::test_container_update_heals_legacy_product_amount":8,"Tests\\Feature\\StoreOrderTest::test_container_update_validates_negative_numbers":8,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_rejected_when_product_deleted":7,"Tests\\Feature\\StoreOrderItemTest::test_order_list_search_by_product_name":8,"Tests\\Feature\\PurchaseEditTest::test_detail_returns_store_matrix":7,"Tests\\Feature\\PurchaseEditTest::test_update_cell_syncs_order_item_and_totals":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_cost_syncs_all_order_items":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_weight_distributed_by_quantity":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_product_attributes":7,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_order_items_into_header":7,"Tests\\Feature\\ExportTest::test_export_category_filters_to_vegetables":7,"Tests\\Feature\\ExportTest::test_export_pdf":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_does_not_touch_manual_weight":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_to_product_catalog":7,"Tests\\Feature\\PurchaseEditTest::test_update_cell_weight_cascades_totals":7,"Tests\\Feature\\PurchaseEditTest::test_cell_sync_refreshes_snapshot_and_cascades":7,"Tests\\Feature\\PurchaseEditTest::test_edits_rejected_when_purchase_completed":7,"Tests\\Feature\\StoreOrderItemTest::test_update_item_recalculates_order_totals":7,"Tests\\Feature\\StoreOrderItemTest::test_update_item_validates_negative_price":7,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_updates_snapshot_from_product":7,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_recalculates_percent_price_with_latest_cost":7,"Tests\\Feature\\PurchaseEditTest::test_cell_detail_returns_items_with_order_info":8,"Tests\\Feature\\ProductCategoryTest::test_create_product_with_leaf_category_ok":7,"Tests\\Feature\\BillExportTest::test_export_filters_by_root_category":8,"Tests\\Feature\\BillExportTest::test_export_requires_export_permission":8,"Tests\\Feature\\DebugPermissionTest::test_debug_permission":8,"Tests\\Feature\\BillPaymentTest::test_order_status_progresses_via_business_chain":7,"Tests\\Feature\\BillPaymentTest::test_payment_audit_reject_does_not_accumulate":7,"Tests\\Feature\\BillPaymentTest::test_payment_detail_returns_voucher_urls":8,"Tests\\Feature\\ContainerReturnTest::test_press_containers_adds_amount_and_writes_record":7,"Tests\\Feature\\ContainerReturnTest::test_return_containers_deducts_amount":7,"Tests\\Feature\\ContainerReturnTest::test_mixed_sign_containers":7,"Tests\\Feature\\ContainerReturnTest::test_zero_containers_writes_no_record":7,"Tests\\Feature\\StoreOrderTest::test_order_list_outputs_status_name_and_item_preview":7,"Tests\\Feature\\DashboardTest::test_requires_dashboard_analysis_ability":7,"Tests\\Feature\\DashboardTest::test_recon_summary_and_receivable":8,"Tests\\Feature\\DashboardDebugTest::test_debug":8,"Tests\\Feature\\StoreOrderItemTest::test_place_order_snapshots_full_product_info":8,"Tests\\Feature\\StoreOrderItemTest::test_mini_detail_hides_cost_price":8,"Tests\\Feature\\StoreOrderItemTest::test_admin_detail_shows_cost_price_and_supplier":8,"Tests\\Feature\\StoreOrderItemTest::test_update_item_rejected_when_completed_or_cancelled":8,"Tests\\Feature\\StoreOrderItemTest::test_add_store_item_uses_level_percent_price":8,"Tests\\Feature\\ExportTest::test_export_suppliers_multi_sheet":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_skips_catalog_sync_when_product_deleted":7,"Tests\\Feature\\ProductImportExportTest::test_export_filters_by_category":8,"Tests\\Feature\\ProductImportExportTest::test_import_creates_products_and_auto_supplier":7,"Tests\\Feature\\ProductImportExportTest::test_import_matches_existing_supplier":7,"Tests\\Feature\\ProductImportExportTest::test_import_errors_abort_all_rows":7,"Tests\\Feature\\ProductImportExportTest::test_import_category_path_resolution":7,"Tests\\Feature\\MiniReportTest::test_report_accumulates_same_product_across_orders":7,"Tests\\Feature\\ExportTest::test_export_suppliers_split_by_market":7,"Tests\\Feature\\MiniOnlinePaymentTest::test_query_syncs_gateway_status":7,"Tests\\Feature\\MiniSpecialTest::test_cart_quantity_attached_for_store":8,"Tests\\Feature\\MiniWechatPaymentTest::test_create_wechat_payment_success":7,"Tests\\Feature\\ExportTest::test_export_lists_all_catalog_products_with_totals_row":7,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_online_payment_success":7,"Tests\\Feature\\MiniMpPaymentTest::test_mp_scene_wechat_channel":8,"Tests\\Feature\\MiniMpPaymentTest::test_default_scene_remains_mini":7,"Tests\\Feature\\MiniProductTest::test_product_list_ordered_by_category_tree":7,"Tests\\Feature\\PurchaseEditTest::test_list_includes_bill_product_amount":7},"times":{"Tests\\Feature\\ExampleTest::test_the_application_returns_a_successful_response":0.003,"Tests\\Feature\\ProductPriceTest::test_product_list_returns_price_for_store_level":0.088,"Tests\\Feature\\ProductPriceTest::test_store_without_level_is_rejected":0.007,"Tests\\Feature\\ProductPriceTest::test_batch_price_updates_and_notifies_affected_stores":0.01,"Tests\\Feature\\ProductPriceTest::test_price_matrix_structure":0.007,"Tests\\Feature\\StoreOrderTest::test_place_order_snapshots_level_price_and_recalculates":0.048,"Tests\\Feature\\StoreOrderTest::test_client_supplied_amount_is_ignored":0.048,"Tests\\Feature\\StoreOrderTest::test_product_without_level_price_rejected":0.007,"Tests\\Feature\\StoreOrderTest::test_cancel_only_pending_orders":0.052,"Tests\\Feature\\StoreOrderTest::test_summarized_order_cannot_be_cancelled":0.05,"Tests\\Feature\\StoreOrderTest::test_order_data_isolated_between_stores":0.092,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_orders_by_product":0.028,"Tests\\Feature\\PurchaseGenerateTest::test_generate_writes_back_order_status":0.099,"Tests\\Feature\\PurchaseGenerateTest::test_generate_without_pending_orders_fails":0.006,"Tests\\Feature\\PurchaseGenerateTest::test_generate_is_idempotent":0.101,"Tests\\Feature\\AllocationTest::test_allocation_conserves_amount_with_tail_correction":0.076,"Tests\\Feature\\AllocationTest::test_allocation_follows_order_ratio":0.022,"Tests\\Feature\\AllocationTest::test_allocation_is_idempotent":0.028,"Tests\\Feature\\AllocationTest::test_allocation_rejected_without_actual_amount":0.021,"Tests\\Feature\\DebugGenerateTest::test_debug_generate":0.047,"Tests\\Feature\\ReconciliationTest::test_build_creates_reconciliation_items":0.019,"Tests\\Feature\\ReconciliationTest::test_build_filters_by_supplier":0.022,"Tests\\Feature\\ReconciliationTest::test_update_item_recalculates_diff_and_header":0.019,"Tests\\Feature\\ReconciliationTest::test_toggle_reconciled_flag":0.02,"Tests\\Feature\\ReconciliationTest::test_settle_creates_settlements_per_store":0.036,"Tests\\Feature\\StatementTest::test_generate_snapshots_payment_cycle":0.011,"Tests\\Feature\\StatementTest::test_statement_isolated_between_stores":0.013,"Tests\\Feature\\StatementTest::test_generate_excludes_cancelled_and_used_items":0.016,"Tests\\Feature\\MiniAuthTest::test_login_creates_user_and_issues_token":0.056,"Tests\\Feature\\MiniAuthTest::test_disabled_user_cannot_login":0.003,"Tests\\Feature\\MiniAuthTest::test_phone_binding_matches_store":0.005,"Tests\\Feature\\MiniAuthTest::test_phone_no_match_stays_pending":0.001,"Tests\\Feature\\MiniAuthTest::test_sys_token_cannot_access_mini":0.009,"Tests\\Feature\\MiniAuthTest::test_mini_token_cannot_access_admin_api":0.049,"Tests\\Feature\\ExportTest::test_export_xlsx_with_encoded_chinese_filename":0.096,"Tests\\Feature\\ExportTest::test_export_category_filters_to_vegetables":0.017,"Tests\\Feature\\ExportTest::test_export_pdf":0.015,"Tests\\Feature\\ExportTest::test_export_invalid_format_rejected":0.016,"Tests\\Feature\\ExportTest::test_export_requires_export_permission":0.079,"Tests\\Unit\\ExampleTest::test_that_true_is_true":0.001,"Tests\\Feature\\MiniAuthTest::test_login_fails_when_wechat_rejects_code":0.003,"Tests\\Feature\\CartTest::test_add_to_cart_succeeds":0.046,"Tests\\Feature\\CartTest::test_duplicate_add_merges_quantity":0.048,"Tests\\Feature\\CartTest::test_off_shelf_product_rejected":0.046,"Tests\\Feature\\CartTest::test_soft_deleted_product_rejected":0.008,"Tests\\Feature\\CartTest::test_product_without_level_price_rejected":0.006,"Tests\\Feature\\CartTest::test_unbound_user_rejected":0.006,"Tests\\Feature\\CartTest::test_store_without_level_rejected":0.087,"Tests\\Feature\\CartTest::test_list_with_prices_amounts_and_totals":0.057,"Tests\\Feature\\CartTest::test_list_marks_off_shelf_item_unbuyable":0.071,"Tests\\Feature\\CartTest::test_empty_cart_returns_empty_items":0.049,"Tests\\Feature\\CartTest::test_update_quantity":0.048,"Tests\\Feature\\CartTest::test_update_other_users_item_rejected":0.009,"Tests\\Feature\\CartTest::test_update_missing_item_rejected":0.048,"Tests\\Feature\\CartTest::test_invalid_quantity_rejected":0.046,"Tests\\Feature\\CartTest::test_delete_item":0.061,"Tests\\Feature\\CartTest::test_delete_other_users_item_rejected":0.009,"Tests\\Feature\\CartTest::test_clear_only_own_cart":0.1,"Tests\\Feature\\CartTest::test_unauthenticated_returns_401":0.003,"Tests\\Feature\\CartTest::test_cart_isolated_between_users":0.011,"Tests\\Feature\\DebugCartListTest::test_dump_cart_list_response":0.057,"Tests\\Feature\\ProductCostPriceTest::test_calc_actual_price_fixed_and_percent":0.001,"Tests\\Feature\\ProductCostPriceTest::test_calc_actual_price_edge_cases":0.001,"Tests\\Feature\\ProductCostPriceTest::test_admin_list_contains_cost_price_and_actual_price":0.009,"Tests\\Feature\\ProductCostPriceTest::test_mini_list_returns_actual_price_without_cost_price":0.045,"Tests\\Feature\\ProductCostPriceTest::test_create_product_with_cost_and_percent_pricing":0.008,"Tests\\Feature\\ProductCostPriceTest::test_create_percent_row_without_percent_fails":0.007,"Tests\\Feature\\ProductCostPriceTest::test_update_switches_fixed_to_percent":0.01,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_cost_only_notifies_percent_level_stores":0.01,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_percent_row_update":0.009,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_mixed_row_updates_cost_and_level":0.008,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_empty_row_rejected":0.006,"Tests\\Feature\\ProductCostPriceTest::test_price_matrix_includes_cost_and_percent_columns":0.007,"Tests\\Feature\\ProductCostPriceTest::test_mini_order_uses_actual_price_for_percent_row":0.007,"Tests\\Feature\\ProductCostPriceTest::test_mini_cart_uses_actual_price_for_percent_row":0.01,"Tests\\Feature\\PurchaseGenerateTest::test_generate_uses_min_actual_price_across_types":0.014,"Tests\\Feature\\ProductPriceTest::test_store_without_level_sees_products_without_price":0.045,"Tests\\Feature\\ProductPriceTest::test_unbound_user_can_browse_products_without_price_but_cannot_cart":0.009,"Tests\\Feature\\MiniAuthTest::test_login_issues_token_for_registered_user":0.01,"Tests\\Feature\\MiniAuthTest::test_login_rejects_unregistered_openid":0.002,"Tests\\Feature\\MiniAuthTest::test_register_binds_store_and_issues_token":0.009,"Tests\\Feature\\MiniAuthTest::test_register_rejects_unknown_store":0.002,"Tests\\Feature\\MiniAuthTest::test_register_rejects_duplicate_openid":0.003,"Tests\\Feature\\MiniStoreTest::test_info_returns_bound_store":0.005,"Tests\\Feature\\MiniStoreTest::test_update_info":0.054,"Tests\\Feature\\MiniStoreTest::test_update_info_ignores_readonly_fields":0.055,"Tests\\Feature\\MiniStoreTest::test_requires_bound_store":0.007,"Tests\\Feature\\MiniStoreTest::test_update_info_validates_length":0.084,"Tests\\Feature\\StoreOrderTest::test_container_update_recalculates_amounts":0.012,"Tests\\Feature\\StoreOrderTest::test_container_update_allowed_in_editable_statuses":0.022,"Tests\\Feature\\StoreOrderTest::test_container_update_rejected_in_other_statuses":0.019,"Tests\\Feature\\StoreOrderTest::test_container_update_heals_legacy_product_amount":0.02,"Tests\\Feature\\StoreOrderTest::test_container_update_validates_negative_numbers":0.014,"Tests\\Feature\\PurchaseGenerateTest::test_generate_without_accepted_orders_fails":0.052,"Tests\\Feature\\PurchaseGenerateTest::test_generate_with_selected_order_ids":0.103,"Tests\\Feature\\StoreOrderItemTest::test_place_order_snapshots_full_product_info":0.048,"Tests\\Feature\\StoreOrderItemTest::test_mini_detail_hides_cost_price":0.05,"Tests\\Feature\\StoreOrderItemTest::test_admin_detail_shows_cost_price_and_supplier":0.053,"Tests\\Feature\\StoreOrderItemTest::test_update_item_recalculates_order_totals":0.011,"Tests\\Feature\\StoreOrderItemTest::test_update_item_rejected_when_completed_or_cancelled":0.011,"Tests\\Feature\\StoreOrderItemTest::test_update_item_validates_negative_price":0.012,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_updates_snapshot_from_product":0.013,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_recalculates_percent_price_with_latest_cost":0.01,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_rejected_when_product_deleted":0.01,"Tests\\Feature\\StoreOrderItemTest::test_order_list_search_by_product_name":0.06,"Tests\\Feature\\StoreOrderTest::test_soft_delete_only_cancelled_orders":0.058,"Tests\\Feature\\StoreOrderTest::test_soft_delete_rejected_for_non_cancelled_orders":0.249,"Tests\\Feature\\StoreOrderTest::test_soft_delete_twice_rejected":0.053,"Tests\\Feature\\PurchaseEditTest::test_detail_returns_store_matrix":0.103,"Tests\\Feature\\PurchaseEditTest::test_update_cell_syncs_order_item_and_totals":0.101,"Tests\\Feature\\PurchaseEditTest::test_update_row_cost_syncs_all_order_items":0.103,"Tests\\Feature\\PurchaseEditTest::test_update_row_weight_distributed_by_quantity":0.032,"Tests\\Feature\\PurchaseEditTest::test_update_row_requires_at_least_one_field":0.099,"Tests\\Feature\\PurchaseEditTest::test_update_cell_rejects_negative_quantity":0.1,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_order_items_into_header":0.098,"Tests\\Feature\\ReconciliationTest::test_build_excludes_unfinished_orders":0.016,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_product_attributes":0.103,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_to_product_catalog":0.019,"Tests\\Feature\\PurchaseEditTest::test_cell_detail_returns_items_with_order_info":0.101,"Tests\\Feature\\PurchaseEditTest::test_cell_detail_rejects_missing_params":0.1,"Tests\\Feature\\PurchaseEditTest::test_update_cell_weight_cascades_totals":0.105,"Tests\\Feature\\PurchaseEditTest::test_cell_sync_refreshes_snapshot_and_cascades":0.012,"Tests\\Feature\\PurchaseEditTest::test_edits_rejected_when_purchase_completed":0.108,"Tests\\Feature\\PurchaseEditTest::test_update_row_does_not_touch_manual_weight":0.106,"Tests\\Feature\\PurchaseEditTest::test_store_summary_returns_aggregated_items":0.114,"Tests\\Feature\\PurchaseEditTest::test_store_summary_aggregates_multiple_orders_with_weighted_price":0.06,"Tests\\Feature\\PurchaseEditTest::test_store_summary_rejects_missing_or_invalid_params":0.101,"Tests\\Feature\\ExportTest::test_export_invalid_type_rejected":0.016,"Tests\\Feature\\ExportTest::test_export_missing_purchase_rejected":0.007,"Tests\\Feature\\PurchaseEditTest::test_detail_returns_container_summary":0.022,"Tests\\Feature\\PurchaseEditTest::test_update_container_syncs_order_amounts":0.018,"Tests\\Feature\\PurchaseEditTest::test_update_container_rejected_when_purchase_completed":0.018,"Tests\\Feature\\PurchaseEditTest::test_update_container_rejects_incomplete_or_foreign_orders":0.026,"Tests\\Feature\\PurchaseEditTest::test_update_container_validates_negative_and_duplicate_orders":0.018,"Tests\\Feature\\ProductCategoryTest::test_create_child_category_under_top_level":0.007,"Tests\\Feature\\ProductCategoryTest::test_create_category_under_second_level_rejected":0.007,"Tests\\Feature\\ProductCategoryTest::test_update_second_level_move_to_another_top":0.01,"Tests\\Feature\\ProductCategoryTest::test_update_parent_with_children_cannot_move_under_category":0.007,"Tests\\Feature\\ProductCategoryTest::test_update_with_missing_parent_rejected":0.008,"Tests\\Feature\\ProductCategoryTest::test_create_product_with_parent_category_rejected":0.008,"Tests\\Feature\\ProductCategoryTest::test_create_product_with_leaf_category_ok":0.008,"Tests\\Feature\\ProductCategoryTest::test_mini_categories_returns_all_enabled_categories":0.047,"Tests\\Feature\\MiniBillTest::test_bill_list_derives_pay_state_and_settlement_date":0.052,"Tests\\Feature\\MiniBillTest::test_bill_list_summary_aggregates_unpaid":0.06,"Tests\\Feature\\MiniBillTest::test_bill_list_payable_filter":0.055,"Tests\\Feature\\MiniBillTest::test_bill_list_filters_by_bill_date_range":0.084,"Tests\\Feature\\MiniBillTest::test_bill_data_isolated_between_stores":0.116,"Tests\\Feature\\MiniBillTest::test_bill_detail_outputs_bill_items_and_orders":0.092,"Tests\\Feature\\StoreOrderTest::test_order_list_outputs_status_name_and_item_preview":0.053,"Tests\\Feature\\StoreOrderTest::test_order_list_filters_by_order_date_range":0.058,"Tests\\Feature\\StoreOrderTest::test_order_list_rejects_invalid_filters":0.063,"Tests\\Feature\\BillExportTest::test_export_merges_items_across_bills":0.095,"Tests\\Feature\\BillExportTest::test_export_filters_by_root_category":0.053,"Tests\\Feature\\BillExportTest::test_export_empty_category_rejected":0.067,"Tests\\Feature\\BillExportTest::test_export_requires_export_permission":0.048,"Tests\\Feature\\BillExportTest::test_export_invalid_ids_rejected":0.01,"Tests\\Feature\\DebugPermissionTest::test_debug_permission":0.098,"Tests\\Feature\\BillExportTest::test_mini_export_scoped_to_bound_store":0.014,"Tests\\Feature\\BillExportTest::test_mini_export_requires_store_binding":0.005,"Tests\\Feature\\MiniNoticeTest::test_notice_list_includes_personal_and_broadcast":0.053,"Tests\\Feature\\MiniNoticeTest::test_broadcast_read_creates_personal_copy":0.067,"Tests\\Feature\\MiniNoticeTest::test_personal_notice_read_marks_directly":0.056,"Tests\\Feature\\MiniNoticeTest::test_other_users_notice_not_found":0.007,"Tests\\Feature\\StoreOrderTest::test_manual_status_flow_only_accept_and_cancel":0.101,"Tests\\Feature\\StoreOrderTest::test_manual_status_flow_rejects_delivery_and_completion":0.151,"Tests\\Feature\\StoreOrderTest::test_batch_status_only_accept_and_cancel":0.101,"Tests\\Feature\\BillPaymentTest::test_order_status_progresses_via_business_chain":0.06,"Tests\\Feature\\BillPaymentTest::test_manual_pay_accumulates_store_total_purchase_amount":0.066,"Tests\\Feature\\BillPaymentTest::test_payment_audit_pass_accumulates_store_total_purchase_amount":0.052,"Tests\\Feature\\BillPaymentTest::test_payment_audit_reject_does_not_accumulate":0.049,"Tests\\Feature\\MiniProductTest::test_product_detail_guest_sees_null_price":0.05,"Tests\\Feature\\MiniProductTest::test_product_detail_store_user_sees_level_price":0.006,"Tests\\Feature\\MiniProductTest::test_product_detail_percent_price_calculated_from_cost":0.046,"Tests\\Feature\\MiniProductTest::test_product_detail_off_shelf_or_missing_rejected":0.058,"Tests\\Feature\\MiniProductTest::test_product_list_store_user_sees_level_price":0.005,"Tests\\Feature\\MiniProductTest::test_product_list_guest_sees_null_price":0.049,"Tests\\Feature\\BillPaymentTest::test_admin_order_list_and_detail_show_bill_info":0.07,"Tests\\Feature\\BillPaymentTest::test_payment_detail_returns_voucher_urls":0.054,"Tests\\Feature\\StoreOrderTest::test_order_list_preview_includes_image_spec_and_unit":0.049,"Tests\\Feature\\ContainerReturnTest::test_press_containers_adds_amount_and_writes_record":0.068,"Tests\\Feature\\ContainerReturnTest::test_return_containers_deducts_amount":0.074,"Tests\\Feature\\ContainerReturnTest::test_mixed_sign_containers":0.077,"Tests\\Feature\\ContainerReturnTest::test_zero_containers_writes_no_record":0.068,"Tests\\Feature\\ContainerReturnTest::test_non_integer_containers_rejected":0.048,"Tests\\Feature\\ContainerReturnTest::test_manual_create_and_delete_routes_removed":0.01,"Tests\\Feature\\ContainerReturnTest::test_export_matrix_merges_same_day_and_zero_fills":0.1,"Tests\\Feature\\ContainerReturnTest::test_export_filters_by_selected_stores":0.148,"Tests\\Feature\\ContainerReturnTest::test_export_invalid_params_rejected":0.017,"Tests\\Feature\\ContainerReturnTest::test_export_empty_range_rejected":0.011,"Tests\\Feature\\ContainerReturnTest::test_export_requires_export_permission":0.007,"Tests\\Feature\\DashboardTest::test_guest_cannot_access_dashboard":0.005,"Tests\\Feature\\DashboardTest::test_requires_dashboard_analysis_ability":0.006,"Tests\\Feature\\DashboardTest::test_empty_database_returns_zero_structure":0.014,"Tests\\Feature\\DashboardTest::test_overview_excludes_cancelled_orders":0.055,"Tests\\Feature\\DashboardTest::test_week_growth_rate":0.071,"Tests\\Feature\\DashboardTest::test_trend_covers_30_days_with_zero_filling":0.058,"Tests\\Feature\\DashboardTest::test_category_sales_grouped_by_category":0.077,"Tests\\Feature\\DashboardTest::test_top_products_aggregated_across_orders":0.063,"Tests\\Feature\\DashboardTest::test_top_stores_ranked_by_amount":0.121,"Tests\\Feature\\DashboardTest::test_purchase_amount_prefers_actual_over_estimate":0.009,"Tests\\Feature\\DashboardTest::test_recon_summary_and_receivable":0.059,"Tests\\Feature\\DashboardTest::test_latest_orders_limited_and_ordered":0.053,"Tests\\Feature\\DashboardTest::test_archives_count_active_records_only":0.152,"Tests\\Feature\\DashboardDebugTest::test_debug_ability_check":0.044,"Tests\\Feature\\DashboardDebugTest::test_debug":0.045,"Tests\\Feature\\ProductPriceTest::test_batch_price_updates_cost_and_notifies_all_stores":0.089,"Tests\\Feature\\ProductPriceTest::test_level_percent_update_notifies_level_stores":0.089,"Tests\\Feature\\ProductPriceTest::test_level_update_without_percent_change_sends_no_notice":0.048,"Tests\\Feature\\ProductPriceTest::test_level_percent_validation":0.01,"Tests\\Feature\\ProductCostPriceTest::test_calc_level_price":0.001,"Tests\\Feature\\ProductCostPriceTest::test_calc_level_price_edge_cases":0.001,"Tests\\Feature\\ProductCostPriceTest::test_admin_list_contains_cost_price_and_level_prices":0.011,"Tests\\Feature\\ProductCostPriceTest::test_create_product_with_cost_price":0.007,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_cost_row_update":0.05,"Tests\\Feature\\ProductCostPriceTest::test_price_matrix_includes_cost_and_level_price_columns":0.008,"Tests\\Feature\\ProductCostPriceTest::test_mini_order_uses_level_price":0.047,"Tests\\Feature\\ProductCostPriceTest::test_mini_cart_uses_level_price":0.049,"Tests\\Feature\\CartTest::test_store_level_missing_rejected":0.006,"Tests\\Feature\\StoreOrderTest::test_store_level_missing_rejected":0.047,"Tests\\Feature\\PurchaseEditTest::test_update_row_skips_catalog_sync_when_product_deleted":0.103,"Tests\\Feature\\PurchaseEditTest::test_store_item_add_creates_item_and_recalculates":0.104,"Tests\\Feature\\PurchaseEditTest::test_store_item_update_merges_multi_order_rows":0.06,"Tests\\Feature\\PurchaseEditTest::test_store_item_remove_deletes_and_recalculates":0.101,"Tests\\Feature\\StoreOrderItemTest::test_update_store_item_recalculates_totals":0.072,"Tests\\Feature\\StoreOrderItemTest::test_store_item_edits_rejected_when_purchase_completed":0.062,"Tests\\Feature\\StoreOrderItemTest::test_update_store_item_validates_negative_values":0.06,"Tests\\Feature\\StoreOrderItemTest::test_add_store_item_uses_level_percent_price":0.059,"Tests\\Feature\\StoreOrderItemTest::test_add_store_item_rejected_when_product_deleted":0.056,"Tests\\Feature\\ExportTest::test_export_lists_all_catalog_products_with_totals_row":0.135,"Tests\\Feature\\ExportTest::test_export_supplier_filter":0.114,"Tests\\Feature\\ExportTest::test_export_stores_multi_sheet":0.108,"Tests\\Feature\\ExportTest::test_export_stores_single_store":0.11,"Tests\\Feature\\ExportTest::test_export_stores_without_items_rejected":0.15,"Tests\\Feature\\ExportTest::test_export_suppliers_multi_sheet":0.128,"Tests\\Feature\\ExportTest::test_export_suppliers_single":0.132,"Tests\\Feature\\ExportTest::test_export_suppliers_without_items_rejected":0.124,"Tests\\Feature\\PurchaseEditTest::test_update_row_cost_change_reprices_items_by_store_level":0.104,"Tests\\Feature\\PurchaseEditTest::test_update_row_without_cost_change_keeps_item_price":0.104,"Tests\\Feature\\CartTest::test_update_other_stores_item_rejected":0.089,"Tests\\Feature\\CartTest::test_delete_other_stores_item_rejected":0.109,"Tests\\Feature\\CartTest::test_cart_isolated_between_stores":0.097,"Tests\\Feature\\MiniAuthTest::test_login_issues_token_for_valid_credentials":0.133,"Tests\\Feature\\MiniAuthTest::test_login_rejects_wrong_password":0.15,"Tests\\Feature\\MiniAuthTest::test_login_rejects_unknown_username":0.002,"Tests\\Feature\\MiniAuthTest::test_disabled_store_cannot_login":0.143,"Tests\\Feature\\MiniAuthTest::test_login_validates_required_params":0.002,"Tests\\Feature\\MiniAuthTest::test_login_token_accesses_protected_routes":0.15,"Tests\\Feature\\MiniAuthTest::test_set_password_succeeds":0.25,"Tests\\Feature\\MiniAuthTest::test_set_password_rejects_wrong_old_password":0.166,"Tests\\Feature\\MiniAuthTest::test_set_password_validates_confirmation":0.051,"Tests\\Feature\\BillExportTest::test_mini_export_scoped_to_own_store":0.094,"Tests\\Feature\\MiniNoticeTest::test_other_stores_notice_not_found":0.105,"Tests\\Feature\\MiniProductTest::test_product_detail_store_sees_level_price":0.053,"Tests\\Feature\\MiniProductTest::test_product_list_store_sees_level_price":0.045,"Tests\\Feature\\MiniStoreTest::test_info_returns_current_store":0.047,"Tests\\Feature\\MiniStoreTest::test_disabled_store_rejected":0.049,"Tests\\Feature\\ProductImportExportTest::test_export_downloads_all_products":0.008,"Tests\\Feature\\ProductImportExportTest::test_export_filters_by_category":0.008,"Tests\\Feature\\ProductImportExportTest::test_export_template_mode":0.006,"Tests\\Feature\\ProductImportExportTest::test_export_requires_permission":0.007,"Tests\\Feature\\ProductImportExportTest::test_import_creates_products_and_auto_supplier":0.037,"Tests\\Feature\\ProductImportExportTest::test_import_matches_existing_supplier":0.016,"Tests\\Feature\\ProductImportExportTest::test_import_errors_abort_all_rows":0.015,"Tests\\Feature\\ProductImportExportTest::test_import_category_path_resolution":0.028,"Tests\\Feature\\ProductImportExportTest::test_import_rejects_invalid_header":0.013,"Tests\\Feature\\ProductImportExportTest::test_import_requires_permission":0.012,"Tests\\Feature\\ProductImportExportTest::test_list_filters_by_market":0.007,"Tests\\Feature\\MiniReportTest::test_report_aggregates_total_and_item_percent":0.056,"Tests\\Feature\\MiniReportTest::test_report_accumulates_same_product_across_orders":0.063,"Tests\\Feature\\MiniReportTest::test_report_filters_by_custom_date_range":0.055,"Tests\\Feature\\MiniReportTest::test_report_excludes_cancelled_and_deleted_orders":0.059,"Tests\\Feature\\MiniReportTest::test_report_preset_month_and_last_month":0.056,"Tests\\Feature\\MiniReportTest::test_report_preset_week_and_last_week":0.053,"Tests\\Feature\\MiniReportTest::test_report_defaults_to_current_month":0.06,"Tests\\Feature\\MiniReportTest::test_report_data_isolated_between_stores":0.099,"Tests\\Feature\\MiniReportTest::test_report_empty_period_returns_zero":0.045,"Tests\\Feature\\MiniReportTest::test_report_validates_params":0.049,"Tests\\Feature\\ProductBatchDeleteTest::test_batch_delete_soft_deletes_selected_products":0.011,"Tests\\Feature\\ProductBatchDeleteTest::test_batch_delete_requires_non_empty_ids":0.013,"Tests\\Feature\\ProductBatchDeleteTest::test_batch_delete_forbidden_without_permission":0.008,"Tests\\Feature\\CartTest::test_place_order_clears_ordered_items_from_cart":0.067,"Tests\\Feature\\StoreOrderItemTest::test_admin_order_list_filters_by_order_date_range":0.064,"Tests\\Feature\\StoreOrderItemTest::test_admin_order_list_search_by_purchase_no":0.063,"Tests\\Feature\\ExportTest::test_export_suppliers_split_by_market":0.067,"Tests\\Feature\\BillPaymentTest::test_generate_bill_saves_after_sale_and_remark":0.116,"Tests\\Feature\\ProductCostPriceTest::test_product_price_unit_default_and_editable":0.013,"Tests\\Feature\\StoreOrderTest::test_place_order_blocked_by_overdue_unpaid_bill":0.055,"Tests\\Feature\\StoreOrderTest::test_place_order_allowed_within_payment_cycle":0.057,"Tests\\Feature\\CartTest::test_cart_summary_endpoint":0.053,"Tests\\Feature\\CartTest::test_cart_summary_requires_login":0.002,"Tests\\Feature\\MiniProductTest::test_product_list_appends_cart_quantity_and_summary":0.053,"Tests\\Feature\\MiniProductTest::test_product_list_guest_sees_zero_cart_fields":0.057,"Tests\\Feature\\MiniProductTest::test_product_detail_appends_cart_quantity":0.05,"Tests\\Feature\\MiniProductTest::test_home_appends_cart_summary":0.058,"Tests\\Feature\\MiniOnlinePaymentTest::test_sign_matches_document_example":0.002,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_online_payment_success":0.057,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_online_payment_validation":0.13,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_fails_when_code2session_fails":0.059,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_gateway_failure_releases_bills":0.056,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_settles_payment":0.054,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_rejects_invalid_messages":0.057,"Tests\\Feature\\MiniOnlinePaymentTest::test_query_syncs_gateway_status":0.064,"Tests\\Feature\\MiniOnlinePaymentTest::test_query_rejects_other_store_payment":0.096,"Tests\\Feature\\MiniOnlinePaymentTest::test_offline_payment_flow_unaffected":0.056,"Tests\\Feature\\BillPaymentTest::test_generate_bill_positive_after_sale_added_to_total":0.114,"Tests\\Feature\\BillPaymentTest::test_generate_bill_rejects_non_numeric_after_sale":0.048,"Tests\\Feature\\ClientSpecialTest::test_batch_add_creates_specials":0.015,"Tests\\Feature\\ClientSpecialTest::test_batch_add_skips_existing_products":0.01,"Tests\\Feature\\ClientSpecialTest::test_batch_add_requires_non_empty_product_ids":0.007,"Tests\\Feature\\ClientSpecialTest::test_batch_add_forbidden_without_permission":0.007,"Tests\\Feature\\ClientSpecialTest::test_query_filters_by_product_name_keyword":0.007,"Tests\\Feature\\ClientSpecialTest::test_update_changes_sort_and_status":0.006,"Tests\\Feature\\ClientSpecialTest::test_delete_and_batch_delete":0.016,"Tests\\Feature\\ClientSpecialTest::test_batch_delete_requires_non_empty_ids":0.011,"Tests\\Feature\\MiniSpecialTest::test_guest_sees_specials_with_null_price":0.045,"Tests\\Feature\\MiniSpecialTest::test_store_sees_level_price":0.046,"Tests\\Feature\\MiniSpecialTest::test_disabled_special_and_off_shelf_product_excluded":0.046,"Tests\\Feature\\MiniSpecialTest::test_specials_sorted_by_sort_asc":0.085,"Tests\\Feature\\MiniSpecialTest::test_cart_quantity_attached_for_store":0.047,"Tests\\Feature\\MiniOnlinePaymentTest::test_aes_encryption_matches_demo_golden":0.001,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_envelope_round_trip":0.004,"Tests\\Feature\\MiniOnlinePaymentTest::test_swapped_key_config_fails_with_clear_message":0.019,"Tests\\Feature\\MiniWechatPaymentTest::test_create_wechat_payment_success":0.057,"Tests\\Feature\\MiniWechatPaymentTest::test_create_wechat_payment_gateway_failure_releases_bills":0.053,"Tests\\Feature\\MiniWechatPaymentTest::test_wechat_notify_settles_payment":0.054,"Tests\\Feature\\MiniWechatPaymentTest::test_wechat_notify_rejects_invalid_messages":0.053,"Tests\\Feature\\MiniWechatPaymentTest::test_wechat_notify_with_platform_cert_validates_signature":0.068,"Tests\\Feature\\MiniWechatPaymentTest::test_wechat_query_syncs_status":0.066,"Tests\\Feature\\MiniWechatPaymentTest::test_wangpu_channel_remains_default":0.081,"Tests\\Feature\\BillPaymentTest::test_payment_config_returns_pay_methods":0.047,"Tests\\Feature\\MiniMpPaymentTest::test_mp_scene_wechat_channel":0.121,"Tests\\Feature\\MiniMpPaymentTest::test_mp_scene_wangpu_channel":0.066,"Tests\\Feature\\MiniMpPaymentTest::test_mp_scene_oauth_failure":0.078,"Tests\\Feature\\MiniMpPaymentTest::test_mp_scene_requires_mp_config":0.068,"Tests\\Feature\\MiniMpPaymentTest::test_default_scene_remains_mini":0.058,"Tests\\Feature\\MiniProductTest::test_product_list_ordered_by_category_tree":0.007,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_sign_matches_doc_golden":0.002,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_verify_rejects_bad_sign":0.005,"Tests\\Feature\\ExportTest::test_export_hides_detail_columns_by_default":0.106,"Tests\\Feature\\ExportTest::test_export_scope_includes_off_shelf_but_not_deleted":0.131,"Tests\\Unit\\WeightEstimatorTest::test_weight_unit_quantity_is_weight":0.001,"Tests\\Unit\\WeightEstimatorTest::test_spec_per_unit_weight":0.001,"Tests\\Unit\\WeightEstimatorTest::test_unparsable_spec_fallback":0,"Tests\\Feature\\StoreOrderTest::test_place_order_prefills_reference_weight":0.049,"Tests\\Feature\\PurchaseGenerateTest::test_generate_sums_reference_weight":0.057,"Tests\\Feature\\PurchaseEditTest::test_store_item_add_defaults_reference_weight":0.102,"Tests\\Feature\\StoreOrderTest::test_place_order_blocked_outside_order_time_window":0.055,"Tests\\Feature\\StoreOrderTest::test_place_order_cross_midnight_time_window":0.055,"Tests\\Feature\\StoreOrderTest::test_place_order_only_cutoff_time_and_invalid_config":0.054,"Tests\\Feature\\PurchaseEditTest::test_item_check_toggle_persists_and_echoes_in_detail":0.11,"Tests\\Feature\\PurchaseEditTest::test_item_check_allowed_when_purchase_completed":0.099,"Tests\\Feature\\PurchaseEditTest::test_item_check_toggle_validates_purchase_and_product":0.101,"Tests\\Feature\\PurchaseEditTest::test_item_check_batch_marks_and_clears":0.109,"Tests\\Feature\\PurchaseEditTest::test_item_check_batch_validates_and_ignores_unknown_products":0.103,"Tests\\Feature\\PurchaseEditTest::test_list_includes_bill_product_amount":0.108}} \ No newline at end of file +{"version":2,"defects":{"Tests\\Feature\\ProductPriceTest::test_product_list_returns_price_for_store_level":8,"Tests\\Feature\\ProductPriceTest::test_store_without_level_is_rejected":8,"Tests\\Feature\\ProductPriceTest::test_batch_price_updates_and_notifies_affected_stores":7,"Tests\\Feature\\ProductPriceTest::test_price_matrix_structure":8,"Tests\\Feature\\StoreOrderTest::test_place_order_snapshots_level_price_and_recalculates":8,"Tests\\Feature\\StoreOrderTest::test_client_supplied_amount_is_ignored":8,"Tests\\Feature\\StoreOrderTest::test_product_without_level_price_rejected":8,"Tests\\Feature\\StoreOrderTest::test_cancel_only_pending_orders":8,"Tests\\Feature\\StoreOrderTest::test_summarized_order_cannot_be_cancelled":8,"Tests\\Feature\\StoreOrderTest::test_order_data_isolated_between_stores":8,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_orders_by_product":7,"Tests\\Feature\\PurchaseGenerateTest::test_generate_writes_back_order_status":7,"Tests\\Feature\\PurchaseGenerateTest::test_generate_without_pending_orders_fails":8,"Tests\\Feature\\PurchaseGenerateTest::test_generate_is_idempotent":7,"Tests\\Feature\\AllocationTest::test_allocation_conserves_amount_with_tail_correction":7,"Tests\\Feature\\AllocationTest::test_allocation_follows_order_ratio":7,"Tests\\Feature\\AllocationTest::test_allocation_is_idempotent":7,"Tests\\Feature\\AllocationTest::test_allocation_rejected_without_actual_amount":8,"Tests\\Feature\\MiniAuthTest::test_login_creates_user_and_issues_token":7,"Tests\\Feature\\MiniAuthTest::test_phone_binding_matches_store":8,"Tests\\Feature\\MiniAuthTest::test_phone_no_match_stays_pending":8,"Tests\\Feature\\ExportTest::test_export_xlsx_with_encoded_chinese_filename":7,"Tests\\Feature\\CartTest::test_list_with_prices_amounts_and_totals":7,"Tests\\Feature\\CartTest::test_list_marks_off_shelf_item_unbuyable":7,"Tests\\Feature\\DebugCartListTest::test_dump_cart_list_response":5,"Tests\\Feature\\ProductCostPriceTest::test_create_product_with_cost_and_percent_pricing":7,"Tests\\Feature\\ProductCostPriceTest::test_create_percent_row_without_percent_fails":7,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_cost_only_notifies_percent_level_stores":7,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_empty_row_rejected":7,"Tests\\Feature\\MiniAuthTest::test_disabled_user_cannot_login":8,"Tests\\Feature\\MiniAuthTest::test_mini_token_cannot_access_admin_api":8,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_percent_row_update":7,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_mixed_row_updates_cost_and_level":7,"Tests\\Feature\\ReconciliationTest::test_build_creates_reconciliation_items":8,"Tests\\Feature\\ReconciliationTest::test_build_filters_by_supplier":8,"Tests\\Feature\\ReconciliationTest::test_update_item_recalculates_diff_and_header":8,"Tests\\Feature\\ReconciliationTest::test_toggle_reconciled_flag":8,"Tests\\Feature\\ReconciliationTest::test_settle_creates_settlements_per_store":8,"Tests\\Feature\\ProductCostPriceTest::test_mini_list_returns_actual_price_without_cost_price":8,"Tests\\Feature\\ProductCostPriceTest::test_mini_order_uses_actual_price_for_percent_row":8,"Tests\\Feature\\ProductCostPriceTest::test_mini_cart_uses_actual_price_for_percent_row":8,"Tests\\Feature\\StoreOrderTest::test_container_update_recalculates_amounts":8,"Tests\\Feature\\StoreOrderTest::test_container_update_allowed_in_editable_statuses":8,"Tests\\Feature\\StoreOrderTest::test_container_update_rejected_in_other_statuses":8,"Tests\\Feature\\StoreOrderTest::test_container_update_heals_legacy_product_amount":8,"Tests\\Feature\\StoreOrderTest::test_container_update_validates_negative_numbers":8,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_rejected_when_product_deleted":7,"Tests\\Feature\\StoreOrderItemTest::test_order_list_search_by_product_name":8,"Tests\\Feature\\PurchaseEditTest::test_detail_returns_store_matrix":7,"Tests\\Feature\\PurchaseEditTest::test_update_cell_syncs_order_item_and_totals":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_cost_syncs_all_order_items":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_weight_distributed_by_quantity":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_product_attributes":7,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_order_items_into_header":7,"Tests\\Feature\\ExportTest::test_export_category_filters_to_vegetables":7,"Tests\\Feature\\ExportTest::test_export_pdf":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_does_not_touch_manual_weight":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_to_product_catalog":7,"Tests\\Feature\\PurchaseEditTest::test_update_cell_weight_cascades_totals":7,"Tests\\Feature\\PurchaseEditTest::test_cell_sync_refreshes_snapshot_and_cascades":7,"Tests\\Feature\\PurchaseEditTest::test_edits_rejected_when_purchase_completed":7,"Tests\\Feature\\StoreOrderItemTest::test_update_item_recalculates_order_totals":7,"Tests\\Feature\\StoreOrderItemTest::test_update_item_validates_negative_price":7,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_updates_snapshot_from_product":7,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_recalculates_percent_price_with_latest_cost":7,"Tests\\Feature\\PurchaseEditTest::test_cell_detail_returns_items_with_order_info":8,"Tests\\Feature\\ProductCategoryTest::test_create_product_with_leaf_category_ok":7,"Tests\\Feature\\BillExportTest::test_export_filters_by_root_category":8,"Tests\\Feature\\BillExportTest::test_export_requires_export_permission":8,"Tests\\Feature\\DebugPermissionTest::test_debug_permission":8,"Tests\\Feature\\BillPaymentTest::test_order_status_progresses_via_business_chain":7,"Tests\\Feature\\BillPaymentTest::test_payment_audit_reject_does_not_accumulate":7,"Tests\\Feature\\BillPaymentTest::test_payment_detail_returns_voucher_urls":8,"Tests\\Feature\\ContainerReturnTest::test_press_containers_adds_amount_and_writes_record":7,"Tests\\Feature\\ContainerReturnTest::test_return_containers_deducts_amount":7,"Tests\\Feature\\ContainerReturnTest::test_mixed_sign_containers":7,"Tests\\Feature\\ContainerReturnTest::test_zero_containers_writes_no_record":7,"Tests\\Feature\\StoreOrderTest::test_order_list_outputs_status_name_and_item_preview":7,"Tests\\Feature\\DashboardTest::test_requires_dashboard_analysis_ability":7,"Tests\\Feature\\DashboardTest::test_recon_summary_and_receivable":8,"Tests\\Feature\\DashboardDebugTest::test_debug":8,"Tests\\Feature\\StoreOrderItemTest::test_place_order_snapshots_full_product_info":8,"Tests\\Feature\\StoreOrderItemTest::test_mini_detail_hides_cost_price":8,"Tests\\Feature\\StoreOrderItemTest::test_admin_detail_shows_cost_price_and_supplier":8,"Tests\\Feature\\StoreOrderItemTest::test_update_item_rejected_when_completed_or_cancelled":8,"Tests\\Feature\\StoreOrderItemTest::test_add_store_item_uses_level_percent_price":8,"Tests\\Feature\\ExportTest::test_export_suppliers_multi_sheet":7,"Tests\\Feature\\PurchaseEditTest::test_update_row_skips_catalog_sync_when_product_deleted":7,"Tests\\Feature\\ProductImportExportTest::test_export_filters_by_category":8,"Tests\\Feature\\ProductImportExportTest::test_import_creates_products_and_auto_supplier":7,"Tests\\Feature\\ProductImportExportTest::test_import_matches_existing_supplier":7,"Tests\\Feature\\ProductImportExportTest::test_import_errors_abort_all_rows":7,"Tests\\Feature\\ProductImportExportTest::test_import_category_path_resolution":7,"Tests\\Feature\\MiniReportTest::test_report_accumulates_same_product_across_orders":7,"Tests\\Feature\\ExportTest::test_export_suppliers_split_by_market":7,"Tests\\Feature\\MiniOnlinePaymentTest::test_query_syncs_gateway_status":7,"Tests\\Feature\\MiniSpecialTest::test_cart_quantity_attached_for_store":8,"Tests\\Feature\\MiniWechatPaymentTest::test_create_wechat_payment_success":7,"Tests\\Feature\\ExportTest::test_export_lists_all_catalog_products_with_totals_row":7,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_online_payment_success":7,"Tests\\Feature\\MiniMpPaymentTest::test_mp_scene_wechat_channel":8,"Tests\\Feature\\MiniMpPaymentTest::test_default_scene_remains_mini":7,"Tests\\Feature\\MiniProductTest::test_product_list_ordered_by_category_tree":7,"Tests\\Feature\\PurchaseEditTest::test_list_includes_bill_product_amount":7},"times":{"Tests\\Feature\\ExampleTest::test_the_application_returns_a_successful_response":0.008,"Tests\\Feature\\ProductPriceTest::test_product_list_returns_price_for_store_level":0.104,"Tests\\Feature\\ProductPriceTest::test_store_without_level_is_rejected":0.007,"Tests\\Feature\\ProductPriceTest::test_batch_price_updates_and_notifies_affected_stores":0.01,"Tests\\Feature\\ProductPriceTest::test_price_matrix_structure":0.007,"Tests\\Feature\\StoreOrderTest::test_place_order_snapshots_level_price_and_recalculates":0.049,"Tests\\Feature\\StoreOrderTest::test_client_supplied_amount_is_ignored":0.049,"Tests\\Feature\\StoreOrderTest::test_product_without_level_price_rejected":0.007,"Tests\\Feature\\StoreOrderTest::test_cancel_only_pending_orders":0.065,"Tests\\Feature\\StoreOrderTest::test_summarized_order_cannot_be_cancelled":0.058,"Tests\\Feature\\StoreOrderTest::test_order_data_isolated_between_stores":0.097,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_orders_by_product":0.028,"Tests\\Feature\\PurchaseGenerateTest::test_generate_writes_back_order_status":0.11,"Tests\\Feature\\PurchaseGenerateTest::test_generate_without_pending_orders_fails":0.006,"Tests\\Feature\\PurchaseGenerateTest::test_generate_is_idempotent":0.116,"Tests\\Feature\\AllocationTest::test_allocation_conserves_amount_with_tail_correction":0.076,"Tests\\Feature\\AllocationTest::test_allocation_follows_order_ratio":0.022,"Tests\\Feature\\AllocationTest::test_allocation_is_idempotent":0.028,"Tests\\Feature\\AllocationTest::test_allocation_rejected_without_actual_amount":0.021,"Tests\\Feature\\DebugGenerateTest::test_debug_generate":0.047,"Tests\\Feature\\ReconciliationTest::test_build_creates_reconciliation_items":0.019,"Tests\\Feature\\ReconciliationTest::test_build_filters_by_supplier":0.022,"Tests\\Feature\\ReconciliationTest::test_update_item_recalculates_diff_and_header":0.019,"Tests\\Feature\\ReconciliationTest::test_toggle_reconciled_flag":0.02,"Tests\\Feature\\ReconciliationTest::test_settle_creates_settlements_per_store":0.036,"Tests\\Feature\\StatementTest::test_generate_snapshots_payment_cycle":0.011,"Tests\\Feature\\StatementTest::test_statement_isolated_between_stores":0.013,"Tests\\Feature\\StatementTest::test_generate_excludes_cancelled_and_used_items":0.016,"Tests\\Feature\\MiniAuthTest::test_login_creates_user_and_issues_token":0.056,"Tests\\Feature\\MiniAuthTest::test_disabled_user_cannot_login":0.003,"Tests\\Feature\\MiniAuthTest::test_phone_binding_matches_store":0.005,"Tests\\Feature\\MiniAuthTest::test_phone_no_match_stays_pending":0.001,"Tests\\Feature\\MiniAuthTest::test_sys_token_cannot_access_mini":0.006,"Tests\\Feature\\MiniAuthTest::test_mini_token_cannot_access_admin_api":0.075,"Tests\\Feature\\ExportTest::test_export_xlsx_with_encoded_chinese_filename":0.104,"Tests\\Feature\\ExportTest::test_export_category_filters_to_vegetables":0.017,"Tests\\Feature\\ExportTest::test_export_pdf":0.015,"Tests\\Feature\\ExportTest::test_export_invalid_format_rejected":0.016,"Tests\\Feature\\ExportTest::test_export_requires_export_permission":0.072,"Tests\\Unit\\ExampleTest::test_that_true_is_true":0.001,"Tests\\Feature\\MiniAuthTest::test_login_fails_when_wechat_rejects_code":0.003,"Tests\\Feature\\CartTest::test_add_to_cart_succeeds":0.046,"Tests\\Feature\\CartTest::test_duplicate_add_merges_quantity":0.048,"Tests\\Feature\\CartTest::test_off_shelf_product_rejected":0.046,"Tests\\Feature\\CartTest::test_soft_deleted_product_rejected":0.008,"Tests\\Feature\\CartTest::test_product_without_level_price_rejected":0.006,"Tests\\Feature\\CartTest::test_unbound_user_rejected":0.006,"Tests\\Feature\\CartTest::test_store_without_level_rejected":0.088,"Tests\\Feature\\CartTest::test_list_with_prices_amounts_and_totals":0.052,"Tests\\Feature\\CartTest::test_list_marks_off_shelf_item_unbuyable":0.05,"Tests\\Feature\\CartTest::test_empty_cart_returns_empty_items":0.045,"Tests\\Feature\\CartTest::test_update_quantity":0.048,"Tests\\Feature\\CartTest::test_update_other_users_item_rejected":0.009,"Tests\\Feature\\CartTest::test_update_missing_item_rejected":0.048,"Tests\\Feature\\CartTest::test_invalid_quantity_rejected":0.048,"Tests\\Feature\\CartTest::test_delete_item":0.047,"Tests\\Feature\\CartTest::test_delete_other_users_item_rejected":0.009,"Tests\\Feature\\CartTest::test_clear_only_own_cart":0.095,"Tests\\Feature\\CartTest::test_unauthenticated_returns_401":0.002,"Tests\\Feature\\CartTest::test_cart_isolated_between_users":0.011,"Tests\\Feature\\DebugCartListTest::test_dump_cart_list_response":0.057,"Tests\\Feature\\ProductCostPriceTest::test_calc_actual_price_fixed_and_percent":0.001,"Tests\\Feature\\ProductCostPriceTest::test_calc_actual_price_edge_cases":0.001,"Tests\\Feature\\ProductCostPriceTest::test_admin_list_contains_cost_price_and_actual_price":0.009,"Tests\\Feature\\ProductCostPriceTest::test_mini_list_returns_actual_price_without_cost_price":0.059,"Tests\\Feature\\ProductCostPriceTest::test_create_product_with_cost_and_percent_pricing":0.008,"Tests\\Feature\\ProductCostPriceTest::test_create_percent_row_without_percent_fails":0.007,"Tests\\Feature\\ProductCostPriceTest::test_update_switches_fixed_to_percent":0.01,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_cost_only_notifies_percent_level_stores":0.01,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_percent_row_update":0.009,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_mixed_row_updates_cost_and_level":0.008,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_empty_row_rejected":0.011,"Tests\\Feature\\ProductCostPriceTest::test_price_matrix_includes_cost_and_percent_columns":0.007,"Tests\\Feature\\ProductCostPriceTest::test_mini_order_uses_actual_price_for_percent_row":0.007,"Tests\\Feature\\ProductCostPriceTest::test_mini_cart_uses_actual_price_for_percent_row":0.01,"Tests\\Feature\\PurchaseGenerateTest::test_generate_uses_min_actual_price_across_types":0.014,"Tests\\Feature\\ProductPriceTest::test_store_without_level_sees_products_without_price":0.052,"Tests\\Feature\\ProductPriceTest::test_unbound_user_can_browse_products_without_price_but_cannot_cart":0.009,"Tests\\Feature\\MiniAuthTest::test_login_issues_token_for_registered_user":0.01,"Tests\\Feature\\MiniAuthTest::test_login_rejects_unregistered_openid":0.002,"Tests\\Feature\\MiniAuthTest::test_register_binds_store_and_issues_token":0.009,"Tests\\Feature\\MiniAuthTest::test_register_rejects_unknown_store":0.002,"Tests\\Feature\\MiniAuthTest::test_register_rejects_duplicate_openid":0.003,"Tests\\Feature\\MiniStoreTest::test_info_returns_bound_store":0.005,"Tests\\Feature\\MiniStoreTest::test_update_info":0.048,"Tests\\Feature\\MiniStoreTest::test_update_info_ignores_readonly_fields":0.05,"Tests\\Feature\\MiniStoreTest::test_requires_bound_store":0.007,"Tests\\Feature\\MiniStoreTest::test_update_info_validates_length":0.049,"Tests\\Feature\\StoreOrderTest::test_container_update_recalculates_amounts":0.012,"Tests\\Feature\\StoreOrderTest::test_container_update_allowed_in_editable_statuses":0.022,"Tests\\Feature\\StoreOrderTest::test_container_update_rejected_in_other_statuses":0.019,"Tests\\Feature\\StoreOrderTest::test_container_update_heals_legacy_product_amount":0.02,"Tests\\Feature\\StoreOrderTest::test_container_update_validates_negative_numbers":0.014,"Tests\\Feature\\PurchaseGenerateTest::test_generate_without_accepted_orders_fails":0.066,"Tests\\Feature\\PurchaseGenerateTest::test_generate_with_selected_order_ids":0.115,"Tests\\Feature\\StoreOrderItemTest::test_place_order_snapshots_full_product_info":0.054,"Tests\\Feature\\StoreOrderItemTest::test_mini_detail_hides_cost_price":0.054,"Tests\\Feature\\StoreOrderItemTest::test_admin_detail_shows_cost_price_and_supplier":0.053,"Tests\\Feature\\StoreOrderItemTest::test_update_item_recalculates_order_totals":0.011,"Tests\\Feature\\StoreOrderItemTest::test_update_item_rejected_when_completed_or_cancelled":0.011,"Tests\\Feature\\StoreOrderItemTest::test_update_item_validates_negative_price":0.012,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_updates_snapshot_from_product":0.013,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_recalculates_percent_price_with_latest_cost":0.01,"Tests\\Feature\\StoreOrderItemTest::test_sync_item_rejected_when_product_deleted":0.01,"Tests\\Feature\\StoreOrderItemTest::test_order_list_search_by_product_name":0.063,"Tests\\Feature\\StoreOrderTest::test_soft_delete_only_cancelled_orders":0.071,"Tests\\Feature\\StoreOrderTest::test_soft_delete_rejected_for_non_cancelled_orders":0.291,"Tests\\Feature\\StoreOrderTest::test_soft_delete_twice_rejected":0.056,"Tests\\Feature\\PurchaseEditTest::test_detail_returns_store_matrix":0.104,"Tests\\Feature\\PurchaseEditTest::test_update_cell_syncs_order_item_and_totals":0.13,"Tests\\Feature\\PurchaseEditTest::test_update_row_cost_syncs_all_order_items":0.135,"Tests\\Feature\\PurchaseEditTest::test_update_row_weight_distributed_by_quantity":0.032,"Tests\\Feature\\PurchaseEditTest::test_update_row_requires_at_least_one_field":0.115,"Tests\\Feature\\PurchaseEditTest::test_update_cell_rejects_negative_quantity":0.14,"Tests\\Feature\\PurchaseGenerateTest::test_generate_aggregates_order_items_into_header":0.141,"Tests\\Feature\\ReconciliationTest::test_build_excludes_unfinished_orders":0.016,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_product_attributes":0.112,"Tests\\Feature\\PurchaseEditTest::test_update_row_syncs_to_product_catalog":0.019,"Tests\\Feature\\PurchaseEditTest::test_cell_detail_returns_items_with_order_info":0.143,"Tests\\Feature\\PurchaseEditTest::test_cell_detail_rejects_missing_params":0.124,"Tests\\Feature\\PurchaseEditTest::test_update_cell_weight_cascades_totals":0.146,"Tests\\Feature\\PurchaseEditTest::test_cell_sync_refreshes_snapshot_and_cascades":0.012,"Tests\\Feature\\PurchaseEditTest::test_edits_rejected_when_purchase_completed":0.11,"Tests\\Feature\\PurchaseEditTest::test_update_row_does_not_touch_manual_weight":0.135,"Tests\\Feature\\PurchaseEditTest::test_store_summary_returns_aggregated_items":0.123,"Tests\\Feature\\PurchaseEditTest::test_store_summary_aggregates_multiple_orders_with_weighted_price":0.08,"Tests\\Feature\\PurchaseEditTest::test_store_summary_rejects_missing_or_invalid_params":0.116,"Tests\\Feature\\ExportTest::test_export_invalid_type_rejected":0.016,"Tests\\Feature\\ExportTest::test_export_missing_purchase_rejected":0.009,"Tests\\Feature\\PurchaseEditTest::test_detail_returns_container_summary":0.022,"Tests\\Feature\\PurchaseEditTest::test_update_container_syncs_order_amounts":0.018,"Tests\\Feature\\PurchaseEditTest::test_update_container_rejected_when_purchase_completed":0.018,"Tests\\Feature\\PurchaseEditTest::test_update_container_rejects_incomplete_or_foreign_orders":0.026,"Tests\\Feature\\PurchaseEditTest::test_update_container_validates_negative_and_duplicate_orders":0.018,"Tests\\Feature\\ProductCategoryTest::test_create_child_category_under_top_level":0.011,"Tests\\Feature\\ProductCategoryTest::test_create_category_under_second_level_rejected":0.02,"Tests\\Feature\\ProductCategoryTest::test_update_second_level_move_to_another_top":0.007,"Tests\\Feature\\ProductCategoryTest::test_update_parent_with_children_cannot_move_under_category":0.009,"Tests\\Feature\\ProductCategoryTest::test_update_with_missing_parent_rejected":0.007,"Tests\\Feature\\ProductCategoryTest::test_create_product_with_parent_category_rejected":0.011,"Tests\\Feature\\ProductCategoryTest::test_create_product_with_leaf_category_ok":0.011,"Tests\\Feature\\ProductCategoryTest::test_mini_categories_returns_all_enabled_categories":0.079,"Tests\\Feature\\MiniBillTest::test_bill_list_derives_pay_state_and_settlement_date":0.077,"Tests\\Feature\\MiniBillTest::test_bill_list_summary_aggregates_unpaid":0.055,"Tests\\Feature\\MiniBillTest::test_bill_list_payable_filter":0.056,"Tests\\Feature\\MiniBillTest::test_bill_list_filters_by_bill_date_range":0.051,"Tests\\Feature\\MiniBillTest::test_bill_data_isolated_between_stores":0.11,"Tests\\Feature\\MiniBillTest::test_bill_detail_outputs_bill_items_and_orders":0.052,"Tests\\Feature\\StoreOrderTest::test_order_list_outputs_status_name_and_item_preview":0.07,"Tests\\Feature\\StoreOrderTest::test_order_list_filters_by_order_date_range":0.077,"Tests\\Feature\\StoreOrderTest::test_order_list_rejects_invalid_filters":0.07,"Tests\\Feature\\BillExportTest::test_export_merges_items_across_bills":0.097,"Tests\\Feature\\BillExportTest::test_export_filters_by_root_category":0.051,"Tests\\Feature\\BillExportTest::test_export_empty_category_rejected":0.067,"Tests\\Feature\\BillExportTest::test_export_requires_export_permission":0.049,"Tests\\Feature\\BillExportTest::test_export_invalid_ids_rejected":0.009,"Tests\\Feature\\DebugPermissionTest::test_debug_permission":0.098,"Tests\\Feature\\BillExportTest::test_mini_export_scoped_to_bound_store":0.014,"Tests\\Feature\\BillExportTest::test_mini_export_requires_store_binding":0.005,"Tests\\Feature\\MiniNoticeTest::test_notice_list_includes_personal_and_broadcast":0.069,"Tests\\Feature\\MiniNoticeTest::test_broadcast_read_creates_personal_copy":0.061,"Tests\\Feature\\MiniNoticeTest::test_personal_notice_read_marks_directly":0.055,"Tests\\Feature\\MiniNoticeTest::test_other_users_notice_not_found":0.007,"Tests\\Feature\\StoreOrderTest::test_manual_status_flow_only_accept_and_cancel":0.108,"Tests\\Feature\\StoreOrderTest::test_manual_status_flow_rejects_delivery_and_completion":0.157,"Tests\\Feature\\StoreOrderTest::test_batch_status_only_accept_and_cancel":0.128,"Tests\\Feature\\BillPaymentTest::test_order_status_progresses_via_business_chain":0.058,"Tests\\Feature\\BillPaymentTest::test_manual_pay_accumulates_store_total_purchase_amount":0.067,"Tests\\Feature\\BillPaymentTest::test_payment_audit_pass_accumulates_store_total_purchase_amount":0.053,"Tests\\Feature\\BillPaymentTest::test_payment_audit_reject_does_not_accumulate":0.049,"Tests\\Feature\\MiniProductTest::test_product_detail_guest_sees_null_price":0.058,"Tests\\Feature\\MiniProductTest::test_product_detail_store_user_sees_level_price":0.006,"Tests\\Feature\\MiniProductTest::test_product_detail_percent_price_calculated_from_cost":0.053,"Tests\\Feature\\MiniProductTest::test_product_detail_off_shelf_or_missing_rejected":0.055,"Tests\\Feature\\MiniProductTest::test_product_list_store_user_sees_level_price":0.005,"Tests\\Feature\\MiniProductTest::test_product_list_guest_sees_null_price":0.065,"Tests\\Feature\\BillPaymentTest::test_admin_order_list_and_detail_show_bill_info":0.074,"Tests\\Feature\\BillPaymentTest::test_payment_detail_returns_voucher_urls":0.051,"Tests\\Feature\\StoreOrderTest::test_order_list_preview_includes_image_spec_and_unit":0.085,"Tests\\Feature\\ContainerReturnTest::test_press_containers_adds_amount_and_writes_record":0.086,"Tests\\Feature\\ContainerReturnTest::test_return_containers_deducts_amount":0.069,"Tests\\Feature\\ContainerReturnTest::test_mixed_sign_containers":0.073,"Tests\\Feature\\ContainerReturnTest::test_zero_containers_writes_no_record":0.081,"Tests\\Feature\\ContainerReturnTest::test_non_integer_containers_rejected":0.054,"Tests\\Feature\\ContainerReturnTest::test_manual_create_and_delete_routes_removed":0.006,"Tests\\Feature\\ContainerReturnTest::test_export_matrix_merges_same_day_and_zero_fills":0.104,"Tests\\Feature\\ContainerReturnTest::test_export_filters_by_selected_stores":0.157,"Tests\\Feature\\ContainerReturnTest::test_export_invalid_params_rejected":0.01,"Tests\\Feature\\ContainerReturnTest::test_export_empty_range_rejected":0.012,"Tests\\Feature\\ContainerReturnTest::test_export_requires_export_permission":0.013,"Tests\\Feature\\DashboardTest::test_guest_cannot_access_dashboard":0.002,"Tests\\Feature\\DashboardTest::test_requires_dashboard_analysis_ability":0.006,"Tests\\Feature\\DashboardTest::test_empty_database_returns_zero_structure":0.013,"Tests\\Feature\\DashboardTest::test_overview_excludes_cancelled_orders":0.061,"Tests\\Feature\\DashboardTest::test_week_growth_rate":0.079,"Tests\\Feature\\DashboardTest::test_trend_covers_30_days_with_zero_filling":0.069,"Tests\\Feature\\DashboardTest::test_category_sales_grouped_by_category":0.053,"Tests\\Feature\\DashboardTest::test_top_products_aggregated_across_orders":0.059,"Tests\\Feature\\DashboardTest::test_top_stores_ranked_by_amount":0.112,"Tests\\Feature\\DashboardTest::test_purchase_amount_prefers_actual_over_estimate":0.01,"Tests\\Feature\\DashboardTest::test_recon_summary_and_receivable":0.079,"Tests\\Feature\\DashboardTest::test_latest_orders_limited_and_ordered":0.066,"Tests\\Feature\\DashboardTest::test_archives_count_active_records_only":0.149,"Tests\\Feature\\DashboardDebugTest::test_debug_ability_check":0.044,"Tests\\Feature\\DashboardDebugTest::test_debug":0.045,"Tests\\Feature\\ProductPriceTest::test_batch_price_updates_cost_and_notifies_all_stores":0.13,"Tests\\Feature\\ProductPriceTest::test_level_percent_update_notifies_level_stores":0.121,"Tests\\Feature\\ProductPriceTest::test_level_update_without_percent_change_sends_no_notice":0.053,"Tests\\Feature\\ProductPriceTest::test_level_percent_validation":0.008,"Tests\\Feature\\ProductCostPriceTest::test_calc_level_price":0.001,"Tests\\Feature\\ProductCostPriceTest::test_calc_level_price_edge_cases":0.001,"Tests\\Feature\\ProductCostPriceTest::test_admin_list_contains_cost_price_and_level_prices":0.007,"Tests\\Feature\\ProductCostPriceTest::test_create_product_with_cost_price":0.007,"Tests\\Feature\\ProductCostPriceTest::test_batch_price_cost_row_update":0.053,"Tests\\Feature\\ProductCostPriceTest::test_price_matrix_includes_cost_and_level_price_columns":0.027,"Tests\\Feature\\ProductCostPriceTest::test_mini_order_uses_level_price":0.061,"Tests\\Feature\\ProductCostPriceTest::test_mini_cart_uses_level_price":0.051,"Tests\\Feature\\CartTest::test_store_level_missing_rejected":0.006,"Tests\\Feature\\StoreOrderTest::test_store_level_missing_rejected":0.05,"Tests\\Feature\\PurchaseEditTest::test_update_row_skips_catalog_sync_when_product_deleted":0.105,"Tests\\Feature\\PurchaseEditTest::test_store_item_add_creates_item_and_recalculates":0.14,"Tests\\Feature\\PurchaseEditTest::test_store_item_update_merges_multi_order_rows":0.11,"Tests\\Feature\\PurchaseEditTest::test_store_item_remove_deletes_and_recalculates":0.117,"Tests\\Feature\\StoreOrderItemTest::test_update_store_item_recalculates_totals":0.059,"Tests\\Feature\\StoreOrderItemTest::test_store_item_edits_rejected_when_purchase_completed":0.073,"Tests\\Feature\\StoreOrderItemTest::test_update_store_item_validates_negative_values":0.081,"Tests\\Feature\\StoreOrderItemTest::test_add_store_item_uses_level_percent_price":0.079,"Tests\\Feature\\StoreOrderItemTest::test_add_store_item_rejected_when_product_deleted":0.067,"Tests\\Feature\\ExportTest::test_export_lists_all_catalog_products_with_totals_row":0.12,"Tests\\Feature\\ExportTest::test_export_supplier_filter":0.148,"Tests\\Feature\\ExportTest::test_export_stores_multi_sheet":0.127,"Tests\\Feature\\ExportTest::test_export_stores_single_store":0.145,"Tests\\Feature\\ExportTest::test_export_stores_without_items_rejected":0.179,"Tests\\Feature\\ExportTest::test_export_suppliers_multi_sheet":0.208,"Tests\\Feature\\ExportTest::test_export_suppliers_single":0.115,"Tests\\Feature\\ExportTest::test_export_suppliers_without_items_rejected":0.138,"Tests\\Feature\\PurchaseEditTest::test_update_row_cost_change_reprices_items_by_store_level":0.151,"Tests\\Feature\\PurchaseEditTest::test_update_row_without_cost_change_keeps_item_price":0.144,"Tests\\Feature\\CartTest::test_update_other_stores_item_rejected":0.088,"Tests\\Feature\\CartTest::test_delete_other_stores_item_rejected":0.091,"Tests\\Feature\\CartTest::test_cart_isolated_between_stores":0.108,"Tests\\Feature\\MiniAuthTest::test_login_issues_token_for_valid_credentials":0.176,"Tests\\Feature\\MiniAuthTest::test_login_rejects_wrong_password":0.13,"Tests\\Feature\\MiniAuthTest::test_login_rejects_unknown_username":0.006,"Tests\\Feature\\MiniAuthTest::test_disabled_store_cannot_login":0.124,"Tests\\Feature\\MiniAuthTest::test_login_validates_required_params":0.002,"Tests\\Feature\\MiniAuthTest::test_login_token_accesses_protected_routes":0.138,"Tests\\Feature\\MiniAuthTest::test_set_password_succeeds":0.234,"Tests\\Feature\\MiniAuthTest::test_set_password_rejects_wrong_old_password":0.146,"Tests\\Feature\\MiniAuthTest::test_set_password_validates_confirmation":0.054,"Tests\\Feature\\BillExportTest::test_mini_export_scoped_to_own_store":0.092,"Tests\\Feature\\MiniNoticeTest::test_other_stores_notice_not_found":0.096,"Tests\\Feature\\MiniProductTest::test_product_detail_store_sees_level_price":0.063,"Tests\\Feature\\MiniProductTest::test_product_list_store_sees_level_price":0.059,"Tests\\Feature\\MiniStoreTest::test_info_returns_current_store":0.059,"Tests\\Feature\\MiniStoreTest::test_disabled_store_rejected":0.053,"Tests\\Feature\\ProductImportExportTest::test_export_downloads_all_products":0.008,"Tests\\Feature\\ProductImportExportTest::test_export_filters_by_category":0.012,"Tests\\Feature\\ProductImportExportTest::test_export_template_mode":0.013,"Tests\\Feature\\ProductImportExportTest::test_export_requires_permission":0.008,"Tests\\Feature\\ProductImportExportTest::test_import_creates_products_and_auto_supplier":0.047,"Tests\\Feature\\ProductImportExportTest::test_import_matches_existing_supplier":0.03,"Tests\\Feature\\ProductImportExportTest::test_import_errors_abort_all_rows":0.023,"Tests\\Feature\\ProductImportExportTest::test_import_category_path_resolution":0.031,"Tests\\Feature\\ProductImportExportTest::test_import_rejects_invalid_header":0.018,"Tests\\Feature\\ProductImportExportTest::test_import_requires_permission":0.013,"Tests\\Feature\\ProductImportExportTest::test_list_filters_by_market":0.007,"Tests\\Feature\\MiniReportTest::test_report_aggregates_total_and_item_percent":0.048,"Tests\\Feature\\MiniReportTest::test_report_accumulates_same_product_across_orders":0.051,"Tests\\Feature\\MiniReportTest::test_report_filters_by_custom_date_range":0.046,"Tests\\Feature\\MiniReportTest::test_report_excludes_cancelled_and_deleted_orders":0.049,"Tests\\Feature\\MiniReportTest::test_report_preset_month_and_last_month":0.053,"Tests\\Feature\\MiniReportTest::test_report_preset_week_and_last_week":0.061,"Tests\\Feature\\MiniReportTest::test_report_defaults_to_current_month":0.066,"Tests\\Feature\\MiniReportTest::test_report_data_isolated_between_stores":0.108,"Tests\\Feature\\MiniReportTest::test_report_empty_period_returns_zero":0.053,"Tests\\Feature\\MiniReportTest::test_report_validates_params":0.077,"Tests\\Feature\\ProductBatchDeleteTest::test_batch_delete_soft_deletes_selected_products":0.007,"Tests\\Feature\\ProductBatchDeleteTest::test_batch_delete_requires_non_empty_ids":0.006,"Tests\\Feature\\ProductBatchDeleteTest::test_batch_delete_forbidden_without_permission":0.02,"Tests\\Feature\\CartTest::test_place_order_clears_ordered_items_from_cart":0.059,"Tests\\Feature\\StoreOrderItemTest::test_admin_order_list_filters_by_order_date_range":0.088,"Tests\\Feature\\StoreOrderItemTest::test_admin_order_list_search_by_purchase_no":0.074,"Tests\\Feature\\ExportTest::test_export_suppliers_split_by_market":0.075,"Tests\\Feature\\BillPaymentTest::test_generate_bill_saves_after_sale_and_remark":0.118,"Tests\\Feature\\ProductCostPriceTest::test_product_price_unit_default_and_editable":0.012,"Tests\\Feature\\StoreOrderTest::test_place_order_blocked_by_overdue_unpaid_bill":0.066,"Tests\\Feature\\StoreOrderTest::test_place_order_allowed_within_payment_cycle":0.062,"Tests\\Feature\\CartTest::test_cart_summary_endpoint":0.053,"Tests\\Feature\\CartTest::test_cart_summary_requires_login":0.002,"Tests\\Feature\\MiniProductTest::test_product_list_appends_cart_quantity_and_summary":0.069,"Tests\\Feature\\MiniProductTest::test_product_list_guest_sees_zero_cart_fields":0.05,"Tests\\Feature\\MiniProductTest::test_product_detail_appends_cart_quantity":0.054,"Tests\\Feature\\MiniProductTest::test_home_appends_cart_summary":0.078,"Tests\\Feature\\MiniOnlinePaymentTest::test_sign_matches_document_example":0.002,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_online_payment_success":0.055,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_online_payment_validation":0.121,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_fails_when_code2session_fails":0.062,"Tests\\Feature\\MiniOnlinePaymentTest::test_create_gateway_failure_releases_bills":0.063,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_settles_payment":0.054,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_rejects_invalid_messages":0.064,"Tests\\Feature\\MiniOnlinePaymentTest::test_query_syncs_gateway_status":0.082,"Tests\\Feature\\MiniOnlinePaymentTest::test_query_rejects_other_store_payment":0.103,"Tests\\Feature\\MiniOnlinePaymentTest::test_offline_payment_flow_unaffected":0.07,"Tests\\Feature\\BillPaymentTest::test_generate_bill_positive_after_sale_added_to_total":0.116,"Tests\\Feature\\BillPaymentTest::test_generate_bill_rejects_non_numeric_after_sale":0.048,"Tests\\Feature\\ClientSpecialTest::test_batch_add_creates_specials":0.008,"Tests\\Feature\\ClientSpecialTest::test_batch_add_skips_existing_products":0.01,"Tests\\Feature\\ClientSpecialTest::test_batch_add_requires_non_empty_product_ids":0.008,"Tests\\Feature\\ClientSpecialTest::test_batch_add_forbidden_without_permission":0.007,"Tests\\Feature\\ClientSpecialTest::test_query_filters_by_product_name_keyword":0.008,"Tests\\Feature\\ClientSpecialTest::test_update_changes_sort_and_status":0.008,"Tests\\Feature\\ClientSpecialTest::test_delete_and_batch_delete":0.016,"Tests\\Feature\\ClientSpecialTest::test_batch_delete_requires_non_empty_ids":0.007,"Tests\\Feature\\MiniSpecialTest::test_guest_sees_specials_with_null_price":0.046,"Tests\\Feature\\MiniSpecialTest::test_store_sees_level_price":0.046,"Tests\\Feature\\MiniSpecialTest::test_disabled_special_and_off_shelf_product_excluded":0.056,"Tests\\Feature\\MiniSpecialTest::test_specials_sorted_by_sort_asc":0.098,"Tests\\Feature\\MiniSpecialTest::test_cart_quantity_attached_for_store":0.055,"Tests\\Feature\\MiniOnlinePaymentTest::test_aes_encryption_matches_demo_golden":0.001,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_envelope_round_trip":0.004,"Tests\\Feature\\MiniOnlinePaymentTest::test_swapped_key_config_fails_with_clear_message":0.005,"Tests\\Feature\\MiniWechatPaymentTest::test_create_wechat_payment_success":0.063,"Tests\\Feature\\MiniWechatPaymentTest::test_create_wechat_payment_gateway_failure_releases_bills":0.07,"Tests\\Feature\\MiniWechatPaymentTest::test_wechat_notify_settles_payment":0.061,"Tests\\Feature\\MiniWechatPaymentTest::test_wechat_notify_rejects_invalid_messages":0.059,"Tests\\Feature\\MiniWechatPaymentTest::test_wechat_notify_with_platform_cert_validates_signature":0.066,"Tests\\Feature\\MiniWechatPaymentTest::test_wechat_query_syncs_status":0.09,"Tests\\Feature\\MiniWechatPaymentTest::test_wangpu_channel_remains_default":0.07,"Tests\\Feature\\BillPaymentTest::test_payment_config_returns_pay_methods":0.047,"Tests\\Feature\\MiniMpPaymentTest::test_mp_scene_wechat_channel":0.079,"Tests\\Feature\\MiniMpPaymentTest::test_mp_scene_wangpu_channel":0.06,"Tests\\Feature\\MiniMpPaymentTest::test_mp_scene_oauth_failure":0.053,"Tests\\Feature\\MiniMpPaymentTest::test_mp_scene_requires_mp_config":0.068,"Tests\\Feature\\MiniMpPaymentTest::test_default_scene_remains_mini":0.054,"Tests\\Feature\\MiniProductTest::test_product_list_ordered_by_category_tree":0.008,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_sign_matches_doc_golden":0.002,"Tests\\Feature\\MiniOnlinePaymentTest::test_notify_verify_rejects_bad_sign":0.002,"Tests\\Feature\\ExportTest::test_export_hides_detail_columns_by_default":0.112,"Tests\\Feature\\ExportTest::test_export_scope_includes_off_shelf_but_not_deleted":0.112,"Tests\\Unit\\WeightEstimatorTest::test_weight_unit_quantity_is_weight":0.001,"Tests\\Unit\\WeightEstimatorTest::test_spec_per_unit_weight":0.001,"Tests\\Unit\\WeightEstimatorTest::test_unparsable_spec_fallback":0,"Tests\\Feature\\StoreOrderTest::test_place_order_prefills_reference_weight":0.059,"Tests\\Feature\\PurchaseGenerateTest::test_generate_sums_reference_weight":0.085,"Tests\\Feature\\PurchaseEditTest::test_store_item_add_defaults_reference_weight":0.116,"Tests\\Feature\\StoreOrderTest::test_place_order_blocked_outside_order_time_window":0.081,"Tests\\Feature\\StoreOrderTest::test_place_order_cross_midnight_time_window":0.069,"Tests\\Feature\\StoreOrderTest::test_place_order_only_cutoff_time_and_invalid_config":0.063,"Tests\\Feature\\PurchaseEditTest::test_item_check_toggle_persists_and_echoes_in_detail":0.111,"Tests\\Feature\\PurchaseEditTest::test_item_check_allowed_when_purchase_completed":0.139,"Tests\\Feature\\PurchaseEditTest::test_item_check_toggle_validates_purchase_and_product":0.111,"Tests\\Feature\\PurchaseEditTest::test_item_check_batch_marks_and_clears":0.156,"Tests\\Feature\\PurchaseEditTest::test_item_check_batch_validates_and_ignores_unknown_products":0.113,"Tests\\Feature\\PurchaseEditTest::test_list_includes_bill_product_amount":0.136,"Tests\\Feature\\BillPaymentTest::test_generate_bill_after_sale_marked_up_by_level":0.106}} \ No newline at end of file diff --git a/app/Http/Controllers/Purchase/PurchaseOrderController.php b/app/Http/Controllers/Purchase/PurchaseOrderController.php index 71fd8f9..e95b2cd 100644 --- a/app/Http/Controllers/Purchase/PurchaseOrderController.php +++ b/app/Http/Controllers/Purchase/PurchaseOrderController.php @@ -623,8 +623,9 @@ class PurchaseOrderController extends BaseController ->get(['id', 'store_id', 'total_amount']); $stores = StoreModel::withTrashed() + ->with('level:id,name,percent') ->whereIn('id', $orders->pluck('store_id')->unique()) - ->get(['id', 'name']) + ->get(['id', 'name', 'level_id']) ->keyBy('id'); $bills = BillModel::query() @@ -642,9 +643,13 @@ class PurchaseOrderController extends BaseController '0' ); $bill = $bills->get((int) $storeId); + $store = $stores->get((int) $storeId); $rows[] = [ 'store_id' => (int) $storeId, - 'store_name' => $stores->get((int) $storeId)->name ?? ('门店#' . $storeId), + 'store_name' => $store->name ?? ('门店#' . $storeId), + // 客户等级(售后金额上浮折算预览用;无等级=不上浮) + 'level_name' => $store?->level?->name, + 'level_percent' => (string) ($store?->level?->percent ?? '0'), 'order_count' => $storeOrders->count(), 'product_amount' => $productAmount, 'box_price' => $boxPrice, diff --git a/app/Services/BillGenerateService.php b/app/Services/BillGenerateService.php index 689999b..17532e1 100644 --- a/app/Services/BillGenerateService.php +++ b/app/Services/BillGenerateService.php @@ -5,6 +5,7 @@ namespace App\Services; use App\Exceptions\RepositoryException; use App\Models\BillModel; use App\Models\ContainerReturnModel; +use App\Models\CustomerLevelModel; use App\Models\PurchaseOrderModel; use App\Models\StoreModel; use App\Models\StoreOrderItemModel; @@ -20,7 +21,8 @@ use Throwable; * 2. 商品金额 = 门店订单商品金额汇总(快照,生成后不可修改) * 3. 附加金额 = 周转筐数量×筐单价 + 托盘数量×托盘单价(单价取站点配置快照; * 数量正数=压筐附加金额,负数=回筐抵扣金额) - * 4. 售后金额 = 按门店填写的调整金额(可正负:正数=加收,负数=售后减免) + * 4. 售后金额 = 按门店填写的调整金额 × 门店客户等级上浮比例((100+percent)/100,与售价同口径; + * 可正负:正数=加收,负数=售后减免) * 5. 总金额 = 商品金额 + 配送费 + 附加金额 + 售后金额;回写门店订单 bill_id 完成关联,订单状态置为已完成 * 6. 压回筐记录:筐/托盘数量非 0 时写入完整快照(数量/单价/金额均可为负) */ @@ -82,6 +84,14 @@ readonly class BillGenerateService $boxPrice = (string) site_config('services.box_amount', 0); $trayPrice = (string) site_config('services.tray_amount', 0); $billDate = now()->toDateString(); + // 各门店客户等级上浮比例(售后金额折算用;无等级按 0 不上浮) + $levelPercents = StoreModel::withTrashed() + ->with('level:id,percent') + ->whereIn('id', $ordersByStore->keys()) + ->get(['id', 'level_id']) + ->mapWithKeys(static fn (StoreModel $store) => [ + $store->id => (string) ($store->level?->percent ?? '0'), + ]); $bills = []; foreach ($ordersByStore as $storeId => $storeOrders) { $row = $submitted[(int) $storeId]; @@ -96,7 +106,11 @@ readonly class BillGenerateService bcmul((string) (int) $row['tray_num'], $trayPrice, 2), 2 ); - $afterSale = bcadd((string) ($row['after_sale'] ?? '0'), '0', 2); + // 售后金额按客户等级上浮比例折算(输入 15、上浮 1% → 实收 15.15;负数同比例放大) + $afterSale = CustomerLevelModel::calcLevelPrice( + (string) ($row['after_sale'] ?? '0'), + $levelPercents[(int) $storeId] ?? '0', + ); $totalAmount = bcadd(bcadd(bcadd($productAmount, $deliveryFee, 2), $addedAmount, 2), $afterSale, 2); $bill = BillModel::create([ diff --git a/tests/Feature/BillPaymentTest.php b/tests/Feature/BillPaymentTest.php index f9ffbb6..709a265 100644 --- a/tests/Feature/BillPaymentTest.php +++ b/tests/Feature/BillPaymentTest.php @@ -133,6 +133,56 @@ class BillPaymentTest extends ProcurementTestCase $this->assertSame('5.00', (string) $bill2->total_amount, '未传售后金额不影响总金额'); } + /** 售后金额按客户等级上浮折算:输入 15、上浮 1% → 实收 15.15;billPrepare 回显等级(负数同比例放大) */ + public function test_generate_bill_after_sale_marked_up_by_level(): void + { + $level = CustomerLevelModel::factory()->create(['percent' => 1]); + $store = StoreModel::factory()->create(['level_id' => $level->id]); + $level2 = CustomerLevelModel::factory()->create(['percent' => 2]); + $store2 = StoreModel::factory()->create(['level_id' => $level2->id]); + $product = ProductModel::factory()->create(['status' => ProductModel::STATUS_ON, 'cost_price' => '5.00']); + + // 两店各下一单:店1 等级价 5.05 × 4 = 20.20;店2 等级价 5.10 × 2 = 10.20 + foreach ([[$store, 4], [$store2, 2]] as [$s, $qty]) { + $this->actingAsMiniStore($s); + $this->postJson('/mini/order', ['items' => [['product_id' => $product->id, 'quantity' => $qty]]]) + ->assertJsonPath('success', true); + } + StoreOrderModel::query()->update(['status' => StoreOrderModel::STATUS_SUMMARIZED]); + + $this->actingAsSysUser(); + $this->postJson('/purchase/order/generate', ['purchase_date' => now()->toDateString()]) + ->assertJsonPath('success', true); + $purchase = PurchaseOrderModel::first(); + $this->putJson("/purchase/order/{$purchase->id}/finish")->assertJsonPath('success', true); + + // billPrepare 回显客户等级与上浮比例(弹窗预览用) + $prepare = $this->getJson("/purchase/order/{$purchase->id}/bill/prepare") + ->assertJsonPath('success', true) + ->json('data.stores'); + $prepareByStore = collect($prepare)->keyBy('store_id'); + $this->assertSame($level->name, $prepareByStore[$store->id]['level_name']); + $this->assertSame('1.00', (string) $prepareByStore[$store->id]['level_percent']); + $this->assertSame($level2->name, $prepareByStore[$store2->id]['level_name']); + $this->assertSame('2.00', (string) $prepareByStore[$store2->id]['level_percent']); + + // 店1 售后 15 × 101% = 15.15;店2 售后 -10 × 102% = -10.20 + $this->postJson("/purchase/order/{$purchase->id}/bill", [ + 'stores' => [ + ['store_id' => $store->id, 'delivery_fee' => 0, 'box_num' => 0, 'tray_num' => 0, 'after_sale' => 15], + ['store_id' => $store2->id, 'delivery_fee' => 0, 'box_num' => 0, 'tray_num' => 0, 'after_sale' => -10], + ], + ])->assertJsonPath('success', true); + + $bill = BillModel::where('store_id', $store->id)->first(); + $this->assertSame('15.15', (string) $bill->after_sale, '15 × 101%'); + $this->assertSame('35.35', (string) $bill->total_amount, '商品 20.20 + 售后 15.15'); + + $bill2 = BillModel::where('store_id', $store2->id)->first(); + $this->assertSame('-10.20', (string) $bill2->after_sale, '-10 × 102%(负数同比例放大)'); + $this->assertSame('0.00', (string) $bill2->total_amount, '商品 10.20 + 售后 -10.20'); + } + /** 生成账单:售后金额为正数时加收计入总金额 */ public function test_generate_bill_positive_after_sale_added_to_total(): void { diff --git a/web/domain/iPurchaseOrder.ts b/web/domain/iPurchaseOrder.ts index 623147f..42ceca0 100644 --- a/web/domain/iPurchaseOrder.ts +++ b/web/domain/iPurchaseOrder.ts @@ -147,6 +147,10 @@ export const BILL_STATUS_MAP: Record = export interface IBillPrepareStore { store_id: number; store_name: string; + /** 客户等级名(无等级为 null) */ + level_name?: string | null; + /** 客户等级上浮比例(售后金额折算用;无等级为 '0') */ + level_percent?: string; order_count: number; /** 商品金额(订单汇总,不可修改) */ product_amount: string; diff --git a/web/pages/purchase/order.tsx b/web/pages/purchase/order.tsx index 4203445..35a03c3 100644 --- a/web/pages/purchase/order.tsx +++ b/web/pages/purchase/order.tsx @@ -86,6 +86,10 @@ const calcUnitRefPrice = (total: number, spec: string): number => { return Number.isFinite(pack) && pack > 0 ? total / pack : total; }; +/** 售后金额按客户等级上浮折算:实收 = 输入 × (100+percent)/100(两位小数截断,与后端 calcLevelPrice 同口径) */ +const calcLevelAmount = (amount: number, percent: number): number => + Math.trunc(amount * (100 + percent)) / 100; + /** * 采购单管理(C1 在门店订单页合并生成 / C2-C3 导出 / C4 明细矩阵修改) * 采购单无独立明细表,明细直接溯源门店订货明细:商品行 × 门店列 @@ -209,17 +213,20 @@ const PurchaseOrderPage: React.FC = () => { const [billSaving, setBillSaving] = useState(false); const [billForm] = Form.useForm<{ stores: BillGenerateStoreParams[] }>(); - // 弹窗内实时预览:附加金额 = 筐×筐单价 + 托盘×托盘单价;总额 = 商品 + 配送费 + 附加 + 售后金额(可正负) + // 弹窗内实时预览:附加金额 = 筐×筐单价 + 托盘×托盘单价;售后金额 = 输入 × 客户等级上浮比例;总额 = 商品 + 配送费 + 附加 + 售后(可正负) const watchBillStores = Form.useWatch('stores', billForm) ?? []; const billPreview = (billPrepare?.stores ?? []).map((row, index) => { const input = watchBillStores[index] ?? {}; const deliveryFee = Number(input.delivery_fee ?? 0); - const afterSale = Number(input.after_sale ?? 0); + const levelPercent = Number(row.level_percent ?? 0); + const afterSaleInput = Number(input.after_sale ?? 0); + const afterSale = calcLevelAmount(afterSaleInput, levelPercent); const added = Number(input.box_num ?? 0) * Number(row.box_price) + Number(input.tray_num ?? 0) * Number(row.tray_price); return { added, + afterSale, total: Number(row.product_amount) + deliveryFee + added + afterSale, }; }); @@ -1460,7 +1467,7 @@ const PurchaseOrderPage: React.FC = () => { {billPrepare && ( <>
- 每个门店单独生成一张账单;商品金额由订单汇总不可修改,请填写各门店的配送费、周转筐/托盘数量(正数=压筐附加金额,负数=回筐抵扣金额)、售后金额(可正负,计入总金额:正数=加收,负数=售后减免)与备注(可选,随账单存档)。 + 每个门店单独生成一张账单;商品金额由订单汇总不可修改,请填写各门店的配送费、周转筐/托盘数量(正数=压筐附加金额,负数=回筐抵扣金额)、售后金额(可正负,按客户等级上浮比例折算后计入总金额:如输入 15、上浮 1% 则实收 15.15)与备注(可选,随账单存档)。 {billAllGenerated ? '该采购单已全部生成账单,仅可查看。' : '生成后采购单中的全部订单将关联到对应门店账单。'}
@@ -1471,9 +1478,18 @@ const PurchaseOrderPage: React.FC = () => {
门店
商品金额
配送费(元)
-
周转筐(¥{billPrepare.stores[0]?.box_price ?? '0.00'}/个)
-
周转托盘(¥{billPrepare.stores[0]?.tray_price ?? '0.00'}/个)
-
售后金额(元)
+
+
周转筐
+
(¥{billPrepare.stores[0]?.box_price ?? '0.00'}/个)
+
+
+
周转托盘
+
(¥{billPrepare.stores[0]?.tray_price ?? '0.00'}/个)
+
+
+
售后金额
+
(元,按等级上浮)
+
备注
附加金额
账单总金额
@@ -1489,6 +1505,11 @@ const PurchaseOrderPage: React.FC = () => { {row?.order_count ?? 0} 笔订单 {billed && 已生成} +
+ {row?.level_name + ? `${row.level_name} +${Number(row.level_percent ?? 0)}%` + : '无等级(不上浮)'} +
¥{row?.product_amount ?? '0.00'} @@ -1497,7 +1518,7 @@ const PurchaseOrderPage: React.FC = () => { @@ -1510,7 +1531,7 @@ const PurchaseOrderPage: React.FC = () => { /> @@ -1522,7 +1543,7 @@ const PurchaseOrderPage: React.FC = () => { /> @@ -1533,17 +1554,28 @@ const PurchaseOrderPage: React.FC = () => { placeholder="正压负回" /> - - - +
+ + + {/* 售后金额按客户等级上浮折算预览(实收 = 输入 × (100+上浮%)/100);已生成账单行为存档值不再折算 */} + {( +
+ 实收 ¥{billPreview[field.name]?.afterSale.toFixed(2)} +
+ )} +
+ + + +
+ +