logger = $logger; $this->queue = $queue; } /** * Hooks. */ public function hooks() { add_action( 'woocommerce_paczkomaty_inpost_shipment_created', array( $this, 'schedule_status_refresh_on_shipment_created' ) ); add_action( self::ACTION_REFRESH_SHIPMENT_STATUS, array( $this, 'refresh_status' ), 10, 4 ); } /** * Schedule status refresh in given next schedule time. * * @param WPDesk_Flexible_Shipping_Shipment_Paczkomaty $shipment . * * @internal */ public function schedule_status_refresh_on_shipment_created( $shipment ) { $this->schedule_status_refresh( $shipment ); } /** * Schedule status refresh in given next schedule time. * * @param WPDesk_Flexible_Shipping_Shipment_Paczkomaty $shipment . * @param int $current_run_number . */ private function schedule_status_refresh( $shipment, $current_run_number = 0 ) { $current_user = wp_get_current_user(); $args = array( 'shipment_id' => $shipment->get_id(), 'inpost_shipment_id' => $shipment->get_meta( $shipment::META_PACZKOMAT_SHIPMENT_ID ), 'current_run_number' => $current_run_number, 'user_id' => $current_user->ID, ); $schedule_in_seconds = self::SCHEDULES_IN_SECONDS; $schedule_time = $this->should_next_schedule( $current_run_number ) ? $schedule_in_seconds[ $current_run_number ] : 0; $this->queue->schedule_single( time() + $schedule_time, self::ACTION_REFRESH_SHIPMENT_STATUS, $args, 'woocommerce_paczkomaty_inpost' ); $this->logger->debug( 'Inpost status scheduler: scheduled status refresh.', array( 'shipment_id' => $shipment->get_id(), 'status' => $shipment->get_status(), 'run_number' => $current_run_number, 'user_id' => $current_user->ID, ) ); } /** * Should next schedule? * Do not schedule forever. With first schedule in 5 seconds and multiplier 5 status will be refreshed 5 times, in: * 5, 25, 125, 625 and 3125 seconds. * * @param int $current_run_number . * * @return bool */ private function should_next_schedule( $current_run_number ) { $schedule_in_seconds = self::SCHEDULES_IN_SECONDS; return isset( $schedule_in_seconds[ $current_run_number ] ); } /** * Schedule next shipment refresh. * Next schedule time is computed as multiply of current schedule time. * * @param WPDesk_Flexible_Shipping_Shipment_Paczkomaty $shipment . * @param int $current_run_number . */ public function schedule_next_refresh( $shipment, $current_run_number ) { if ( $this->should_next_schedule( $current_run_number ) ) { $this->schedule_status_refresh( $shipment, $current_run_number + 1 ); } } /** * Refresh shipment status. * * @param int $shipment_id . * @param string $inpost_shipment_id . * @param int $current_run_number . * @param int $user_id . * * @throws WPDesk_Paczkomaty_ShipX_Exception . * * @internal */ public function refresh_status( $shipment_id, $inpost_shipment_id, $current_run_number, $user_id = 0 ) { wp_set_current_user( $user_id ); $status_refresher = new WPDesk_Paczkomaty_Shipment_Status_Refresher( $shipment_id, $inpost_shipment_id, $current_run_number, $this, $this->logger ); $status_refresher->refresh_status(); } }