Plugin Directory

Changeset 3435948


Ignore:
Timestamp:
01/09/2026 01:46:37 PM (6 weeks ago)
Author:
robertosnap
Message:

Update to version 7.14.4 from GitHub

Location:
logistra-woocommerce-integrasjon-fra-wildrobot-app
Files:
4 added
4 deleted
6 edited
1 copied

Legend:

Unmodified
Added
Removed
  • logistra-woocommerce-integrasjon-fra-wildrobot-app/tags/7.14.4/README.txt

    r3435235 r3435948  
    55Requires at least: 5.1
    66Tested up to: 6.7.2
    7 Stable tag: 7.14.3
     7Stable tag: 7.14.4
    88WC requires at least: 3.0.0
    99WC tested up to: 9.8.1
     
    4949== Changelog ==
    5050
    51 == 7.14.2-3 ==
     51== 7.14.2-4 ==
    5252* FIX Bust cache for Fallback delivery point.
    5353
  • logistra-woocommerce-integrasjon-fra-wildrobot-app/tags/7.14.4/logistra-robots.php

    r3435235 r3435948  
    1717 * Plugin URI:        https://wildrobot.app/wildrobot-logistra-cargonizer-woocommerce-integrasjon/
    1818 * Description:       Integrate WooCommerce with Profrakt or Logistra - Freight administration made easy by Wildrobot!
    19  * Version:           7.14.3
     19 * Version:           7.14.4
    2020 * Author:            Robertosnap
    2121 * Author URI:        https://wildrobot.app/wildrobot-logistra-cargonizer-woocommerce-integrasjon/
     
    3939 * Rename this for your plugin and update it as you release new versions.
    4040 */
    41 define('WILDROBOT_LOGISTRA_VERSION', '7.14.3');
     41define('WILDROBOT_LOGISTRA_VERSION', '7.14.4');
    4242
    4343/**
  • logistra-woocommerce-integrasjon-fra-wildrobot-app/tags/7.14.4/public/class-wildrobot-logistra-public.php

    r3321591 r3435948  
    2323class Wildrobot_Logistra_Public
    2424{
    25 
    26     private $plugin_name;
    27 
    28     /**
    29      * The version of this plugin.
    30      *
    31      * @since    1.0.0
    32      * @access   private
    33      * @var      string    $version    The current version of this plugin.
    34      */
    35     private $version;
    36 
    37     /**
    38      * Initialize the class and set its properties.
    39      *
    40      * @since    1.0.0
    41      * @param      string    $plugin_name       The name of the plugin.
    42      * @param      string    $version    The version of this plugin.
    43      */
    44     public function __construct($plugin_name, $version)
    45     {
    46 
    47         $this->plugin_name = $plugin_name;
    48         $this->version = $version;
    49 
    50         add_action('wp_ajax_logistra_save_service_partner', array($this, 'save_service_partner_to_session'));
    51         add_action('wp_ajax_nopriv_logistra_save_service_partner', array($this, 'save_service_partner_to_session'));
    52         add_filter('logistra_robots_service_partner_select', array($this, "logistra_robots_cart_shipping_template_args"), 1, 2);
    53         // Cart
    54         add_action("woocommerce_cart_totals_after_shipping", array($this, "add_pickup_point_to_cart"));
    55         // Checkout
    56         add_action("woocommerce_review_order_after_shipping", array($this, "add_pickup_point_to_cart"), 1);
    57     }
    58 
    59     function wildrobot_logistra_locate_template($template, $template_name, $template_path)
    60     {
    61         global $woocommerce;
    62         $_template = $template;
    63         if (!$template_path)
    64             $template_path = $woocommerce->template_url;
    65 
    66         // $plugin_path  = untrailingslashit(plugin_dir_path(__FILE__))  . '/template/woocommerce/';
    67         $plugin_path  = plugin_dir_path(dirname(__FILE__)) . 'templates/woocommerce/';
    68         // $plugin_path  = plugin_dir_path(dirname(__FILE__) . '/template/woocommerce/');
    69 
    70         // Look within passed path within the theme - this is priority
    71         $template = locate_template(
    72             array(
    73                 $template_path . $template_name,
    74                 $template_name
    75             )
    76         );
    77 
    78         if (!$template && file_exists($plugin_path . $template_name))
    79             $template = $plugin_path . $template_name;
    80 
    81         if (!$template)
    82             $template = $_template;
    83 
    84         return $template;
    85     }
    86 
    87     public function add_picklist_to_page($content = null)
    88     {
    89         $page_id = get_the_ID();
    90         if (is_page() && (get_option("wildrobot_logistra_picklist_active") === "yes")  && !empty($page_id)) {
    91             if ($page_id == get_option('wildrobot_logistra_picklist_page', null)) {
    92                 $content = '<div id="wildrobot-complete-picklist-order">Laster plukkliste fullføring...</div>';
    93             }
    94         }
    95         return $content;
    96     }
    97 
    98     public function add_service_partner_picker_field($fields)
    99     {
    100         $fields['billing']['shipping_service_partner'] = array(
    101             'label'     => __('Utleveringssted', 'logistra-robots'),
    102             'placeholder'   => _x('Velg utleveringssted', 'placeholder', 'logistra-robots'),
    103             'required'  => false,
    104             'class'     => array('form-row-wide hidden'),
    105             'clear'     => true,
    106             'type' => 'text',
    107         );
    108 
    109         return $fields;
    110     }
    111 
    112     public function save_service_partner_to_session()
    113     {
    114         check_ajax_referer('wildrobot_logistra_select_servicepartner', 'nonce');
    115 
    116         $service_partner_number = sanitize_text_field($_POST['service_partner_number']);
    117         $service_partner_customer_number = sanitize_text_field($_POST['service_partner_customer_number']);
    118         $service_partner_name = sanitize_text_field($_POST['service_partner_name']);
    119         $service_partner_postcode = sanitize_text_field($_POST['service_partner_postcode']);
    120         $service_partner_city = sanitize_text_field($_POST['service_partner_city']);
    121         $service_partner_country = sanitize_text_field($_POST['service_partner_country']);
    122         $chosen_shipping_methods = maybe_serialize(WC()->session->get('chosen_shipping_methods'));
    123 
    124         WC()->session->set('wildrobot_logistra_service_partner_number', $service_partner_number);
    125         WC()->session->set('wildrobot_logistra_service_partner_customer_number', $service_partner_customer_number);
    126         WC()->session->set('wildrobot_logistra_service_partner_name', $service_partner_name);
    127         WC()->session->set('wildrobot_logistra_service_partner_postcode', $service_partner_postcode);
    128         WC()->session->set('wildrobot_logistra_service_partner_city', $service_partner_city);
    129         WC()->session->set('wildrobot_logistra_service_partner_country', $service_partner_country);
    130         WC()->session->set('wildrobot_logistra_service_partner_for_chosen_shipping_methods', $chosen_shipping_methods);
    131         wp_send_json_success();
    132     }
    133 
    134     function wildrobot_logistra_woocommerce_checkout_process($order_id, $posted_data, $order)
    135     {
    136 
    137         $service_partner_number = WC()->session->get('wildrobot_logistra_service_partner_number');
    138         $service_partner_customer_number = WC()->session->get('wildrobot_logistra_service_partner_customer_number');
    139         $service_partner_name = WC()->session->get('wildrobot_logistra_service_partner_name');
    140         $service_partner_postcode = WC()->session->get('wildrobot_logistra_service_partner_postcode');
    141         $service_partner_city = WC()->session->get('wildrobot_logistra_service_partner_city');
    142         $service_partner_country = WC()->session->get('wildrobot_logistra_service_partner_country');
    143 
    144         if (!empty($service_partner_number)) {
    145             $order->update_meta_data("_wildrobot_logistra_service_partner_number", $service_partner_number);
    146             $order->update_meta_data("_wildrobot_logistra_service_partner_customer_number", $service_partner_customer_number);
    147             $order->update_meta_data("_wildrobot_logistra_service_partner_name", $service_partner_name);
    148             $order->update_meta_data("_wildrobot_logistra_service_partner_postcode", $service_partner_postcode);
    149             $order->update_meta_data("_wildrobot_logistra_service_partner_city", $service_partner_city);
    150             $order->update_meta_data("_wildrobot_logistra_service_partner_country", $service_partner_country);
    151             $order->save();
    152             WC()->session->__unset('wildrobot_logistra_service_partner_number');
    153             WC()->session->__unset('wildrobot_logistra_service_partner_customer_number');
    154             WC()->session->__unset('wildrobot_logistra_service_partner_name');
    155             WC()->session->__unset('wildrobot_logistra_service_partner_postcode');
    156             WC()->session->__unset('wildrobot_logistra_service_partner_city');
    157             WC()->session->__unset('wildrobot_logistra_service_partner_country');
    158             WC()->session->__unset('wildrobot_logistra_service_partner_for_chosen_shipping_methods');
    159             return;
    160         }
    161 
    162         // TO BE DEPRECATED
    163         if (isset($_POST["logistra_robots_select_servicepartner"]) && !empty($_POST["logistra_robots_select_servicepartner"])) {
    164             $service_partner_number = $_POST["logistra_robots_select_servicepartner"];
    165         } else if (isset($_POST["shipping_service_partner"]) && !empty($_POST["shipping_service_partner"])) {
    166             $service_partner_number = $_POST["shipping_service_partner"];
    167         }
    168         if (!empty($service_partner_number)) {
    169             $order->update_meta_data("_shipping_service_partner", $service_partner_number);
    170             $order->save();
    171         }
    172     }
    173 
    174     public function stop_checkout_if_service_partner_not_set($order_id)
    175     {
    176         $chosen_shipping_methods = WC()->session->get('chosen_shipping_methods');
    177         $shipping_methods = WC()->shipping()->get_shipping_methods();
    178 
    179         foreach ($chosen_shipping_methods as $chosen_method) {
    180             if (strpos($chosen_method, 'logistra_robots_shipping_method') !== false) {
    181                 list($method_id, $instance_id) = explode(':', $chosen_method);
    182                 if (isset($shipping_methods[$method_id])) {
    183                     $shipping_method = new $shipping_methods[$method_id]($instance_id);
    184                     if (method_exists($shipping_method, 'get_option')) {
    185                         $require_service_partner = $shipping_method->get_option('require_service_partner');
    186                         if ($require_service_partner === 'yes') {
    187                             $service_partner_number = WC()->session->get('wildrobot_logistra_service_partner_number');
    188                             $service_partner_for_chosen_shipping_methods = maybe_unserialize(WC()->session->get('wildrobot_logistra_service_partner_for_chosen_shipping_methods'));
    189                             if (empty($service_partner_number) || !in_array($chosen_method, $service_partner_for_chosen_shipping_methods)) {
    190                                 wc_add_notice(__('Må velge utleveringssted på denne fraktmetoden.', 'logistra-robots'), 'error');
    191                                 return;
    192                             }
    193                         }
    194                     }
    195                 }
    196             }
    197         }
    198     }
    199 
    200 
    201     /**
    202      * Generates the service partner object for the cart shipping template based on the selected shipping method.
    203      *
    204      * This function retrieves the delivery relation and transport agreement based on the chosen shipping method.
    205      * It checks if service partners are possible and filters out certain carriers. It then fetches service partners
    206      * based on the destination postcode and country. The function returns a service partner object which includes
    207      * details like carrier name, identifier, and available service partners.
    208      *
    209      * @param object $service_partner_object An object to be populated with service partner details.
    210      * @param array $args An array containing shipping method and destination details. Minimum values required are "chosen_method" and "package" with "destination" containing "postcode" and "country".
    211      * [
    212      *  "chosen_method": string,
    213      *  "package": [
    214      *      "destination": [
    215      *          "postcode": string,
    216      *          "country": string
    217      *      ]
    218      *  ]
    219      * ]
    220      * @return object|bool Returns the service partner object with populated details or false on failure.
    221      * {
    222      *  "carrier_name": string,
    223      *  "carrier_identifier": string,
    224      *  "service_partner_possible": bool,
    225      *  "requires_service_partner": bool,
    226      *  "service_partners": array,
    227      *  "service_partner_select_values": array
    228      * }
    229      */
    230     function logistra_robots_cart_shipping_template_args($service_partner_object, $args = [])
    231     {
    232         try {
    233             $packages = WC()->shipping()->get_packages();
    234             // START Maybe its a subscription
    235             if (empty($packages)) {
    236                 // Check if WooCommerce Subscriptions is active and the class/method exists
    237                 if (class_exists('WC_Subscriptions_Cart') && method_exists('WC_Subscriptions_Cart', 'get_recurring_shipping_packages')) {
    238                     foreach (WC_Subscriptions_Cart::get_recurring_shipping_packages() as $shipping_package_key => $shipping_package) {
    239                         foreach ($shipping_package as $i => $package) {
    240                             $packages[$i] = $package;
    241                         }
    242                     }
    243                 }
    244             }
    245             // END Maybe its a subscription
    246             foreach ($packages as $i => $package) {
    247                 $chosen_method = isset(WC()->session->chosen_shipping_methods[$i]) ? WC()->session->chosen_shipping_methods[$i] : '';
    248                 $package = $packages[$i];
    249                 if (!empty($chosen_method)) {
    250                     break;
    251                 }
    252             }
    253             if (empty($chosen_method) || empty($package)) {
    254                 return false;
    255             }
    256 
    257             $delivery_realtion = Wildrobot_Logistra_DB::get_delivery_relation_with_transport_agreement($chosen_method);
    258             if (empty($delivery_realtion)) {
    259                 return false;
    260             }
    261             $transportAgreement = $delivery_realtion["transport_agreement"];
    262             $service_partner_possible = false;
    263             if ($transportAgreement["service_partner_possible"]) {
    264                 $service_partner_possible = true;
    265             }
    266             if (in_array($transportAgreement["identifier"], ["bring_small_parcel_a_no_rfid", "bring_small_parcel_a", "bring2_small_parcel_a_no_rfid", "bring2_small_parcel_a", "postnord_mypack_home_small"])) {
    267                 $service_partner_possible = false;
    268             }
    269             $carrier_identifier = $transportAgreement["ta_carrier"]["identifier"];
    270             $carrier_name = $transportAgreement["ta_carrier"]["name"];
    271 
    272             $postcode = $package["destination"]["postcode"];
    273             $country = $package["destination"]["country"];
    274             $address_1 = $package["destination"]["address"];
    275             $city = $package["destination"]["city"];
    276             if (empty($postcode)) {
    277                 return false;
    278             }
    279             $service_partner_type = null;
    280             foreach ($delivery_realtion["services"] as $service) {
    281                 if ($service === "wildrobot_only_manned_service_partner") {
    282                     $service_partner_type = "manned";
    283                 }
    284                 if ($service === "wildrobot_only_unmanned_service_partner") {
    285                     $service_partner_type = "locker";
    286                 }
    287             }
    288             $res = Wildrobot_Logistra_Cargonizer::get_service_partners(
    289                 $country,
    290                 $postcode,
    291                 $carrier_identifier,
    292                 $delivery_realtion["wr_id"],
    293                 empty($address_1) ? null : $address_1,
    294                 empty($city) ? null : $city,
    295                 $service_partner_type
    296             );
    297             if (empty($res["service_partners"])) {
    298                 $service_partner_possible = false;
    299             }
    300             // Velg dag og tid for utlevering
    301 
    302             $service_partner_key_label = [
    303                 "" => apply_filters("wildrobot_logistra_service_partner_select_label", get_option("wildrobot_logistra_service_partner_select_default_value", "Velg nærmeste for meg"), $chosen_method, $transportAgreement["ta_carrier"]["identifier"]),
    304             ];
    305             foreach ($res["service_partners"] as $service_partner) {
    306                 $key = $service_partner["number"] . "@@@" .
    307                     (is_string($service_partner["customer-number"]) ? $service_partner["customer-number"] : "");
    308                 $service_partner_key_label[$key] = $service_partner["name"] . ", " . $service_partner["postcode"] . ($service_partner["city"] === "Unknown" ? "" : " " . $service_partner["city"]);
    309             }
    310 
    311             $service_partner_object = (object) [
    312                 "carrier_name" => $carrier_name,
    313                 "carrier_identifier" => $carrier_identifier,
    314                 "service_partner_possible" => $service_partner_possible,
    315                 "requires_service_partner" => $transportAgreement["requires_service_partner"],
    316                 "service_partners" => $res["service_partners"],
    317                 "service_partner_select_values" => $service_partner_key_label,
    318                 // "service_partner_select_objects" => $service_partner_select_objects,
    319             ];
    320 
    321             return apply_filters("logistra_robots_cart_shipping_service_partner_object", $service_partner_object);
    322         } catch (\Throwable $error) {
    323             return false;
    324         }
    325     }
    326     /**
    327      * Adds pickup point selection to cart totals if enabled
    328      * Hooked to: woocommerce_cart_totals_after_shipping
    329      */
    330     public function add_pickup_point_to_cart()
    331     {
    332         // Early return if pickup point is not enabled
    333         if (get_option("wildrobot_logistra_pickuppoint_checkout_inline_hook") !== "yes") {
    334             return;
    335         }
    336 
    337         $service_partner_object = self::logistra_robots_cart_shipping_template_args(null);
    338 
    339         // Early return if service partner is not possible
    340         if (!$service_partner_object || !$service_partner_object->service_partner_possible) {
    341             return;
    342         }
    343 
    344         // Get current service partner value from session
    345         $value = !empty(WC()->session->get('wildrobot_logistra_service_partner_number'))
    346             ? WC()->session->get('wildrobot_logistra_service_partner_number') . "@@@" .
    347             WC()->session->get('wildrobot_logistra_service_partner_customer_number')
    348             : null;
    349 
    350         // Add data attributes instead of wp_localize_script
    351         $service_partner_data = array(
    352             'servicePartners' => $service_partner_object->service_partners,
    353             'ajaxUrl' => admin_url('admin-ajax.php'),
    354             'nonce' => wp_create_nonce('wildrobot_logistra_select_servicepartner')
    355         );
    356 ?>
     25    private $plugin_name;
     26
     27    /**
     28     * The version of this plugin.
     29     *
     30     * @since    1.0.0
     31     * @access   private
     32     * @var      string    $version    The current version of this plugin.
     33     */
     34    private $version;
     35
     36    /**
     37     * Initialize the class and set its properties.
     38     *
     39     * @since    1.0.0
     40     * @param      string    $plugin_name       The name of the plugin.
     41     * @param      string    $version    The version of this plugin.
     42     */
     43    public function __construct($plugin_name, $version)
     44    {
     45        $this->plugin_name = $plugin_name;
     46        $this->version = $version;
     47
     48        add_action("wp_ajax_logistra_save_service_partner", [
     49            $this,
     50            "save_service_partner_to_session",
     51        ]);
     52        add_action("wp_ajax_nopriv_logistra_save_service_partner", [
     53            $this,
     54            "save_service_partner_to_session",
     55        ]);
     56        add_filter(
     57            "logistra_robots_service_partner_select",
     58            [$this, "logistra_robots_cart_shipping_template_args"],
     59            1,
     60            2,
     61        );
     62        // Cart
     63        add_action("woocommerce_cart_totals_after_shipping", [
     64            $this,
     65            "add_pickup_point_to_cart",
     66        ]);
     67        // Checkout
     68        add_action(
     69            "woocommerce_review_order_after_shipping",
     70            [$this, "add_pickup_point_to_cart"],
     71            1,
     72        );
     73    }
     74
     75    function wildrobot_logistra_locate_template(
     76        $template,
     77        $template_name,
     78        $template_path,
     79    ) {
     80        global $woocommerce;
     81        $_template = $template;
     82        if (!$template_path) {
     83            $template_path = $woocommerce->template_url;
     84        }
     85
     86        // $plugin_path  = untrailingslashit(plugin_dir_path(__FILE__))  . '/template/woocommerce/';
     87        $plugin_path =
     88            plugin_dir_path(dirname(__FILE__)) . "templates/woocommerce/";
     89        // $plugin_path  = plugin_dir_path(dirname(__FILE__) . '/template/woocommerce/');
     90
     91        // Look within passed path within the theme - this is priority
     92        $template = locate_template([
     93            $template_path . $template_name,
     94            $template_name,
     95        ]);
     96
     97        if (!$template && file_exists($plugin_path . $template_name)) {
     98            $template = $plugin_path . $template_name;
     99        }
     100
     101        if (!$template) {
     102            $template = $_template;
     103        }
     104
     105        return $template;
     106    }
     107
     108    public function add_picklist_to_page($content = null)
     109    {
     110        $page_id = get_the_ID();
     111        if (
     112            is_page() &&
     113            get_option("wildrobot_logistra_picklist_active") === "yes" &&
     114            !empty($page_id)
     115        ) {
     116            if (
     117                $page_id == get_option("wildrobot_logistra_picklist_page", null)
     118            ) {
     119                $content =
     120                    '<div id="wildrobot-complete-picklist-order">Laster plukkliste fullføring...</div>';
     121            }
     122        }
     123        return $content;
     124    }
     125
     126    public function add_service_partner_picker_field($fields)
     127    {
     128        $fields["billing"]["shipping_service_partner"] = [
     129            "label" => __("Utleveringssted", "logistra-robots"),
     130            "placeholder" => _x(
     131                "Velg utleveringssted",
     132                "placeholder",
     133                "logistra-robots",
     134            ),
     135            "required" => false,
     136            "class" => ["form-row-wide hidden"],
     137            "clear" => true,
     138            "type" => "text",
     139        ];
     140
     141        return $fields;
     142    }
     143
     144    public function save_service_partner_to_session()
     145    {
     146        check_ajax_referer("wildrobot_logistra_select_servicepartner", "nonce");
     147
     148        $service_partner_number = sanitize_text_field(
     149            $_POST["service_partner_number"],
     150        );
     151        $service_partner_customer_number = sanitize_text_field(
     152            $_POST["service_partner_customer_number"],
     153        );
     154        $service_partner_name = sanitize_text_field(
     155            $_POST["service_partner_name"],
     156        );
     157        $service_partner_postcode = sanitize_text_field(
     158            $_POST["service_partner_postcode"],
     159        );
     160        $service_partner_city = sanitize_text_field(
     161            $_POST["service_partner_city"],
     162        );
     163        $service_partner_country = sanitize_text_field(
     164            $_POST["service_partner_country"],
     165        );
     166        $chosen_shipping_methods = maybe_serialize(
     167            WC()->session->get("chosen_shipping_methods"),
     168        );
     169
     170        WC()->session->set(
     171            "wildrobot_logistra_service_partner_number",
     172            $service_partner_number,
     173        );
     174        WC()->session->set(
     175            "wildrobot_logistra_service_partner_customer_number",
     176            $service_partner_customer_number,
     177        );
     178        WC()->session->set(
     179            "wildrobot_logistra_service_partner_name",
     180            $service_partner_name,
     181        );
     182        WC()->session->set(
     183            "wildrobot_logistra_service_partner_postcode",
     184            $service_partner_postcode,
     185        );
     186        WC()->session->set(
     187            "wildrobot_logistra_service_partner_city",
     188            $service_partner_city,
     189        );
     190        WC()->session->set(
     191            "wildrobot_logistra_service_partner_country",
     192            $service_partner_country,
     193        );
     194        WC()->session->set(
     195            "wildrobot_logistra_service_partner_for_chosen_shipping_methods",
     196            $chosen_shipping_methods,
     197        );
     198        wp_send_json_success();
     199    }
     200
     201    function wildrobot_logistra_woocommerce_checkout_process(
     202        $order_id,
     203        $posted_data,
     204        $order,
     205    ) {
     206        $service_partner_number = WC()->session->get(
     207            "wildrobot_logistra_service_partner_number",
     208        );
     209        $service_partner_customer_number = WC()->session->get(
     210            "wildrobot_logistra_service_partner_customer_number",
     211        );
     212        $service_partner_name = WC()->session->get(
     213            "wildrobot_logistra_service_partner_name",
     214        );
     215        $service_partner_postcode = WC()->session->get(
     216            "wildrobot_logistra_service_partner_postcode",
     217        );
     218        $service_partner_city = WC()->session->get(
     219            "wildrobot_logistra_service_partner_city",
     220        );
     221        $service_partner_country = WC()->session->get(
     222            "wildrobot_logistra_service_partner_country",
     223        );
     224
     225        if (!empty($service_partner_number)) {
     226            $order->update_meta_data(
     227                "_wildrobot_logistra_service_partner_number",
     228                $service_partner_number,
     229            );
     230            $order->update_meta_data(
     231                "_wildrobot_logistra_service_partner_customer_number",
     232                $service_partner_customer_number,
     233            );
     234            $order->update_meta_data(
     235                "_wildrobot_logistra_service_partner_name",
     236                $service_partner_name,
     237            );
     238            $order->update_meta_data(
     239                "_wildrobot_logistra_service_partner_postcode",
     240                $service_partner_postcode,
     241            );
     242            $order->update_meta_data(
     243                "_wildrobot_logistra_service_partner_city",
     244                $service_partner_city,
     245            );
     246            $order->update_meta_data(
     247                "_wildrobot_logistra_service_partner_country",
     248                $service_partner_country,
     249            );
     250            $order->save();
     251            WC()->session->__unset("wildrobot_logistra_service_partner_number");
     252            WC()->session->__unset(
     253                "wildrobot_logistra_service_partner_customer_number",
     254            );
     255            WC()->session->__unset("wildrobot_logistra_service_partner_name");
     256            WC()->session->__unset(
     257                "wildrobot_logistra_service_partner_postcode",
     258            );
     259            WC()->session->__unset("wildrobot_logistra_service_partner_city");
     260            WC()->session->__unset(
     261                "wildrobot_logistra_service_partner_country",
     262            );
     263            WC()->session->__unset(
     264                "wildrobot_logistra_service_partner_for_chosen_shipping_methods",
     265            );
     266            return;
     267        }
     268
     269        // TO BE DEPRECATED
     270        if (
     271            isset($_POST["logistra_robots_select_servicepartner"]) &&
     272            !empty($_POST["logistra_robots_select_servicepartner"])
     273        ) {
     274            $service_partner_number =
     275                $_POST["logistra_robots_select_servicepartner"];
     276        } elseif (
     277            isset($_POST["shipping_service_partner"]) &&
     278            !empty($_POST["shipping_service_partner"])
     279        ) {
     280            $service_partner_number = $_POST["shipping_service_partner"];
     281        }
     282        if (!empty($service_partner_number)) {
     283            $order->update_meta_data(
     284                "_shipping_service_partner",
     285                $service_partner_number,
     286            );
     287            $order->save();
     288        }
     289    }
     290
     291    public function stop_checkout_if_service_partner_not_set($order_id)
     292    {
     293        $chosen_shipping_methods = WC()->session->get(
     294            "chosen_shipping_methods",
     295        );
     296        $shipping_methods = WC()->shipping()->get_shipping_methods();
     297
     298        foreach ($chosen_shipping_methods as $chosen_method) {
     299            if (
     300                strpos($chosen_method, "logistra_robots_shipping_method") !==
     301                false
     302            ) {
     303                [$method_id, $instance_id] = explode(":", $chosen_method);
     304                if (isset($shipping_methods[$method_id])) {
     305                    $shipping_method = new ($shipping_methods[$method_id])(
     306                        $instance_id,
     307                    );
     308                    if (method_exists($shipping_method, "get_option")) {
     309                        $require_service_partner = $shipping_method->get_option(
     310                            "require_service_partner",
     311                        );
     312                        if ($require_service_partner === "yes") {
     313                            $service_partner_number = WC()->session->get(
     314                                "wildrobot_logistra_service_partner_number",
     315                            );
     316                            $service_partner_for_chosen_shipping_methods = maybe_unserialize(
     317                                WC()->session->get(
     318                                    "wildrobot_logistra_service_partner_for_chosen_shipping_methods",
     319                                ),
     320                            );
     321                            if (
     322                                empty($service_partner_number) ||
     323                                !in_array(
     324                                    $chosen_method,
     325                                    $service_partner_for_chosen_shipping_methods,
     326                                )
     327                            ) {
     328                                wc_add_notice(
     329                                    __(
     330                                        "Må velge utleveringssted på denne fraktmetoden.",
     331                                        "logistra-robots",
     332                                    ),
     333                                    "error",
     334                                );
     335                                return;
     336                            }
     337                        }
     338                    }
     339                }
     340            }
     341        }
     342    }
     343
     344    /**
     345     * Generates the service partner object for the cart shipping template based on the selected shipping method.
     346     *
     347     * This function retrieves the delivery relation and transport agreement based on the chosen shipping method.
     348     * It checks if service partners are possible and filters out certain carriers. It then fetches service partners
     349     * based on the destination postcode and country. The function returns a service partner object which includes
     350     * details like carrier name, identifier, and available service partners.
     351     *
     352     * @param object $service_partner_object An object to be populated with service partner details.
     353     * @param array $args An array containing shipping method and destination details. Minimum values required are "chosen_method" and "package" with "destination" containing "postcode" and "country".
     354     * [
     355     *  "chosen_method": string,
     356     *  "package": [
     357     *      "destination": [
     358     *          "postcode": string,
     359     *          "country": string
     360     *      ]
     361     *  ]
     362     * ]
     363     * @return object|bool Returns the service partner object with populated details or false on failure.
     364     * {
     365     *  "carrier_name": string,
     366     *  "carrier_identifier": string,
     367     *  "service_partner_possible": bool,
     368     *  "requires_service_partner": bool,
     369     *  "service_partners": array,
     370     *  "service_partner_select_values": array
     371     * }
     372     */
     373    function logistra_robots_cart_shipping_template_args(
     374        $service_partner_object,
     375        $args = [],
     376    ) {
     377        try {
     378            $packages = WC()->shipping()->get_packages();
     379            // START Maybe its a subscription
     380            if (empty($packages)) {
     381                // Check if WooCommerce Subscriptions is active and the class/method exists
     382                if (
     383                    class_exists("WC_Subscriptions_Cart") &&
     384                    method_exists(
     385                        "WC_Subscriptions_Cart",
     386                        "get_recurring_shipping_packages",
     387                    )
     388                ) {
     389                    foreach (
     390                        WC_Subscriptions_Cart::get_recurring_shipping_packages()
     391                        as $shipping_package_key => $shipping_package
     392                    ) {
     393                        foreach ($shipping_package as $i => $package) {
     394                            $packages[$i] = $package;
     395                        }
     396                    }
     397                }
     398            }
     399            // END Maybe its a subscription
     400            foreach ($packages as $i => $package) {
     401                $chosen_method = isset(
     402                    WC()->session->chosen_shipping_methods[$i],
     403                )
     404                    ? WC()->session->chosen_shipping_methods[$i]
     405                    : "";
     406                $package = $packages[$i];
     407                if (!empty($chosen_method)) {
     408                    break;
     409                }
     410            }
     411            if (empty($chosen_method) || empty($package)) {
     412                return false;
     413            }
     414
     415            $delivery_realtion = Wildrobot_Logistra_DB::get_delivery_relation_with_transport_agreement(
     416                $chosen_method,
     417            );
     418            if (empty($delivery_realtion)) {
     419                return false;
     420            }
     421            $transportAgreement = $delivery_realtion["transport_agreement"];
     422            $service_partner_possible = false;
     423            if ($transportAgreement["service_partner_possible"]) {
     424                $service_partner_possible = true;
     425            }
     426            if (
     427                in_array($transportAgreement["identifier"], [
     428                    "bring_small_parcel_a_no_rfid",
     429                    "bring_small_parcel_a",
     430                    "bring2_small_parcel_a_no_rfid",
     431                    "bring2_small_parcel_a",
     432                    "postnord_mypack_home_small",
     433                ])
     434            ) {
     435                $service_partner_possible = false;
     436            }
     437            $carrier_identifier =
     438                $transportAgreement["ta_carrier"]["identifier"];
     439            $carrier_name = $transportAgreement["ta_carrier"]["name"];
     440
     441            $postcode = $package["destination"]["postcode"];
     442            $country = $package["destination"]["country"];
     443            $address_1 = $package["destination"]["address"];
     444            $city = $package["destination"]["city"];
     445            if (empty($postcode)) {
     446                return false;
     447            }
     448            $service_partner_type = null;
     449            foreach ($delivery_realtion["services"] as $service) {
     450                if ($service === "wildrobot_only_manned_service_partner") {
     451                    $service_partner_type = "manned";
     452                }
     453                if ($service === "wildrobot_only_unmanned_service_partner") {
     454                    $service_partner_type = "locker";
     455                }
     456            }
     457            $res = Wildrobot_Logistra_Cargonizer::get_service_partners(
     458                $country,
     459                $postcode,
     460                $carrier_identifier,
     461                $delivery_realtion["wr_id"],
     462                empty($address_1) ? null : $address_1,
     463                empty($city) ? null : $city,
     464                $service_partner_type,
     465            );
     466
     467            // Filter out fallback service partners (e.g., Postens Godssenter)
     468            $real_service_partners = array_filter(
     469                $res["service_partners"] ?? [],
     470                function ($sp) {
     471                    return empty($sp["is_fallback"]);
     472                },
     473            );
     474
     475            // If only fallback partners exist, hide the dropdown entirely
     476            if (empty($real_service_partners)) {
     477                $service_partner_possible = false;
     478            }
     479
     480            $service_partner_key_label = [
     481                "" => apply_filters(
     482                    "wildrobot_logistra_service_partner_select_label",
     483                    get_option(
     484                        "wildrobot_logistra_service_partner_select_default_value",
     485                        "Velg nærmeste for meg",
     486                    ),
     487                    $chosen_method,
     488                    $transportAgreement["ta_carrier"]["identifier"],
     489                ),
     490            ];
     491            foreach ($real_service_partners as $service_partner) {
     492                $key =
     493                    $service_partner["number"] .
     494                    "@@@" .
     495                    (is_string($service_partner["customer-number"])
     496                        ? $service_partner["customer-number"]
     497                        : "");
     498                $service_partner_key_label[$key] =
     499                    $service_partner["name"] .
     500                    ", " .
     501                    $service_partner["postcode"] .
     502                    ($service_partner["city"] === "Unknown"
     503                        ? ""
     504                        : " " . $service_partner["city"]);
     505            }
     506
     507            $service_partner_object = (object) [
     508                "carrier_name" => $carrier_name,
     509                "carrier_identifier" => $carrier_identifier,
     510                "service_partner_possible" => $service_partner_possible,
     511                "requires_service_partner" =>
     512                    $transportAgreement["requires_service_partner"],
     513                "service_partners" => array_values($real_service_partners),
     514                "service_partner_select_values" => $service_partner_key_label,
     515                // "service_partner_select_objects" => $service_partner_select_objects,
     516            ];
     517
     518            return apply_filters(
     519                "logistra_robots_cart_shipping_service_partner_object",
     520                $service_partner_object,
     521            );
     522        } catch (\Throwable $error) {
     523            return false;
     524        }
     525    }
     526    /**
     527     * Adds pickup point selection to cart totals if enabled
     528     * Hooked to: woocommerce_cart_totals_after_shipping
     529     */
     530    public function add_pickup_point_to_cart()
     531    {
     532        // Early return if pickup point is not enabled
     533        if (
     534            get_option(
     535                "wildrobot_logistra_pickuppoint_checkout_inline_hook",
     536            ) !== "yes"
     537        ) {
     538            return;
     539        }
     540
     541        $service_partner_object = self::logistra_robots_cart_shipping_template_args(
     542            null,
     543        );
     544
     545        // Early return if service partner is not possible
     546        if (
     547            !$service_partner_object ||
     548            !$service_partner_object->service_partner_possible
     549        ) {
     550            return;
     551        }
     552
     553        // Get current service partner value from session
     554        $value = !empty(
     555            WC()->session->get("wildrobot_logistra_service_partner_number")
     556        )
     557            ? WC()->session->get("wildrobot_logistra_service_partner_number") .
     558                "@@@" .
     559                WC()->session->get(
     560                    "wildrobot_logistra_service_partner_customer_number",
     561                )
     562            : null;
     563
     564        // Add data attributes instead of wp_localize_script
     565        $service_partner_data = [
     566            "servicePartners" => $service_partner_object->service_partners,
     567            "ajaxUrl" => admin_url("admin-ajax.php"),
     568            "nonce" => wp_create_nonce(
     569                "wildrobot_logistra_select_servicepartner",
     570            ),
     571        ];
     572        ?>
    357573        <tr class="woocommerce-wildrobot-pickuppoint-checkout-inline"
    358             data-logistra-service-partner='<?php echo esc_attr(json_encode($service_partner_data)); ?>'>
    359             <th><?php echo esc_html__('Utleveringssted', 'logistra-robots'); ?></th>
     574            data-logistra-service-partner='<?php echo esc_attr(
     575       json_encode($service_partner_data),
     576   ); ?>'>
     577            <th><?php echo esc_html__("Utleveringssted", "logistra-robots"); ?></th>
    360578            <td>
    361                 <?php
    362                 woocommerce_form_field("logistra_robots_select_servicepartner", [
    363                     'type'          => 'select',
    364                     'class'         => array('logistra_robots_select_servicepartner form-row-wide'),
    365                     'required'      => false,
    366                     'options'       => $service_partner_object->service_partner_select_values,
    367                     'default'       => $value,
    368                 ]);
    369                 ?>
     579                <?php woocommerce_form_field("logistra_robots_select_servicepartner", [
     580        "type" => "select",
     581        "class" => ["logistra_robots_select_servicepartner form-row-wide"],
     582        "required" => false,
     583        "options" => $service_partner_object->service_partner_select_values,
     584        "default" => $value,
     585    ]); ?>
    370586            </td>
    371587        </tr>
    372588<?php
    373     }
    374 
    375     public function enqueue_styles()
    376     {
    377         // wp_enqueue_style($this->plugin_name, plugin_dir_url(__FILE__) . 'css/ReactToastify.css', array(), $this->version, 'all');
    378     }
    379 
    380     public function enqueue_scripts()
    381     {
    382 
    383         $pickup_page_id = (int) get_option('wildrobot_logistra_picklist_page');
    384         $current_page_id = get_queried_object_id();
    385         $is_pickup_page = $current_page_id == $pickup_page_id;
    386 
    387         // Get current page ID
    388         // Only enqueue scripts on cart, checkout, or pickup page
    389         if (!is_cart() && !is_checkout() && !$is_pickup_page) {
    390             return;
    391         }
    392         $php_to_js_variables = array(
    393             'version' => $this->version,
    394             'wc_ajax_url' => WC()->ajax_url(),
    395             'security' => wp_create_nonce("randomTextForLogistraIntegration"),
    396         );
    397 
    398         $options = Wildrobot_Logistra_Options::get_public_options();
    399 
    400         $plugin_js = self::get_js_file_path('partials/frontend', 'public');
    401         wp_enqueue_script($this->plugin_name . "-public-js", $plugin_js, ['wp-element'], $this->version, true);
    402         wp_localize_script($this->plugin_name . '-public-js', 'wildrobotLogistraPublic', array_merge($php_to_js_variables, $options));
    403 
    404         // Enqueue the service partner handler script
    405         wp_enqueue_script(
    406             $this->plugin_name . '-service-partner',
    407             plugin_dir_url(__FILE__) . 'js/service-partner-handler.js',
    408             array('jquery'),
    409             $this->version,
    410             true
    411         );
    412     }
    413 
    414     private static function get_js_file_path($folder, $file)
    415     {
    416         $files = glob(plugin_dir_path(__FILE__) . $folder . '/' . $file . '*.js');
    417         if (!empty($files)) {
    418             $full_path = $files[0];
    419             $app_pos = strpos($full_path, $file . '.');
    420             $file_name = substr($full_path, $app_pos);
    421             return plugin_dir_url(__FILE__) . $folder . '/' . $file_name;
    422         } else {
    423             return 'http://localhost:3000/static/js/client.js';
    424         }
    425     }
     589    }
     590
     591    public function enqueue_styles()
     592    {
     593        // wp_enqueue_style($this->plugin_name, plugin_dir_url(__FILE__) . 'css/ReactToastify.css', array(), $this->version, 'all');
     594    }
     595
     596    public function enqueue_scripts()
     597    {
     598        $pickup_page_id = (int) get_option("wildrobot_logistra_picklist_page");
     599        $current_page_id = get_queried_object_id();
     600        $is_pickup_page = $current_page_id == $pickup_page_id;
     601
     602        // Get current page ID
     603        // Only enqueue scripts on cart, checkout, or pickup page
     604        if (!is_cart() && !is_checkout() && !$is_pickup_page) {
     605            return;
     606        }
     607        $php_to_js_variables = [
     608            "version" => $this->version,
     609            "wc_ajax_url" => WC()->ajax_url(),
     610            "security" => wp_create_nonce("randomTextForLogistraIntegration"),
     611        ];
     612
     613        $options = Wildrobot_Logistra_Options::get_public_options();
     614
     615        $plugin_js = self::get_js_file_path("partials/frontend", "public");
     616        wp_enqueue_script(
     617            $this->plugin_name . "-public-js",
     618            $plugin_js,
     619            ["wp-element"],
     620            $this->version,
     621            true,
     622        );
     623        wp_localize_script(
     624            $this->plugin_name . "-public-js",
     625            "wildrobotLogistraPublic",
     626            array_merge($php_to_js_variables, $options),
     627        );
     628
     629        // Enqueue the service partner handler script
     630        wp_enqueue_script(
     631            $this->plugin_name . "-service-partner",
     632            plugin_dir_url(__FILE__) . "js/service-partner-handler.js",
     633            ["jquery"],
     634            $this->version,
     635            true,
     636        );
     637    }
     638
     639    private static function get_js_file_path($folder, $file)
     640    {
     641        $files = glob(
     642            plugin_dir_path(__FILE__) . $folder . "/" . $file . "*.js",
     643        );
     644        if (!empty($files)) {
     645            $full_path = $files[0];
     646            $app_pos = strpos($full_path, $file . ".");
     647            $file_name = substr($full_path, $app_pos);
     648            return plugin_dir_url(__FILE__) . $folder . "/" . $file_name;
     649        } else {
     650            return "http://localhost:3000/static/js/client.js";
     651        }
     652    }
    426653}
  • logistra-woocommerce-integrasjon-fra-wildrobot-app/trunk/README.txt

    r3435235 r3435948  
    55Requires at least: 5.1
    66Tested up to: 6.7.2
    7 Stable tag: 7.14.3
     7Stable tag: 7.14.4
    88WC requires at least: 3.0.0
    99WC tested up to: 9.8.1
     
    4949== Changelog ==
    5050
    51 == 7.14.2-3 ==
     51== 7.14.2-4 ==
    5252* FIX Bust cache for Fallback delivery point.
    5353
  • logistra-woocommerce-integrasjon-fra-wildrobot-app/trunk/logistra-robots.php

    r3435235 r3435948  
    1717 * Plugin URI:        https://wildrobot.app/wildrobot-logistra-cargonizer-woocommerce-integrasjon/
    1818 * Description:       Integrate WooCommerce with Profrakt or Logistra - Freight administration made easy by Wildrobot!
    19  * Version:           7.14.3
     19 * Version:           7.14.4
    2020 * Author:            Robertosnap
    2121 * Author URI:        https://wildrobot.app/wildrobot-logistra-cargonizer-woocommerce-integrasjon/
     
    3939 * Rename this for your plugin and update it as you release new versions.
    4040 */
    41 define('WILDROBOT_LOGISTRA_VERSION', '7.14.3');
     41define('WILDROBOT_LOGISTRA_VERSION', '7.14.4');
    4242
    4343/**
  • logistra-woocommerce-integrasjon-fra-wildrobot-app/trunk/public/class-wildrobot-logistra-public.php

    r3321591 r3435948  
    2323class Wildrobot_Logistra_Public
    2424{
    25 
    26     private $plugin_name;
    27 
    28     /**
    29      * The version of this plugin.
    30      *
    31      * @since    1.0.0
    32      * @access   private
    33      * @var      string    $version    The current version of this plugin.
    34      */
    35     private $version;
    36 
    37     /**
    38      * Initialize the class and set its properties.
    39      *
    40      * @since    1.0.0
    41      * @param      string    $plugin_name       The name of the plugin.
    42      * @param      string    $version    The version of this plugin.
    43      */
    44     public function __construct($plugin_name, $version)
    45     {
    46 
    47         $this->plugin_name = $plugin_name;
    48         $this->version = $version;
    49 
    50         add_action('wp_ajax_logistra_save_service_partner', array($this, 'save_service_partner_to_session'));
    51         add_action('wp_ajax_nopriv_logistra_save_service_partner', array($this, 'save_service_partner_to_session'));
    52         add_filter('logistra_robots_service_partner_select', array($this, "logistra_robots_cart_shipping_template_args"), 1, 2);
    53         // Cart
    54         add_action("woocommerce_cart_totals_after_shipping", array($this, "add_pickup_point_to_cart"));
    55         // Checkout
    56         add_action("woocommerce_review_order_after_shipping", array($this, "add_pickup_point_to_cart"), 1);
    57     }
    58 
    59     function wildrobot_logistra_locate_template($template, $template_name, $template_path)
    60     {
    61         global $woocommerce;
    62         $_template = $template;
    63         if (!$template_path)
    64             $template_path = $woocommerce->template_url;
    65 
    66         // $plugin_path  = untrailingslashit(plugin_dir_path(__FILE__))  . '/template/woocommerce/';
    67         $plugin_path  = plugin_dir_path(dirname(__FILE__)) . 'templates/woocommerce/';
    68         // $plugin_path  = plugin_dir_path(dirname(__FILE__) . '/template/woocommerce/');
    69 
    70         // Look within passed path within the theme - this is priority
    71         $template = locate_template(
    72             array(
    73                 $template_path . $template_name,
    74                 $template_name
    75             )
    76         );
    77 
    78         if (!$template && file_exists($plugin_path . $template_name))
    79             $template = $plugin_path . $template_name;
    80 
    81         if (!$template)
    82             $template = $_template;
    83 
    84         return $template;
    85     }
    86 
    87     public function add_picklist_to_page($content = null)
    88     {
    89         $page_id = get_the_ID();
    90         if (is_page() && (get_option("wildrobot_logistra_picklist_active") === "yes")  && !empty($page_id)) {
    91             if ($page_id == get_option('wildrobot_logistra_picklist_page', null)) {
    92                 $content = '<div id="wildrobot-complete-picklist-order">Laster plukkliste fullføring...</div>';
    93             }
    94         }
    95         return $content;
    96     }
    97 
    98     public function add_service_partner_picker_field($fields)
    99     {
    100         $fields['billing']['shipping_service_partner'] = array(
    101             'label'     => __('Utleveringssted', 'logistra-robots'),
    102             'placeholder'   => _x('Velg utleveringssted', 'placeholder', 'logistra-robots'),
    103             'required'  => false,
    104             'class'     => array('form-row-wide hidden'),
    105             'clear'     => true,
    106             'type' => 'text',
    107         );
    108 
    109         return $fields;
    110     }
    111 
    112     public function save_service_partner_to_session()
    113     {
    114         check_ajax_referer('wildrobot_logistra_select_servicepartner', 'nonce');
    115 
    116         $service_partner_number = sanitize_text_field($_POST['service_partner_number']);
    117         $service_partner_customer_number = sanitize_text_field($_POST['service_partner_customer_number']);
    118         $service_partner_name = sanitize_text_field($_POST['service_partner_name']);
    119         $service_partner_postcode = sanitize_text_field($_POST['service_partner_postcode']);
    120         $service_partner_city = sanitize_text_field($_POST['service_partner_city']);
    121         $service_partner_country = sanitize_text_field($_POST['service_partner_country']);
    122         $chosen_shipping_methods = maybe_serialize(WC()->session->get('chosen_shipping_methods'));
    123 
    124         WC()->session->set('wildrobot_logistra_service_partner_number', $service_partner_number);
    125         WC()->session->set('wildrobot_logistra_service_partner_customer_number', $service_partner_customer_number);
    126         WC()->session->set('wildrobot_logistra_service_partner_name', $service_partner_name);
    127         WC()->session->set('wildrobot_logistra_service_partner_postcode', $service_partner_postcode);
    128         WC()->session->set('wildrobot_logistra_service_partner_city', $service_partner_city);
    129         WC()->session->set('wildrobot_logistra_service_partner_country', $service_partner_country);
    130         WC()->session->set('wildrobot_logistra_service_partner_for_chosen_shipping_methods', $chosen_shipping_methods);
    131         wp_send_json_success();
    132     }
    133 
    134     function wildrobot_logistra_woocommerce_checkout_process($order_id, $posted_data, $order)
    135     {
    136 
    137         $service_partner_number = WC()->session->get('wildrobot_logistra_service_partner_number');
    138         $service_partner_customer_number = WC()->session->get('wildrobot_logistra_service_partner_customer_number');
    139         $service_partner_name = WC()->session->get('wildrobot_logistra_service_partner_name');
    140         $service_partner_postcode = WC()->session->get('wildrobot_logistra_service_partner_postcode');
    141         $service_partner_city = WC()->session->get('wildrobot_logistra_service_partner_city');
    142         $service_partner_country = WC()->session->get('wildrobot_logistra_service_partner_country');
    143 
    144         if (!empty($service_partner_number)) {
    145             $order->update_meta_data("_wildrobot_logistra_service_partner_number", $service_partner_number);
    146             $order->update_meta_data("_wildrobot_logistra_service_partner_customer_number", $service_partner_customer_number);
    147             $order->update_meta_data("_wildrobot_logistra_service_partner_name", $service_partner_name);
    148             $order->update_meta_data("_wildrobot_logistra_service_partner_postcode", $service_partner_postcode);
    149             $order->update_meta_data("_wildrobot_logistra_service_partner_city", $service_partner_city);
    150             $order->update_meta_data("_wildrobot_logistra_service_partner_country", $service_partner_country);
    151             $order->save();
    152             WC()->session->__unset('wildrobot_logistra_service_partner_number');
    153             WC()->session->__unset('wildrobot_logistra_service_partner_customer_number');
    154             WC()->session->__unset('wildrobot_logistra_service_partner_name');
    155             WC()->session->__unset('wildrobot_logistra_service_partner_postcode');
    156             WC()->session->__unset('wildrobot_logistra_service_partner_city');
    157             WC()->session->__unset('wildrobot_logistra_service_partner_country');
    158             WC()->session->__unset('wildrobot_logistra_service_partner_for_chosen_shipping_methods');
    159             return;
    160         }
    161 
    162         // TO BE DEPRECATED
    163         if (isset($_POST["logistra_robots_select_servicepartner"]) && !empty($_POST["logistra_robots_select_servicepartner"])) {
    164             $service_partner_number = $_POST["logistra_robots_select_servicepartner"];
    165         } else if (isset($_POST["shipping_service_partner"]) && !empty($_POST["shipping_service_partner"])) {
    166             $service_partner_number = $_POST["shipping_service_partner"];
    167         }
    168         if (!empty($service_partner_number)) {
    169             $order->update_meta_data("_shipping_service_partner", $service_partner_number);
    170             $order->save();
    171         }
    172     }
    173 
    174     public function stop_checkout_if_service_partner_not_set($order_id)
    175     {
    176         $chosen_shipping_methods = WC()->session->get('chosen_shipping_methods');
    177         $shipping_methods = WC()->shipping()->get_shipping_methods();
    178 
    179         foreach ($chosen_shipping_methods as $chosen_method) {
    180             if (strpos($chosen_method, 'logistra_robots_shipping_method') !== false) {
    181                 list($method_id, $instance_id) = explode(':', $chosen_method);
    182                 if (isset($shipping_methods[$method_id])) {
    183                     $shipping_method = new $shipping_methods[$method_id]($instance_id);
    184                     if (method_exists($shipping_method, 'get_option')) {
    185                         $require_service_partner = $shipping_method->get_option('require_service_partner');
    186                         if ($require_service_partner === 'yes') {
    187                             $service_partner_number = WC()->session->get('wildrobot_logistra_service_partner_number');
    188                             $service_partner_for_chosen_shipping_methods = maybe_unserialize(WC()->session->get('wildrobot_logistra_service_partner_for_chosen_shipping_methods'));
    189                             if (empty($service_partner_number) || !in_array($chosen_method, $service_partner_for_chosen_shipping_methods)) {
    190                                 wc_add_notice(__('Må velge utleveringssted på denne fraktmetoden.', 'logistra-robots'), 'error');
    191                                 return;
    192                             }
    193                         }
    194                     }
    195                 }
    196             }
    197         }
    198     }
    199 
    200 
    201     /**
    202      * Generates the service partner object for the cart shipping template based on the selected shipping method.
    203      *
    204      * This function retrieves the delivery relation and transport agreement based on the chosen shipping method.
    205      * It checks if service partners are possible and filters out certain carriers. It then fetches service partners
    206      * based on the destination postcode and country. The function returns a service partner object which includes
    207      * details like carrier name, identifier, and available service partners.
    208      *
    209      * @param object $service_partner_object An object to be populated with service partner details.
    210      * @param array $args An array containing shipping method and destination details. Minimum values required are "chosen_method" and "package" with "destination" containing "postcode" and "country".
    211      * [
    212      *  "chosen_method": string,
    213      *  "package": [
    214      *      "destination": [
    215      *          "postcode": string,
    216      *          "country": string
    217      *      ]
    218      *  ]
    219      * ]
    220      * @return object|bool Returns the service partner object with populated details or false on failure.
    221      * {
    222      *  "carrier_name": string,
    223      *  "carrier_identifier": string,
    224      *  "service_partner_possible": bool,
    225      *  "requires_service_partner": bool,
    226      *  "service_partners": array,
    227      *  "service_partner_select_values": array
    228      * }
    229      */
    230     function logistra_robots_cart_shipping_template_args($service_partner_object, $args = [])
    231     {
    232         try {
    233             $packages = WC()->shipping()->get_packages();
    234             // START Maybe its a subscription
    235             if (empty($packages)) {
    236                 // Check if WooCommerce Subscriptions is active and the class/method exists
    237                 if (class_exists('WC_Subscriptions_Cart') && method_exists('WC_Subscriptions_Cart', 'get_recurring_shipping_packages')) {
    238                     foreach (WC_Subscriptions_Cart::get_recurring_shipping_packages() as $shipping_package_key => $shipping_package) {
    239                         foreach ($shipping_package as $i => $package) {
    240                             $packages[$i] = $package;
    241                         }
    242                     }
    243                 }
    244             }
    245             // END Maybe its a subscription
    246             foreach ($packages as $i => $package) {
    247                 $chosen_method = isset(WC()->session->chosen_shipping_methods[$i]) ? WC()->session->chosen_shipping_methods[$i] : '';
    248                 $package = $packages[$i];
    249                 if (!empty($chosen_method)) {
    250                     break;
    251                 }
    252             }
    253             if (empty($chosen_method) || empty($package)) {
    254                 return false;
    255             }
    256 
    257             $delivery_realtion = Wildrobot_Logistra_DB::get_delivery_relation_with_transport_agreement($chosen_method);
    258             if (empty($delivery_realtion)) {
    259                 return false;
    260             }
    261             $transportAgreement = $delivery_realtion["transport_agreement"];
    262             $service_partner_possible = false;
    263             if ($transportAgreement["service_partner_possible"]) {
    264                 $service_partner_possible = true;
    265             }
    266             if (in_array($transportAgreement["identifier"], ["bring_small_parcel_a_no_rfid", "bring_small_parcel_a", "bring2_small_parcel_a_no_rfid", "bring2_small_parcel_a", "postnord_mypack_home_small"])) {
    267                 $service_partner_possible = false;
    268             }
    269             $carrier_identifier = $transportAgreement["ta_carrier"]["identifier"];
    270             $carrier_name = $transportAgreement["ta_carrier"]["name"];
    271 
    272             $postcode = $package["destination"]["postcode"];
    273             $country = $package["destination"]["country"];
    274             $address_1 = $package["destination"]["address"];
    275             $city = $package["destination"]["city"];
    276             if (empty($postcode)) {
    277                 return false;
    278             }
    279             $service_partner_type = null;
    280             foreach ($delivery_realtion["services"] as $service) {
    281                 if ($service === "wildrobot_only_manned_service_partner") {
    282                     $service_partner_type = "manned";
    283                 }
    284                 if ($service === "wildrobot_only_unmanned_service_partner") {
    285                     $service_partner_type = "locker";
    286                 }
    287             }
    288             $res = Wildrobot_Logistra_Cargonizer::get_service_partners(
    289                 $country,
    290                 $postcode,
    291                 $carrier_identifier,
    292                 $delivery_realtion["wr_id"],
    293                 empty($address_1) ? null : $address_1,
    294                 empty($city) ? null : $city,
    295                 $service_partner_type
    296             );
    297             if (empty($res["service_partners"])) {
    298                 $service_partner_possible = false;
    299             }
    300             // Velg dag og tid for utlevering
    301 
    302             $service_partner_key_label = [
    303                 "" => apply_filters("wildrobot_logistra_service_partner_select_label", get_option("wildrobot_logistra_service_partner_select_default_value", "Velg nærmeste for meg"), $chosen_method, $transportAgreement["ta_carrier"]["identifier"]),
    304             ];
    305             foreach ($res["service_partners"] as $service_partner) {
    306                 $key = $service_partner["number"] . "@@@" .
    307                     (is_string($service_partner["customer-number"]) ? $service_partner["customer-number"] : "");
    308                 $service_partner_key_label[$key] = $service_partner["name"] . ", " . $service_partner["postcode"] . ($service_partner["city"] === "Unknown" ? "" : " " . $service_partner["city"]);
    309             }
    310 
    311             $service_partner_object = (object) [
    312                 "carrier_name" => $carrier_name,
    313                 "carrier_identifier" => $carrier_identifier,
    314                 "service_partner_possible" => $service_partner_possible,
    315                 "requires_service_partner" => $transportAgreement["requires_service_partner"],
    316                 "service_partners" => $res["service_partners"],
    317                 "service_partner_select_values" => $service_partner_key_label,
    318                 // "service_partner_select_objects" => $service_partner_select_objects,
    319             ];
    320 
    321             return apply_filters("logistra_robots_cart_shipping_service_partner_object", $service_partner_object);
    322         } catch (\Throwable $error) {
    323             return false;
    324         }
    325     }
    326     /**
    327      * Adds pickup point selection to cart totals if enabled
    328      * Hooked to: woocommerce_cart_totals_after_shipping
    329      */
    330     public function add_pickup_point_to_cart()
    331     {
    332         // Early return if pickup point is not enabled
    333         if (get_option("wildrobot_logistra_pickuppoint_checkout_inline_hook") !== "yes") {
    334             return;
    335         }
    336 
    337         $service_partner_object = self::logistra_robots_cart_shipping_template_args(null);
    338 
    339         // Early return if service partner is not possible
    340         if (!$service_partner_object || !$service_partner_object->service_partner_possible) {
    341             return;
    342         }
    343 
    344         // Get current service partner value from session
    345         $value = !empty(WC()->session->get('wildrobot_logistra_service_partner_number'))
    346             ? WC()->session->get('wildrobot_logistra_service_partner_number') . "@@@" .
    347             WC()->session->get('wildrobot_logistra_service_partner_customer_number')
    348             : null;
    349 
    350         // Add data attributes instead of wp_localize_script
    351         $service_partner_data = array(
    352             'servicePartners' => $service_partner_object->service_partners,
    353             'ajaxUrl' => admin_url('admin-ajax.php'),
    354             'nonce' => wp_create_nonce('wildrobot_logistra_select_servicepartner')
    355         );
    356 ?>
     25    private $plugin_name;
     26
     27    /**
     28     * The version of this plugin.
     29     *
     30     * @since    1.0.0
     31     * @access   private
     32     * @var      string    $version    The current version of this plugin.
     33     */
     34    private $version;
     35
     36    /**
     37     * Initialize the class and set its properties.
     38     *
     39     * @since    1.0.0
     40     * @param      string    $plugin_name       The name of the plugin.
     41     * @param      string    $version    The version of this plugin.
     42     */
     43    public function __construct($plugin_name, $version)
     44    {
     45        $this->plugin_name = $plugin_name;
     46        $this->version = $version;
     47
     48        add_action("wp_ajax_logistra_save_service_partner", [
     49            $this,
     50            "save_service_partner_to_session",
     51        ]);
     52        add_action("wp_ajax_nopriv_logistra_save_service_partner", [
     53            $this,
     54            "save_service_partner_to_session",
     55        ]);
     56        add_filter(
     57            "logistra_robots_service_partner_select",
     58            [$this, "logistra_robots_cart_shipping_template_args"],
     59            1,
     60            2,
     61        );
     62        // Cart
     63        add_action("woocommerce_cart_totals_after_shipping", [
     64            $this,
     65            "add_pickup_point_to_cart",
     66        ]);
     67        // Checkout
     68        add_action(
     69            "woocommerce_review_order_after_shipping",
     70            [$this, "add_pickup_point_to_cart"],
     71            1,
     72        );
     73    }
     74
     75    function wildrobot_logistra_locate_template(
     76        $template,
     77        $template_name,
     78        $template_path,
     79    ) {
     80        global $woocommerce;
     81        $_template = $template;
     82        if (!$template_path) {
     83            $template_path = $woocommerce->template_url;
     84        }
     85
     86        // $plugin_path  = untrailingslashit(plugin_dir_path(__FILE__))  . '/template/woocommerce/';
     87        $plugin_path =
     88            plugin_dir_path(dirname(__FILE__)) . "templates/woocommerce/";
     89        // $plugin_path  = plugin_dir_path(dirname(__FILE__) . '/template/woocommerce/');
     90
     91        // Look within passed path within the theme - this is priority
     92        $template = locate_template([
     93            $template_path . $template_name,
     94            $template_name,
     95        ]);
     96
     97        if (!$template && file_exists($plugin_path . $template_name)) {
     98            $template = $plugin_path . $template_name;
     99        }
     100
     101        if (!$template) {
     102            $template = $_template;
     103        }
     104
     105        return $template;
     106    }
     107
     108    public function add_picklist_to_page($content = null)
     109    {
     110        $page_id = get_the_ID();
     111        if (
     112            is_page() &&
     113            get_option("wildrobot_logistra_picklist_active") === "yes" &&
     114            !empty($page_id)
     115        ) {
     116            if (
     117                $page_id == get_option("wildrobot_logistra_picklist_page", null)
     118            ) {
     119                $content =
     120                    '<div id="wildrobot-complete-picklist-order">Laster plukkliste fullføring...</div>';
     121            }
     122        }
     123        return $content;
     124    }
     125
     126    public function add_service_partner_picker_field($fields)
     127    {
     128        $fields["billing"]["shipping_service_partner"] = [
     129            "label" => __("Utleveringssted", "logistra-robots"),
     130            "placeholder" => _x(
     131                "Velg utleveringssted",
     132                "placeholder",
     133                "logistra-robots",
     134            ),
     135            "required" => false,
     136            "class" => ["form-row-wide hidden"],
     137            "clear" => true,
     138            "type" => "text",
     139        ];
     140
     141        return $fields;
     142    }
     143
     144    public function save_service_partner_to_session()
     145    {
     146        check_ajax_referer("wildrobot_logistra_select_servicepartner", "nonce");
     147
     148        $service_partner_number = sanitize_text_field(
     149            $_POST["service_partner_number"],
     150        );
     151        $service_partner_customer_number = sanitize_text_field(
     152            $_POST["service_partner_customer_number"],
     153        );
     154        $service_partner_name = sanitize_text_field(
     155            $_POST["service_partner_name"],
     156        );
     157        $service_partner_postcode = sanitize_text_field(
     158            $_POST["service_partner_postcode"],
     159        );
     160        $service_partner_city = sanitize_text_field(
     161            $_POST["service_partner_city"],
     162        );
     163        $service_partner_country = sanitize_text_field(
     164            $_POST["service_partner_country"],
     165        );
     166        $chosen_shipping_methods = maybe_serialize(
     167            WC()->session->get("chosen_shipping_methods"),
     168        );
     169
     170        WC()->session->set(
     171            "wildrobot_logistra_service_partner_number",
     172            $service_partner_number,
     173        );
     174        WC()->session->set(
     175            "wildrobot_logistra_service_partner_customer_number",
     176            $service_partner_customer_number,
     177        );
     178        WC()->session->set(
     179            "wildrobot_logistra_service_partner_name",
     180            $service_partner_name,
     181        );
     182        WC()->session->set(
     183            "wildrobot_logistra_service_partner_postcode",
     184            $service_partner_postcode,
     185        );
     186        WC()->session->set(
     187            "wildrobot_logistra_service_partner_city",
     188            $service_partner_city,
     189        );
     190        WC()->session->set(
     191            "wildrobot_logistra_service_partner_country",
     192            $service_partner_country,
     193        );
     194        WC()->session->set(
     195            "wildrobot_logistra_service_partner_for_chosen_shipping_methods",
     196            $chosen_shipping_methods,
     197        );
     198        wp_send_json_success();
     199    }
     200
     201    function wildrobot_logistra_woocommerce_checkout_process(
     202        $order_id,
     203        $posted_data,
     204        $order,
     205    ) {
     206        $service_partner_number = WC()->session->get(
     207            "wildrobot_logistra_service_partner_number",
     208        );
     209        $service_partner_customer_number = WC()->session->get(
     210            "wildrobot_logistra_service_partner_customer_number",
     211        );
     212        $service_partner_name = WC()->session->get(
     213            "wildrobot_logistra_service_partner_name",
     214        );
     215        $service_partner_postcode = WC()->session->get(
     216            "wildrobot_logistra_service_partner_postcode",
     217        );
     218        $service_partner_city = WC()->session->get(
     219            "wildrobot_logistra_service_partner_city",
     220        );
     221        $service_partner_country = WC()->session->get(
     222            "wildrobot_logistra_service_partner_country",
     223        );
     224
     225        if (!empty($service_partner_number)) {
     226            $order->update_meta_data(
     227                "_wildrobot_logistra_service_partner_number",
     228                $service_partner_number,
     229            );
     230            $order->update_meta_data(
     231                "_wildrobot_logistra_service_partner_customer_number",
     232                $service_partner_customer_number,
     233            );
     234            $order->update_meta_data(
     235                "_wildrobot_logistra_service_partner_name",
     236                $service_partner_name,
     237            );
     238            $order->update_meta_data(
     239                "_wildrobot_logistra_service_partner_postcode",
     240                $service_partner_postcode,
     241            );
     242            $order->update_meta_data(
     243                "_wildrobot_logistra_service_partner_city",
     244                $service_partner_city,
     245            );
     246            $order->update_meta_data(
     247                "_wildrobot_logistra_service_partner_country",
     248                $service_partner_country,
     249            );
     250            $order->save();
     251            WC()->session->__unset("wildrobot_logistra_service_partner_number");
     252            WC()->session->__unset(
     253                "wildrobot_logistra_service_partner_customer_number",
     254            );
     255            WC()->session->__unset("wildrobot_logistra_service_partner_name");
     256            WC()->session->__unset(
     257                "wildrobot_logistra_service_partner_postcode",
     258            );
     259            WC()->session->__unset("wildrobot_logistra_service_partner_city");
     260            WC()->session->__unset(
     261                "wildrobot_logistra_service_partner_country",
     262            );
     263            WC()->session->__unset(
     264                "wildrobot_logistra_service_partner_for_chosen_shipping_methods",
     265            );
     266            return;
     267        }
     268
     269        // TO BE DEPRECATED
     270        if (
     271            isset($_POST["logistra_robots_select_servicepartner"]) &&
     272            !empty($_POST["logistra_robots_select_servicepartner"])
     273        ) {
     274            $service_partner_number =
     275                $_POST["logistra_robots_select_servicepartner"];
     276        } elseif (
     277            isset($_POST["shipping_service_partner"]) &&
     278            !empty($_POST["shipping_service_partner"])
     279        ) {
     280            $service_partner_number = $_POST["shipping_service_partner"];
     281        }
     282        if (!empty($service_partner_number)) {
     283            $order->update_meta_data(
     284                "_shipping_service_partner",
     285                $service_partner_number,
     286            );
     287            $order->save();
     288        }
     289    }
     290
     291    public function stop_checkout_if_service_partner_not_set($order_id)
     292    {
     293        $chosen_shipping_methods = WC()->session->get(
     294            "chosen_shipping_methods",
     295        );
     296        $shipping_methods = WC()->shipping()->get_shipping_methods();
     297
     298        foreach ($chosen_shipping_methods as $chosen_method) {
     299            if (
     300                strpos($chosen_method, "logistra_robots_shipping_method") !==
     301                false
     302            ) {
     303                [$method_id, $instance_id] = explode(":", $chosen_method);
     304                if (isset($shipping_methods[$method_id])) {
     305                    $shipping_method = new ($shipping_methods[$method_id])(
     306                        $instance_id,
     307                    );
     308                    if (method_exists($shipping_method, "get_option")) {
     309                        $require_service_partner = $shipping_method->get_option(
     310                            "require_service_partner",
     311                        );
     312                        if ($require_service_partner === "yes") {
     313                            $service_partner_number = WC()->session->get(
     314                                "wildrobot_logistra_service_partner_number",
     315                            );
     316                            $service_partner_for_chosen_shipping_methods = maybe_unserialize(
     317                                WC()->session->get(
     318                                    "wildrobot_logistra_service_partner_for_chosen_shipping_methods",
     319                                ),
     320                            );
     321                            if (
     322                                empty($service_partner_number) ||
     323                                !in_array(
     324                                    $chosen_method,
     325                                    $service_partner_for_chosen_shipping_methods,
     326                                )
     327                            ) {
     328                                wc_add_notice(
     329                                    __(
     330                                        "Må velge utleveringssted på denne fraktmetoden.",
     331                                        "logistra-robots",
     332                                    ),
     333                                    "error",
     334                                );
     335                                return;
     336                            }
     337                        }
     338                    }
     339                }
     340            }
     341        }
     342    }
     343
     344    /**
     345     * Generates the service partner object for the cart shipping template based on the selected shipping method.
     346     *
     347     * This function retrieves the delivery relation and transport agreement based on the chosen shipping method.
     348     * It checks if service partners are possible and filters out certain carriers. It then fetches service partners
     349     * based on the destination postcode and country. The function returns a service partner object which includes
     350     * details like carrier name, identifier, and available service partners.
     351     *
     352     * @param object $service_partner_object An object to be populated with service partner details.
     353     * @param array $args An array containing shipping method and destination details. Minimum values required are "chosen_method" and "package" with "destination" containing "postcode" and "country".
     354     * [
     355     *  "chosen_method": string,
     356     *  "package": [
     357     *      "destination": [
     358     *          "postcode": string,
     359     *          "country": string
     360     *      ]
     361     *  ]
     362     * ]
     363     * @return object|bool Returns the service partner object with populated details or false on failure.
     364     * {
     365     *  "carrier_name": string,
     366     *  "carrier_identifier": string,
     367     *  "service_partner_possible": bool,
     368     *  "requires_service_partner": bool,
     369     *  "service_partners": array,
     370     *  "service_partner_select_values": array
     371     * }
     372     */
     373    function logistra_robots_cart_shipping_template_args(
     374        $service_partner_object,
     375        $args = [],
     376    ) {
     377        try {
     378            $packages = WC()->shipping()->get_packages();
     379            // START Maybe its a subscription
     380            if (empty($packages)) {
     381                // Check if WooCommerce Subscriptions is active and the class/method exists
     382                if (
     383                    class_exists("WC_Subscriptions_Cart") &&
     384                    method_exists(
     385                        "WC_Subscriptions_Cart",
     386                        "get_recurring_shipping_packages",
     387                    )
     388                ) {
     389                    foreach (
     390                        WC_Subscriptions_Cart::get_recurring_shipping_packages()
     391                        as $shipping_package_key => $shipping_package
     392                    ) {
     393                        foreach ($shipping_package as $i => $package) {
     394                            $packages[$i] = $package;
     395                        }
     396                    }
     397                }
     398            }
     399            // END Maybe its a subscription
     400            foreach ($packages as $i => $package) {
     401                $chosen_method = isset(
     402                    WC()->session->chosen_shipping_methods[$i],
     403                )
     404                    ? WC()->session->chosen_shipping_methods[$i]
     405                    : "";
     406                $package = $packages[$i];
     407                if (!empty($chosen_method)) {
     408                    break;
     409                }
     410            }
     411            if (empty($chosen_method) || empty($package)) {
     412                return false;
     413            }
     414
     415            $delivery_realtion = Wildrobot_Logistra_DB::get_delivery_relation_with_transport_agreement(
     416                $chosen_method,
     417            );
     418            if (empty($delivery_realtion)) {
     419                return false;
     420            }
     421            $transportAgreement = $delivery_realtion["transport_agreement"];
     422            $service_partner_possible = false;
     423            if ($transportAgreement["service_partner_possible"]) {
     424                $service_partner_possible = true;
     425            }
     426            if (
     427                in_array($transportAgreement["identifier"], [
     428                    "bring_small_parcel_a_no_rfid",
     429                    "bring_small_parcel_a",
     430                    "bring2_small_parcel_a_no_rfid",
     431                    "bring2_small_parcel_a",
     432                    "postnord_mypack_home_small",
     433                ])
     434            ) {
     435                $service_partner_possible = false;
     436            }
     437            $carrier_identifier =
     438                $transportAgreement["ta_carrier"]["identifier"];
     439            $carrier_name = $transportAgreement["ta_carrier"]["name"];
     440
     441            $postcode = $package["destination"]["postcode"];
     442            $country = $package["destination"]["country"];
     443            $address_1 = $package["destination"]["address"];
     444            $city = $package["destination"]["city"];
     445            if (empty($postcode)) {
     446                return false;
     447            }
     448            $service_partner_type = null;
     449            foreach ($delivery_realtion["services"] as $service) {
     450                if ($service === "wildrobot_only_manned_service_partner") {
     451                    $service_partner_type = "manned";
     452                }
     453                if ($service === "wildrobot_only_unmanned_service_partner") {
     454                    $service_partner_type = "locker";
     455                }
     456            }
     457            $res = Wildrobot_Logistra_Cargonizer::get_service_partners(
     458                $country,
     459                $postcode,
     460                $carrier_identifier,
     461                $delivery_realtion["wr_id"],
     462                empty($address_1) ? null : $address_1,
     463                empty($city) ? null : $city,
     464                $service_partner_type,
     465            );
     466
     467            // Filter out fallback service partners (e.g., Postens Godssenter)
     468            $real_service_partners = array_filter(
     469                $res["service_partners"] ?? [],
     470                function ($sp) {
     471                    return empty($sp["is_fallback"]);
     472                },
     473            );
     474
     475            // If only fallback partners exist, hide the dropdown entirely
     476            if (empty($real_service_partners)) {
     477                $service_partner_possible = false;
     478            }
     479
     480            $service_partner_key_label = [
     481                "" => apply_filters(
     482                    "wildrobot_logistra_service_partner_select_label",
     483                    get_option(
     484                        "wildrobot_logistra_service_partner_select_default_value",
     485                        "Velg nærmeste for meg",
     486                    ),
     487                    $chosen_method,
     488                    $transportAgreement["ta_carrier"]["identifier"],
     489                ),
     490            ];
     491            foreach ($real_service_partners as $service_partner) {
     492                $key =
     493                    $service_partner["number"] .
     494                    "@@@" .
     495                    (is_string($service_partner["customer-number"])
     496                        ? $service_partner["customer-number"]
     497                        : "");
     498                $service_partner_key_label[$key] =
     499                    $service_partner["name"] .
     500                    ", " .
     501                    $service_partner["postcode"] .
     502                    ($service_partner["city"] === "Unknown"
     503                        ? ""
     504                        : " " . $service_partner["city"]);
     505            }
     506
     507            $service_partner_object = (object) [
     508                "carrier_name" => $carrier_name,
     509                "carrier_identifier" => $carrier_identifier,
     510                "service_partner_possible" => $service_partner_possible,
     511                "requires_service_partner" =>
     512                    $transportAgreement["requires_service_partner"],
     513                "service_partners" => array_values($real_service_partners),
     514                "service_partner_select_values" => $service_partner_key_label,
     515                // "service_partner_select_objects" => $service_partner_select_objects,
     516            ];
     517
     518            return apply_filters(
     519                "logistra_robots_cart_shipping_service_partner_object",
     520                $service_partner_object,
     521            );
     522        } catch (\Throwable $error) {
     523            return false;
     524        }
     525    }
     526    /**
     527     * Adds pickup point selection to cart totals if enabled
     528     * Hooked to: woocommerce_cart_totals_after_shipping
     529     */
     530    public function add_pickup_point_to_cart()
     531    {
     532        // Early return if pickup point is not enabled
     533        if (
     534            get_option(
     535                "wildrobot_logistra_pickuppoint_checkout_inline_hook",
     536            ) !== "yes"
     537        ) {
     538            return;
     539        }
     540
     541        $service_partner_object = self::logistra_robots_cart_shipping_template_args(
     542            null,
     543        );
     544
     545        // Early return if service partner is not possible
     546        if (
     547            !$service_partner_object ||
     548            !$service_partner_object->service_partner_possible
     549        ) {
     550            return;
     551        }
     552
     553        // Get current service partner value from session
     554        $value = !empty(
     555            WC()->session->get("wildrobot_logistra_service_partner_number")
     556        )
     557            ? WC()->session->get("wildrobot_logistra_service_partner_number") .
     558                "@@@" .
     559                WC()->session->get(
     560                    "wildrobot_logistra_service_partner_customer_number",
     561                )
     562            : null;
     563
     564        // Add data attributes instead of wp_localize_script
     565        $service_partner_data = [
     566            "servicePartners" => $service_partner_object->service_partners,
     567            "ajaxUrl" => admin_url("admin-ajax.php"),
     568            "nonce" => wp_create_nonce(
     569                "wildrobot_logistra_select_servicepartner",
     570            ),
     571        ];
     572        ?>
    357573        <tr class="woocommerce-wildrobot-pickuppoint-checkout-inline"
    358             data-logistra-service-partner='<?php echo esc_attr(json_encode($service_partner_data)); ?>'>
    359             <th><?php echo esc_html__('Utleveringssted', 'logistra-robots'); ?></th>
     574            data-logistra-service-partner='<?php echo esc_attr(
     575       json_encode($service_partner_data),
     576   ); ?>'>
     577            <th><?php echo esc_html__("Utleveringssted", "logistra-robots"); ?></th>
    360578            <td>
    361                 <?php
    362                 woocommerce_form_field("logistra_robots_select_servicepartner", [
    363                     'type'          => 'select',
    364                     'class'         => array('logistra_robots_select_servicepartner form-row-wide'),
    365                     'required'      => false,
    366                     'options'       => $service_partner_object->service_partner_select_values,
    367                     'default'       => $value,
    368                 ]);
    369                 ?>
     579                <?php woocommerce_form_field("logistra_robots_select_servicepartner", [
     580        "type" => "select",
     581        "class" => ["logistra_robots_select_servicepartner form-row-wide"],
     582        "required" => false,
     583        "options" => $service_partner_object->service_partner_select_values,
     584        "default" => $value,
     585    ]); ?>
    370586            </td>
    371587        </tr>
    372588<?php
    373     }
    374 
    375     public function enqueue_styles()
    376     {
    377         // wp_enqueue_style($this->plugin_name, plugin_dir_url(__FILE__) . 'css/ReactToastify.css', array(), $this->version, 'all');
    378     }
    379 
    380     public function enqueue_scripts()
    381     {
    382 
    383         $pickup_page_id = (int) get_option('wildrobot_logistra_picklist_page');
    384         $current_page_id = get_queried_object_id();
    385         $is_pickup_page = $current_page_id == $pickup_page_id;
    386 
    387         // Get current page ID
    388         // Only enqueue scripts on cart, checkout, or pickup page
    389         if (!is_cart() && !is_checkout() && !$is_pickup_page) {
    390             return;
    391         }
    392         $php_to_js_variables = array(
    393             'version' => $this->version,
    394             'wc_ajax_url' => WC()->ajax_url(),
    395             'security' => wp_create_nonce("randomTextForLogistraIntegration"),
    396         );
    397 
    398         $options = Wildrobot_Logistra_Options::get_public_options();
    399 
    400         $plugin_js = self::get_js_file_path('partials/frontend', 'public');
    401         wp_enqueue_script($this->plugin_name . "-public-js", $plugin_js, ['wp-element'], $this->version, true);
    402         wp_localize_script($this->plugin_name . '-public-js', 'wildrobotLogistraPublic', array_merge($php_to_js_variables, $options));
    403 
    404         // Enqueue the service partner handler script
    405         wp_enqueue_script(
    406             $this->plugin_name . '-service-partner',
    407             plugin_dir_url(__FILE__) . 'js/service-partner-handler.js',
    408             array('jquery'),
    409             $this->version,
    410             true
    411         );
    412     }
    413 
    414     private static function get_js_file_path($folder, $file)
    415     {
    416         $files = glob(plugin_dir_path(__FILE__) . $folder . '/' . $file . '*.js');
    417         if (!empty($files)) {
    418             $full_path = $files[0];
    419             $app_pos = strpos($full_path, $file . '.');
    420             $file_name = substr($full_path, $app_pos);
    421             return plugin_dir_url(__FILE__) . $folder . '/' . $file_name;
    422         } else {
    423             return 'http://localhost:3000/static/js/client.js';
    424         }
    425     }
     589    }
     590
     591    public function enqueue_styles()
     592    {
     593        // wp_enqueue_style($this->plugin_name, plugin_dir_url(__FILE__) . 'css/ReactToastify.css', array(), $this->version, 'all');
     594    }
     595
     596    public function enqueue_scripts()
     597    {
     598        $pickup_page_id = (int) get_option("wildrobot_logistra_picklist_page");
     599        $current_page_id = get_queried_object_id();
     600        $is_pickup_page = $current_page_id == $pickup_page_id;
     601
     602        // Get current page ID
     603        // Only enqueue scripts on cart, checkout, or pickup page
     604        if (!is_cart() && !is_checkout() && !$is_pickup_page) {
     605            return;
     606        }
     607        $php_to_js_variables = [
     608            "version" => $this->version,
     609            "wc_ajax_url" => WC()->ajax_url(),
     610            "security" => wp_create_nonce("randomTextForLogistraIntegration"),
     611        ];
     612
     613        $options = Wildrobot_Logistra_Options::get_public_options();
     614
     615        $plugin_js = self::get_js_file_path("partials/frontend", "public");
     616        wp_enqueue_script(
     617            $this->plugin_name . "-public-js",
     618            $plugin_js,
     619            ["wp-element"],
     620            $this->version,
     621            true,
     622        );
     623        wp_localize_script(
     624            $this->plugin_name . "-public-js",
     625            "wildrobotLogistraPublic",
     626            array_merge($php_to_js_variables, $options),
     627        );
     628
     629        // Enqueue the service partner handler script
     630        wp_enqueue_script(
     631            $this->plugin_name . "-service-partner",
     632            plugin_dir_url(__FILE__) . "js/service-partner-handler.js",
     633            ["jquery"],
     634            $this->version,
     635            true,
     636        );
     637    }
     638
     639    private static function get_js_file_path($folder, $file)
     640    {
     641        $files = glob(
     642            plugin_dir_path(__FILE__) . $folder . "/" . $file . "*.js",
     643        );
     644        if (!empty($files)) {
     645            $full_path = $files[0];
     646            $app_pos = strpos($full_path, $file . ".");
     647            $file_name = substr($full_path, $app_pos);
     648            return plugin_dir_url(__FILE__) . $folder . "/" . $file_name;
     649        } else {
     650            return "http://localhost:3000/static/js/client.js";
     651        }
     652    }
    426653}
Note: See TracChangeset for help on using the changeset viewer.