En app/models/Operacion.php haz SOLO estos cambios:

1) Importa el servicio en la cabecera:
use App\Services\EnvaseService;

2) Cambia la firma actual:
public function crearDesdePedido(int $idPedido, int $idUsuario, int $idSucursal): int

por:
public function crearDesdePedido(int $idPedido, int $idUsuario, int $idSucursal, array $accionesEnvase = []): int

3) En public function pedido(), dentro del SELECT de pedidos_detalle, agrega:
p.tipo_producto,
p.id_tipo_envase,

4) Dentro de crearDesdePedido(), después del foreach que inserta operaciones_detalle y ANTES del UPDATE pedidos, agrega:

$envaseService = new EnvaseService($this->db);

foreach ($pedido['detalles'] as $detalle) {
    $idTipoEnvase = (int)($detalle['id_tipo_envase'] ?? 0);
    $tipoProducto = (string)($detalle['tipo_producto'] ?? '');

    if ($idTipoEnvase <= 0) {
        continue;
    }

    if (!in_array($tipoProducto, ['RECARGA_GAS', 'RECARGA_AGUA'], true)) {
        continue;
    }

    $accion = $accionesEnvase[(string)$detalle['id_detalle']] ?? '';

    if (!in_array($accion, ['DEVUELVE_VACIO', 'PRESTA_ENVASE'], true)) {
        throw new \RuntimeException(
            'Debes indicar qué ocurre con el envase de ' . $detalle['producto'] . '.'
        );
    }

    $envaseService->registrarRecargaCliente(
        $idTipoEnvase,
        (int)$pedido['id_cliente'],
        $idOperacion,
        $idAlmacen,
        $idUsuario,
        $accion,
        (int)$detalle['cantidad_solicitada']
    );
}

IMPORTANTE:
- Conserva tu cálculo de IGV.
- Conserva tu integración actual con Inventario.
- Conserva tu integración actual con Caja/Pagos.
- No reemplaces toda la función crearDesdePedido(); agrega solamente estos cambios sobre tu versión actual.
