{# Esta no es una página web, contiene funciones para que puedan ser usadas en otras páginas. #} {# Referencia: https://jinja.palletsprojects.com/en/2.11.x/templates/#macros #} {% import "detail_view_macros.html" as dv_macros %} {# Ayuda a agregar a importar los mismos archivos en el header de los archivos .html #} {% macro headertags() -%} {# Linea en blanco intencional #} {# Anti-FOUC: apply saved theme before ANY paint #} {# Bootstrap first so our CSS can override it #} {# Our design system last — wins over Bootstrap #} {%- endmacro %} {# Ayuda a renderizar la barra superior en las páginas de la aplicación #} {% macro cabecera() %}
Cacao Accounting
{% if is_cloud_mode() %} {% set task_count = current_user_open_task_count() %} {% if task_count %} {{ task_count }} {% endif %} {% endif %}
{%- endmacro %} {# Ayuda a renderizar la barra lateral en las páginas de la aplicación #} {% macro barralateral() -%} {%- endmacro %} {% macro list_filters(show_status=False, placeholder=None) %}
{% if show_status %}
{% endif %}
{{ _('Limpiar') }}
{% endmacro %} {% macro rendizar_paginacion(consulta=None, vista=None) %}

{{ consulta.total }} items encontrados.
{% if consulta.has_prev %} Anterior {% endif %} Página {{ consulta.page }} de {{ consulta.pages }} {% if consulta.has_next %} Siguiente {% endif %}

{% endmacro %} {% macro render_status(status=None, lista_status=None) %} {%- set normalized_status = status if status is not none else 'activo' -%} {%- set status_info = lista_status[normalized_status] if lista_status and normalized_status in lista_status else None -%} {% endmacro %} {% macro module_status_badge(status_info) %} {{ status_info.label }} {% endmacro %} {% macro crear_nueva_entidad() %}

Cacao Accounting Logo
Bienvenido a Cacao Accounting

Al parecer es la primera vez que accedes al sistema.

Para utilizar el sistema debes al menos haber creado una entidad a la que realizar registros:

Crear Nueva Entidad

{% if is_cloud_mode() %}

Los siguientes vínculos pueden ser de su interés:

Manual de Usuario Sala de Chat
{% endif %}
{% endmacro %} {# ─── Docstatus Badge ──────────────────────────────────────────── #} {% macro docstatus_badge(docstatus) %} {% if docstatus == 0 %} Borrador {% elif docstatus == 1 %} Aprobado {% elif docstatus == 2 %} Cancelado {% endif %} {% endmacro %} {# ─── Calculated Document Status Badge ────────────────────────── #} {% macro document_status_badge(status_info, detail=False) %} {{ status_info.label }} {% if detail %} {{ status_info.full_label }} {% endif %} {% endmacro %} {% macro document_status_for(document_type, document, detail=False) %} {{ document_status_badge(document_status_info(document_type, document), detail=detail) }} {% endmacro %} {% macro document_collaboration_panel(document_type, document) %} {% if is_cloud_mode() %} {% set tasks = document_collaboration_tasks(document_type, document.id) %} {% set users = collaboration_active_users() %}
{{ _('Colaboracion') }}
{{ _('Tareas del documento') }}
{% if tasks %}

{{ _('Detalle de tareas vinculadas al documento, con prioridad, estado y vencimiento.') }}

{% for task in tasks %} {% endfor %}
{{ _('Tareas del documento') }}
{{ _('Titulo') }}{{ _('Prioridad') }}{{ _('Estado') }}{{ _('Vencimiento') }}
{{ task.title }}{{ task.priority }}{{ task.status }}{{ task.due_date or '-' }}
{% else %}

{{ _('No hay tareas para este documento.') }}

{% endif %}
{% endif %} {% endmacro %} {# ─────────────────────────────────────────────────────────────── #} {# Árbol de flujo documental — componente reutilizable #} {# #} {# Uso: #} {# {{ macros.document_flow_tree("sales_invoice", registro) }} #} {# #} {# El componente Alpine.js `documentFlowTree` se registra en #} {# cacao_accounting/static/js/document-flow-tree.js y se carga #} {# globalmente desde headertags(). #} {# ─────────────────────────────────────────────────────────────── #} {% macro document_flow_tree(document_type, document, docstatus=None, create_actions_json='[]') %} {%- set status_value = document.status|default('') -%} {%- set inferred_docstatus = 1 if status_value == 'submitted' else (2 if status_value == 'cancelled' else 0) -%} {%- set effective_docstatus = docstatus if docstatus is not none else (document.docstatus|default(inferred_docstatus)) -%} {%- set api_url = url_for('api.api_document_flow_tree') ~ '?document_type=' ~ document_type ~ '&document_id=' ~ document.id -%}
{{ _('Flujo documental') }}

{{ _('Trazabilidad completa de esta transacción') }}

{% endmacro %} {# ─── Workflow Buttons (Submit / Cancel) ──────────────────────── #} {% macro workflow_buttons(docstatus, submit_url, cancel_url, submit_label, cancel_label) %} {% if docstatus == 0 %}
{% elif docstatus == 1 %}
{% endif %} {% endmacro %} {% macro detail_nav_buttons(list_url, new_url) %} {{ _('Listado') }} {{ _('Nuevo') }} {% endmacro %} {# ─── Line Items Table (Alpine.js) for create forms ──────────── #} {# Params: #} {# items_disponibles: list of {code, name, uom} #} {# uoms_disponibles: list of {code, name} #} {# source_api_url: string or None — enables auto-fill modal #} {# source_label: human-readable source doc label #} {% macro lineas_items(items_disponibles, uoms_disponibles, source_api_url=None, source_label="documento origen") %}
Productos / Servicios
{% if source_api_url %} {% endif %}
Líneas del documento
Artículo Descripción Cantidad UOM Precio Unit. Monto
Sin líneas. Use "Agregar Línea"{% if source_api_url %} o "Actualizar Elementos"{% endif %}.
{% if source_api_url %} {# ── Auto-fill modal ── #} {% endif %}
{% endmacro %} {# ─── Line Items read-only table (for detail pages) ───────────── #} {% macro lineas_tabla_lectura(items, currency_code='') %} {{ dv_macros.detail_lines_table(items, currency_code=currency_code) }} {% endmacro %} {# ─── Audit Timeline (reusable across all document types) ─────── #} {% macro audit_timeline(timeline, page_size=20) %} {% set field_labels = { 'items': _('Líneas del documento'), 'memo': _('Observaciones'), 'exchange_rate': _('Tipo de cambio'), 'fiscal_year_id': _('Año fiscal'), 'fiscal_year': _('Año fiscal'), 'status': _('Estado'), 'date': _('Fecha'), 'posting_date': _('Fecha de contabilización'), 'reference': _('Referencia'), 'entity': _('Compañía'), 'company': _('Compañía'), 'currency': _('Moneda'), 'currency_id': _('Moneda'), 'document_no': _('Número de documento'), 'serie': _('Serie'), 'total_amount': _('Total'), 'grand_total': _('Total general'), 'remarks': _('Observaciones'), 'narration': _('Descripción'), 'account': _('Cuenta'), 'cost_center': _('Centro de costos'), 'third_code': _('Tercero'), 'third_type': _('Tipo de tercero'), 'payment_method': _('Método de pago'), 'bank_account': _('Cuenta bancaria'), 'warehouse': _('Almacén'), 'item_code': _('Artículo'), 'quantity': _('Cantidad'), 'rate': _('Precio unitario'), 'amount': _('Monto'), 'tax': _('Impuesto'), 'discount': _('Descuento'), 'party_id': _('Tercero'), 'party_type': _('Tipo de tercero'), 'due_date': _('Fecha de vencimiento'), 'payment_terms': _('Condiciones de pago') } %} {% set total = timeline | length %} {% set older = timeline[: total - page_size] if total > page_size else [] %} {% set recent = timeline[total - page_size :] if total > page_size else timeline %} {% set collapse_id = 'audit-older-' ~ (timeline | first).event.document_id if timeline else 'audit-older' %}
{{ _('Historial del documento') }} {% if total %}{{ total }}{% endif %}
{% if timeline %} {% set action_map = { 'created': _('creó este documento'), 'updated': _('editó este documento'), 'submitted': _('contabilizó este documento'), 'approved': _('aprobó este documento'), 'cancelled': _('anuló este documento'), 'rejected': _('rechazó este documento'), 'reversed': _('revirtió este documento'), 'reversal_draft_created': _('creó un borrador de reversión'), 'commented': _('agregó un comentario') } %} {% if older %}
    {% for row in older %} {% set event = row.event %}
  • {{ event.actor_name or event.actor_user_id or _('Sistema') }} {{ action_map.get(event.action, audit_action_label(event.action)) }} — {{ event.timestamp }}
    {% if row.changes %}
      {% for change in row.changes %}
    • {{ _('Cambió') }} {{ field_labels.get(change.field, change.field) }} {{ _('de') }} "{{ change.before }}" {{ _('a') }} "{{ change.after }}"
    • {% endfor %}
    {% endif %} {% if event.comment %} {{ _('Motivo') }}: {{ event.comment }} {% endif %}
  • {% endfor %}

{% endif %} {% else %}

{{ _('No hay eventos de auditoría registrados.') }}

{% endif %}
{% endmacro %}