Facturar items con lista de materiales

Estimados, reciban un cordial saludo.

Actualmente estoy desarrollando parte de un componente donde la función es registrar una factura con origen desde otro sistema.

Mi problema radica con productos con lista de materiales:
por ejemplo, un producto base, se vende por unidad, digamos, una cerveza, esta tiene su código y se rebaja por unidad 1 a 1.
Pero hay una lista de materiales, donde se vende por paquetes de 6. entonces al facturar este código debe rebajar 6 unidades del producto base.

Cuando primero registro la orden de venta utilizando el SDK, al parecer SAP automáticamente inserta el producto base representado por la lista y el precio del item dentro de esa factura queda en cero.

El error aparece al momento de registrar la factura en el SDK relacionando la orden de venta, este devuelve “Target item number does not match base item number. [INV1.ItemCode][line: 1]”
Me imagino que se debe a que en la orden se insertan dos productos…el de la lista y el producto base, pero en realidad solo debe ser una linea.

Existe alguna forma o parámetro que hace falta en SAP o estoy ignorando alguna propiedad al momento de registrar la factura desde el SDK?

Muchas gracias por su tiempo. estoy a la orden si necesitan mas información.

Atentamente,
Oscar Romero

Hola

en la línea podría haber un atributo llamado TreeType, que indica que el artículo que estás facturando es una lista de materiales.

A nivel de base datos los valores son: A=Assembly, I=Sales BOM Component, N=Not a BOM, P=Production, S=Sales, T=Template

Espero te sirva de ayuda
Agustín

Hola estimado @oromero87
¿Ya verificaste si el articulo existe en tu maestro de articulos ?
tambien podrias verificar si el codigo articulo Hijo, corresponde a su articulo padre?

Y por lo visto, es en la linea no.1 de tu orden de venta.

Algo asi me suena el error que te esta mostrando.
Revisalo, espero te sirvan las sugerencias.

Ademas de lo anterior, te doy la bienvenida a nuestra comunidad y te invito a que te des un paseo por las demas areas de este foro, te invito a que te presentes en el area de presentaciones y tambien a que participes en los temas interesantes que hay en otras de las areas de esta comunidad.

Bienvenido y espero te ayude en algo lo sugerido.
Saludos cordiales.

Buen día Amarcos,

Gracias por la información. Abajo dejo el código para registrar la orden y la venta.

Saludos cordiales,
Oscar Romero

Hola @saufondez,

Gracias por la bienvenida y la información proporcionada.

Puedes ver el código y otros adjuntos, La verdad no encuentro la causa.

Muchas gracias a todos.

Saludos cordiales,
Oscar Romero

Amigos, este es el código para registrar la orden de venta:

        public TransactionEntity Create(OrderEntity order, List<ItemEntity> items)
        {
            int line = 0;
            string newEntityId = "";
            TransactionEntity transaction = new TransactionEntity();

            _Order = Company.GetBusinessObject(BoObjectTypes.oOrders);
            _Order.CardCode = order.CustomerCode;
            _Order.DocDueDate = order.OrderDueDate;

            foreach(ItemEntity item in items)
            {
                _Order.Lines.SetCurrentLine(line);
                _Order.Lines.WarehouseCode = item.WarehouseCode;
                _Order.Lines.ItemCode = item.ItemCode;
                _Order.Lines.Quantity = item.Quantity;
                _Order.Lines.UnitPrice = item.UnitPrice;
                _Order.Lines.LineTotal = item.LineTotal;
                _Order.Lines.TaxCode = item.TaxCode;
                _Order.Lines.VatGroup = item.VatGroup;
                _Order.Lines.Add();
                line += 1;
            }

            if (_Order.Add() != 0)
            {
                JavaScriptSerializer jsSerializer = new JavaScriptSerializer();

                transaction.Message = "Orders: " + Company.GetLastErrorDescription() + jsSerializer.Serialize(_Order.Lines);
            }
            else
            {
                Company.GetNewObjectCode(out newEntityId);
                transaction.Successfull(newEntityId);
            }

            System.Runtime.InteropServices.Marshal.ReleaseComObject(_Order);
            _Order = null;
            GC.Collect();

            return transaction;
        }

Este es el código para registrar la factura:

        public TransactionEntity Create(InvoiceEntity invoice, List<ItemEntity> items)
        {
            int line = 0;
            string newEntityId = "";
            TransactionEntity transaction = new TransactionEntity();

            _Invoice = Company.GetBusinessObject(BoObjectTypes.oInvoices);
            _Invoice.CardCode = invoice.CustomerCode;
            _Invoice.NumAtCard = invoice.Reference;
            _Invoice.DocDate = invoice.DocDate;
            _Invoice.TaxDate = invoice.TaxDate;
            _Invoice.DocType = BoDocumentTypes.dDocument_Items;
            _Invoice.Comments = invoice.Comments;

            if (invoice.Series > 0)
            {
                _Invoice.Series = (int)invoice.Series;
            }

            foreach (ItemEntity item in items)
            {
                _Invoice.Lines.SetCurrentLine(line);
                _Invoice.Lines.ItemCode = item.ItemCode;
                _Invoice.Lines.WarehouseCode = item.WarehouseCode;
                _Invoice.Lines.Quantity = item.Quantity;
                _Invoice.Lines.VatGroup = item.VatGroup;
                _Invoice.Lines.UnitPrice = item.UnitPrice;
                _Invoice.Lines.LineTotal = item.LineTotal;
                _Invoice.Lines.TaxCode = item.TaxCode;
                _Invoice.Lines.BaseType = (int)BoObjectTypes.oOrders;
                _Invoice.Lines.BaseEntry = invoice.OrderId;
                _Invoice.Lines.BaseLine = line;
                _Invoice.Lines.MeasureUnit = item.UnitOfMeasure;
                _Invoice.Lines.Add();
                line += 1;
            }

            if (_Invoice.Add() != 0)
            {
                JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
                transaction.Message = "Invoices: " + Company.GetLastErrorDescription() + jsSerializer.Serialize(_Invoice.Lines);
            }
            else
            {
                Company.GetNewObjectCode(out newEntityId);
                transaction.Successfull(newEntityId);
            }

            System.Runtime.InteropServices.Marshal.ReleaseComObject(_Invoice);
            _Invoice = null;
            GC.Collect();

            return transaction;
        }

1-Esta es una tabla de equivalencias donde mapeo el código del sistema X contra el código de SAP:
image007

2-Esta es la configuración en SAP:
image003

3-Este es el registro de la factura desde el sistema X:
image008

4-Así registra SAP la orden de venta en SAP:
Sobre el ítem LMTC-00000125 ésta es una lista de materiales
El LMTC-00000124 es el producto base.
image009

5-Este es el mensaje devuelto por SAP al momento de registrar la factura:
image010

Viendo otras facturas desde el sistema X hay un patrón, los códigos que son de una lista de materiales aparecen al final o a veces se factura solo una linea…en esos casos no hay error…pero cuando el item aparece al principio (como en el punto 3) devuelve ese error.

Aparte hay otro caso, cuando es un producto de lista materiales el precio se registra en cero al crear la factura.

Agradezco enormemente su apoyo y tiempo.

Saludos cordiales,
Oscar Romero

Creo lo que te hace falta es lo que comenta @Amarcos, para que el sistema entienda que estas ingresando un articulo tipo BOM.

Saludos

Hola @juliancab, Gracias por tu tiempo.

Aún no he modificado el código pero analizando lo que dices con @Amarcos creo que primero debo validar si el código que viene desde el sistema X es de una lista de materiales…si lo es…obtener producto(s) base. e insertarlos en la orden y factura. Pero me pregunto si esto tiene impacto financiero o en análisis de futuros reportes.

Saludos cordiales,
Oscar Romero

Hola Oscar.

Pudiste resolver algo al respecto. Es que he topado con algo parecido. Tengo un artículo tipo lista de ventas y necesito que a la hora de facturarlo poder modificar la cantidad de uno de los componentes o productos base, pero no he podido por medio de SDK (en SAP si se puede).

Agradezco si pudiste me pudieras colaborar, o a otros compañeros si nos pueden ayudar.

Saludos,

Carlos

Importante, si insertas los componentes en la orden sin poder establecer que pertenecen al artículo tipo lista te los va a facturar a parte, es decir rebajará el doble a nivel de costo e inventarios (eso si ya lo probé).

Saludos,
Carlos.

Hola @Carnavso,

Lastimosamente no puedo darte una respuesta, sigo en labores de investigación. Al tener una solución con gusto les notificaré.

Saludos,
Oscar

Amigos, He probado lo que indican pero sigo sin suerte. De igual forma intenté lo siguiente:
1- guardar la lista de materiales como montaje en lugar de ventas.
2- corregir lista de precio asignada al cliente, productos principales y lista de materiales.
3- ocultar los componentes de la lista de materiales en impresión.
4- precio y total solo para artículo.

Si han encontrado la forma de facturar desde el SDK un tip o indicio se agradece.

Saludos cordiales,
Oscar Romero

Hola estimados, Pues la solución a final no fue tan elegante creo, Siempre me quedé con la duda…Lo que hice fue pasar de un solo a factura y no hacer la orden venta.

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