Ultima Fecha de una Factura en una Orden de Venta

sql
Etiquetas: #<Tag:0x00007f10e624eac0>

#1

Buenos días

Alguien tendrá alguna idea de como hacerle para obtener la ultima fecha de una orden de venta?
para poderme darme a entender, anexo la imagen del resultado de la consulta.
image

En la columna Fecha Fact Ame tengo dos fechas, 3/03 y 28/02, la Orden de Venta es la misma.

Pensé que ya lo había logrado en un tema anterior :(, pero luego surgieron mas casos.
Este es el ultimo query que tengo.

SELECT DISTINCT 
	T0.DocNum as 'OV'
	,T0.U_Convenio as 'Conv OV'
	,T11.U_Convenio as 'Conv Fact'
	,T0.SlpCode as 'Vendedor'
	,T11.[Total Fact] as 'Total Fact'
	,T11.Vendedor as 'Vendedor Fact'
	,T0.U_TIPO_Convenio as 'Tipo Conv OV'
	,T18.isIns as 'FR'
	,T18.IsICT as 'FD+P'	
	--, T11.DocNum as 'FAC'
	--, T0.DocTotal as 'Total OV'
	, IIF(T0.DocTotal =  T0.PaidToDate,T0.DocTotal,0) as 'Tot OV'
	--, T11.DocDate as 'Fecha FACT'
	, T15.DocDate as 'Fecha Pago'
	--, T15.PagadoFact as 'Total Pago'
	, T18.FechaFactAme as 'Fecha Fact ame'
	,T18.FechaEnt as 'FechaEnt'
    , T17.U_Name as 'Usuario'
	, T0.DocDate AS 'DocDate_OV'
	, T0.DocDueDate AS 'DocDueDate_OV'
	, T0.TaxDate AS 'TaxDate_OV'
	, T0.NumAtCard AS 'NumAtCard_OV'
	, T0.Comments AS 'Comments_OV'
	, T0.PickRmrk AS 'PickRmrk_OV'
	, CASE T0.DocStatus WHEN 'O' THEN 'Abierto' WHEN 'C' THEN 'Cerrado' END AS 'ESTADO_OV'
	, T0.AtcEntry AS 'AtcEntry_OV'
	, FORMAT(T0.CreateTs, '00:00:00') AS 'HORA_OV'
,t14.SlpName as 'Asesor'
FROM 
	[ORDR] T0 /*OV*/ 
	INNER JOIN [RDR1] T1 ON T0.DocEntry = T1.DocEntry /*OV*/ 

	LEFT JOIN [INV1] T10 ON T0.DocEntry = T10.BaseEntry AND T0.ObjType = T10.BaseType AND T1.LineNum = T10.BaseLine
	--LEFT JOIN [OINV] T11 ON T10.DocEntry = T11.DocEntry 

	---T11---
	LEFT JOIN (SELECT T2.isIns, T2.IsICT, 2.DocNum, T2.DocEntry, t2.U_Convenio,T2.U_TIPO_Convenio,T2.DocTotal 'Total Fact', T2.SlpCode as 'Vendedor'
		FROM OINV T2 
		WHERE T2.CANCELED='N' and T2.U_Convenio='SI') T11 ON T10.DocEntry = T11.DocEntry 

	LEFT JOIN [OCRD] T13 ON T0.CardCode = T13.CardCode
	LEFT JOIN [OSLP] T14 ON T0.SlpCode = T14.SlpCode

	-----T15----
	LEFT JOIN (SELECT T1.DocEntry, T1.InvType, SUM(T1.SumApplied) as PagadoFact, MAX(DocDate) as DocDate
				FROM [ORCT] T0 JOIN [RCT2] T1 ON T0.DocNum = T1.DocNum
				WHERE Status='N'
				GROUP BY T1.DocEntry, T1.InvType
					) T15 ON T11.DocEntry = T15.DocEntry --AND T11.ObjType = T15.InvType
	LEFT JOIN [OHEM] T16 ON T0.OwnerCode=T16.empID
	LEFT JOIN OUSR T17 ON T16.USERID=T17.UserID 

	-----T18----
	LEFT JOIN (SELECT T2.isIns, T2.IsICT, T3.DocDate as 'FechaEnt', T0.SlpCode as 'Vendedor OV',  t2.U_Convenio,T2.U_TIPO_Convenio, 
	T0.DocEntry, T0.DocNum 'Orden', 
	T0.DocDate 'Fecha orden', 
	max(T2.DocDate) as FechaFactAme, max (t3.DocDate) as FechaEntAme
	
		FROM ORDR T0
		INNER JOIN INV1 T1 ON T1.BaseEntry=T0.DocEntry AND T1.BaseType='17'  
		INNER JOIN OINV T2 ON T2.DocEntry=T1.DocEntry
		left JOIN odln t3 on t1.TrgetEntry=t3.DocEntry
		WHERE T2.CANCELED='N' group by t0.SlpCode, t0.DocEntry, t0.DocNum, 
		t0.DocDate,t2.U_Convenio,T2.U_TIPO_Convenio, t3.DocDate, T2.isIns, T2.IsICT) T18 on T0.DocEntry=T18.DocEntry
		 
	left JOIN ( select t0.DocDate, T0.DocNum, T0.DocEntry
	 FROM ODLN T0  LEFT JOIN DLN1 T1 ON T0.[DocEntry] = T1.[DocEntry]
    LEFT JOIN OINV T2 on T1.BaseEntry=T2.DocEntry and T1.BaseRef=T2.DocNum where t0.CANCELED='N'
	) T20 on T11.DocEntry=T20.DocEntry
	
	
WHERE 
	(T0.Canceled ='N')
	--AND T11.DocNum IS NOT NULL -- NO MUESTRA LAS OV SIN FACTURAS
	--AND T15.PagadoFact IS NOT NULL -- NO MUESTRA LAS OV SIN PAGOS
	AND T0.DocTotal =  T0.PaidToDate -- MUESTRA LAS OV SOLO PAGOS COMPLETOS
	--and T11.CANCELED='N'
	
	AND T0.DocStatus='C'  
	and t0.DocNum='35759'

Necesito crear el informe en crystal, mi parametro es igual a fechafactame, pero siguiendo ese ejemplo me toma el valor de febrero, cuando debe ser el de marzo, la diferencia esta en que la Orden de Venta tiene 2 facturas de reserva con sus respectivas entregas y una factura de deudor.

Espero que me puedan brindar su apoyo :slight_smile:


#2

Buenos días
Ya he logrado lo que necesito, anexe un case en las fechas.
Ahora me surge otro caso :frowning:
En la consulta no estoy anexando lo que son las facturas deudor+pago, intente anexarlo pero toda mi consulta se basa en ordenes de venta.


#3

Alguien tendrá alguna idea? :slight_smile:


#4

Buenas tardes

Parece que nadie :frowning:


#5

Hola America
Si de pronto nos explicas que información necesita que traiga la consulta te podemos ayudar!

Andres Ramirez Jararamillo :colombia:


#6

Gracias por tu respuesta

Necesito de una consulta donde, me muestre la fecha en la cual se cerró la orden de venta, esta puede tener varias facturas ya sea reserva con su entrega y deudor, también puede ser, facturas de deudor o reservas en parcialidades (no me debe considerar esta como cerrada si aun no esta pagada), el total de la orden de venta la debe considerar, cuando la reserva esta entregada y pagada, el deudor esta totalmente pagada. Tengo varios casos donde la orden de venta tiene varias reservas, las entregas de estas en teoria deben ser las mismas, pero tienen fechas diferentes, entonces debo tomar el mayor.
En el query que tengo, obtengo las fechas del documento que lo cierra, pero si la entrega no esta entregada, la considera :frowning:


#7

Buenos días
He decidido cambiar los casos, creo que el caso que expongo es complicado, no logró obtener los resultados deseados, son muchos casos a considerar.
Ahora intento con las Ordenes de Venta, Facturas de Reserva y Entregas, la Orden de venta puede tener varias reservas, para que mi OV pueda considerarla como cerrada, todas las Reservas tienen que estar entregadas, y la fecha que debo considerar sería la ultima.

Esta es la consulta que tengo

SELECT distinct T0.DocNum 'Orden', t0.DocTotal, T2.docnum as 'FolioFact', t3.DocNum as 'FolioEnt', t1.BaseEntry, 
	t1.BaseRef, t1.TargetType, T2.isIns, T2.IsICT, T3.DocDate as 'FechaEnt', T0.SlpCode as 'Vendedor OV',  t2.U_Convenio,T2.U_TIPO_Convenio, 
	T0.DocEntry, T0.DocDate 'Fecha orden', 
	max (t3.DocDate) as 'FechaFactAme',
	case when t2.isIns='Y' and  t1.TargetType=-1 and t0.DocNum=t1.BaseRef then max (t3.DocDate) end as 'Ame'
		FROM ORDR T0
		left JOIN INV1 T1 ON T1.BaseEntry=T0.DocEntry and t1.BaseRef=t0.DocNum AND t1.baseentry=t0.DocEntry and T1.BaseType='17'  
		left JOIN OINV T2 ON T2.DocEntry=T1.DocEntry 
		left JOIN odln t3 on t1.TrgetEntry=t3.DocEntry
		--inner join DLN1 t4 on t3.DocEntry=t4.DocEntry and t4.BaseRef=t2.DocEntry
		WHERE T2.CANCELED='N' and T1.TargetType <>14 
		group by t0.SlpCode, t0.DocEntry, t0.DocNum, 
		t0.DocDate,t2.U_Convenio,T2.U_TIPO_Convenio, t3.DocDate, T2.isIns, T2.IsICT, t1.TargetType, 
		t1.BaseEntry, t1.BaseRef, t3.DocNum, T2.docnum, t0.DocTotal

Pero sigo sin obtener lo que necesito


#8

Buenos días :slight_smile:
Creen que si se pueda obtener lo que necesito? O alguna idea?
Muchas gracias :slight_smile:


#9

Hola @america:

Buenas, disculpe, finalmente, resolvió esto?

De ser así nos podría comentar, como lo hizo finalmente :pray:

Salud@s :raised_hand_with_fingers_splayed:t5:


#10

Hola @oscarezh

No lo pude resolver, si gusta puede cerrar el tema :pensive:

Gracias


#11

Haz intentado tomar el dato del log de modificaciones? Ahi te guarda todo el tratamiento que tiene un documento y con el campo LogInstanc puedes saber cual fue el ultimo cambio que tuvo ese documento.


#12

Gracias @juliancab sip, te podría decir que intente de todo


#13

Hola @america:

Buen día, no nos demos por vencido :muscle:t5:

Veamos si entre todos podemos llegar a lo que usted quiere :wink:

En su último flujo usted tiene estas dos opciones

  • Ordenes de Ventas --> Facturas de Reserva --> Entregas
  • Orden de Ventas --> Entregas --> Factura de Deudor
    Cierto?

Y lo que quiere es obtener es:

  • Número de Orden.
  • Monto de Orden.
  • Folio de Factura:
  • Folio Ent:
  • BaseEntry:
  • BaseRef:
  • TargetType:
  • T2.isIns:
  • T2.IsICT:
  • FechaEnt:
  • ‘Vendedor OV’:
  • T0.DocEntry:
  • Fecha orden:
  • FechaFactAme:

Podría comentarnos que quiere obtener en estos campos?
o en donde esta entrampada? :pray:

Saludos :raised_hand_with_fingers_splayed:t5:


#14

Gracias :slight_smile:


Así es como lo tengo:

  • Ordenes de Ventas --> Facturas de Reserva --> Entregas
  • Orden de Ventas --> Factura de Deudor

De igual forma la Factura de reserva o deudor pueden tener varios pagos.
Lo que necesito obtener es, cuando todas las facturas de la orden de venta ya hayan sido pagadas que me muestre el importe de la orden de venta, considerando como fecha cerrada la ultima fecha que tengan las facturas, ya sea pago o entrega de la reserva, aunque estuve viendo que se complica mas si considero la entrega de las reservas, así que intente también considerando como fecha cerrada el ultimo pago que tengan las facturas.


#15

Hola @america:

En el caso de:

  • Orden de Venta --> Factura de Deudor realizaría una sub-consulta así:
select t0.BaseEntry, T1.DocNum, MAX(T1.DocDate) from INV1 t0
inner join OINV t1 on t0.DocEntry=t1.DocEntry
where t0.BaseType=17
AND t1.DocTotal=t1.PaidToDate
GROUP BY t0.BaseEntry, T1.DocNum

Con ella obtendría orden de venta, factura de deudor y fecha de factura de deudor :wink:

Saludos :raised_hand_with_fingers_splayed:t5:


#16

Gracias por su respuesta, ya he intentado con una consulta parecida, con ello obtengo la ultima factura creada, esto es correcto, pero con esto obtengo el caso de que hay una factura que no esta pagada totalmente, por lo cual no lo debería mostrar, y si a esa le anexo el filtro de que no considere las facturas no pagadas, me muestra la factura que si esta pagada, pero no debería porque el importe de la orden de venta no ha sido pagada totalmente, anexo un ejemplo:

image

la factura 39105 es la ultima, pero no puedo considerarla porque aun tiene saldo, entonces cuando esa factura ya este pagada totalmente, debo tomar la ultima fecha que se pago, supongamos que se pago ayer, entonces la ultima fecha sería esa.
Agradezco de su apoyo :slight_smile:


#17

Buen día @america:
Pero el campo PaidToDate, guarda el valor pagado a la fecha, por eso el único caso en que

Sería cuando este completamente pagada no parcialmente :thinking:

Saludos :raised_hand_with_fingers_splayed:t5:


#18

Buen día

Gracias por su respuesta

Yo se, pero el punto es que es que la orden de venta para mi aun no esta pagada, debido a que tiene una factura pagada parcialmente y una pagada totalmente, el total de la OV debo considerarla cuando ya esten pagadas todas las facturas, con la consulta que tengo, me muestra el total de la OV ya que tiene una factura pagada pero no debería, ya que tiene una parcial. Me explico? :slight_smile:


#19

Hola @oscarezh

Gracias a tus palabras, retomé nuevamente el tema :slight_smile:
Esto es lo que tengo hasta ahora.

SELECT DISTINCT 
	T0.DocNum as 'OV'
	,T15.OwnerPhone, T15.FirstSum, T15.PagoEfect,T15.PagoTC, T15.PagoCheque,  T15.InvType
	, IIF(T0.DocTotal =  T0.PaidToDate,T0.DocTotal,0) as 'Tot OV'
	--, T15.DocDate as 'Fecha Pago'
	, T11.DocTotal as 'TotalFact'
	, sum (T15.PagadoFact) as 'Total Pago'
	, T11.Vendedorfact
	, T18.FechaFactAme as 'Fecha Fact ame'
    , T18.CANCELED
	, T0.DocStatus as 'Status OV'
	, T18.DocStatus as 'Status Fact'
    , T17.U_Name as 'Usuario'
	, T0.DocDate AS 'DocDate_OV'
	, T0.DocDueDate AS 'DocDueDate_OV'
	, T0.TaxDate AS 'TaxDate_OV'
	, T0.NumAtCard AS 'NumAtCard_OV'
	, T0.Comments AS 'Comments_OV'
	, T0.PickRmrk AS 'PickRmrk_OV'
	, CASE T0.DocStatus WHEN 'O' THEN 'Abierto' WHEN 'C' THEN 'Cerrado' END AS 'ESTADO_OV'
	, case when t18.DocStatus ='O' then 'Abierto' end as 'Ame' 
	, T0.AtcEntry AS 'AtcEntry_OV'
	, FORMAT(T0.CreateTs, '00:00:00') AS 'HORA_OV'
,t14.SlpName as 'Asesor'
FROM 
	[ORDR] T0 /*OV*/ 
	INNER JOIN [RDR1] T1 ON T0.DocEntry = T1.DocEntry /*OV*/ 
	LEFT JOIN [INV1] T10 ON T0.DocEntry = T10.BaseEntry AND T0.ObjType = T10.BaseType AND T1.LineNum = T10.BaseLine
	
	---T11---
	LEFT JOIN (SELECT distinct T2.DocNum,t2.DocTotal, t3.baseentry, T3.DocEntry, t2.U_Convenio,T2.U_TIPO_Convenio,T2.DocTotal 'Total Fact', T2.SlpCode as 'Vendedorfact'
		FROM OINV T2 inner join inv1 t3 on t2.DocEntry=t3.DocEntry
		WHERE T2.CANCELED='N' and t3.TargetType<>1) T11 ON T10.DocEntry = T11.DocEntry 

	LEFT JOIN [OCRD] T13 ON T0.CardCode = T13.CardCode
	LEFT JOIN [OSLP] T14 ON T0.SlpCode = T14.SlpCode

	--------T15---------
	LEFT JOIN (SELECT T2.OwnerPhone, t1.DocEntry, T0.[DocNum] AS 'FolioPago', T2.FirstSum, T0.[CashSum] as 'PagoEfect', 
				T0.[CreditSum] as 'PagoTC', T0.[CheckSum] as 'PagoCheque', T1.InvType, 
				SUM(T1.SumApplied) as PagadoFact, MAX(t0.DocDate) as DocDate
				FROM ORCT T0 left JOIN RCT2 T1 ON T0.DocEntry = T1.DocNum
				left JOIN RCT3 T2 ON T0.DocEntry = T2.DocNum
				WHERE Status='N' and T0.Canceled='N'-- and t1.SumApplied=t5.DocTotal --and t0.docnum=72997
				group by t0.DocNum, t0.CashSum, t0.CreditSum,t1.DocEntry, 
				t0.CheckSum, t1.InvType, T2.FirstSum, T2.OwnerPhone, T2.FirstSum 
					) T15 ON T11.DocEntry = T15.DocEntry --AND T11.ObjType = T15.InvType
	LEFT JOIN [OHEM] T16 ON T0.OwnerCode=T16.empID
	LEFT JOIN OUSR T17 ON T16.USERID=T17.UserID 

	------T18------
	LEFT JOIN (SELECT distinct  T2.CANCELED, t0.DocEntry, T2.DocStatus,
	t0.docNum 'Orden', t0.DocTotal, T0.SlpCode as 'Vendedor OV', 
	T0.DocDate 'Fecha orden', 
	max(T2.DocDate) as FechaFactAme
	--,IIF(T2.U_Convenio = 'SI') as 'Total OV'
		FROM ORDR T0
		inner JOIN INV1 T1 ON T0.DocEntry=T1.BaseEntry --And T1.BaseType='17'  
		inner JOIN OINV T2 ON T2.DocEntry=T1.DocEntry
		where t2.CANCELED='N' and t1.TargetType <>14 and t2.DocStatus='C' and t0.DocStatus='C'

	group by t0.DocNum, t0.DocDate,T0.SlpCode, t0.DocTotal, T0.DocEntry, t2.DocStatus, T2.CANCELED) T18 on T0.DocEntry=T18.DocEntry 
WHERE 
	T0.Canceled ='N'
	AND T11.DocNum IS NOT NULL -- NO MUESTRA LAS OV SIN FACTURAS
	AND T15.PagadoFact IS NOT NULL -- NO MUESTRA LAS OV SIN PAGOS
	AND T0.DocTotal =  T0.PaidToDate -- MUESTRA LAS OV SOLO PAGOS COMPLETOS
	--and T11.CANCELED='N'
	and t11.BaseEntry=t0.DocEntry
		--and t11.PaidToDate=t11.DocTotal
	AND T0.DocStatus='C' and t0.docnum=36651 or t0.DocNum=36221 or t0.docnum=35568
	AND PagadoFact=t0.DocTotal
group by t0.DocNum,T15.OwnerPhone, T15.FirstSum, T15.PagoEfect,T15.PagoTC, T15.PagoCheque,  T15.InvType,
	T0.DocTotal,  T0.PaidToDate,
	--, T15.DocDate as 'Fecha Pago'
	T15.PagadoFact
	, T11.DocTotal
	, T11.Vendedorfact
	, T18.FechaFactAme 
    , T18.CANCELED
	, T0.DocStatus 
	, T18.DocStatus 
    , T17.U_Name
	, T0.DocDate 
	, T0.DocDueDate 
	, T0.TaxDate 
	, T0.NumAtCard 
	, T0.Comments 
	, T0.PickRmrk
	, T0.DocStatus 
	, t18.DocStatus
	, T0.AtcEntry 
	, T0.CreateTs
	, t14.SlpName

El resultado es el siguiente

image

Pero en el ejemplo, la OV 36221 no debería aparecer ya que no esta facturada toda la OV, solo tiene una por 6,721.80 de 10,347.00, entonces lo que me ayudaría es hacer la suma de todas las facturas donde su baseentry sea igual a la OV y asi compararlo con el total de la oV. Pero no lo logro :frowning:

Gracias


#20

Hola @america:

Se me ocurriría hacer otra subconsulta para determinar si todas están pagadas :smile:

Por ejemplo el target entry de tu línea de detalle de la orden, tiene el docentry de tu factura.

Basado en eso haría la diferencia entre doctotal y paidtodate, para cada docentry.

Luego lo sumaría y agruparía por el docentry de tu orden.

Si el resultado de la suma es 0 tienes una orden con todas sus facturas pagadas :wink:

SELECT 
T0.DocEntry,
SUM(T1.Diferencia)
FROM RDR1 T0
INNER JOIN (SELECT T0.DocEntry, T0.DocTotal-T0.PaidToDate 'Diferencia' FROM OINV T0)T1 ON T0.TrgetEntry=T1.DocEntry
GROUP BY T0.DocEntry

Otra alternativa sería consultando si las facturas estan cerradas de ser así, hacer un proceso similar :thinking:

Saludos :raised_hand_with_fingers_splayed:t5: