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
ACTIONSe 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
ACTIONSe 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
FILTERModifica 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
ACTIONSe 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
ACTIONSe 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
FILTERModifica 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
ACTIONSe 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
FILTERAñ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
ACTIONSe 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
FILTERAñ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.