{"id":4883,"date":"2026-03-23T11:54:49","date_gmt":"2026-03-23T17:54:49","guid":{"rendered":"https:\/\/racmanuel.dev\/?post_type=docs&#038;p=4883"},"modified":"2026-03-23T17:27:06","modified_gmt":"2026-03-23T23:27:06","password":"","slug":"hooks-and-filters","status":"publish","type":"docs","link":"https:\/\/racmanuel.dev\/en\/docs\/flow-pos-point-of-sale-for-woocommerce\/hooks-and-filters\/","title":{"rendered":"Hooks and Filters"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Este documento lista los hooks en PHP (filtros\/acciones) y los eventos en JS para extender Flow POS sin modificar el core.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"hooks-en-php\">Hooks en PHP<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"productos\">Productos<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p><code>flow_pos_product_categories<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: despu\u00e9s de cargar categor\u00edas de productos para el POS.<\/li>\n<li>Args: <code>array $categories<\/code>, <code>array $terms<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_product_categories', function ($categories, $terms) {\n    return array_values(array_filter($categories, function ($category) {\n        return $category['slug'] !== 'uncategorized';\n    }));\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: despu\u00e9s de cargar categor\u00edas de productos para el POS.<\/li>\n\n\n\n<li>Args: <code>array $categories<\/code>, <code>array $terms<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_product_categories', function ($categories, $terms) {\n    return array_values(array_filter($categories, function ($category) {\n        return $category['slug'] !== 'uncategorized';\n    }));\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_products_query_args<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de ejecutar <code>WC_Product_Query<\/code> para el listado de productos.<\/li>\n<li>Args: <code>array $query_args<\/code>, <code>array $context<\/code>.<\/li>\n<li>Contexto: <code>search<\/code>, <code>search_mode<\/code>, <code>category<\/code>, <code>page<\/code>, <code>per_page<\/code>, <code>hide_out_of_stock<\/code>, <code>is_search<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_products_query_args', function ($args, $context) {\n    if (!empty($context['category'])) {\n        $args['orderby'] = 'menu_order';\n        $args['order'] = 'ASC';\n    }\n    return $args;\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de ejecutar <code>WC_Product_Query<\/code> para el listado de productos.<\/li>\n\n\n\n<li>Args: <code>array $query_args<\/code>, <code>array $context<\/code>.<\/li>\n\n\n\n<li>Contexto: <code>search<\/code>, <code>search_mode<\/code>, <code>category<\/code>, <code>page<\/code>, <code>per_page<\/code>, <code>hide_out_of_stock<\/code>, <code>is_search<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_products_query_args', function ($args, $context) {\n    if (!empty($context['category'])) {\n        $args['orderby'] = 'menu_order';\n        $args['order'] = 'ASC';\n    }\n    return $args;\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_product_data<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: despu\u00e9s de formatear un producto para el POS.<\/li>\n<li>Args: <code>array $product_data<\/code>, <code>WC_Product $product<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_product_data', function ($data, $product) {\n    $data['sku'] = $product-&gt;get_sku();\n    return $data;\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: despu\u00e9s de formatear un producto para el POS.<\/li>\n\n\n\n<li>Args: <code>array $product_data<\/code>, <code>WC_Product $product<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_product_data', function ($data, $product) {\n    $data['sku'] = $product-&gt;get_sku();\n    return $data;\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_products_response<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de devolver la respuesta del listado de productos.<\/li>\n<li>Args: <code>array $response<\/code>, <code>array $context<\/code>.<\/li>\n<li>Response: <code>products<\/code>, <code>page<\/code>, <code>total_pages<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_products_response', function ($response, $context) {\n    $response['has_more'] = $response['page'] &lt; $response['total_pages'];\n    return $response;\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de devolver la respuesta del listado de productos.<\/li>\n\n\n\n<li>Args: <code>array $response<\/code>, <code>array $context<\/code>.<\/li>\n\n\n\n<li>Response: <code>products<\/code>, <code>page<\/code>, <code>total_pages<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_products_response', function ($response, $context) {\n    $response['has_more'] = $response['page'] &lt; $response['total_pages'];\n    return $response;\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"clientes\">Clientes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p><code>flow_pos_customers_search_args<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de cada <code>WP_User_Query<\/code> en la b\u00fasqueda de clientes.<\/li>\n<li>Args: <code>array $query_args<\/code>, <code>array $context<\/code>.<\/li>\n<li>Contexto: <code>term<\/code>, <code>limit<\/code>, <code>exclude<\/code>, <code>type<\/code> (<code>search<\/code>, <code>phone<\/code>, <code>recent<\/code>).<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_customers_search_args', function ($args, $context) {\n    if ($context['type'] === 'search') {\n        $args['meta_query'] = isset($args['meta_query']) ? $args['meta_query'] : [];\n        $args['meta_query'][] = [\n            'key' =&gt; 'billing_country',\n            'value' =&gt; 'MX',\n        ];\n    }\n    return $args;\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de cada <code>WP_User_Query<\/code> en la b\u00fasqueda de clientes.<\/li>\n\n\n\n<li>Args: <code>array $query_args<\/code>, <code>array $context<\/code>.<\/li>\n\n\n\n<li>Contexto: <code>term<\/code>, <code>limit<\/code>, <code>exclude<\/code>, <code>type<\/code> (<code>search<\/code>, <code>phone<\/code>, <code>recent<\/code>).<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_customers_search_args', function ($args, $context) {\n    if ($context['type'] === 'search') {\n        $args['meta_query'] = isset($args['meta_query']) ? $args['meta_query'] : [];\n        $args['meta_query'][] = [\n            'key' =&gt; 'billing_country',\n            'value' =&gt; 'MX',\n        ];\n    }\n    return $args;\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_customers_search_response<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de devolver la respuesta de b\u00fasqueda.<\/li>\n<li>Args: <code>array $response<\/code>, <code>array $context<\/code>.<\/li>\n<li>Response: <code>customers<\/code>, <code>has_more<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_customers_search_response', function ($response, $context) {\n    $response['total'] = count($response['customers']);\n    return $response;\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de devolver la respuesta de b\u00fasqueda.<\/li>\n\n\n\n<li>Args: <code>array $response<\/code>, <code>array $context<\/code>.<\/li>\n\n\n\n<li>Response: <code>customers<\/code>, <code>has_more<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_customers_search_response', function ($response, $context) {\n    $response['total'] = count($response['customers']);\n    return $response;\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_customer_create_payload<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de validar\/crear un cliente desde POS.<\/li>\n<li>Args: <code>array $payload<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Payload: <code>name<\/code>, <code>phone<\/code>, <code>email<\/code>, <code>billing<\/code>, <code>shipping<\/code>, <code>shipping_different<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_customer_create_payload', function ($payload, $user_id) {\n    $payload['billing']['country'] = 'MX';\n    return $payload;\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de validar\/crear un cliente desde POS.<\/li>\n\n\n\n<li>Args: <code>array $payload<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Payload: <code>name<\/code>, <code>phone<\/code>, <code>email<\/code>, <code>billing<\/code>, <code>shipping<\/code>, <code>shipping_different<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_customer_create_payload', function ($payload, $user_id) {\n    $payload['billing']['country'] = 'MX';\n    return $payload;\n}, 10, 2);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_customer_response<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de devolver el payload del cliente creado.<\/li>\n<li>Args: <code>array $customer_response<\/code>, <code>int $user_id<\/code>, <code>array $payload<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_customer_response', function ($customer, $user_id, $payload) {\n    $customer['billing_email'] = $payload['billing']['email'] ?? '';\n    return $customer;\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de devolver el payload del cliente creado.<\/li>\n\n\n\n<li>Args: <code>array $customer_response<\/code>, <code>int $user_id<\/code>, <code>array $payload<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_customer_response', function ($customer, $user_id, $payload) {\n    $customer['billing_email'] = $payload['billing']['email'] ?? '';\n    return $customer;\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_customer_created<\/code> (action)<\/p>\n<ul>\n<li>Cu\u00e1ndo: despu\u00e9s de crear un cliente.<\/li>\n<li>Args: <code>int $user_id<\/code>, <code>array $payload<\/code>, <code>array $customer_response<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_customer_created', function ($user_id, $payload, $customer_response) {\n    update_user_meta($user_id, '_flow_pos_created', '1');\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: despu\u00e9s de crear un cliente.<\/li>\n\n\n\n<li>Args: <code>int $user_id<\/code>, <code>array $payload<\/code>, <code>array $customer_response<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_customer_created', function ($user_id, $payload, $customer_response) {\n    update_user_meta($user_id, '_flow_pos_created', '1');\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cajas-sesiones\">Cajas \/ sesiones<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p><code>flow_pos_register_open_response<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de devolver la respuesta de apertura de caja.<\/li>\n<li>Args: <code>array $response<\/code>, <code>int $session_id<\/code>, <code>int $store_id<\/code>, <code>int $register_id<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_register_open_response', function ($response, $session_id, $store_id, $register_id, $user_id) {\n    $response['timezone'] = wp_timezone_string();\n    return $response;\n}, 10, 5);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de devolver la respuesta de apertura de caja.<\/li>\n\n\n\n<li>Args: <code>array $response<\/code>, <code>int $session_id<\/code>, <code>int $store_id<\/code>, <code>int $register_id<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_register_open_response', function ($response, $session_id, $store_id, $register_id, $user_id) {\n    $response['timezone'] = wp_timezone_string();\n    return $response;\n}, 10, 5);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_register_opened<\/code> (action)<\/p>\n<ul>\n<li>Cu\u00e1ndo: despu\u00e9s de abrir una caja.<\/li>\n<li>Args: <code>int $session_id<\/code>, <code>int $store_id<\/code>, <code>int $register_id<\/code>, <code>int $user_id<\/code>, <code>string $opening_cash<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_register_opened', function ($session_id, $store_id, $register_id, $user_id, $opening_cash) {\n    \/\/ custom log\n}, 10, 5);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: despu\u00e9s de abrir una caja.<\/li>\n\n\n\n<li>Args: <code>int $session_id<\/code>, <code>int $store_id<\/code>, <code>int $register_id<\/code>, <code>int $user_id<\/code>, <code>string $opening_cash<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_register_opened', function ($session_id, $store_id, $register_id, $user_id, $opening_cash) {\n    \/\/ custom log\n}, 10, 5);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_register_close_summary<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de devolver o usar el resumen de cierre.<\/li>\n<li>Args: <code>array $summary<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_register_close_summary', function ($summary, $open_session, $user_id) {\n    $summary['expected_cash'] = max(0, (float) $summary['expected_cash']);\n    return $summary;\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de devolver o usar el resumen de cierre.<\/li>\n\n\n\n<li>Args: <code>array $summary<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_register_close_summary', function ($summary, $open_session, $user_id) {\n    $summary['expected_cash'] = max(0, (float) $summary['expected_cash']);\n    return $summary;\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_register_close_response<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de devolver la respuesta de cierre.<\/li>\n<li>Args: <code>array $response<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_register_close_response', function ($response, $open_session, $user_id) {\n    $response['closed_at'] = current_time('mysql');\n    return $response;\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de devolver la respuesta de cierre.<\/li>\n\n\n\n<li>Args: <code>array $response<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_register_close_response', function ($response, $open_session, $user_id) {\n    $response['closed_at'] = current_time('mysql');\n    return $response;\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_register_closed<\/code> (action)<\/p>\n<ul>\n<li>Cu\u00e1ndo: despu\u00e9s de cerrar una caja.<\/li>\n<li>Args: <code>array $open_session<\/code>, <code>array $summary<\/code>, <code>float $closing_cash<\/code>, <code>float $cash_difference<\/code>, <code>string $notes<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_register_closed', function ($open_session, $summary, $closing_cash, $cash_difference, $notes, $user_id) {\n    \/\/ custom log\n}, 10, 6);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: despu\u00e9s de cerrar una caja.<\/li>\n\n\n\n<li>Args: <code>array $open_session<\/code>, <code>array $summary<\/code>, <code>float $closing_cash<\/code>, <code>float $cash_difference<\/code>, <code>string $notes<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_register_closed', function ($open_session, $summary, $closing_cash, $cash_difference, $notes, $user_id) {\n    \/\/ custom log\n}, 10, 6);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"carritos-suspendidos\">Carritos suspendidos<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p><code>flow_pos_suspend_cart_data<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de guardar un carrito como suspendido.<\/li>\n<li>Args: <code>array $cart_data<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_suspend_cart_data', function ($cart_data, $open_session, $user_id) {\n    $cart_data['meta']['source'] = 'pos';\n    return $cart_data;\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de guardar un carrito como suspendido.<\/li>\n\n\n\n<li>Args: <code>array $cart_data<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_suspend_cart_data', function ($cart_data, $open_session, $user_id) {\n    $cart_data['meta']['source'] = 'pos';\n    return $cart_data;\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_cart_suspended<\/code> (action)<\/p>\n<ul>\n<li>Cu\u00e1ndo: despu\u00e9s de suspender un carrito.<\/li>\n<li>Args: <code>string $cart_key<\/code>, <code>array $cart_data<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_cart_suspended', function ($cart_key, $cart_data, $open_session, $user_id) {\n    \/\/ custom log\n}, 10, 4);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: despu\u00e9s de suspender un carrito.<\/li>\n\n\n\n<li>Args: <code>string $cart_key<\/code>, <code>array $cart_data<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_cart_suspended', function ($cart_key, $cart_data, $open_session, $user_id) {\n    \/\/ custom log\n}, 10, 4);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_suspended_carts_list<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de devolver la lista de suspendidos.<\/li>\n<li>Args: <code>array $rows<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_suspended_carts_list', function ($rows, $open_session, $user_id) {\n    return array_slice($rows, 0, 10);\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de devolver la lista de suspendidos.<\/li>\n\n\n\n<li>Args: <code>array $rows<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_suspended_carts_list', function ($rows, $open_session, $user_id) {\n    return array_slice($rows, 0, 10);\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_resume_cart_data<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de devolver un carrito reanudado al POS.<\/li>\n<li>Args: <code>array $cart_data<\/code>, <code>array $row<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_resume_cart_data', function ($cart_data, $row, $open_session, $user_id) {\n    unset($cart_data['meta']['internal_flag']);\n    return $cart_data;\n}, 10, 4);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de devolver un carrito reanudado al POS.<\/li>\n\n\n\n<li>Args: <code>array $cart_data<\/code>, <code>array $row<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_resume_cart_data', function ($cart_data, $row, $open_session, $user_id) {\n    unset($cart_data['meta']['internal_flag']);\n    return $cart_data;\n}, 10, 4);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_cart_resumed<\/code> (action)<\/p>\n<ul>\n<li>Cu\u00e1ndo: despu\u00e9s de reanudar un carrito.<\/li>\n<li>Args: <code>string $cart_key<\/code>, <code>array $cart_data<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_cart_resumed', function ($cart_key, $cart_data, $open_session, $user_id) {\n    \/\/ custom log\n}, 10, 4);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: despu\u00e9s de reanudar un carrito.<\/li>\n\n\n\n<li>Args: <code>string $cart_key<\/code>, <code>array $cart_data<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_cart_resumed', function ($cart_key, $cart_data, $open_session, $user_id) {\n    \/\/ custom log\n}, 10, 4);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_cart_voided<\/code> (action)<\/p>\n<ul>\n<li>Cu\u00e1ndo: despu\u00e9s de anular un carrito suspendido.<\/li>\n<li>Args: <code>string $cart_key<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_cart_voided', function ($cart_key, $open_session, $user_id) {\n    \/\/ custom log\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: despu\u00e9s de anular un carrito suspendido.<\/li>\n\n\n\n<li>Args: <code>string $cart_key<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_cart_voided', function ($cart_key, $open_session, $user_id) {\n    \/\/ custom log\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"checkout\">Checkout<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p><code>flow_pos_checkout_cart_data<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de validar y procesar el carrito.<\/li>\n<li>Args: <code>array $cart_data<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_checkout_cart_data', function ($cart_data, $open_session, $user_id) {\n    foreach ($cart_data['items'] as &amp;$item) {\n        $item['qty'] = min(99, (int) $item['qty']);\n    }\n    return $cart_data;\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de validar y procesar el carrito.<\/li>\n\n\n\n<li>Args: <code>array $cart_data<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_checkout_cart_data', function ($cart_data, $open_session, $user_id) {\n    foreach ($cart_data['items'] as &amp;$item) {\n        $item['qty'] = min(99, (int) $item['qty']);\n    }\n    return $cart_data;\n}, 10, 3);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_checkout_payments_payload<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de normalizar los pagos.<\/li>\n<li>Args: <code>array $payments_payload<\/code>, <code>array $cart_data<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_checkout_payments_payload', function ($payments, $cart_data, $open_session, $user_id) {\n    return array_map(function ($payment) {\n        $payment['reference'] = isset($payment['reference']) ? trim($payment['reference']) : '';\n        return $payment;\n    }, $payments);\n}, 10, 4);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de normalizar los pagos.<\/li>\n\n\n\n<li>Args: <code>array $payments_payload<\/code>, <code>array $cart_data<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_checkout_payments_payload', function ($payments, $cart_data, $open_session, $user_id) {\n    return array_map(function ($payment) {\n        $payment['reference'] = isset($payment['reference']) ? trim($payment['reference']) : '';\n        return $payment;\n    }, $payments);\n}, 10, 4);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_checkout_order_args<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de crear la orden en WooCommerce.<\/li>\n<li>Args: <code>array $order_args<\/code>, <code>array $cart_data<\/code>, <code>array $payments<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_checkout_order_args', function ($order_args, $cart_data, $payments, $open_session, $user_id) {\n    $order_args['created_via'] = 'flow-pos';\n    return $order_args;\n}, 10, 5);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de crear la orden en WooCommerce.<\/li>\n\n\n\n<li>Args: <code>array $order_args<\/code>, <code>array $cart_data<\/code>, <code>array $payments<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_checkout_order_args', function ($order_args, $cart_data, $payments, $open_session, $user_id) {\n    $order_args['created_via'] = 'flow-pos';\n    return $order_args;\n}, 10, 5);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_checkout_completed<\/code> (action)<\/p>\n<ul>\n<li>Cu\u00e1ndo: despu\u00e9s de crear la orden y la transacci\u00f3n.<\/li>\n<li>Args: <code>int $order_id<\/code>, <code>int $transaction_id<\/code>, <code>array $cart_data<\/code>, <code>array $payments<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_checkout_completed', function ($order_id, $transaction_id, $cart_data, $payments, $open_session, $user_id) {\n    update_post_meta($order_id, '_flow_pos_custom_flag', '1');\n}, 10, 6);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: despu\u00e9s de crear la orden y la transacci\u00f3n.<\/li>\n\n\n\n<li>Args: <code>int $order_id<\/code>, <code>int $transaction_id<\/code>, <code>array $cart_data<\/code>, <code>array $payments<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_action('flow_pos_checkout_completed', function ($order_id, $transaction_id, $cart_data, $payments, $open_session, $user_id) {\n    update_post_meta($order_id, '_flow_pos_custom_flag', '1');\n}, 10, 6);\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flow_pos_checkout_response<\/code> (filter)<\/p>\n<ul>\n<li>Cu\u00e1ndo: antes de devolver la respuesta del checkout.<\/li>\n<li>Args: <code>array $response<\/code>, <code>WC_Order $order<\/code>, <code>array $cart_data<\/code>, <code>array $payments<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_checkout_response', function ($response, $order, $cart_data, $payments, $open_session, $user_id) {\n    $response['receipt_url'] = $order-&gt;get_checkout_order_received_url();\n    return $response;\n}, 10, 6);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cu\u00e1ndo: antes de devolver la respuesta del checkout.<\/li>\n\n\n\n<li>Args: <code>array $response<\/code>, <code>WC_Order $order<\/code>, <code>array $cart_data<\/code>, <code>array $payments<\/code>, <code>array $open_session<\/code>, <code>int $user_id<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-php\">add_filter('flow_pos_checkout_response', function ($response, $order, $cart_data, $payments, $open_session, $user_id) {\n    $response['receipt_url'] = $order-&gt;get_checkout_order_received_url();\n    return $response;\n}, 10, 6);\n<\/code><\/pre>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"eventos-en-js\">Eventos en JS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Todos los hooks JS se emiten como <code>CustomEvent<\/code> en <code>window<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ejemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">window.addEventListener('flowPos:customer:selected', (event) => {\n    console.log('Cliente seleccionado', event.detail.customer);\n});<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"productos\">Productos<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p><code>flowPos:productsLoaded<\/code><\/p>\n<ul>\n<li>Detail: <code>{ products, page, totalPages, hasMore, search, searchMode, category }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:productsLoaded', (event) =&gt; {\n    const { products, hasMore } = event.detail;\n    console.log(products.length, hasMore);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ products, page, totalPages, hasMore, search, searchMode, category }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:productsLoaded', (event) =&gt; {\n    const { products, hasMore } = event.detail;\n    console.log(products.length, hasMore);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPos:productsLoadFailed<\/code><\/p>\n<ul>\n<li>Detail: <code>{ error, page, search, searchMode, category }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:productsLoadFailed', (event) =&gt; {\n    console.error(event.detail.error);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ error, page, search, searchMode, category }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:productsLoadFailed', (event) =&gt; {\n    console.error(event.detail.error);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"carrito\">Carrito<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p><code>flowPos:cartChanged<\/code><\/p>\n<ul>\n<li>Detail: <code>{ cart, reason }<\/code>.<\/li>\n<li>Reasons: <code>add<\/code>, <code>increase<\/code>, <code>decrease<\/code>, <code>remove<\/code>, <code>clear<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:cartChanged', (event) =&gt; {\n    const { cart, reason } = event.detail;\n    console.log(reason, cart?.items?.length || 0);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ cart, reason }<\/code>.<\/li>\n\n\n\n<li>Reasons: <code>add<\/code>, <code>increase<\/code>, <code>decrease<\/code>, <code>remove<\/code>, <code>clear<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:cartChanged', (event) =&gt; {\n    const { cart, reason } = event.detail;\n    console.log(reason, cart?.items?.length || 0);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPos:cartCleared<\/code><\/p>\n<ul>\n<li>Detail: <code>{ cart }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:cartCleared', (event) =&gt; {\n    console.log('cart cleared', event.detail.cart);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ cart }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:cartCleared', (event) =&gt; {\n    console.log('cart cleared', event.detail.cart);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"clientes\">Clientes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p><code>flowPos:customer:selected<\/code><\/p>\n<ul>\n<li>Detail: <code>{ customer }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:customer:selected', (event) =&gt; {\n    console.log(event.detail.customer);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ customer }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:customer:selected', (event) =&gt; {\n    console.log(event.detail.customer);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPos:customer:cleared<\/code><\/p>\n<ul>\n<li>Detail: <code>{ customer }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:customer:cleared', (event) =&gt; {\n    console.log(event.detail.customer);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ customer }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:customer:cleared', (event) =&gt; {\n    console.log(event.detail.customer);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPos:customer:created<\/code><\/p>\n<ul>\n<li>Detail: <code>{ customer }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:customer:created', (event) =&gt; {\n    console.log('created', event.detail.customer);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ customer }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:customer:created', (event) =&gt; {\n    console.log('created', event.detail.customer);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPos:customer:searchResults<\/code><\/p>\n<ul>\n<li>Detail: <code>{ term, customers, hasMore, append }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:customer:searchResults', (event) =&gt; {\n    const { term, customers } = event.detail;\n    console.log(term, customers.length);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ term, customers, hasMore, append }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:customer:searchResults', (event) =&gt; {\n    const { term, customers } = event.detail;\n    console.log(term, customers.length);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPos:customer:searchFailed<\/code><\/p>\n<ul>\n<li>Detail: <code>{ term, message }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:customer:searchFailed', (event) =&gt; {\n    console.error(event.detail.term, event.detail.message);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ term, message }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:customer:searchFailed', (event) =&gt; {\n    console.error(event.detail.term, event.detail.message);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"checkout\">Checkout<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p><code>flowPos:checkout:before<\/code><\/p>\n<ul>\n<li>Detail: <code>{ cart, payments }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:checkout:before', (event) =&gt; {\n    console.log(event.detail.cart, event.detail.payments);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ cart, payments }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:checkout:before', (event) =&gt; {\n    console.log(event.detail.cart, event.detail.payments);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPos:checkout:after<\/code><\/p>\n<ul>\n<li>Detail: <code>{ orderId, summary }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:checkout:after', (event) =&gt; {\n    console.log(event.detail.orderId);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ orderId, summary }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:checkout:after', (event) =&gt; {\n    console.log(event.detail.orderId);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"carritos-suspendidos\">Carritos suspendidos<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p><code>flowPos:suspended:created<\/code><\/p>\n<ul>\n<li>Detail: <code>{ cartKey, cart }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:suspended:created', (event) =&gt; {\n    console.log(event.detail.cartKey);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ cartKey, cart }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:suspended:created', (event) =&gt; {\n    console.log(event.detail.cartKey);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPos:suspended:list<\/code><\/p>\n<ul>\n<li>Detail: <code>{ carts }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:suspended:list', (event) =&gt; {\n    console.log(event.detail.carts.length);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ carts }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:suspended:list', (event) =&gt; {\n    console.log(event.detail.carts.length);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPos:suspended:resumed<\/code><\/p>\n<ul>\n<li>Detail: <code>{ cartKey, cart }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:suspended:resumed', (event) =&gt; {\n    console.log(event.detail.cartKey);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ cartKey, cart }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:suspended:resumed', (event) =&gt; {\n    console.log(event.detail.cartKey);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPos:suspended:voided<\/code><\/p>\n<ul>\n<li>Detail: <code>{ cartKey }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:suspended:voided', (event) =&gt; {\n    console.log(event.detail.cartKey);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ cartKey }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:suspended:voided', (event) =&gt; {\n    console.log(event.detail.cartKey);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sesiones\">Sesiones<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p><code>flowPos:session:contextLoaded<\/code><\/p>\n<ul>\n<li>Detail: <code>{ hasSession, sessionContext, stores, registers }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:session:contextLoaded', (event) =&gt; {\n    console.log(event.detail.hasSession);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ hasSession, sessionContext, stores, registers }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:session:contextLoaded', (event) =&gt; {\n    console.log(event.detail.hasSession);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPos:session:opened<\/code><\/p>\n<ul>\n<li>Detail: <code>{ sessionId, sessionContext }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:session:opened', (event) =&gt; {\n    console.log(event.detail.sessionId);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ sessionId, sessionContext }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:session:opened', (event) =&gt; {\n    console.log(event.detail.sessionId);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPos:session:closed<\/code><\/p>\n<ul>\n<li>Detail: <code>{ sessionId, summary, closingCash, cashDifference }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:session:closed', (event) =&gt; {\n    console.log(event.detail.sessionId, event.detail.summary);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ sessionId, summary, closingCash, cashDifference }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPos:session:closed', (event) =&gt; {\n    console.log(event.detail.sessionId, event.detail.summary);\n});\n<\/code><\/pre>\n<\/li>\n\n\n\n<li><p><code>flowPosSessionContextChanged<\/code><\/p>\n<ul>\n<li>Detail: <code>{ storeId, registerId, sessionId, hasSession, defaultPrimaryColor, ... }<\/code>.<\/li>\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPosSessionContextChanged', (event) =&gt; {\n    console.log(event.detail.hasSession);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Detail: <code>{ storeId, registerId, sessionId, hasSession, defaultPrimaryColor, ... }<\/code>.<\/li>\n\n\n\n<li>Ejemplo:<pre><code class=\"language-js\">window.addEventListener('flowPosSessionContextChanged', (event) =&gt; {\n    console.log(event.detail.hasSession);\n});\n<\/code><\/pre>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Este documento lista los hooks en PHP (filtros\/acciones) y los eventos en JS para extender Flow POS sin modificar el core. Hooks en PHP Productos Clientes Cajas \/ sesiones Carritos suspendidos Checkout Eventos en JS Todos los hooks JS se emiten como CustomEvent en window. Ejemplo: Productos Carrito Clientes Checkout Carritos suspendidos Sesiones<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_gspb_post_css":"","_glsr_average":0,"_glsr_ranking":0,"_glsr_reviews":0,"footnotes":""},"doc_category":[105],"doc_tag":[],"class_list":["post-4883","docs","type-docs","status-publish","hentry","doc_category-flow-pos-point-of-sale-for-woocommerce"],"blocksy_meta":[],"year_month":"2026-06","word_count":3205,"total_views":0,"reactions":{"happy":0,"normal":0,"sad":0},"author_info":{"name":"racmanuel","author_nicename":"ra_cm","author_url":"https:\/\/racmanuel.dev\/en\/author\/ra_cm\/"},"doc_category_info":[{"term_name":"Flow POS - Point of Sale for WooCommerce","term_url":"https:\/\/racmanuel.dev\/en\/docs\/category\/flow-pos-point-of-sale-for-woocommerce\/"}],"doc_tag_info":[],"acf":[],"_links":{"self":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/docs\/4883","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/comments?post=4883"}],"version-history":[{"count":3,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/docs\/4883\/revisions"}],"predecessor-version":[{"id":4896,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/docs\/4883\/revisions\/4896"}],"wp:attachment":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/media?parent=4883"}],"wp:term":[{"taxonomy":"doc_category","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/doc_category?post=4883"},{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/doc_tag?post=4883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}