<?php
/**
 * Cuadro operativo de pedidos (OC + inventario) por estilo de tablero.
 *
 * @package Logistica
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

$board_slug = isset( $board_slug ) ? sanitize_title( (string) $board_slug ) : 'hornitos';
$sheet_config = ( isset( $sheet_config ) && is_array( $sheet_config ) )
	? $sheet_config
	: Logistica_Pedidos_Board::get_board_sheet_config( $board_slug );

if ( ! $sheet_config ) {
	return;
}
$uses_inventario = Logistica_Pedidos_Board::board_uses_inventario( $board_slug );
$inventario_rows   = $uses_inventario ? Logistica_Pedidos_Board::get_inventario_rows( $board_slug ) : array();
$ordenes_compra    = Logistica_Pedidos_Board::get_ordenes_compra( $board_slug );
$orden_estados     = Logistica_Pedidos_Board::orden_estado_options();
$entrega_slot_count      = Logistica_Pedidos_Board::get_board_entrega_slot_count( $board_slug );
$max_entrega_slots       = $entrega_slot_count;
$max_orden_entrega_slots = $entrega_slot_count;

if ( ! function_exists( 'logistica_pedidos_flatten_ordenes' ) ) {
	/**
	 * Agrupa líneas de OC para render con rowspan visual.
	 *
	 * @param array<int, array<string, mixed>> $ordenes Órdenes.
	 * @return array<int, array<string, mixed>>
	 */
	function logistica_pedidos_flatten_ordenes( $ordenes ) {
	$flat = array();
	foreach ( (array) $ordenes as $orden ) {
		$lineas = isset( $orden['lineas'] ) && is_array( $orden['lineas'] ) ? $orden['lineas'] : array();
		if ( empty( $lineas ) ) {
			continue;
		}
		$rowspan = count( $lineas );
		foreach ( $lineas as $index => $linea ) {
			$flat[] = array(
				'orden'     => $orden,
				'linea'     => $linea,
				'rowspan'   => $rowspan,
				'is_first'  => 0 === $index,
				'group_key' => (string) ( $orden['id'] ?? '0' ),
			);
		}
	}
	return $flat;
	}
}

if ( ! function_exists( 'logistica_pedidos_orden_row_estado_class' ) ) {
	/**
	 * Clases CSS de fila según estado de línea OC.
	 *
	 * @param string $estado Estado sanitizado.
	 * @return string
	 */
	function logistica_pedidos_orden_row_estado_class( $estado ) {
		$estado  = sanitize_key( (string) $estado );
		$valid   = array_keys( Logistica_Pedidos_Board::orden_estado_options() );
		$estado  = in_array( $estado, $valid, true ) ? $estado : 'sin_confirmar';
		$classes = array( 'is-estado-' . str_replace( '_', '-', $estado ) );

		if ( 'entregado' === $estado ) {
			$classes[] = 'is-entregado';
		} elseif ( 'despacho' === $estado ) {
			$classes[] = 'is-despacho';
		}

		return implode( ' ', $classes );
	}
}

if ( ! function_exists( 'logistica_pedidos_row_visible_parcial_slots' ) ) {
	/**
	 * Slots visibles de entrega parcial por fila.
	 *
	 * @param array<int, array<string, mixed>> $parciales_by_slot Parciales indexados.
	 * @return int
	 */
	function logistica_pedidos_row_visible_parcial_slots( $parciales_by_slot ) {
		$min      = Logistica_Pedidos_Board::MIN_ENTREGA_SLOTS;
		$max_used = -1;

		foreach ( (array) $parciales_by_slot as $slot => $parcial ) {
			$slot = (int) $slot;
			$has  = ( (int) ( $parcial['id'] ?? 0 ) > 0 )
				|| (float) ( $parcial['cantidad'] ?? 0 ) > 0
				|| '' !== trim( (string) ( $parcial['factura'] ?? '' ) );
			if ( $has ) {
				$max_used = max( $max_used, $slot );
			}
		}

		return min(
			Logistica_Pedidos_Board::MAX_ORDEN_ENTREGA_SLOTS,
			max( $min, $max_used + 2 )
		);
	}
}

if ( ! function_exists( 'logistica_pedidos_render_parciales_wrap' ) ) {
	/**
	 * Celda de entregas parciales con pares Cant/Factura y controles +/- por fila.
	 *
	 * @param array<int, array<string, mixed>> $parciales_by_slot Parciales indexados.
	 * @param int                               $visible_slots    Cantidad visible.
	 * @param bool                              $allows_entrega   Si los campos son editables.
	 * @param string                            $entrega_title    Tooltip bloqueo.
	 * @return void
	 */
	function logistica_pedidos_render_parciales_wrap( $parciales_by_slot, $visible_slots, $allows_entrega, $entrega_title = '' ) {
		$visible_slots = max(
			Logistica_Pedidos_Board::MIN_ENTREGA_SLOTS,
			min( Logistica_Pedidos_Board::MAX_ORDEN_ENTREGA_SLOTS, (int) $visible_slots )
		);
		$edit_title = $allows_entrega
			? __( 'Editar cantidad y factura de despacho', 'logistica' )
			: ( $entrega_title ? $entrega_title : __( 'Solo editable con OC, tipo de producto y estado Despacho o Entregado.', 'logistica' ) );
		?>
		<td data-pedidos-orden-parciales-wrap>
			<div
				class="logistica-pedidos-parciales-row"
				data-pedidos-parciales-row
				data-visible-parcial-slots="<?php echo esc_attr( (string) $visible_slots ); ?>"
			>
				<?php for ( $slot = 0; $slot < $visible_slots; $slot++ ) : ?>
					<?php
					$parcial    = $parciales_by_slot[ $slot ] ?? null;
					$slot_label = $slot + 1;
					?>
					<div class="logistica-pedidos-parcial-pair" data-pedidos-parcial-pair data-slot="<?php echo esc_attr( (string) $slot ); ?>">
						<div class="logistica-pedidos-parcial-pair__field">
							<span class="logistica-pedidos-parcial-pair__label"><?php echo esc_html( sprintf( __( 'Cant. %d', 'logistica' ), $slot_label ) ); ?></span>
							<input
								type="text"
								inputmode="numeric"
								class="logistica-pedidos-orden-parcial-cell is-modal-locked is-computed-locked"
								value="<?php echo esc_attr( $parcial ? Logistica_Pedidos_Board::format_quantity( $parcial['cantidad'] ?? 0 ) : '' ); ?>"
								data-field="parcial_cantidad"
								data-slot="<?php echo esc_attr( (string) $slot ); ?>"
								data-parcial-id="<?php echo esc_attr( $parcial ? (string) ( $parcial['id'] ?? 0 ) : '0' ); ?>"
								readonly
								tabindex="-1"
								aria-readonly="true"
							>
						</div>
						<div class="logistica-pedidos-parcial-pair__field">
							<span class="logistica-pedidos-parcial-pair__label"><?php echo esc_html( sprintf( __( 'Factura %d', 'logistica' ), $slot_label ) ); ?></span>
							<input
								type="text"
								class="logistica-pedidos-orden-parcial-cell is-modal-locked is-computed-locked"
								value="<?php echo esc_attr( $parcial ? (string) ( $parcial['factura'] ?? '' ) : '' ); ?>"
								data-field="parcial_factura"
								data-slot="<?php echo esc_attr( (string) $slot ); ?>"
								data-parcial-id="<?php echo esc_attr( $parcial ? (string) ( $parcial['id'] ?? 0 ) : '0' ); ?>"
								readonly
								tabindex="-1"
								aria-readonly="true"
							>
						</div>
						<button
							type="button"
							class="logistica-pedidos-parcial-edit-btn logistica-table-icon-btn"
							data-action="pedidos-edit-parcial-slot"
							data-slot="<?php echo esc_attr( (string) $slot ); ?>"
							aria-label="<?php echo esc_attr( $edit_title ); ?>"
							title="<?php echo esc_attr( $edit_title ); ?>"
							<?php disabled( ! $allows_entrega ); ?>
						>
							<span class="dashicons dashicons-edit" aria-hidden="true"></span>
						</button>
					</div>
				<?php endfor; ?>
				<div class="logistica-pedidos-parcial-controls">
					<button
						type="button"
						class="logistica-pedidos-parcial-slot-btn logistica-pedidos-parcial-slot-btn--add"
						data-action="pedidos-add-orden-parcial-slot"
						title="<?php esc_attr_e( 'Agregar par Cantidad / Factura', 'logistica' ); ?>"
						aria-label="<?php esc_attr_e( 'Agregar par Cantidad / Factura', 'logistica' ); ?>"
					>+</button>
					<button
						type="button"
						class="logistica-pedidos-parcial-slot-btn logistica-pedidos-parcial-slot-btn--remove"
						data-action="pedidos-remove-orden-parcial-slot"
						title="<?php esc_attr_e( 'Quitar último par vacío', 'logistica' ); ?>"
						aria-label="<?php esc_attr_e( 'Quitar último par vacío', 'logistica' ); ?>"
					>−</button>
				</div>
			</div>
		</td>
		<?php
	}
}

$orden_rows_flat     = logistica_pedidos_flatten_ordenes( $ordenes_compra );
$orden_oc_base_cols  = 15;
$referencia_source   = Logistica_Pedidos_Board::get_referencia_source( $board_slug );
$referencia_options  = Logistica_Pedidos_Board::get_referencia_options( $board_slug );
$referencia_strict   = 'formado_yield' === $referencia_source;
$filter_referencias  = array();
$filter_clientes     = array();

foreach ( $orden_rows_flat as $filter_entry ) {
	$filter_orden = $filter_entry['orden'] ?? null;
	$filter_linea = $filter_entry['linea'] ?? null;
	if ( $filter_orden ) {
		$filter_cliente = trim( (string) ( $filter_orden['cliente'] ?? '' ) );
		if ( '' !== $filter_cliente ) {
			$filter_clientes[ strtolower( $filter_cliente ) ] = $filter_cliente;
		}
	}
	if ( ! $filter_linea ) {
		continue;
	}
	$filter_ref = trim( (string) ( $filter_linea['articulo'] ?? '' ) );
	if ( '' !== $filter_ref ) {
		$filter_referencias[ $filter_ref ] = $filter_ref;
	}
}
natcasesort( $filter_referencias );
natcasesort( $filter_clientes );

$orden_sheet_totals = array(
	'cantidad'   => 0.0,
	'finalizada' => 0.0,
	'pendiente'  => 0.0,
	'despachada' => 0.0,
);
foreach ( $orden_rows_flat as $totals_entry ) {
	$totals_linea = $totals_entry['linea'] ?? null;
	if ( ! $totals_linea ) {
		continue;
	}
	$orden_sheet_totals['cantidad']   += (float) ( $totals_linea['cantidad'] ?? 0 );
	$orden_sheet_totals['finalizada'] += (float) ( $totals_linea['cantidad_entregada'] ?? 0 );
	$orden_sheet_totals['despachada'] += (float) ( $totals_linea['cantidad_despachada'] ?? Logistica_Pedidos_Board::sum_orden_linea_entregas( $totals_linea['entregas_parciales'] ?? array() ) );
	$orden_sheet_totals['pendiente']  += Logistica_Pedidos_Board::compute_orden_linea_pendiente( $totals_linea );
}
$orden_has_rows = ! empty( $orden_rows_flat );

$redirect_base   = logistica_tab_url( 'logistica-cuadro-pedidos', is_admin() ? 'admin' : 'frontend' );
$export_url      = wp_nonce_url(
	add_query_arg(
		array(
			'action'     => 'logistica_export_pedidos_ordenes',
			'board_slug' => $board_slug,
		),
		admin_url( 'admin-post.php' )
	),
	'logistica_export_pedidos_ordenes'
);
$historial_export_base = wp_nonce_url(
	add_query_arg(
		array(
			'action'     => 'logistica_export_pedidos_ordenes_historial',
			'board_slug' => $board_slug,
		),
		admin_url( 'admin-post.php' )
	),
	'logistica_export_pedidos_ordenes_historial'
);
$import_action   = admin_url( 'admin-post.php' );
$import_form_id  = 'logistica-pedidos-excel-upload-' . $board_slug;
$import_input_id = 'logistica-pedidos-excel-file-' . $board_slug;

if ( ! function_exists( 'logistica_pedidos_render_locked_input' ) ) {
	/**
	 * Campo bloqueado (solo lectura en tabla; edición vía modal).
	 *
	 * @param string $field      Nombre del campo data-field.
	 * @param string $value      Valor mostrado.
	 * @param string $input_type Tipo de input.
	 * @return void
	 */
	function logistica_pedidos_render_locked_input( $field, $value = '', $input_type = 'text' ) {
		?>
		<input
			type="<?php echo esc_attr( $input_type ); ?>"
			class="is-modal-locked"
			readonly
			tabindex="-1"
			data-field="<?php echo esc_attr( $field ); ?>"
			value="<?php echo esc_attr( (string) $value ); ?>"
			title="<?php esc_attr_e( 'Editar con el icono de editar', 'logistica' ); ?>"
		>
		<?php
	}
}

if ( ! function_exists( 'logistica_pedidos_render_fecha_entrega_cell' ) ) {
	/**
	 * Celda de fecha entrega con indicador de prórroga.
	 *
	 * @param array $linea Línea de pedido.
	 * @return void
	 */
	function logistica_pedidos_render_fecha_entrega_cell( $linea ) {
		$linea          = is_array( $linea ) ? $linea : array();
		$fecha_entrega  = Logistica_Pedidos_Board::format_date_input( $linea['fecha_entrega'] ?? '' );
		$fecha_prorroga = Logistica_Pedidos_Board::format_date_input( $linea['fecha_prorroga'] ?? '' );
		$fecha_aprob    = Logistica_Pedidos_Board::format_date_input( $linea['fecha_aprobacion'] ?? '' );
		$display        = $fecha_prorroga !== '' ? $fecha_prorroga : $fecha_entrega;
		$has_prorroga   = $fecha_prorroga !== '';
		$dias           = Logistica_Pedidos_Board::compute_dias_entrega_desde_aprobacion( $display, $fecha_aprob );
		?>
		<span class="logistica-pedidos-fecha-entrega-cell<?php echo $has_prorroga ? ' has-prorroga' : ''; ?>">
			<?php if ( $has_prorroga && $fecha_entrega !== '' ) : ?>
				<span class="logistica-pedidos-fecha-entrega-cell__original" title="<?php esc_attr_e( 'Fecha original', 'logistica' ); ?>"><?php echo esc_html( $fecha_entrega ); ?></span>
			<?php endif; ?>
			<span class="logistica-pedidos-fecha-entrega-cell__effective"><?php echo esc_html( $display ); ?></span>
			<?php if ( null !== $dias ) : ?>
				<span class="logistica-pedidos-fecha-entrega-cell__dias" data-pedidos-entrega-dias title="<?php esc_attr_e( 'Días entre aprobación y entrega', 'logistica' ); ?>">
					<?php
					echo esc_html(
						sprintf(
							/* translators: %d: number of days */
							_n( '%d día', '%d días', $dias, 'logistica' ),
							$dias
						)
					);
					?>
				</span>
			<?php else : ?>
				<span class="logistica-pedidos-fecha-entrega-cell__dias" data-pedidos-entrega-dias hidden></span>
			<?php endif; ?>
			<?php if ( $has_prorroga ) : ?>
				<span class="logistica-pedidos-fecha-entrega-cell__badge" title="<?php esc_attr_e( 'Prórroga acordada con el cliente', 'logistica' ); ?>"><?php esc_html_e( 'Prórroga', 'logistica' ); ?></span>
			<?php endif; ?>
		</span>
		<input type="hidden" data-field="fecha_entrega" value="<?php echo esc_attr( $fecha_entrega ); ?>">
		<input type="hidden" data-field="fecha_prorroga" value="<?php echo esc_attr( $fecha_prorroga ); ?>">
		<?php
	}
}

if ( ! function_exists( 'logistica_pedidos_render_fecha_aprobacion_field' ) ) {
	/**
	 * Campo fecha de aprobación bloqueado según estado de la línea.
	 *
	 * @param string $value  Fecha Y-m-d.
	 * @param string $estado Estado de la línea.
	 * @return void
	 */
	function logistica_pedidos_render_fecha_aprobacion_field( $value = '', $estado = '' ) {
		$allows = Logistica_Pedidos_Board::orden_linea_allows_fecha_aprobacion_field( $estado );
		$value  = trim( (string) $value );
		$has    = '' !== $value;
		$title  = $allows
			? ( $has ? __( 'Editar fecha de aprobación', 'logistica' ) : __( 'Indica la fecha de aprobación', 'logistica' ) )
			: __( 'Disponible cuando el estado sea Aprobado', 'logistica' );
		?>
		<div class="logistica-pedidos-fa-field">
			<input
				type="text"
				data-field="fecha_aprobacion"
				class="is-computed-locked is-modal-locked"
				value="<?php echo esc_attr( $allows ? $value : '' ); ?>"
				readonly
				tabindex="-1"
				aria-readonly="true"
				placeholder="<?php echo $allows && ! $has ? esc_attr__( 'Sin fecha', 'logistica' ) : ''; ?>"
			>
			<button
				type="button"
				class="logistica-pedidos-fa-btn logistica-table-icon-btn"
				data-action="pedidos-edit-fecha-aprobacion"
				aria-label="<?php echo esc_attr( $title ); ?>"
				title="<?php echo esc_attr( $title ); ?>"
				<?php disabled( ! $allows || ! $has ); ?>
				<?php echo ( $allows && ! $has ) ? ' hidden' : ''; ?>
			>
				<span class="dashicons dashicons-edit" aria-hidden="true"></span>
			</button>
		</div>
		<?php
	}
}

if ( ! function_exists( 'logistica_pedidos_render_op_field' ) ) {
	/**
	 * Campo OP bloqueado según estado de la línea.
	 *
	 * @param string $value  Valor OP.
	 * @param string $estado Estado de la línea.
	 * @return void
	 */
	function logistica_pedidos_render_op_field( $value = '', $estado = '' ) {
		$allows = Logistica_Pedidos_Board::orden_linea_allows_op_field( $estado );
		$value  = trim( (string) $value );
		$has_op = '' !== $value;
		$title  = $allows
			? ( $has_op ? __( 'Editar OP', 'logistica' ) : __( 'Indica la OP', 'logistica' ) )
			: __( 'Disponible cuando el estado sea Conversión o Impresión', 'logistica' );
		?>
		<div class="logistica-pedidos-op-field">
			<input
				type="text"
				data-field="op"
				class="is-computed-locked is-modal-locked"
				value="<?php echo esc_attr( $allows ? $value : '' ); ?>"
				readonly
				tabindex="-1"
				aria-readonly="true"
				placeholder="<?php echo $allows && ! $has_op ? esc_attr__( 'Sin OP', 'logistica' ) : ''; ?>"
			>
			<button
				type="button"
				class="logistica-pedidos-op-btn logistica-table-icon-btn"
				data-action="pedidos-edit-op"
				aria-label="<?php echo esc_attr( $title ); ?>"
				title="<?php echo esc_attr( $title ); ?>"
				<?php disabled( ! $allows || ! $has_op ); ?>
				<?php echo ( $allows && ! $has_op ) ? ' hidden' : ''; ?>
			>
				<span class="dashicons dashicons-edit" aria-hidden="true"></span>
			</button>
		</div>
		<?php
	}
}

if ( ! function_exists( 'logistica_pedidos_render_locked_tolerancia_pct' ) ) {
	/**
	 * Tolerancia ± % bloqueada en tabla.
	 *
	 * @param string $field Nombre del campo data-field.
	 * @param mixed  $value Porcentaje numérico.
	 * @return void
	 */
	function logistica_pedidos_render_locked_tolerancia_pct( $field, $value = '' ) {
		$display = Logistica_Pedidos_Board::format_tolerancia_pct( $value );
		?>
		<span class="logistica-pedidos-pct-field" title="<?php esc_attr_e( 'Tolerancia ± % sobre la cantidad solicitada', 'logistica' ); ?>">
			<span class="logistica-pedidos-pct-field__sign" aria-hidden="true">±</span>
			<input
				type="text"
				class="is-modal-locked logistica-pedidos-pct-field__input"
				readonly
				tabindex="-1"
				data-field="<?php echo esc_attr( $field ); ?>"
				value="<?php echo esc_attr( $display ); ?>"
				title="<?php esc_attr_e( 'Editar con el icono de editar', 'logistica' ); ?>"
			>
			<span class="logistica-pedidos-pct-field__suffix" aria-hidden="true">%</span>
		</span>
		<?php
	}
}

if ( ! function_exists( 'logistica_pedidos_render_locked_computed' ) ) {
	/**
	 * Valor calculado (solo lectura) con el mismo aspecto que los campos bloqueados.
	 *
	 * @param string $value Valor mostrado.
	 * @return void
	 */
	function logistica_pedidos_render_locked_computed( $value = '' ) {
		?>
		<input
			type="text"
			class="is-modal-locked is-computed-locked"
			readonly
			tabindex="-1"
			value="<?php echo esc_attr( (string) $value ); ?>"
			aria-readonly="true"
		>
		<?php
	}
}

if ( ! function_exists( 'logistica_pedidos_render_cantidad_finalizada' ) ) {
	/**
	 * Cantidad finalizada (aviso comercial): editable solo con estado Finalizado.
	 *
	 * @param string               $value  Valor mostrado.
	 * @param string               $estado Estado de la línea.
	 * @param array<string,mixed>|null $linea Línea para badge de tolerancia.
	 * @return void
	 */
	function logistica_pedidos_render_cantidad_finalizada( $value = '', $estado = '', $linea = null ) {
		$editable = ( 'finalizado' === sanitize_key( (string) $estado ) );
		$title    = $editable
			? __( 'Editar cantidad finalizada', 'logistica' )
			: __( 'Solo editable con estado Finalizado', 'logistica' );
		$accuracy = array(
			'label' => '',
			'class' => 'is-empty',
		);
		if ( is_array( $linea ) ) {
			$accuracy = Logistica_Pedidos_Board::format_finalizada_accuracy_badge(
				(float) ( $linea['cantidad'] ?? 0 ),
				(float) ( $linea['cantidad_entregada'] ?? 0 ),
				(float) ( $linea['cantidad_maxima_recibida'] ?? 0 )
			);
		}
		?>
		<div class="logistica-pedidos-cantidad-finalizada-wrap">
			<div class="logistica-pedidos-cantidad-finalizada-field">
				<input
					type="text"
					inputmode="numeric"
					data-field="cantidad_entregada"
					class="is-computed-locked is-modal-locked"
					value="<?php echo esc_attr( (string) $value ); ?>"
					readonly
					tabindex="-1"
					aria-readonly="true"
				>
				<button
					type="button"
					class="logistica-pedidos-cantidad-finalizada-btn logistica-table-icon-btn"
					data-action="pedidos-edit-cantidad-finalizada"
					aria-label="<?php echo esc_attr( $title ); ?>"
					title="<?php echo esc_attr( $title ); ?>"
					<?php disabled( ! $editable ); ?>
				>
					<span class="dashicons dashicons-edit" aria-hidden="true"></span>
				</button>
			</div>
			<?php if ( '' !== (string) ( $accuracy['label'] ?? '' ) ) : ?>
				<span
					class="logistica-pedidos-finalizada-accuracy <?php echo esc_attr( (string) ( $accuracy['class'] ?? '' ) ); ?>"
					data-pedidos-finalizada-accuracy
					title="<?php echo esc_attr( (string) ( $accuracy['label'] ?? '' ) ); ?>"
				><?php echo esc_html( (string) ( $accuracy['label'] ?? '' ) ); ?></span>
			<?php else : ?>
				<span class="logistica-pedidos-finalizada-accuracy is-empty" data-pedidos-finalizada-accuracy hidden></span>
			<?php endif; ?>
		</div>
		<?php
	}
}

if ( ! function_exists( 'logistica_pedidos_render_locked_referencia' ) ) {
	/**
	 * Referencia bloqueada en tabla.
	 *
	 * @param string $value Valor seleccionado.
	 * @return void
	 */
	function logistica_pedidos_render_locked_referencia( $value = '' ) {
		$value = (string) $value;
		?>
		<input type="hidden" data-field="articulo" value="<?php echo esc_attr( $value ); ?>">
		<span class="logistica-pedidos-locked-value" title="<?php esc_attr_e( 'Editar con el icono de editar', 'logistica' ); ?>">
			<?php echo esc_html( '' !== $value ? $value : '—' ); ?>
		</span>
		<?php
	}
}

if ( ! function_exists( 'logistica_pedidos_render_referencia_select' ) ) {
	/**
	 * Select de referencia en línea de OC.
	 *
	 * @param array<int, array{value:string,label:string}> $options  Opciones base.
	 * @param string                                       $selected Valor seleccionado.
	 * @param bool                                         $strict   Solo catálogo (sin valores extra).
	 * @return void
	 */
	function logistica_pedidos_render_referencia_select( $options, $selected = '', $strict = false ) {
		if ( ! $strict ) {
			$options = Logistica_Pedidos_Board::merge_articulo_option( $options, $selected );
		}
		?>
		<select data-field="articulo">
			<option value=""><?php esc_html_e( 'Seleccionar…', 'logistica' ); ?></option>
			<?php foreach ( $options as $option ) : ?>
				<option value="<?php echo esc_attr( (string) ( $option['value'] ?? '' ) ); ?>" <?php selected( $selected, (string) ( $option['value'] ?? '' ) ); ?>>
					<?php echo esc_html( (string) ( $option['label'] ?? '' ) ); ?>
				</option>
			<?php endforeach; ?>
		</select>
		<?php
	}
}
?>
<div
	class="logistica-pedidos-sheet logistica-pedidos-sheet--<?php echo esc_attr( $board_slug ); ?>"
	data-pedidos-sheet-root
	data-board-slug="<?php echo esc_attr( $board_slug ); ?>"
	data-uses-inventario="<?php echo $uses_inventario ? '1' : '0'; ?>"
	data-referencia-source="<?php echo esc_attr( $referencia_source ); ?>"
	data-entrega-slots="<?php echo esc_attr( (string) $entrega_slot_count ); ?>"
	data-max-entrega-slots="<?php echo esc_attr( (string) Logistica_Pedidos_Board::MAX_ORDEN_ENTREGA_SLOTS ); ?>"
	data-referencia-options="<?php echo esc_attr( wp_json_encode( $referencia_options ) ); ?>"
	data-pedidos-historial-export-url="<?php echo esc_url( $historial_export_base ); ?>"
>
	<h2 data-pedidos-board-sheet-title><?php echo esc_html( (string) ( $sheet_config['label'] ?? $board_slug ) ); ?></h2>

	<section class="logistica-pedidos-section logistica-pedidos-section--ordenes">
		<header class="logistica-pedidos-section__head logistica-pedidos-section__head--start">
			<button type="button" class="button button-primary logistica-pedidos-btn-add-oc" data-action="pedidos-add-orden">
				<span class="dashicons dashicons-plus-alt2" aria-hidden="true"></span>
				<?php esc_html_e( 'Nueva OC', 'logistica' ); ?>
			</button>
		</header>

		<form
			id="<?php echo esc_attr( $import_form_id ); ?>"
			class="logistica-excel-upload-form-source"
			method="post"
			action="<?php echo esc_url( $import_action ); ?>"
			enctype="multipart/form-data"
			hidden
		>
			<input type="hidden" name="action" value="logistica_import_pedidos_ordenes">
			<input type="hidden" name="board_slug" value="<?php echo esc_attr( $board_slug ); ?>">
			<input type="hidden" name="redirect_to" value="<?php echo esc_url( $redirect_base ); ?>">
			<?php wp_nonce_field( 'logistica_import_pedidos_ordenes' ); ?>
		</form>

		<div
			class="logistica-tapas-excel-wrap logistica-pedidos-ordenes-excel-wrap"
			data-excel-zoom-root="<?php echo esc_attr( 'pedidos-ordenes-' . $board_slug ); ?>"
			data-pedidos-ordenes-excel
		>
			<?php
			logistica_table_excel_view_header(
				__( 'Consulta y filtra las líneas de OC. Pulsa el icono de editar en cada fila para actualizar datos de la orden.', 'logistica' )
			);
			logistica_excel_table_zoom_toolbar();
			?>
			<div class="logistica-tapas-filters" data-pedidos-orden-filters>
				<div class="logistica-pedidos-historial-banner" data-pedidos-orden-historial-banner hidden>
					<div class="logistica-pedidos-historial-banner__head">
						<button
							type="button"
							class="button logistica-pedidos-historial-banner__back"
							data-action="toggle-pedidos-orden-historial"
							aria-pressed="true"
						>
							<span class="dashicons dashicons-arrow-left-alt2" aria-hidden="true"></span>
							<?php esc_html_e( 'Tablero activo', 'logistica' ); ?>
						</button>
						<div class="logistica-pedidos-historial-banner__title-wrap">
							<p class="logistica-pedidos-historial-banner__eyebrow"><?php esc_html_e( 'Consulta archivada', 'logistica' ); ?></p>
							<h4 class="logistica-pedidos-historial-banner__title"><?php esc_html_e( 'Historial de entregados', 'logistica' ); ?></h4>
						</div>
					</div>
					<div class="logistica-pedidos-historial-banner__tools" data-pedidos-orden-historial-fields>
						<label class="logistica-tapas-filters__field logistica-pedidos-historial-banner__field">
							<span class="logistica-tapas-filters__label"><?php esc_html_e( 'Entregado desde', 'logistica' ); ?></span>
							<input type="date" data-pedidos-historial-desde>
						</label>
						<label class="logistica-tapas-filters__field logistica-pedidos-historial-banner__field">
							<span class="logistica-tapas-filters__label"><?php esc_html_e( 'Entregado hasta', 'logistica' ); ?></span>
							<input type="date" data-pedidos-historial-hasta>
						</label>
						<button
							type="button"
							class="button logistica-excel-btn logistica-excel-btn--export logistica-pedidos-historial-download"
							data-action="export-pedidos-orden-historial"
						>
							<span class="dashicons dashicons-download" aria-hidden="true"></span>
							<span class="logistica-excel-btn__label"><?php esc_html_e( 'Descargar historial', 'logistica' ); ?></span>
						</button>
					</div>
				</div>
				<div class="logistica-tapas-filters__head" data-pedidos-orden-filters-head>
					<?php logistica_table_filters_icon(); ?>
					<p class="logistica-tapas-filters__title" data-pedidos-orden-filters-title><?php esc_html_e( 'Filtrar tabla', 'logistica' ); ?></p>
					<span class="logistica-tapas-filters__badge" data-pedidos-orden-filter-badge hidden><?php esc_html_e( 'Activo', 'logistica' ); ?></span>
				</div>
				<div class="logistica-pedidos-ordenes-entrega-filters" data-pedidos-ordenes-entrega-filters role="group" aria-label="<?php esc_attr_e( 'Filtros rápidos por fecha de entrega', 'logistica' ); ?>">
					<button type="button" class="button logistica-pedidos-entrega-filter-btn" data-pedidos-orden-entrega-filter="cercano" title="<?php esc_attr_e( 'Pedidos con entrega en los próximos 3 días (excluye finalizados)', 'logistica' ); ?>">
						<span class="logistica-pedidos-entrega-filter-btn__swatch is-pedidos-legend-entrega-cercano" aria-hidden="true"></span>
						<?php esc_html_e( 'Cercano a finalizar', 'logistica' ); ?>
					</button>
					<button type="button" class="button logistica-pedidos-entrega-filter-btn" data-pedidos-orden-entrega-filter="manana" title="<?php esc_attr_e( 'Pedidos con entrega programada para mañana', 'logistica' ); ?>">
						<span class="logistica-pedidos-entrega-filter-btn__swatch is-pedidos-legend-entrega-manana" aria-hidden="true"></span>
						<?php esc_html_e( 'Entrega mañana', 'logistica' ); ?>
					</button>
					<button type="button" class="button logistica-pedidos-entrega-filter-btn" data-pedidos-orden-entrega-filter="atrasados" title="<?php esc_attr_e( 'Pedidos con fecha de entrega vencida', 'logistica' ); ?>">
						<span class="logistica-pedidos-entrega-filter-btn__swatch is-pedidos-legend-entrega-atrasados" aria-hidden="true"></span>
						<?php esc_html_e( 'Atrasados', 'logistica' ); ?>
					</button>
					<button type="button" class="button logistica-pedidos-entrega-filter-btn" data-pedidos-orden-entrega-filter="prorroga" title="<?php esc_attr_e( 'Pedidos con prórroga acordada con el cliente', 'logistica' ); ?>">
						<span class="logistica-pedidos-entrega-filter-btn__swatch is-pedidos-legend-entrega-prorroga" aria-hidden="true"></span>
						<?php esc_html_e( 'Con prórroga', 'logistica' ); ?>
					</button>
				</div>
				<div class="logistica-tapas-filters__fields">
					<label class="logistica-tapas-filters__field logistica-tapas-filters__field--search">
						<span class="logistica-tapas-filters__label"><?php esc_html_e( 'Buscar', 'logistica' ); ?></span>
						<input
							type="search"
							data-pedidos-orden-filter-search
							placeholder="<?php esc_attr_e( 'OC, cliente, tipo de producto u observaciones…', 'logistica' ); ?>"
							autocomplete="off"
							spellcheck="false"
						>
					</label>
					<label class="logistica-tapas-filters__field">
						<span class="logistica-tapas-filters__label"><?php esc_html_e( 'Cliente', 'logistica' ); ?></span>
						<select data-pedidos-orden-filter-cliente>
							<option value=""><?php esc_html_e( 'Todos', 'logistica' ); ?></option>
							<?php foreach ( $filter_clientes as $filter_cliente ) : ?>
								<option value="<?php echo esc_attr( $filter_cliente ); ?>"><?php echo esc_html( $filter_cliente ); ?></option>
							<?php endforeach; ?>
						</select>
					</label>
					<label class="logistica-tapas-filters__field">
						<span class="logistica-tapas-filters__label"><?php esc_html_e( 'Tipo de producto', 'logistica' ); ?></span>
						<select data-pedidos-orden-filter-referencia>
							<option value=""><?php esc_html_e( 'Todos', 'logistica' ); ?></option>
							<?php foreach ( $filter_referencias as $filter_referencia ) : ?>
								<option value="<?php echo esc_attr( $filter_referencia ); ?>"><?php echo esc_html( $filter_referencia ); ?></option>
							<?php endforeach; ?>
						</select>
					</label>
					<label class="logistica-tapas-filters__field logistica-pedidos-orden-filter-estado-wrap" data-pedidos-orden-filter-estado-wrap>
						<span class="logistica-tapas-filters__label"><?php esc_html_e( 'Estado', 'logistica' ); ?></span>
						<select data-pedidos-orden-filter-estado>
							<option value=""><?php esc_html_e( 'Todos', 'logistica' ); ?></option>
							<?php foreach ( $orden_estados as $estado_key => $estado_label ) : ?>
								<option value="<?php echo esc_attr( $estado_key ); ?>"><?php echo esc_html( $estado_label ); ?></option>
							<?php endforeach; ?>
						</select>
					</label>
					<div class="logistica-tapas-filters__actions">
						<button type="button" class="button logistica-tapas-filters__btn" data-action="clear-pedidos-orden-filters" disabled>
							<?php logistica_table_filters_clear_icon(); ?>
							<?php esc_html_e( 'Limpiar filtros', 'logistica' ); ?>
						</button>
					</div>
				</div>
				<p class="logistica-tapas-filters__meta" data-pedidos-orden-filter-meta hidden></p>
			</div>
			<div class="logistica-pedidos-ordenes-operativo-tools" data-pedidos-orden-operativo-tools>
			<div class="logistica-pedidos-ordenes-operativo-toolbar">
				<div class="logistica-pedidos-historial-entry" data-pedidos-orden-historial-entry>
					<button
						type="button"
						class="button logistica-pedidos-historial-entry__btn"
						data-action="toggle-pedidos-orden-historial"
						aria-pressed="false"
					>
						<span class="dashicons dashicons-backup" aria-hidden="true"></span>
						<?php esc_html_e( 'Historial de entregados', 'logistica' ); ?>
					</button>
				</div>
			<?php
			logistica_table_excel_toolbar(
				array(
					'export_url'        => $export_url,
					'import_form_id'    => $import_form_id,
					'import_input_id'   => $import_input_id,
					'import_input_name' => 'pedidos_ordenes_file',
					'import_data_attr'  => 'pedidos-orden-import-file',
					'import_action'     => 'import-pedidos-ordenes-excel',
					'show_zoom'         => false,
				)
			);
			?>
			</div>
			<?php
			logistica_table_status_legend(
				array_merge(
					array_map(
						static function ( $estado_key, $estado_label ) {
							return array(
								'class' => 'is-pedidos-legend-' . str_replace( '_', '-', $estado_key ),
								'label' => $estado_label,
							);
						},
						array_keys( $orden_estados ),
						array_values( $orden_estados )
					),
					array(
						array(
							'class' => 'is-pedidos-legend-entrega-cercano',
							'label' => __( 'Cercano a finalizar', 'logistica' ),
						),
						array(
							'class' => 'is-pedidos-legend-entrega-manana',
							'label' => __( 'Entrega mañana', 'logistica' ),
						),
						array(
							'class' => 'is-pedidos-legend-entrega-atrasados',
							'label' => __( 'Atrasados', 'logistica' ),
						),
						array(
							'class' => 'is-pedidos-legend-entrega-prorroga',
							'label' => __( 'Con prórroga', 'logistica' ),
						),
					)
				)
			);
			?>
			</div>

		<div class="logistica-pedidos-table-wrap logistica-pedidos-table-wrap--ordenes" data-pedidos-excel-scroll tabindex="0">
			<table class="logistica-pedidos-table logistica-pedidos-table--ordenes" data-pedidos-ordenes-table>
				<thead>
					<tr class="logistica-pedidos-table__group-head">
						<th colspan="<?php echo esc_attr( (string) $orden_oc_base_cols ); ?>"><?php esc_html_e( 'Orden de compra', 'logistica' ); ?></th>
						<th colspan="1" data-pedidos-entregas-group-head"><?php esc_html_e( 'Entregas parciales', 'logistica' ); ?></th>
						<th rowspan="2"><?php esc_html_e( 'Total entregado', 'logistica' ); ?></th>
						<th rowspan="2" class="logistica-pedidos-table__actions-col is-actions-head" scope="col"><?php esc_html_e( 'Acción', 'logistica' ); ?></th>
					</tr>
					<tr>
						<th class="logistica-pedidos-orden-sortable" scope="col" data-pedidos-orden-sort="cliente">
							<?php esc_html_e( 'Cliente', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable" scope="col" data-pedidos-orden-sort="oc">
							<?php esc_html_e( 'OC', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable" scope="col" data-pedidos-orden-sort="fecha-oc">
							<?php esc_html_e( 'Fecha OC', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable" scope="col" data-pedidos-orden-sort="referencia">
							<?php esc_html_e( 'Tipo de producto', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable" scope="col" data-pedidos-orden-sort="descripcion">
							<?php esc_html_e( 'Referencia', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable is-numeric" scope="col" data-pedidos-orden-sort="cantidad">
							<?php esc_html_e( 'Cantidad solicitada', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable is-numeric" scope="col" data-pedidos-orden-sort="cantidad-finalizada">
							<?php esc_html_e( 'Cantidad finalizada', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable is-numeric" scope="col" data-pedidos-orden-sort="pendiente">
							<?php esc_html_e( 'Pendiente por entrega', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable is-numeric" scope="col" data-pedidos-orden-sort="cantidad-maxima" title="<?php esc_attr_e( 'Tolerancia ± % sobre la cantidad solicitada', 'logistica' ); ?>">
							<?php esc_html_e( 'Tolerancia ± %', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable is-numeric" scope="col" data-pedidos-orden-sort="precio">
							<?php esc_html_e( 'Precio unit.', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable" scope="col" data-pedidos-orden-sort="fecha-aprobacion">
							<?php esc_html_e( 'Fecha aprobación', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable" scope="col" data-pedidos-orden-sort="fecha-entrega">
							<?php esc_html_e( 'Fecha entrega', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable" scope="col" data-pedidos-orden-sort="observaciones">
							<?php esc_html_e( 'Observaciones', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable" scope="col" data-pedidos-orden-sort="op">
							<?php esc_html_e( 'OP', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-orden-sortable" scope="col" data-pedidos-orden-sort="estado">
							<?php esc_html_e( 'Estado', 'logistica' ); ?>
							<span class="logistica-pedidos-orden-sort-indicator" aria-hidden="true"></span>
						</th>
						<th class="logistica-pedidos-entregas-subhead" scope="col"><?php esc_html_e( 'Cant. / Factura', 'logistica' ); ?></th>
					</tr>
				</thead>
				<tbody data-pedidos-ordenes-rows>
					<?php
					$orden_colspan = $orden_oc_base_cols + 1 + 2;
					?>
					<?php if ( empty( $orden_rows_flat ) ) : ?>
						<tr class="logistica-pedidos-table__empty" data-pedidos-empty-row>
							<td colspan="<?php echo esc_attr( (string) $orden_colspan ); ?>"><?php esc_html_e( 'No hay órdenes de compra. Crea una OC para comenzar.', 'logistica' ); ?></td>
						</tr>
					<?php else : ?>
						<?php foreach ( $orden_rows_flat as $entry ) : ?>
							<?php
							$orden  = $entry['orden'];
							$linea  = $entry['linea'];
							$estado          = $linea ? sanitize_key( (string) ( $linea['estado'] ?? 'sin_confirmar' ) ) : 'sin_confirmar';
							$row_class       = logistica_pedidos_orden_row_estado_class( $estado );
							$allows_entrega  = $linea && Logistica_Pedidos_Board::orden_linea_allows_entrega_fields( $orden, $linea, $estado );
							$entrega_title   = $allows_entrega
								? ''
								: __( 'Solo editable con OC, tipo de producto y estado Despacho o Entregado. Los parciales guardados se conservan.', 'logistica' );
							$parciales_by_slot = array();
							if ( $linea ) {
								foreach ( (array) ( $linea['entregas_parciales'] ?? array() ) as $parcial ) {
									$parciales_by_slot[ (int) ( $parcial['slot_index'] ?? 0 ) ] = $parcial;
								}
							}
							$visible_parcial_slots = logistica_pedidos_row_visible_parcial_slots( $parciales_by_slot );
							$cantidad_pedida     = $linea ? (float) ( $linea['cantidad'] ?? 0 ) : 0;
							$cantidad_finalizada = $linea ? (float) ( $linea['cantidad_entregada'] ?? 0 ) : 0;
							$cantidad_despachada  = $linea ? (float) ( $linea['cantidad_despachada'] ?? Logistica_Pedidos_Board::sum_orden_linea_entregas( $linea['entregas_parciales'] ?? array() ) ) : 0;
							$cantidad_pendiente   = $linea ? Logistica_Pedidos_Board::compute_orden_linea_pendiente( $linea ) : 0;
							$fecha_entrega_value  = $linea ? Logistica_Pedidos_Board::format_date_input( $linea['fecha_entrega'] ?? '' ) : '';
							$fecha_prorroga_value = $linea ? Logistica_Pedidos_Board::format_date_input( $linea['fecha_prorroga'] ?? '' ) : '';
							$fecha_efectiva_value = $fecha_prorroga_value !== '' ? $fecha_prorroga_value : $fecha_entrega_value;
							$fecha_oc_value       = Logistica_Pedidos_Board::format_date_input( $orden['fecha_oc'] ?? '' );
							$oc_numero_value    = (string) ( $orden['oc_numero'] ?? '' );
							$cliente_value      = (string) ( $orden['cliente'] ?? '' );
							$referencia_value   = $linea ? (string) ( $linea['articulo'] ?? '' ) : '';
							$descripcion_value  = $linea ? (string) ( $linea['descripcion'] ?? '' ) : '';
							$op_value           = $linea ? (string) ( $linea['op'] ?? '' ) : '';
							$fecha_aprob_value  = $linea ? Logistica_Pedidos_Board::format_date_input( $linea['fecha_aprobacion'] ?? '' ) : '';
							$search_bits        = array_filter(
								array(
									$oc_numero_value,
									$cliente_value,
									$referencia_value,
									$descripcion_value,
									$op_value,
									$fecha_aprob_value,
									$linea ? (string) ( $linea['observaciones'] ?? '' ) : '',
								)
							);
							$estado_label       = $orden_estados[ $estado ] ?? $estado;
							$entregado_at_value = ( 'entregado' === $estado && $linea )
								? Logistica_Pedidos_Board::format_entregado_at_iso( $linea )
								: '';
							$parciales_client   = array();
							if ( $linea ) {
								foreach ( (array) ( $linea['entregas_parciales'] ?? array() ) as $parcial_row ) {
									$parciales_client[] = array(
										'id'           => (int) ( $parcial_row['id'] ?? 0 ),
										'slot_index'   => (int) ( $parcial_row['slot_index'] ?? 0 ),
										'cantidad'     => (float) ( $parcial_row['cantidad'] ?? 0 ),
										'cantidad_fmt' => Logistica_Pedidos_Board::format_quantity( $parcial_row['cantidad'] ?? 0 ),
										'factura'      => (string) ( $parcial_row['factura'] ?? '' ),
									);
								}
							}
							?>
							<tr
								data-pedidos-orden-row
								data-orden-id="<?php echo esc_attr( (string) ( $orden['id'] ?? 0 ) ); ?>"
								data-linea-id="<?php echo esc_attr( $linea ? (string) ( $linea['id'] ?? 0 ) : '0' ); ?>"
								data-pedidos-orden-oc="<?php echo esc_attr( $oc_numero_value ); ?>"
								data-pedidos-parciales="<?php echo esc_attr( wp_json_encode( $parciales_client ) ); ?>"
								data-pedidos-orden-search="<?php echo esc_attr( strtolower( implode( ' ', $search_bits ) ) ); ?>"
								data-pedidos-orden-cliente="<?php echo esc_attr( strtolower( $cliente_value ) ); ?>"
								data-pedidos-orden-referencia="<?php echo esc_attr( strtolower( $referencia_value ) ); ?>"
								data-pedidos-orden-estado="<?php echo esc_attr( $estado ); ?>"
								data-pedidos-estado-persisted="<?php echo esc_attr( $estado ); ?>"
								data-pedidos-orden-fecha-entrega="<?php echo esc_attr( $fecha_entrega_value ); ?>"
								data-pedidos-orden-fecha-prorroga="<?php echo esc_attr( $fecha_prorroga_value ); ?>"
								data-pedidos-orden-entregado-at="<?php echo esc_attr( $entregado_at_value ); ?>"
								data-pedidos-orden-sort-fecha-oc="<?php echo esc_attr( $fecha_oc_value ); ?>"
								data-pedidos-orden-sort-oc="<?php echo esc_attr( $oc_numero_value ); ?>"
								data-pedidos-orden-sort-cliente="<?php echo esc_attr( $cliente_value ); ?>"
								data-pedidos-orden-sort-referencia="<?php echo esc_attr( $referencia_value ); ?>"
								data-pedidos-orden-sort-descripcion="<?php echo esc_attr( $descripcion_value ); ?>"
								data-pedidos-orden-sort-cantidad="<?php echo esc_attr( $linea ? Logistica_Pedidos_Board::format_quantity( $linea['cantidad'] ?? 0 ) : '' ); ?>"
								data-pedidos-orden-sort-cantidad-finalizada="<?php echo esc_attr( Logistica_Pedidos_Board::format_quantity( $cantidad_finalizada ) ); ?>"
								data-pedidos-orden-sort-pendiente="<?php echo esc_attr( Logistica_Pedidos_Board::format_quantity( $cantidad_pendiente ) ); ?>"
								data-pedidos-orden-sort-cantidad-maxima="<?php echo esc_attr( $linea ? Logistica_Pedidos_Board::format_tolerancia_pct( $linea['cantidad_maxima_recibida'] ?? 0 ) : '' ); ?>"
								data-pedidos-orden-sort-precio="<?php echo esc_attr( $linea ? Logistica_Pedidos_Board::format_money( $linea['precio_unit'] ?? 0 ) : '' ); ?>"
								data-pedidos-orden-sort-fecha-entrega="<?php echo esc_attr( $fecha_efectiva_value ); ?>"
								data-pedidos-orden-sort-observaciones="<?php echo esc_attr( $linea ? (string) ( $linea['observaciones'] ?? '' ) : '' ); ?>"
								data-pedidos-orden-sort-op="<?php echo esc_attr( $op_value ); ?>"
								data-pedidos-orden-sort-fecha-aprobacion="<?php echo esc_attr( $fecha_aprob_value ); ?>"
								data-pedidos-orden-sort-estado="<?php echo esc_attr( $estado_label ); ?>"
								class="<?php echo esc_attr( trim( $row_class ) ); ?>"
							>
								<?php if ( $entry['is_first'] ) : ?>
									<td rowspan="<?php echo esc_attr( (string) $entry['rowspan'] ); ?>" data-pedidos-orden-cliente>
										<?php logistica_pedidos_render_locked_input( 'cliente', (string) ( $orden['cliente'] ?? '' ) ); ?>
									</td>
									<td rowspan="<?php echo esc_attr( (string) $entry['rowspan'] ); ?>" data-pedidos-orden-numero>
										<?php logistica_pedidos_render_locked_input( 'oc_numero', (string) ( $orden['oc_numero'] ?? '' ) ); ?>
									</td>
									<td rowspan="<?php echo esc_attr( (string) $entry['rowspan'] ); ?>" data-pedidos-orden-fecha>
										<?php logistica_pedidos_render_locked_input( 'fecha_oc', Logistica_Pedidos_Board::format_date_input( $orden['fecha_oc'] ?? '' ), 'date' ); ?>
									</td>
								<?php endif; ?>
								<td><?php logistica_pedidos_render_locked_referencia( $linea ? (string) ( $linea['articulo'] ?? '' ) : '' ); ?></td>
								<td data-pedidos-orden-referencia-cell><?php logistica_pedidos_render_locked_input( 'descripcion', $descripcion_value ); ?></td>
								<td data-pedidos-orden-cantidad><?php logistica_pedidos_render_locked_input( 'cantidad', $linea ? Logistica_Pedidos_Board::format_quantity( $linea['cantidad'] ?? 0 ) : '' ); ?></td>
								<td data-pedidos-orden-cantidad-finalizada><?php logistica_pedidos_render_cantidad_finalizada( Logistica_Pedidos_Board::format_quantity( $cantidad_finalizada ), $estado, $linea ? $linea : null ); ?></td>
								<td data-pedidos-orden-pendiente><?php logistica_pedidos_render_locked_computed( Logistica_Pedidos_Board::format_quantity( $cantidad_pendiente ) ); ?></td>
								<td><?php logistica_pedidos_render_locked_tolerancia_pct( 'cantidad_maxima_recibida', $linea ? ( $linea['cantidad_maxima_recibida'] ?? 0 ) : 0 ); ?></td>
								<td><?php logistica_pedidos_render_locked_input( 'precio_unit', $linea ? Logistica_Pedidos_Board::format_money( $linea['precio_unit'] ?? 0 ) : '' ); ?></td>
								<td data-pedidos-orden-fecha-aprobacion><?php logistica_pedidos_render_fecha_aprobacion_field( $fecha_aprob_value, $estado ); ?></td>
								<td data-pedidos-orden-fecha-entrega-cell><?php logistica_pedidos_render_fecha_entrega_cell( $linea ? array_merge( $linea, array( 'fecha_aprobacion' => $fecha_aprob_value ) ) : array() ); ?></td>
								<td><?php logistica_pedidos_render_locked_input( 'observaciones', $linea ? (string) ( $linea['observaciones'] ?? '' ) : '' ); ?></td>
								<td data-pedidos-orden-op><?php logistica_pedidos_render_op_field( $op_value, $estado ); ?></td>
								<td>
									<select data-field="estado">
										<?php foreach ( $orden_estados as $estado_key => $estado_label ) : ?>
											<option value="<?php echo esc_attr( $estado_key ); ?>" <?php selected( $estado, $estado_key ); ?>><?php echo esc_html( $estado_label ); ?></option>
										<?php endforeach; ?>
									</select>
								</td>
								<?php logistica_pedidos_render_parciales_wrap( $parciales_by_slot, $visible_parcial_slots, $allows_entrega, $entrega_title ); ?>
								<td class="is-auto" data-pedidos-orden-total-entregado data-cantidad-pedida="<?php echo esc_attr( Logistica_Pedidos_Board::format_quantity( $cantidad_pedida ) ); ?>">
									<?php
									echo esc_html(
										Logistica_Pedidos_Board::format_quantity( $cantidad_despachada ) . ' / ' . Logistica_Pedidos_Board::format_quantity( $cantidad_pedida )
									);
									?>
								</td>
								<td class="logistica-pedidos-table__actions-col">
									<button type="button" class="button button-small logistica-table-icon-btn" data-action="pedidos-edit-orden-linea" aria-label="<?php esc_attr_e( 'Editar', 'logistica' ); ?>" title="<?php esc_attr_e( 'Editar', 'logistica' ); ?>">
										<span class="dashicons dashicons-edit" aria-hidden="true"></span>
									</button>
									<button type="button" class="button button-small logistica-table-icon-btn" data-action="pedidos-delete-orden-linea" aria-label="<?php esc_attr_e( 'Eliminar', 'logistica' ); ?>">
										<span class="dashicons dashicons-trash" aria-hidden="true"></span>
									</button>
								</td>
							</tr>
						<?php endforeach; ?>
						<tr class="logistica-pedidos-table__filter-empty" data-pedidos-orden-filter-empty hidden>
							<td colspan="<?php echo esc_attr( (string) $orden_colspan ); ?>">
								<?php esc_html_e( 'Ninguna línea coincide con los filtros aplicados.', 'logistica' ); ?>
							</td>
						</tr>
					<?php endif; ?>
				</tbody>
				<tfoot>
					<tr
						class="logistica-pedidos-table__totals"
						data-pedidos-orden-totals-row
						<?php echo $orden_has_rows ? '' : ' hidden'; ?>
					>
						<td colspan="5" class="logistica-pedidos-table__totals-label" data-pedidos-orden-totals-label>
							<strong><?php esc_html_e( 'Totales', 'logistica' ); ?></strong>
						</td>
						<td class="is-auto is-numeric" data-pedidos-orden-total-cantidad>
							<?php echo esc_html( Logistica_Pedidos_Board::format_quantity( $orden_sheet_totals['cantidad'] ) ); ?>
						</td>
						<td class="is-auto is-numeric" data-pedidos-orden-total-cantidad-finalizada>
							<?php echo esc_html( Logistica_Pedidos_Board::format_quantity( $orden_sheet_totals['finalizada'] ) ); ?>
						</td>
						<td class="is-auto is-numeric" data-pedidos-orden-total-pendiente>
							<?php echo esc_html( Logistica_Pedidos_Board::format_quantity( $orden_sheet_totals['pendiente'] ) ); ?>
						</td>
						<td colspan="7"></td>
						<td></td>
						<td class="is-auto" data-pedidos-orden-total-entregado>
							<?php
							echo esc_html(
								Logistica_Pedidos_Board::format_quantity( $orden_sheet_totals['despachada'] )
								. ' / '
								. Logistica_Pedidos_Board::format_quantity( $orden_sheet_totals['cantidad'] )
							);
							?>
						</td>
						<td class="logistica-pedidos-table__actions-col"></td>
					</tr>
				</tfoot>
			</table>
		</div>
		<?php logistica_table_pagination( 'pedidos-ordenes' ); ?>
		</div>
	</section>

	<?php if ( $uses_inventario ) : ?>
	<section class="logistica-pedidos-section logistica-pedidos-section--inventario">
		<header class="logistica-pedidos-section__head">
			<h3><?php esc_html_e( 'Inventario físico y entregas', 'logistica' ); ?></h3>
			<p class="logistica-pedidos-section__hint">
				<?php echo esc_html( (string) ( $sheet_config['inventario_hint'] ?? '' ) ); ?>
			</p>
			<div class="logistica-pedidos-section__actions">
				<button type="button" class="button button-primary" data-action="pedidos-add-inventario"><?php esc_html_e( 'Nueva fila', 'logistica' ); ?></button>
			</div>
		</header>

		<div class="logistica-pedidos-table-wrap logistica-pedidos-table-wrap--inventario">
			<table class="logistica-pedidos-table logistica-pedidos-table--inventario" data-pedidos-inventario-table>
				<thead>
					<tr class="logistica-pedidos-table__group-head">
						<th colspan="9"><?php esc_html_e( 'Inventario físico', 'logistica' ); ?></th>
						<th colspan="<?php echo esc_attr( (string) ( $max_entrega_slots * 2 ) ); ?>" data-pedidos-inventario-entregas-group-head><?php esc_html_e( 'Entregas', 'logistica' ); ?></th>
						<th rowspan="2" class="logistica-pedidos-table__actions-col"><?php esc_html_e( 'Acciones', 'logistica' ); ?></th>
					</tr>
					<tr>
						<th><?php esc_html_e( 'Item', 'logistica' ); ?></th>
						<th><?php esc_html_e( 'Tipo de producto', 'logistica' ); ?></th>
						<th><?php esc_html_e( 'Cant. OP', 'logistica' ); ?></th>
						<th><?php esc_html_e( 'Fecha OP', 'logistica' ); ?></th>
						<th><?php echo esc_html( (string) ( $sheet_config['reporte_label'] ?? __( 'Inventario reportado', 'logistica' ) ) ); ?></th>
						<th><?php esc_html_e( 'Disponible', 'logistica' ); ?></th>
						<th><?php esc_html_e( 'Valor und', 'logistica' ); ?></th>
						<th><?php esc_html_e( 'Stock Latingraf', 'logistica' ); ?></th>
						<th><?php esc_html_e( 'En prod.', 'logistica' ); ?></th>
						<?php for ( $slot = 0; $slot < $max_entrega_slots; $slot++ ) : ?>
							<th><?php esc_html_e( 'Cantidad', 'logistica' ); ?></th>
							<th><?php esc_html_e( 'Remisión', 'logistica' ); ?></th>
						<?php endfor; ?>
					</tr>
				</thead>
				<tbody data-pedidos-inventario-rows>
					<?php if ( empty( $inventario_rows ) ) : ?>
						<tr class="logistica-pedidos-table__empty" data-pedidos-empty-row>
							<td colspan="<?php echo esc_attr( (string) ( 9 + ( $max_entrega_slots * 2 ) + 1 ) ); ?>">
								<?php echo esc_html( (string) ( $sheet_config['empty_inventario'] ?? __( 'No hay filas de inventario.', 'logistica' ) ) ); ?>
							</td>
						</tr>
					<?php else : ?>
						<?php foreach ( $inventario_rows as $row ) : ?>
							<?php
							$entregas_by_slot = array();
							foreach ( (array) ( $row['entregas'] ?? array() ) as $entrega ) {
								$slot = (int) ( $entrega['slot_index'] ?? 0 );
								$entregas_by_slot[ $slot ] = $entrega;
							}
							$en_prod = ( 'si' === ( $row['en_produccion'] ?? 'no' ) );
							?>
							<tr
								data-pedidos-inventario-row
								data-inventario-id="<?php echo esc_attr( (string) ( $row['id'] ?? 0 ) ); ?>"
								data-referencia="<?php echo esc_attr( (string) ( $row['referencia'] ?? '' ) ); ?>"
								class="<?php echo $en_prod ? ' is-en-produccion' : ''; ?>"
							>
								<td><input type="text" value="<?php echo esc_attr( (string) ( $row['item'] ?? '' ) ); ?>" data-field="item"></td>
								<td><input type="text" value="<?php echo esc_attr( (string) ( $row['referencia'] ?? '' ) ); ?>" data-field="referencia"></td>
								<td><input type="text" inputmode="numeric" value="<?php echo esc_attr( Logistica_Pedidos_Board::format_quantity( $row['cantidad_op'] ?? 0 ) ); ?>" data-field="cantidad_op"></td>
								<td><input type="date" value="<?php echo esc_attr( Logistica_Pedidos_Board::format_date_input( $row['fecha_op'] ?? '' ) ); ?>" data-field="fecha_op"></td>
								<td><input type="text" inputmode="numeric" value="<?php echo esc_attr( Logistica_Pedidos_Board::format_quantity( $row['reporte_hornitos'] ?? 0 ) ); ?>" data-field="reporte_hornitos"></td>
								<td class="is-auto" data-pedidos-disponible><?php echo esc_html( Logistica_Pedidos_Board::format_quantity( $row['reporte_disponible'] ?? 0 ) ); ?></td>
								<td><input type="text" inputmode="decimal" value="<?php echo esc_attr( Logistica_Pedidos_Board::format_money( $row['valor_und'] ?? 0 ) ); ?>" data-field="valor_und"></td>
								<td>
									<div class="logistica-pedidos-stock-cell">
										<input type="text" inputmode="numeric" class="is-sync-readonly" readonly tabindex="-1" value="<?php echo esc_attr( Logistica_Pedidos_Board::format_quantity( $row['stock_latingraf'] ?? 0 ) ); ?>" data-field="stock_latingraf" title="<?php esc_attr_e( 'Ajuste con los botones + y −', 'logistica' ); ?>">
										<div class="logistica-pedidos-stock-actions">
											<button type="button" class="logistica-pedidos-stock-btn logistica-pedidos-stock-btn--minus" data-action="pedidos-subtract-stock" title="<?php esc_attr_e( 'Restar stock', 'logistica' ); ?>" aria-label="<?php esc_attr_e( 'Restar stock', 'logistica' ); ?>">
												<span aria-hidden="true">−</span>
											</button>
											<button type="button" class="logistica-pedidos-stock-btn logistica-pedidos-stock-btn--plus" data-action="pedidos-add-stock" title="<?php esc_attr_e( 'Sumar stock', 'logistica' ); ?>" aria-label="<?php esc_attr_e( 'Sumar stock', 'logistica' ); ?>">
												<span aria-hidden="true">+</span>
											</button>
										</div>
									</div>
									<small class="logistica-pedidos-stock-disponible" data-pedidos-stock-disponible>
										<?php
										printf(
											/* translators: %s: cantidad disponible */
											esc_html__( 'Disp. %s', 'logistica' ),
											esc_html( Logistica_Pedidos_Board::format_quantity( $row['stock_disponible'] ?? 0 ) )
										);
										?>
									</small>
								</td>
								<td>
									<select data-field="en_produccion">
										<option value="si" <?php selected( $en_prod, true ); ?>><?php esc_html_e( 'Sí', 'logistica' ); ?></option>
										<option value="no" <?php selected( $en_prod, false ); ?>><?php esc_html_e( 'No', 'logistica' ); ?></option>
									</select>
								</td>
								<?php for ( $slot = 0; $slot < $max_entrega_slots; $slot++ ) : ?>
									<?php
									$entrega = $entregas_by_slot[ $slot ] ?? null;
									?>
									<td>
										<input
											type="text"
											inputmode="numeric"
											class="is-sync-readonly"
											readonly
											tabindex="-1"
											value="<?php echo esc_attr( $entrega ? Logistica_Pedidos_Board::format_quantity( $entrega['cantidad'] ?? 0 ) : '' ); ?>"
											data-field="entrega_cantidad"
											data-slot="<?php echo esc_attr( (string) $slot ); ?>"
											data-entrega-id="<?php echo esc_attr( $entrega ? (string) ( $entrega['id'] ?? 0 ) : '0' ); ?>"
											title="<?php esc_attr_e( 'Sincronizado desde órdenes de compra', 'logistica' ); ?>"
										>
									</td>
									<td>
										<input
											type="text"
											class="is-sync-readonly"
											readonly
											tabindex="-1"
											value="<?php echo esc_attr( $entrega ? (string) ( $entrega['remision'] ?? '' ) : '' ); ?>"
											data-field="entrega_remision"
											data-slot="<?php echo esc_attr( (string) $slot ); ?>"
											data-entrega-id="<?php echo esc_attr( $entrega ? (string) ( $entrega['id'] ?? 0 ) : '0' ); ?>"
											title="<?php esc_attr_e( 'Sincronizado desde órdenes de compra', 'logistica' ); ?>"
										>
									</td>
								<?php endfor; ?>
								<td class="logistica-pedidos-table__actions-col">
									<button type="button" class="button button-small" data-action="pedidos-save-inventario"><?php esc_html_e( 'Guardar', 'logistica' ); ?></button>
									<button type="button" class="button button-small logistica-table-icon-btn" data-action="pedidos-delete-inventario" aria-label="<?php esc_attr_e( 'Eliminar', 'logistica' ); ?>">
										<span class="dashicons dashicons-trash" aria-hidden="true"></span>
									</button>
								</td>
							</tr>
						<?php endforeach; ?>
					<?php endif; ?>
				</tbody>
				<tfoot>
					<tr data-pedidos-referencia-totals hidden>
						<td colspan="5"><strong data-pedidos-ref-total-label></strong></td>
						<td class="is-auto" data-pedidos-ref-total-value></td>
						<td colspan="<?php echo esc_attr( (string) ( 3 + ( $max_entrega_slots * 2 ) + 1 ) ); ?>"></td>
					</tr>
				</tfoot>
			</table>
		</div>
	</section>
	<?php endif; ?>
</div>
