PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
get_date_range( $assoc_args ); $orders = $this->fetch_orders( $date_range ); $report = $this->generate_report( $orders, $date_range ); $response = [ 'report' => $report, ]; WP_CLI::line( wp_json_encode( $response, JSON_PRETTY_PRINT ) ); } private function get_date_range( array $assoc_args ): array { $from_date = $assoc_args['from-date'] ?? null; $days = isset($assoc_args['days']) ? (int) $assoc_args['days'] : null; if ( ! $from_date && ! $days ) { WP_CLI::error( 'You must provide either --from-date or --days parameter.' ); } if ( $days ) { $to_date = gmdate( 'Y-m-d 23:59:59', strtotime( 'yesterday' ) ); $from_date = gmdate( 'Y-m-d', strtotime( "-" . ( $days - 1 ) . " days", strtotime( 'yesterday' ) ) ); } else { $to_date = gmdate( 'Y-m-d 23:59:59', strtotime( 'yesterday' ) ); } return [ 'from' => $from_date, 'to' => $to_date ]; } private function fetch_orders( array $date_range ): array { return wc_get_orders( [ 'limit' => -1, 'orderby' => 'date', 'order' => 'ASC', 'date_query' => [ [ 'after' => $date_range['from'], 'before' => $date_range['to'], 'inclusive' => true, ], ], 'type' => 'shop_order', 'status' => ['wc-processing', 'wc-completed', 'wc-on-hold'] ] ); } private function generate_report( array $orders, array $date_range ): array { $report = []; $currencies_by_date = []; $unique_customers_by_currency = []; // Initialize report for all days in the range $current_date = new \DateTime( $date_range['from'] ); $end_date = new \DateTime( $date_range['to'] ); while ( $current_date <= $end_date ) { $date_key = $current_date->format( 'Y-m-d' ); $report[$date_key] = []; $currencies_by_date[$date_key] = []; $current_date->modify( '+1 day' ); } // First pass: collect all currencies used in orders foreach ( $orders as $order ) { $order_date = $this->get_order_date( $order ); if ( ! $order_date ) { continue; } $currency = $order->get_currency() ?? 'Unknown'; $currencies_by_date[$order_date][$currency] = true; if (!isset($unique_customers_by_currency[$order_date])) { $unique_customers_by_currency[$order_date] = []; } if (!isset($unique_customers_by_currency[$order_date][$currency])) { $unique_customers_by_currency[$order_date][$currency] = []; } } // Get all unique currencies across all dates $all_currencies = []; foreach ($currencies_by_date as $currencies) { foreach (array_keys($currencies) as $currency) { $all_currencies[$currency] = true; } } // Initialize data structure for each date with all currencies foreach ($report as $date => &$date_data) { // For dates with orders, add the currencies that had orders if (!empty($currencies_by_date[$date])) { foreach (array_keys($currencies_by_date[$date]) as $currency) { $date_data[] = $this->initialize_currency_report_entry($currency); } } // For dates with no orders, add entry with null currency else { $currency = function_exists( 'get_woocommerce_currency' ) ? get_woocommerce_currency() : null; $date_data[] = $this->initialize_currency_report_entry( $currency ); } } // Second pass: process orders and collect data by currency foreach ( $orders as $order ) { $order_date = $this->get_order_date( $order ); if ( ! $order_date ) { continue; } $currency = $order->get_currency() ?? 'Unknown'; // Find the index of this currency in the date's report array foreach ($report[$order_date] as $index => $entry) { if ($entry['currency'] === $currency) { $this->process_order_by_currency($report[$order_date][$index], $unique_customers_by_currency[$order_date][$currency], $order); break; } } } // Calculate averages and format data foreach ($report as $date => $currency_entries) { // Skip dates with no orders (null entries) if (is_array($currency_entries)) { foreach ($currency_entries as $index => $entry) { $this->calculate_currency_averages( $report[$date][$index], $unique_customers_by_currency[$date][$entry['currency']] ?? [] ); } } } return $report; } private function get_order_date( \WC_Order $order ): ?string { return $order->get_date_created() ? $order->get_date_created()->date( 'Y-m-d' ) : null; } private function initialize_currency_report_entry(string $currency = null): array { return [ 'currency' => $currency, 'orders_count' => "", 'num_items_sold' => null, 'gross_sales' => null, 'total_sales' => null, 'coupons' => "0", 'coupons_count' => "0", 'refunds' => null, 'taxes' => null, 'shipping' => null, 'net_revenue' => null, 'avg_items_per_order' => null, 'avg_order_value' => null, 'total_customers' => "0", 'discounts' => null, 'payment_methods' => [], 'payment_method_counts' => [], ]; } private function process_order_by_currency(array &$currency_report, array &$unique_customers, \WC_Order $order): void { $order_totals = $this->extract_order_totals($order); if ($refunds = $order->get_refunds()) { $currency_report['refunds'] = ($currency_report['refunds'] ?? 0) + abs($refunds[0]->get_total()); } // First order for this currency - initialize numeric values if ($currency_report['orders_count'] === "") { $currency_report['num_items_sold'] = 0; $currency_report['gross_sales'] = 0; $currency_report['total_sales'] = 0; $currency_report['taxes'] = 0; $currency_report['shipping'] = 0; $currency_report['net_revenue'] = 0; $currency_report['discounts'] = 0; } $currency_report['orders_count'] = (string)((int)($currency_report['orders_count'] ?: 0) + 1); $currency_report['num_items_sold'] += $order_totals['items']; $currency_report['gross_sales'] += $order_totals['gross_sales']; $currency_report['total_sales'] += $order_totals['total']; $currency_report['coupons'] = (string)(($currency_report['coupons'] !== "0" ? (float)$currency_report['coupons'] : 0) + $order_totals['discounts']); $currency_report['coupons_count'] = (string)(($currency_report['coupons_count'] !== "0" ? (int)$currency_report['coupons_count'] : 0) + count($order->get_coupon_codes())); $currency_report['taxes'] += $order_totals['taxes']; $currency_report['shipping'] += $order_totals['shipping']; $currency_report['net_revenue'] += $order_totals['net_revenue']; $currency_report['discounts'] += $order_totals['discounts']; $customer_id = $order->get_customer_id(); if (!empty($customer_id)) { $unique_customers[$customer_id] = true; } // Track payment method $payment_method_id = $order->get_payment_method(); $payment_method = !empty($payment_method_id) ? $payment_method_id : 'Unknown'; if (!isset($currency_report['payment_method_counts'][$payment_method])) { $currency_report['payment_method_counts'][$payment_method] = 0; } $currency_report['payment_method_counts'][$payment_method]++; } private function extract_order_totals( \WC_Order $order ): array { return [ 'total' => (float)$order->get_total(), 'items' => (int)$order->get_item_count(), 'taxes' => (float)$order->get_total_tax(), 'shipping' => (float)$order->get_shipping_total(), 'discounts' => (float)$order->get_total_discount(), 'gross_sales' => (float)$order->get_total() + $order->get_total_discount() - $order->get_total_tax() - $order->get_shipping_total(), 'net_revenue' => (float)$order->get_total() - $order->get_total_tax() - $order->get_shipping_total(), ]; } private function calculate_currency_averages(array &$currency_report, array $unique_customers): void { // Set total customers $currency_report['total_customers'] = (string)count($unique_customers); // Calculate averages if ((int)$currency_report['orders_count'] > 0) { $currency_report['avg_items_per_order'] = round($currency_report['num_items_sold'] / (int)$currency_report['orders_count'], 2); $currency_report['avg_order_value'] = round($currency_report['total_sales'] / (int)$currency_report['orders_count'], 2); } // Format payment methods if (!empty($currency_report['payment_method_counts'])) { $currency_report['payment_methods'] = []; foreach ($currency_report['payment_method_counts'] as $method => $count) { $currency_report['payment_methods'][] = [ 'payment_method' => $method, 'count' => (string)$count ]; } } unset($currency_report['payment_method_counts']); } }