tick(); } // Step 2: Seed Tax Rates $taxClassIds = static::seedTaxRates($db, $faker); if (defined('WP_CLI') && WP_CLI) { $progress->tick(); } // Step 3: Seed Order Tax Rates for specific orders static::seedOrderTaxRates($db, $faker, $taxClassIds); if (defined('WP_CLI') && WP_CLI) { $progress->tick(); $progress->finish(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo \WP_CLI::colorize('%n'); } if (!defined('WP_CLI') || !WP_CLI) { echo "Tax seeding completed successfully!
"; } } private static function seedTaxClasses($db, $faker) { $taxClasses = [ [ 'title' => 'Standard Rate', 'slug' => 'standard', 'meta' => json_encode(['is_default' => true]), 'created_at' => gmdate('Y-m-d H:i:s'), 'updated_at' => gmdate('Y-m-d H:i:s'), ], [ 'title' => 'Reduced', 'slug' => 'reduced', 'meta' => json_encode(['is_default' => false]), 'created_at' => gmdate('Y-m-d H:i:s'), 'updated_at' => gmdate('Y-m-d H:i:s'), ], [ 'title' => 'Zero', 'slug' => 'zero', 'meta' => json_encode(['is_default' => false]), 'created_at' => gmdate('Y-m-d H:i:s'), 'updated_at' => gmdate('Y-m-d H:i:s'), ], [ 'title' => 'Digital Goods', 'slug' => 'digital', 'meta' => json_encode(['is_default' => false]), 'created_at' => gmdate('Y-m-d H:i:s'), 'updated_at' => gmdate('Y-m-d H:i:s'), ], ]; $db->table('fct_tax_classes')->insert($taxClasses); if (!defined('WP_CLI') || !WP_CLI) { echo "Inserted " . count($taxClasses) . " tax classes
"; } } private static function seedTaxRates($db, $faker) { // Get inserted tax class IDs $taxClassIds = $db->table('fct_tax_classes')->pluck('id'); $taxRates = []; $countries = ['US', 'CA', 'GB', 'DE', 'FR', 'AU', 'IN', 'JP']; $usTaxRates = [ ['country' => 'US', 'state' => 'CA', 'rate' => '8.75', 'name' => 'California Sales Tax'], ['country' => 'US', 'state' => 'NY', 'rate' => '8.00', 'name' => 'New York Sales Tax'], ['country' => 'US', 'state' => 'TX', 'rate' => '6.25', 'name' => 'Texas Sales Tax'], ['country' => 'US', 'state' => 'FL', 'rate' => '6.00', 'name' => 'Florida Sales Tax'], ['country' => 'US', 'state' => 'WA', 'rate' => '6.50', 'name' => 'Washington Sales Tax'], ]; // US State Tax Rates foreach ($usTaxRates as $usRate) { foreach ($taxClassIds as $classId) { $rate = $usRate['rate']; if ($classId == 2) { // Reduced rate $rate = number_format(floatval($rate) * 0.5, 2); } elseif ($classId == 3) { // Zero rate $rate = '0.00'; } elseif ($classId == 4) { // Digital goods - slightly higher $rate = number_format(floatval($rate) * 1.1, 2); } $taxRates[] = [ 'class_id' => $classId, 'country' => $usRate['country'], 'state' => $usRate['state'], 'postcode' => null, 'city' => null, 'rate' => $rate, 'name' => $usRate['name'] . ' - Class ' . $classId, 'group' => 'state', 'priority' => 1, 'is_compound' => 0, 'for_shipping' => $faker->boolean(30) ? 1 : 0, 'for_order' => 1, // 'tax_rate_class' => $classId, ]; } } // International VAT Rates $vatRates = [ ['country' => 'GB', 'rate' => '20.00', 'name' => 'UK VAT'], ['country' => 'DE', 'rate' => '19.00', 'name' => 'German VAT'], ['country' => 'FR', 'rate' => '20.00', 'name' => 'French VAT'], ['country' => 'CA', 'rate' => '13.00', 'name' => 'Canadian HST'], ['country' => 'AU', 'rate' => '10.00', 'name' => 'Australian GST'], ]; foreach ($vatRates as $vatRate) { foreach ($taxClassIds as $classId) { $rate = $vatRate['rate']; if ($classId == 2) { // Reduced rate $rate = number_format(floatval($rate) * 0.5, 2); } elseif ($classId == 3) { // Zero rate $rate = '0.00'; } $taxRates[] = [ 'class_id' => $classId, 'country' => $vatRate['country'], 'state' => null, 'postcode' => null, 'city' => null, 'rate' => $rate, 'name' => $vatRate['name'] . ' - Class ' . $classId, 'group' => 'country', 'priority' => 1, 'is_compound' => 0, 'for_shipping' => $faker->randomElement([null, 0, 5, 10, 20, 30]), 'for_order' => 1, // 'tax_rate_class' => $classId, ]; } } // City-specific rates (examples) $cityRates = [ ['country' => 'US', 'state' => 'CA', 'city' => 'Los Angeles', 'rate' => '10.25'], ['country' => 'US', 'state' => 'NY', 'city' => 'New York City', 'rate' => '8.875'], ['country' => 'US', 'state' => 'IL', 'city' => 'Chicago', 'rate' => '10.75'], ]; foreach ($cityRates as $cityRate) { $taxRates[] = [ 'class_id' => $taxClassIds[0], // Standard rate only for cities 'country' => $cityRate['country'], 'state' => $cityRate['state'], 'postcode' => null, 'city' => $cityRate['city'], 'rate' => $cityRate['rate'], 'name' => $cityRate['city'] . ' Local Tax', 'group' => 'city', 'priority' => 2, 'is_compound' => 1, 'for_shipping' => null, 'for_order' => 1, // 'tax_rate_class' => $taxClassIds[0], ]; } $db->table('fct_tax_rates')->insert($taxRates); if (!defined('WP_CLI') || !WP_CLI) { echo "Inserted " . count($taxRates) . " tax rates
"; } return $taxClassIds; } private static function seedOrderTaxRates($db, $faker, $taxClassIds) { // Get orders in the specified range $orderIds = range(7536149, 7536237); $existingOrders = $db->table('fct_orders') ->whereIn('id', $orderIds) ->pluck('id'); if (empty($existingOrders)) { if (!defined('WP_CLI') || !WP_CLI) { echo "No orders found in the specified range (7536149-7536237)
"; } return; } // Get available tax rates $taxRates = $db->table('fct_tax_rates')->get(); $orderTaxRates = []; foreach ($existingOrders as $orderId) { // Get order details to calculate realistic tax amounts $order = $db->table('fct_orders')->where('id', $orderId)->first(); if (!$order) { continue; } $subtotal = $order->subtotal ?? 10000; // Default to $100 in cents if null // Randomly assign 1-3 tax rates per order $numTaxRates = $faker->numberBetween(1, 3); $selectedTaxRates = $faker->randomElements($taxRates, $numTaxRates); foreach ($selectedTaxRates as $taxRate) { $taxRatePercentage = floatval($taxRate->rate) / 100; // Calculate tax amounts (in cents, following the pattern) $orderTax = intval($subtotal * $taxRatePercentage); $shippingTax = $taxRate->for_shipping ? intval($faker->numberBetween(50, 500)) : 0; $totalTax = $orderTax + $shippingTax; $orderTaxRates[] = [ 'order_id' => $orderId, 'tax_rate_id' => $taxRate->id, 'shipping_tax' => $shippingTax, 'order_tax' => $orderTax, 'total_tax' => $totalTax, 'meta' => json_encode([ 'rate_percentage' => $taxRate->rate, 'tax_name' => $taxRate->name, 'calculated_on' => gmdate('Y-m-d H:i:s'), ]), 'filed_at' => $faker->boolean(70) ? $faker->dateTimeThisYear()->format('Y-m-d H:i:s') : null, 'created_at' => gmdate('Y-m-d H:i:s'), 'updated_at' => gmdate('Y-m-d H:i:s'), ]; } } if (!empty($orderTaxRates)) { $db->table('fct_order_tax_rate')->insert($orderTaxRates); // Update order tax_total field to reflect the calculated taxes foreach ($existingOrders as $orderId) { $totalOrderTax = array_sum(array_column( array_filter($orderTaxRates, function ($otr) use ($orderId) { return $otr['order_id'] == $orderId; }), 'total_tax' )); if ($totalOrderTax > 0) { $db->table('fct_orders') ->where('id', $orderId) ->update(['tax_total' => $totalOrderTax]); } } } if (!defined('WP_CLI') || !WP_CLI) { echo "Inserted " . count($orderTaxRates) . " order tax rate records for " . count($existingOrders) . " orders
"; } } }