Tips

10 Hooks Esenciales para Facturas en Perfex CRM

J. Negro 12 Dic 2025 12 min lectura
Volver al Blog

Personaliza el Sistema de Facturación

El sistema de facturación de Perfex CRM es uno de los más utilizados y, por tanto, uno de los que más necesita personalización. Estos 10 hooks te permitirán adaptar las facturas a las necesidades específicas de tu negocio.

💡 Tipos de Hooks

Actions: Ejecutan código en puntos específicos
Filters: Modifican datos antes de usarlos

1 before_invoice_added

before_invoice_added

ACTION

Se ejecuta justo antes de insertar una factura en la base de datos. Ideal para validaciones personalizadas.

hooks()->add_action('before_invoice_added', 'mi_validacion_factura');

function mi_validacion_factura($data)
{
    // Verificar límite de crédito del cliente
    $CI = &get_instance();
    $cliente = $CI->clients_model->get($data['clientid']);

    $total_pendiente = obtener_deuda_cliente($data['clientid']);

    if ($total_pendiente > 10000) {
        log_activity('Cliente ' . $cliente->company . ' supera límite de crédito');
        // Notificar al administrador
    }
}

2 after_invoice_added

after_invoice_added

ACTION

Se ejecuta después de crear la factura. Útil para integraciones y notificaciones.

hooks()->add_action('after_invoice_added', 'notificar_nueva_factura');

function notificar_nueva_factura($invoice_id)
{
    $CI = &get_instance();
    $factura = $CI->invoices_model->get($invoice_id);

    // Enviar a sistema contable externo
    enviar_a_contabilidad([
        'numero' => format_invoice_number($invoice_id),
        'total'  => $factura->total,
        'fecha'  => $factura->date
    ]);

    // Enviar WhatsApp al cliente
    enviar_whatsapp($factura->client->phonenumber,
        'Nueva factura generada: ' . format_invoice_number($invoice_id));
}

3 invoice_html_pdf_data

invoice_html_pdf_data

FILTER

Modifica los datos que se pasan a la plantilla PDF de la factura.

hooks()->add_filter('invoice_html_pdf_data', 'personalizar_pdf_factura');

function personalizar_pdf_factura($data)
{
    // Añadir datos personalizados al PDF
    $data['custom_footer'] = 'Gracias por su confianza';
    $data['qr_code'] = generar_qr_pago($data['invoice']);

    // Añadir descuento especial visible
    if ($data['invoice']->discount_total > 0) {
        $data['show_discount_badge'] = true;
    }

    return $data;
}

4 before_invoice_updated

before_invoice_updated

ACTION

Se ejecuta antes de actualizar una factura existente.

hooks()->add_action('before_invoice_updated', 'audit_cambios_factura');

function audit_cambios_factura($data, $invoice_id)
{
    $CI = &get_instance();
    $original = $CI->invoices_model->get($invoice_id);

    // Registrar cambios significativos
    if ($original->total != $data['total']) {
        log_activity(sprintf(
            'Factura #%s modificada: total cambió de %s a %s por %s',
            $invoice_id,
            $original->total,
            $data['total'],
            get_staff_full_name(get_staff_user_id())
        ));
    }
}

5 invoice_status_changed

invoice_status_changed

ACTION

Se ejecuta cuando cambia el estado de una factura (pagada, vencida, etc.).

hooks()->add_action('invoice_status_changed', 'manejar_cambio_estado');

function manejar_cambio_estado($invoice_id, $status, $old_status)
{
    // Status: 1=No pagada, 2=Pagada, 3=Pago parcial, 4=Vencida, 5=Cancelada

    if ($status == 2) { // Pagada
        enviar_email_agradecimiento($invoice_id);
        actualizar_puntos_fidelidad($invoice_id);
    }

    if ($status == 4) { // Vencida
        enviar_recordatorio_pago($invoice_id);
        notificar_cobranzas($invoice_id);
    }
}

6 invoice_items

invoice_items

FILTER

Modifica los items de la factura antes de mostrarlos.

hooks()->add_filter('invoice_items', 'personalizar_items');

function personalizar_items($items, $invoice)
{
    foreach ($items as &$item) {
        // Añadir código de barras al item
        $item['barcode'] = generar_barcode($item['id']);

        // Añadir datos de stock
        $item['stock_disponible'] = obtener_stock($item['id']);
    }

    return $items;
}

7 after_invoice_deleted

after_invoice_deleted

ACTION

Se ejecuta después de eliminar una factura.

hooks()->add_action('after_invoice_deleted', 'limpiar_referencias');

function limpiar_referencias($invoice_id)
{
    $CI = &get_instance();

    // Eliminar registros relacionados en tablas propias
    $CI->db->where('invoice_id', $invoice_id);
    $CI->db->delete(db_prefix() . 'mi_modulo_facturas_extra');

    // Sincronizar con sistema externo
    api_externa_eliminar_factura($invoice_id);
}

8 invoice_view_buttons

invoice_view_buttons

FILTER

Añade botones personalizados en la vista de factura.

hooks()->add_filter('invoice_view_buttons', 'agregar_boton_whatsapp');

function agregar_boton_whatsapp($buttons, $invoice)
{
    $telefono = $invoice->client->phonenumber;

    if (!empty($telefono)) {
        $mensaje = urlencode('Hola, le enviamos la factura ' .
            format_invoice_number($invoice->id));

        $buttons[] = [
            'url'   => 'https://wa.me/' . $telefono . '?text=' . $mensaje,
            'class' => 'btn btn-success',
            'icon'  => 'fa fa-whatsapp',
            'text'  => 'Enviar por WhatsApp',
            'attrs' => 'target="_blank"'
        ];
    }

    return $buttons;
}

9 invoice_recurring_recreated

invoice_recurring_recreated

ACTION

Se ejecuta cuando se crea una factura recurrente automáticamente.

hooks()->add_action('invoice_recurring_recreated', 'procesar_recurrente');

function procesar_recurrente($new_invoice_id, $original_invoice_id)
{
    $CI = &get_instance();
    $factura = $CI->invoices_model->get($new_invoice_id);

    // Aplicar descuento por fidelidad
    $meses_cliente = calcular_antiguedad_cliente($factura->clientid);

    if ($meses_cliente >= 12) {
        aplicar_descuento($new_invoice_id, 5); // 5% descuento
    }

    // Notificar al cliente
    enviar_aviso_factura_recurrente($new_invoice_id);
}

10 invoice_merge_fields

invoice_merge_fields

FILTER

Añade campos personalizados para usar en plantillas de email.

hooks()->add_filter('invoice_merge_fields', 'campos_personalizados_factura');

function campos_personalizados_factura($fields, $invoice)
{
    // Añadir enlace de pago directo
    $fields[] = [
        'name'    => 'Enlace de pago',
        'key'     => '{payment_link}',
        'value'   => generar_enlace_pago($invoice->id),
        'fromoptions' => true
    ];

    // Añadir días hasta vencimiento
    $dias = calcular_dias_vencimiento($invoice->duedate);
    $fields[] = [
        'name'  => 'Días para vencimiento',
        'key'   => '{days_to_due}',
        'value' => $dias
    ];

    return $fields;
}

Conclusión

Estos 10 hooks cubren el 90% de las personalizaciones más solicitadas en el sistema de facturación. Combínalos según tus necesidades para crear un sistema de facturación totalmente adaptado a tu negocio.

JN

J. Negro

Desarrollador especializado en Perfex CRM con más de 5 años de experiencia creando módulos empresariales. Fundador de SalesCloud.