App de control financiero: el módulo de ingresos que hace simple lo complicado
Llevar la cuenta de facturas y pagos ya no tiene que sentirse como resolver un acertijo imposible. La App de control financiero se asegura de que cada peso esté en su lugar. Con unos pocos clics, simplifica la gestión de ingresos, te da una visión clara de tu flujo de caja y te devuelve el control de tus finanzas.
Y sí, hasta la pantalla de “pagos recibidos” está pensada para ser tan intuitiva como dar un chasquido. Simple, rápida y hecha para la vida real.
Vamos a desarmarlo paso a paso, pero con estilo:
El título que manda
Para empezar, añadimos un label con el título “Ingresos” en su propiedad Text. Nada de perderse: siempre sabrás que estás en la sección donde el dinero entra (y no se escapa).
El buscador poderoso
Insertamos un cuadro de texto con un ícono de búsqueda. Es como tener un detective financiero personal para tus facturas: escribes cliente, número de factura o proyecto y la app de control financiero te muestra el resultado al instante.
Botón de reinicio
¿Te equivocaste en la búsqueda? Con un clic en el botón de limpiar, todo vuelve a cero. Es como sacudir una pizarra mágica para empezar de nuevo.
La galería ordenada
Aquí llega lo divertido: La galería organiza tus ingresos como si fueran un catálogo, fácil de leer y sin enredos. Para lograrlo, insertamos una galería vertical con la propiedad Items:
Sort( Search( InvoicePayments; TextInput_Search_Income.Text; Client; Project; InvoiceNumber; Date; InvoiceValue; Budgeted value, PurchaseOrderNumber, ICA withholding; Withholding ); 'Created On'; SortOrder.Descending )
¿El resultado? Una lista donde siempre aparecen arriba los ingresos más recientes. Nada de revolver archivos, aquí todo fluye como debe.
Fuente de Datos
Detrás de todo buen módulo, en la app de control financiero hay una tabla aún mejor. todo arranca con InvoicePayments, la base que guarda cada ingreso registrado.
Aquí viven campos esenciales como: Client, Project, Invoice Number, Date, Invoice Value, Budgeted Value, Purchase Order Number, ICA Withholding y Withholding.
Es como tu libro contable, pero digital, organizado, limpio y listo para responder en segundos.
Funciones de Búsqueda
El radar que todo lo encuentra:
Search(InvoicePayments; TextInput_Search_Income.Text; …)
Permite buscar al mismo tiempo en varios campos (cliente, proyecto, número de factura, etc.). Escribiendo un dato y en menos de un segundo tienes las coincidencias. La App de control financiero no falla.
Función de Ordenamiento
El orden importa, y aquí lo garantizas con:
Sort( … ; 'Created On'; SortOrder.Descending)
¿El beneficio? Siempre tendrás los ingresos más recientes en la parte superior de la lista.
Dentro de la Galería
Aquí es donde el módulo de Ingresos se vuelve interactivo:
Etiquetas de información
Cada ingreso muestra datos claros gracias a etiquetas conectadas a la tabla, para esto se insertan labels que muestran las columnas más relevantes: Cliente, Proyecto, Número de Factura, Fecha y Valor.
Cada etiqueta se conecta con el campo real de la tabla usando propiedades como:
ThisItem.Client ThisItem.InvoiceNumber ThisItem.InvoiceValue
Así nunca tienes que adivinar de dónde vino el dinero.
Íconos con actitud
- Eliminar: Con la propiedad OnSelect que activa.
Set(varIncomeDeletionRecord; ThisItem);; UpdateContext({ popDelete: true })
- Editar: Con la propiedad OnSelect:
Set(IncomeItemRecord; ThisItem);; Navigate(EditIncome)
Así puedes entrar directo al registro, actualizarlo o eliminarlo sin rodeos.
Botón Crear
¿Un nuevo ingreso? Solo toca el botón Crear creado con esta propiedad y listo:
Navigate(CreateIncome; ScreenTransition.None)
Es como abrir una nueva pestaña, pero para tus finanzas.
Así mismo creas una sección que convierte la galería en un tablero interactivo: visualizas los datos, editas, eliminas o creas nuevos registros, al alcance de un clic. Justo lo que hace a la gestión administrativa de proyectos mucho más ágil y moderna.
Img.1
Pantalla “Crear Ingreso”
Botón de regreso
Siempre con salida rápida:
OnSelect = Back()
Botón Guardar
El clásico que nunca falla:
OnSelect = SubmitForm(Form_CreateIncome_1)
Etiqueta de título
Para que no haya dudas:
Text = "Create Income"
El formulario mágico
Aquí pasa la acción:
Notify("Income created successfully"; NotificationType.Success);; NewForm(Form_CreateIncome_1);; Navigate(Incomes; ScreenTransition.Fade)
¿El resultado? Cada ingreso registrado con estilo con notificación incluida.
Img.2
Botón “+” para añadir pagos
Porque siempre habrá más ingresos que registrar, agregamos un botón con el nombre “+”. Este botón tiene la propiedad OnSelect:
Collect(TemporaryInvoicePayments; { Payment_Date: Today(); Payment_Value: 0; Advance: ""; TotalPayment: 0 } )
¿Qué hace esta fórmula?
Collect
Es la función que permite crear o sumar registros dentro de una colección local en la app de control financiero. Aquí la colección se llama TemporaryInvoicePayments.
El registro inicial
Cuando presionas el botón, se agrega un nuevo registro con estos valores predeterminados:
- Payment_Date → se llena automáticamente con la fecha de hoy gracias a Today().
- Payment_Value → arranca en 0, esperando que el usuario ingrese el valor real.
- Advance → inicia vacío («»), pensado para registrar anticipos si aplica.
- TotalPayment → comienza en 0, y luego se calcula con base en los datos ingresados.
Para guiar al usuario, también insertamos una etiqueta con el texto:
Text = "Add payment"
Img.3
Porque nada como un recordatorio claro de qué hace el botón.
La galería de pagos
Aquí es donde cada pago se convierte en un registro visible y editable. Insertamos una galería vertical en blanco y en su propiedad Items colocamos:
TemporaryInvoicePayments
Dentro de la galería, añadimos 4 controles que hacen la magia:
- DatePicker → con la propiedad DefaultDate:
ThisItem.Payment_Date
Así siempre aparece la fecha correcta.
- InputText → con la propiedad Default:
ThisItem.Payment_Value
Para que el usuario ajuste el valor real del pago.
- Dropdown → con las opciones:
[""; "Yes"; "No"]
Perfecto para indicar si hay anticipo o no.
- Ícono de eliminar (papelera) → con la propiedad OnSelect:
Remove(TemporaryInvoicePayments; ThisItem)
Así puedes borrar un registro con un solo clic.
Img.4
Con este set de controles, el módulo de ingresos de la App de control financiero se vuelve interactivo, flexible y hasta divertido de usar. Cada pago entra limpio, ordenado y fácil de gestionar, como debe ser en una App de control financiero.
Calculando totales como un pro
Llegamos al momento de sacar cuentas, y aquí tu App de control financiero se convierte en ese contador puntual que nunca se equivoca (ni se toma vacaciones). Gracias a un par de labels inteligentes, todo queda bajo control:
Label «Paid Value»
Text = "$" & Text(Sum(TemporaryInvoicePayments; Value(Paid_Value));"#,##0.00")
Este label muestra automáticamente el total pagado, con formato en pesos y bien presentable, para que no tengas que andar sacando la calculadora.
Label «Balance»
Text = "$" & Text(Value(DataCardValue24.Text) - Sum(TemporaryPaymentsInvoice; Value(Payment_Value)); "#,##0.00")
Aquí tienes el saldo pendiente: lo que falta por pagar se calcula solito, restando lo abonado al valor total de la factura. Así sabes en segundos si toca celebrar o si todavía queda esperar que te consignen.
Img.5
El gran final: guardar y celebrar con tu App de control financiero
Después de todo el esfuerzo de registrar facturas, pagos y balances, llega el momento de apretar el botón de guardar. Y aquí es donde tu App de control financiero se luce como una rockstar de la organización:
If( CountRows(TemporaryInvoicePayments) = 0; Notify("You must add at least one payment"; NotificationType.Error); With( { newInvoicePayments: Patch( InvoicePayments; Defaults(PaymentInvoice); { InvoiceNumberProject: DataCardValue38.Text; InvoiceDate: DateValue5.SelectedDate; ClientAppRelation: DataCardValue43_2.Selected; ProjectAppRelation: DataCardValue46.Selected; PaidAmount: Sum(TemporaryInvoicePayments; Payment_Value); ReteICA: Value(DataCardValue30.Text); Retention: Value(DataCardValue31.Text); ApprovedClientBudget: Value(DataCardValue28.Text); QuoteNumber: DataCardValue33.Text; PurchaseOrderNumber: DataCardValue35.Text; InvoiceValue: Value(DataCardValue24.Text) } ) }; If( !IsBlank(newInvoicePayments); ForAll( TemporaryPaymentsInvoice; Patch( ProjectInvoicePayments; Defaults(ProjectInvoicePayments); { PaymentDate: Payment_Date; PaymentValue: Payment_Value; Advance: Advance; InvoicePaymentRelation: newInvoicePayments } ) );; Clear(TemporaryInvoicePayments); Notify("Invoice and payments saved successfully"; NotificationType.Success) ) ) );; ResetForm(Form5);; Navigate(Payments1_1; ScreenTransition.Fade)
¿Qué hace esta fórmula?
Validación inicial
Primero, la app revisa que hayas agregado al menos un pago:
If( CountRows(TemporaryInvoicePayments) = 0; Notify("You must add at least one payment"; NotificationType.Error);
Si la colección TemporaryInvoicePayments está vacía, ¡pum! aparece un aviso para recordarte que necesitas al menos un pago antes de seguir.
Creación de la factura
Con la función Patch, la app guarda la factura en la tabla InvoicePayments:
newInvoicePayments: Patch( InvoicePayments; Defaults(PaymentsInvoice); { InvoiceNumberProject: DataCardValue38.Text; InvoiceDate: DateValue5.SelectedDate; ClientAppRelation: DataCardValue43_2.Selected; ProjectAppRelation: DataCardValue46.Selected; PaidAmount: Sum(TemporaryInvoicePayments; Payment_Value); ReteICA: Value(DataCardValue30.Text); Retention: Value(DataCardValue31.Text); ApprovedClientBudget: Value(DataCardValue28.Text); QuoteNumber: DataCardValue33.Text; PurchaseOrderNumber: DataCardValue35.Text; InvoiceValue: Value(DataCardValue24.Text) } )
Aquí queda todo registrado: cliente, proyecto, valores, retenciones… ¡como tener un contador automático en tu bolsillo!
Registro de pagos asociados
Después, se recorren uno por uno los pagos temporales con ForAll para insertarlos en la tabla de pagos del proyecto y conectarlos con la factura recién creada:
ForAll( TemporaryPaymentsInvoice; Patch( ProjectInvoicePayments; Defaults(ProjectInvoicePayments); { PaymentDate: Payment_Date; PaymentValue: Payment_Value; Advance: Advance; InvoicePaymentRelation: newInvoicePayments } ) )
De esta manera, cada pago queda enlazado sin que tengas que hacerlo manualmente.
Limpieza y confirmación
Cuando todo está guardado, la app de control financiero borra la colección temporal y muestra un mensaje de éxito:
Clear(TemporaryInvoicePayments); Notify("Invoice and payments saved successfully"; NotificationType.Success)
Te avisa que todo quedó en orden.
Acciones finales
Para cerrar con broche de oro, la app de control financiero reinicia el formulario y te envía a la pantalla de pagos con estilo:
ResetForm(Form5);; Navigate(Payments1_1; ScreenTransition.Fade)
La transición en fade es como un aplauso elegante de tu App de control financiero por un trabajo bien hecho.
Y así, con este último paso, tu App de control financiero se convierte en la herramienta que te acompaña en todo el ciclo: desde registrar una factura, enlazar pagos, validar información y confirmar que todo quedó perfecto.
Pero esto no termina aquí. Te invitamos a visitar nuestra página web para seguir descubriendo cómo optimizar tu Aplicación de rentabilidad de proyectos de Power Apps con la mejor tecnología a tu alcance.
Además, no te pierdas los artículos anteriores de este módulo, explicamos como se construye el módulo de gestión administrativa de proyectos paso a paso con fórmulas que harán tu experiencia mucho más sencilla y eficiente.
¡Dale un vistazo, aprende y lleva tu gestión al siguiente nivel!
No te quedes solo con la teoría: convierte tu gestión en acción. Agenda una llamada y descubre cómo personalizar tu propia App de control financiero.
Deja una respuesta