Link sorties to the entrée client they pay out against
New field_entree_liee (entity reference, node -> node) on
ligne_comptable, restricted to entrée-type nodes via a custom
EntreeClientSelection plugin -- narrows further to the same client as
the sortie being linked when one is already known, using the
referencing-entity context Drupal's selection handler API passes
through (getSelectionHandler($field, $entity)).
Quick-link UI (per the associates' explicit ask: no need to open the
full ligne_comptable form just for this):
- A chain-link icon next to the edit pencil on versement/achat/
hébergement rows (the only types that pay out against a client
invoice) opens LinkEntreeForm, a one-field AJAX modal, reusing the
same modal/close-on-save plumbing as the edit form. Filled/colored
when already linked, with the linked entrée's label on hover.
Also present (states-hidden unless one of those three types is
selected) on the full node form for whoever's already there anyway.
- Entrée rows get a reconciliation badge once at least one sortie
links back to them, clickable to drill the table down to just that
entrée and its linked sorties.
Conformity check assumes multi-compte répartition on both sides (an
entrée's répartition and each linked sortie's répartition can each
split across several comptes -- confirmed this is the real shape of
"hébergement" sorties, e.g. OVH/HETZNER renewals split across all 8
comptes, even though versement/achat lines happen to always be
single-compte in the current data). Per compte, compares the entrée's
répartition share (positive, owed) against the summed répartition of
every linked sortie (negative, paid) -- a residual near zero means
settled, positive means still owed ("reste à verser"), negative means
overpaid ("sur-versé", flagged for a closer look).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -204,7 +204,14 @@ html.gin--dark-mode #figli-home-app {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#figli-home-app .figli-edit-btn {
|
||||
#figli-home-app td.actions-col {
|
||||
display: flex;
|
||||
gap: 0.15rem;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
#figli-home-app .figli-edit-btn,
|
||||
#figli-home-app .figli-link-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
@@ -218,12 +225,45 @@ html.gin--dark-mode #figli-home-app {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#figli-home-app .figli-edit-btn:hover {
|
||||
#figli-home-app .figli-edit-btn:hover,
|
||||
#figli-home-app .figli-link-btn:hover {
|
||||
background: var(--figli-bg-alt);
|
||||
border-color: var(--figli-border);
|
||||
color: var(--figli-text);
|
||||
}
|
||||
|
||||
#figli-home-app .figli-link-btn.is-linked {
|
||||
color: #3b6fe0;
|
||||
}
|
||||
|
||||
/* Reconciliation badge on entrée rows: répartition (money owed) vs the
|
||||
combined répartition of every linked sortie (money actually paid out). */
|
||||
#figli-home-app .figli-recon-badge {
|
||||
display: inline-block;
|
||||
margin-left: 0.4rem;
|
||||
padding: 0.05rem 0.4rem;
|
||||
border-radius: 10px;
|
||||
font-size: 0.68rem;
|
||||
font-weight: 600;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
background: #1a7f371a;
|
||||
color: var(--figli-positive);
|
||||
}
|
||||
#figli-home-app .figli-recon-badge.is-reste {
|
||||
background: #d97a0a1a;
|
||||
color: #d97a0a;
|
||||
}
|
||||
#figli-home-app .figli-recon-badge.is-anomalie {
|
||||
background: #c9312b1a;
|
||||
color: var(--figli-error);
|
||||
}
|
||||
|
||||
#figli-home-app .figli-clear-drilldown {
|
||||
font-size: 0.8rem;
|
||||
padding: 0.2rem 0.6rem;
|
||||
}
|
||||
|
||||
#figli-home-app .figli-error {
|
||||
background: #fde8e8;
|
||||
border: 1px solid #f4a3a3;
|
||||
|
||||
Reference in New Issue
Block a user