Cada vez que se actualice la cartera: corre las 3 queries de abajo en Snowflake, descarga el resultado de cada una como CSV, y súbelos aquí arriba en "Actualizar datos" (puedes subir los 3 a la vez o uno por uno — la página detecta solo cuál es cuál).
- Corre la query
- Exporta / descarga el resultado como CSV
- Súbelo en "Choose Files" arriba
- Verifica que la fecha de corte sea la de hoy
- Dale clic a "Procesar archivos"
1. Factoraje a Clientes
→ reporte de Factoraje a Clientes
Copiar
WITH INVOICE_ADVANCES AS (
SELECT
UPPER(b.Tax_id) AS "RFC CLIENTE",
UPPER(b.NAME) AS "CLIENTE",
UPPER(get(ia.buyer, 'name')) :: VARCHAR AS "COMPRADOR",
get(ia.invoice, 'internalIdentifier') :: VARCHAR AS "ID / FOLIO",
get(ia.invoice, 'amount') :: DECIMAL(9, 2) AS "MONTO FACTURA",
ADVANCE_DATE AS "FECHA ADELANTO",
DUE_DATE AS "FECHA VENCIMIENTO",
EFFECTIVE_ADVANCE AS "ADELANTO",
CURRENT_REMAINING_AMOUNT AS "SALDO ACTUAL",
EFFECTIVE_COLLECTION AS "PAGOS",
STATE AS "ESTATUS",
timediff(DAY, DUE_DATE, CURRENT_DATE()) AS "DIAS VENCIDOS",
EARLY_LATE_FEE AS "LATE FEES"
FROM
REPLICA_PROD.PROD_POSTGRES_INVOICEADVANCE.INVOICE_ADVANCES AS ia
JOIN REPLICA_PROD.PROD_POSTGRES_CUSTOMER.BUSINESS_PRODUCT AS bp
ON (bp.id = ia.business_product_id)
JOIN REPLICA_PROD.PROD_POSTGRES_CUSTOMER.BUSINESS b
ON bp.business:id = b.id
WHERE UPPER(b.Tax_id) = 'ABC991012BF0'
)
, raw_data as (
SELECT *, case when "DIAS VENCIDOS" <= 0 then 'On time'
when "DIAS VENCIDOS" < 30 then 'LATE 30 days'
when "DIAS VENCIDOS" BETWEEN 30 AND 60 then 'LATE 30-60 days'
when "DIAS VENCIDOS" BETWEEN 61 AND 90 then 'LATE 61-90 days'
when "DIAS VENCIDOS" BETWEEN 91 AND 120 then 'LATE 91-120 days'
when "DIAS VENCIDOS" > 120 then 'LATE 121 or more'
end as bucket
FROM INVOICE_ADVANCES
WHERE ESTATUS IN ('advanced', 'delayed', 'late')
)
SELECT *
FROM raw_data
ORDER BY "FECHA ADELANTO", "CLIENTE", "COMPRADOR" ASC;
2. FaP Normal (proveedores)
→ reporte de Factoraje a Proveedores · Factoraje Normal
Copiar
SELECT
CB.NAME AS PROVEEDOR,
IA.INVOICE_INTERNAL_IDENTIFIER AS INVOICE_ID,
DATE_TRUNC(DAY, PROD.ADVANCE_DATE)::DATE AS FECHA_ADELANTO,
DATE_TRUNC(DAY, PROD.DUE_DATE)::DATE AS FECHA_VENCIMIENTO,
IA.INVOICE_AMOUNT AS MONTO_FACTURA,
IA.FEE_AT_DUE AS COSTO_VENCIMIENTO,
IA.ADVANCE_AMOUNT AS MONTO_ADELANTADO,
-- Moratorios en 0 si es vigente o periodo de gracia
CASE
WHEN PROD.STATE IN ('advanced', 'delayed') THEN 0
WHEN IA.EARLY_LATE_FEE <= 0 THEN 0
WHEN COALESCE(IA.POST_ADJUSTMENT, 0) <= 0 THEN IA.EARLY_LATE_FEE
ELSE GREATEST(
IA.EARLY_LATE_FEE - IA.POST_ADJUSTMENT,
0
)
END AS LATE_FEE_REAL,
-- Total a pagar = Monto factura + Late fee real - Pagos aplicados
IA.INVOICE_AMOUNT
+ (
CASE
WHEN PROD.STATE IN ('advanced', 'delayed') THEN 0
WHEN IA.EARLY_LATE_FEE <= 0 THEN 0
WHEN COALESCE(IA.POST_ADJUSTMENT, 0) <= 0 THEN IA.EARLY_LATE_FEE
ELSE GREATEST(
IA.EARLY_LATE_FEE - IA.POST_ADJUSTMENT,
0
)
END
)
- IA.EFFECTIVE_COLLECTION AS TOTAL_A_PAGAR,
CASE
WHEN PROD.STATE IN ('settlementCompleted', 'paid') THEN 'Saldado'
WHEN PROD.STATE = 'late' THEN 'Vencido'
WHEN PROD.STATE = 'advanced' THEN 'Vigente'
WHEN PROD.STATE = 'delayed' THEN 'Periodo de gracia'
ELSE PROD.STATE
END AS Estado,
PROD.CURRENCY
FROM REPLICA_PROD.PROD_POSTGRES_INVOICEADVANCE.invoice_advances PROD
LEFT JOIN ANALYTICS.TRUSTED.CUSTOMER_BUSINESS CB
ON PROD.BUSINESS_ID = CB.BUSINESS_ID
LEFT JOIN ANALYTICS.TRUSTED.INVOICEADVANCE_INVOICE_ADVANCES IA
ON IA.invoice_advance_id = PROD.ID
LEFT JOIN ANALYTICS.TRUSTED.BUYER_BUYER BB
ON IA.BUYER_ID = BB.BUYER_ID
WHERE BB.BUYER_ID IN ('ABC991012BF0')
AND IA.state IN ('advanced', 'delayed', 'late')
ORDER BY FECHA_VENCIMIENTO ASC;
3. FaP LPP (proveedores)
→ reporte de Factoraje a Proveedores · Línea para Proveedores
Copiar
SELECT
SUP.NAME AS Proveedor,
II.INTERNAL_IDENTIFIER AS INVOICE_ID,
IMF.PAID_AT::DATE AS FECHA_ADELANTO,
IMF.due_date::date AS FECHA_VENCIMIENTO,
II.AMOUNT AS MONTO_FACTURA,
IMF.FEE_AT_DUE AS COSTO_VENCIMIENTO,
IMF.APPROVED_PAYMENT_AMOUNT AS MONTO_ADELANTADO,
-- Costo a la fecha en 0 si la factura está saldada
CASE
WHEN IMF.STATE = 'completed' THEN 0
ELSE (IMF.CURRENT_REMAINING_AMOUNT - IMF.APPROVED_PAYMENT_AMOUNT)
END AS COSTO_A_LA_FECHA,
-- Moratorios en 0 si es negativo o si aún no ha vencido
CASE
WHEN IMF.EARLY_LATE_FEE < 0 THEN 0
WHEN IMF.due_date::date > CURRENT_DATE THEN 0
ELSE IMF.EARLY_LATE_FEE
END AS COSTO_MORATORIO,
IMF.current_remaining_amount AS SALDO_A_LA_FECHA,
-- Mapeo de estados
CASE
WHEN IMF.STATE = 'completed' THEN 'Saldado'
WHEN IMF.STATE = 'outstanding' THEN 'Vigente'
WHEN IMF.STATE = 'late' THEN 'Vencido'
WHEN IMF.STATE = 'delayed' THEN 'Periodo de gracia'
ELSE IMF.STATE
END AS Estado
FROM REPLICA_PROD.PROD_POSTGRES_IMPORT_PAYMENT.IMPORT_FINANCES IMF
JOIN REPLICA_PROD.PROD_POSTGRES_IMPORT_PAYMENT.IMPORT_INVOICES II
ON IMF.INVOICE_ID = II.ID
JOIN REPLICA_PROD.PROD_POSTGRES_IMPORT_PAYMENT.SUPPLIERS SUP
ON IMF.SUPPLIER_ID = SUP.ID
WHERE 1=1
AND BUSINESS_ID = 'ecc3777b-bf74-4c53-b2d6-c218d275c8d9'
AND IMF.STATE in ('outstanding','late','delayed')