Crear transferencia de stock en SERVICE LAYER

Buenas tardes, me podrian apoyar.
Estoy programando en C# para crear un traslado de stock en base a una solicitud de traslado usando SERVICE LAYER.
Actualmente cuento con el codigo para crear una solicitud de traslado, pero no se como pasarla a traslado de stock.
Me podrian ayudar, gracias.
Les comparto mi codigo para insertar la solicitud por si a alguien le ayuda de igual manera.

public async Task<string> CrearSolicitudTraslado(encabezadoSolicitudTraslado datos)
{
    // Configurar TLS y aceptar certificados no confiables (como en LoginAsync)
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
    ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

    // Obtener el B1SESSION
    string b1Session = await LoginAsync(datos.empresa);
    if (string.IsNullOrEmpty(b1Session))
        throw new Exception("No se pudo obtener la sesión de SAP.");

    string baseUrl = _configuration.GetSection(datos.empresa.ToUpper())["BaseUrl"];
    string url = $"{baseUrl}/InventoryTransferRequests";

    // Armar el JSON de la solicitud
    var bodyObj = new
    {
        DocDate = DateTime.Now.ToString("yyyy-MM-dd"),
        FromWarehouse = datos.almacenOri,
        ToWarehouse = datos.almacenDest,
        StockTransferLines = datos.detalleST.Select(d => new
        {
            ItemCode = d.itemcode,
            Quantity = d.cantidad,
        }).ToList()
    };

    string jsonBody = JsonConvert.SerializeObject(bodyObj);

    // Crear la petición
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/json";
    request.Headers.Add("Cookie", $"B1SESSION={b1Session}");

    // Enviar el JSON
    using (var streamWriter = new StreamWriter(await request.GetRequestStreamAsync()))
    {
        streamWriter.Write(jsonBody);
    }

    try
    {
        using (WebResponse response = await request.GetResponseAsync())
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            string result = await reader.ReadToEndAsync();
            var jsonResult = JObject.Parse(result);
            return jsonResult["DocEntry"]?.ToString(); // Regresamos el DocEntry de la solicitud creada
        }
    }
    catch (WebException ex)
    {
        using (var errorResponse = (HttpWebResponse)ex.Response)
        using (var reader = new StreamReader(errorResponse.GetResponseStream()))
        {
            string errorText = await reader.ReadToEndAsync();
            throw new Exception($"Error al crear la solicitud de traslado: {errorText}");
        }
    }
}

:heavy_heart_exclamation: Importante :exclamation: La siguiente respuesta es generada por nuestro Robot de Consultoria-SAP.com denominado “CSAPBOT” usando tecnología de IA -inteligencia artificial. Por lo tanto, puede haber datos incorrectos. No podemos garantizar que la información sea 100% correcta, solo consultores SAP profesionales podrían verificar la información. Muchos consultores leen nuestros foros de Ayuda SAP y lamentablemente pocos ayudan respondiendo y confirmando la información.

Si quieres aprender más y mejorar nuestros sistemas, te esperamos en este artículo.


Hola, muy buena implementación y gracias por compartir tu código, será útil para muchos desarrolladores que trabajan con SAP Business One Service Layer.

:white_check_mark: ¿Qué querés hacer?

Querés crear un documento de traslado de stock (InventoryTransfer) a partir de una solicitud de traslado (InventoryTransferRequest) ya creada. Esta es una operación estándar en SAP B1, similar a convertir una orden de ventas en una entrega.


:compass: ¿Cómo lo hacés vía Service Layer?

Para crear un InventoryTransfer (OWTR) en base a una solicitud (OWTQ), necesitás hacer un POST al endpoint:

/InventoryTransfers

Pero indicando la relación con el documento base (la solicitud). Para eso, tenés que usar los campos:

  • BaseType = 1250000001 → Código de objeto para solicitud de traslado
  • BaseEntry = DocEntry de la solicitud
  • BaseLine = número de línea correspondiente

:jigsaw: Ejemplo de JSON para crear el traslado desde solicitud

{
  "DocDate": "2025-06-13",
  "StockTransferLines": [
    {
      "BaseType": 1250000001,
      "BaseEntry": 12345,
      "BaseLine": 0
    },
    {
      "BaseType": 1250000001,
      "BaseEntry": 12345,
      "BaseLine": 1
    }
  ]
}

:wrench: ¿Cómo modificar tu código en C#?

Asumiendo que ya tenés el DocEntry de la solicitud (por ejemplo, solicitudId), podés armar el JSON para la creación del traslado así:

var bodyObj = new
{
    DocDate = DateTime.Now.ToString("yyyy-MM-dd"),
    StockTransferLines = datos.detalleST.Select((d, index) => new
    {
        BaseType = 1250000001,
        BaseEntry = datos.DocEntrySolicitud, // ← Este debe ser el DocEntry de la solicitud
        BaseLine = index
    }).ToList()
};

Asegurate de que datos.DocEntrySolicitud esté correctamente seteado con el valor devuelto al crear la solicitud de traslado (InventoryTransferRequest).


:lock: Consideraciones adicionales

  • No incluyas ItemCode, Quantity, etc. cuando usás base document, ya que esos datos se copian automáticamente desde la solicitud.
  • Verificá que la solicitud esté abierta y con líneas válidas.
  • Si tenés gestión por ubicaciones (Bin Locations), debés incluir también los BinAllocations.

:hammer_and_wrench: Resumen Consultoria-SAP

Para crear un traslado de stock (InventoryTransfer) desde una solicitud (InventoryTransferRequest) en SAP Business One vía Service Layer, se utiliza el endpoint /InventoryTransfers, pasando las líneas con los campos BaseType = 1250000001, BaseEntry = DocEntry de la solicitud y BaseLine. Esto le indica a SAP que debe copiar la solicitud de traslado como base. El código en C# que ya usás puede adaptarse fácilmente generando las líneas con referencia a la solicitud.

Esta operación forma parte del módulo de logística e inventario (MM/IM) en SAP B1, y es común en escenarios de centros de distribución, multialmacén o intersocietarios.

Si querés compartir el código final para que otros lo reutilicen, te esperamos en los Foros de Consultoria-SAP.com.

¡Estamos aquí para ayudarte en los Foros SAP de Consultoria-SAP!

Este tema se cerró automáticamente 2 días después de la última publicación. No se permiten nuevas respuestas.