Creando factura y realizando el incoming payment

Buenas noches mediante el SAP DI he podido crear una factura sin problema. Pero tengo un inconveniente al momento de crear el incoming payment este es mi XML request:

	<Operations>
		<Operation Name="Add" IsMultipleTransactions="True">
			<Object TargetObject="IncomingPayments">
				<LinkedFields>
					<Object Name="IncomingPayments">
						<Field>
							<Name>CardCode</Name>
							<Value>CWP</Value>
						</Field>
						<Field>
							<Name>DocNum</Name>
							<Value>317885</Value>
						</Field>
						<Field>
							<Name>CashSum</Name>
							<Value>25.22</Value>
						</Field>
						<Field>
							<Name>PrjCode</Name>
							<Value>CWP</Value>
						</Field>
						<Field>
							<Name>PrjCode</Name>
							<Value>CWP</Value>
						</Field>
						<Field>
							<Name>PrjCode</Name>
							<Value>CWP</Value>
						</Field>
						<Field>
							<Name>PrjCode</Name>
							<Value>CWP</Value>
						</Field>
						<Field>
							<Name>PrjCode</Name>
							<Value>CWP</Value>
						</Field>
						<Object Name="CreditCards">
							<Field>
								<Name>CrTypeCode</Name>
								<Value>1</Value>
							</Field>
							<Field>
								<Name>CrCardNum</Name>
								<Value>2</Value>
							</Field>
							<Field>
								<Name>VoucherNum</Name>
								<Value>12345</Value>
							</Field>
							<Field>
								<Name>CardValid</Name>
								<Value>02/2022</Value>
							</Field>
							<Field>
								<Name>CreditSum</Name>
								<Value>-16.20</Value>
							</Field>
							<Field>
								<Name>CreditCard</Name>
								<Value>28</Value>
							</Field>
						</Object>
						<Object Name="CreditCards">
							<Field>
								<Name>CrTypeCode</Name>
								<Value>1</Value>
							</Field>
							<Field>
								<Name>CrCardNum</Name>
								<Value>2</Value>
							</Field>
							<Field>
								<Name>VoucherNum</Name>
								<Value>12345</Value>
							</Field>
							<Field>
								<Name>CardValid</Name>
								<Value>02/2022</Value>
							</Field>
							<Field>
								<Name>CreditSum</Name>
								<Value>16.20</Value>
							</Field>
							<Field>
								<Name>CreditCard</Name>
								<Value>10</Value>
							</Field>
						</Object>
						<Object Name="CreditCards">
							<Field>
								<Name>CrTypeCode</Name>
								<Value>1</Value>
							</Field>
							<Field>
								<Name>CrCardNum</Name>
								<Value>2</Value>
							</Field>
							<Field>
								<Name>VoucherNum</Name>
								<Value>12345</Value>
							</Field>
							<Field>
								<Name>CardValid</Name>
								<Value>02/2022</Value>
							</Field>
							<Field>
								<Name>CreditSum</Name>
								<Value>33.11</Value>
							</Field>
							<Field>
								<Name>CreditCard</Name>
								<Value>2</Value>
							</Field>
						</Object>
						<Object Name="CreditCards">
							<Field>
								<Name>CrTypeCode</Name>
								<Value>1</Value>
							</Field>
							<Field>
								<Name>CrCardNum</Name>
								<Value>2</Value>
							</Field>
							<Field>
								<Name>VoucherNum</Name>
								<Value>12345</Value>
							</Field>
							<Field>
								<Name>CardValid</Name>
								<Value>02/2022</Value>
							</Field>
							<Field>
								<Name>CreditSum</Name>
								<Value>9.45</Value>
							</Field>
							<Field>
								<Name>CreditCard</Name>
								<Value>3</Value>
							</Field>
						</Object>
						<Object Name="Invoices">
							<Field>
								<Name>DocEntry</Name>
								<Value>113923</Value>
							</Field>
							<Field>
								<Name>SumApplied</Name>
								<Value>25.22</Value>
							</Field>
						</Object>
						<Object Name="Invoices">
							<Field>
								<Name>DocEntry</Name>
								<Value>113923</Value>
							</Field>
							<Field>
								<Name>SumApplied</Name>
								<Value>-16.20</Value>
							</Field>
						</Object>
						<Object Name="Invoices">
							<Field>
								<Name>DocEntry</Name>
								<Value>113923</Value>
							</Field>
							<Field>
								<Name>SumApplied</Name>
								<Value>16.20</Value>
							</Field>
						</Object>
						<Object Name="Invoices">
							<Field>
								<Name>DocEntry</Name>
								<Value>113923</Value>
							</Field>
							<Field>
								<Name>SumApplied</Name>
								<Value>33.11</Value>
							</Field>
						</Object>
						<Object Name="Invoices">
							<Field>
								<Name>DocEntry</Name>
								<Value>113923</Value>
							</Field>
							<Field>
								<Name>SumApplied</Name>
								<Value>9.45</Value>
							</Field>
						</Object>
					</Object>
				</LinkedFields>
			</Object>
		</Operation>
	</Operations>
</Request>

y me da este error: Failed to Add SAP B1 Business Object (-10): Payment amount is greater than invoice amount [RCT2.SumApplied][line: 2]

mi factura es esta:

y de esta tabla SQL saco los datos para generar el incoming payment:

no sé si sea la mejor manera de manejar esto, me pueden ayudar con algunos tips?

gracias.

1 me gusta

Buenas

En el apartado Invoices del objeto Payments, el DocEntry de una factura solo puede estar una vez, a menos que esa factura este separada por Installments o cuotas.

En tu XML, el DocEntry 113923 está 5 veces, a menos que en tú codigo estés sumando y agrupando en un total para presentarlo al objeto final

Atte.

1 me gusta

actualmente hice un ejemplo y me sale asi:

por cada forma de pago que tengo en la tabla SQL, se crea en SAP B1 una línea de recibo. Eso está correcto?

y me sale cada medio de pago como una tarjeta (asi lo manejo) y su monto correspondiente.

Realmente no sé como agrupar todo para que salga en una sola línea de recibo, ya que manejo varias formas de pago. Esto es una integración de mi punto de venta hacia SAP B1, subo las ventas de todos los días y sus medios de pago.

Te aconsejo que primero crees un pago en SAP B1 manualmente como debería quedar la trasaccion, si no eres tú quien lo define, debes pedirle al area responsable que te genere una transaccion de ejemplo.

Luego obten el XML del objeto Payments creado.

ocompany.XMLExportType = xet_ExportImportMode;

payments.GetByKey(DocEntry del pago);
payments.SaveToFile("c:\ruta\del\disco\pago.xml");

Eso te dará una mejor perspectiva de como debe crearse el objeto.
De todas maneras lo de las tarjetas está correcto, lo que me hace ruido a mi, es el tema de las facturas

Atte.

1 me gusta

hay alguna otra forma de obtener el xml del objeto pero directamente en sap b1 ? sin programación?

De manera estándar no.
Puedes crear un pequeño addon, aplicacion de consola windows, winform, etc que haga ese trabajo.
O puedes hacerlo mediante un script en porwershell, python u otro lenguaje scripting.

Atte.

1 me gusta

voy a probar lo que indicas. Por otro lado que opinas de esto:

actualmente tomo los datos del punto de venta que me genera un XML y lo guardo en una tabla SQL medios de pago y articulos. Entonces ya creo la factura. Esta imagen adjunta es de los medios de pago mi lógica es yo tomo de la columna

  1. otherpayment amount cada linea para agregar medio de pago ejemplo visa, master card y sus montos.
  2. tomo el cashamount para efectivo y lo mapeo
  3. tomo la suma de todos los totalamount y lo ingreso en SumApplied (creo que aquí está mi problema) por eso salen tantas líneas una por cada medio de pago y debería ser 1

esto es una aplicación llamada codeless tiene su GUI, este es parte de mi mapeo:

En SAP es posible crear un pago con múltiples medios de pago incluso múltiples tarjetas ya que en el comercio una venta puede ser pagada 60% con VISA y 40% con MASTER por ejemplo. Eso lo soporta el objeto, por lo tanto que tengas múltiples lineas en el objeto CreditCards está correcto.

Para que un pago esté correctamente cuadrado, la suma de todos los medios de pago debe ser igual a la suma de todas las facturas incluidas.

Yo creo que el problema está aquí, no puedes abonar una factura negativamente, si puedes colocar un medio de pago negativo como la CreditCards

El total de tu pago sumando efectivo y creditos (positivos y negativos) es de 67.78, por lo tanto tu objeto invoice debe quedar con solo una linea así

<Object Name="Invoices">
							<Field>
								<Name>DocEntry</Name>
								<Value>113923</Value>
							</Field>
							<Field>
								<Name>SumApplied</Name>
								<Value>67.78</Value>
							</Field>
						</Object>

Atte.

1 me gusta

es correcto, ahora a nivel de SQL, sé que el foro no es de SQL pero algun tip para hacer algo al respecto? tomando en cuenta que todo lo tengo en una tabla por cada medio de pago, línea por línea el monto

la verdad no se me ocurre nada para pasar al objeto SumApplied solamente 67.78 y no línea por línea

Debes construir el xml de manera separada usando la misma tabla y consulta solo que en una detallando y otra agrupando.
Ejemplo

//Aqui  por cada linea del resultado SQL añades un Elemnto de CreditCards, lo cual es correcto
for each (row in resultadoQuery)
{
     xml.Element.Add(Objecto Credit Cards);
}

//Aqui añades el objeto invoice, tienes que hacer otra query agrupando por el campo sapb1invoicedocentry y sumando la columna totalamount

var sql = "select distinct sapb1invoicedocentry, sum(totalamount) from tabla group by sapb1invoicedocentry";

ConnDB.ExecuteQuery(sql);

for each (row in resultadoQuery)
{
     xml.Element.Add(Objecto Invoice);
}

Atte.

1 me gusta

No se si tu app permite hacer esta distincion, en ese caso deberías contactar al proveedor o desarrollador de la integracion entre TCPOS y SAPB1.

Atte.

1 me gusta

genial, es eso , gracias por la idea Felipe. voy a incorporar ese query para sumar el totalamount, guardarlo en una variable y pasarlo al sap b1 di

gracias

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