Custom template Shareholders/Associates & Governance body/Managers

Hi

We are trying to recreate a custom template that displays the following from the Silverfin Template shareholders/associates & Governance body/Managers

Overview Directors
Name| Represented By | Type | start Mandate | end Mandate | statutory

Overview Shareholders
Shareholder | VVPR Bis | type of ownership

Our current custom template still links to the old text Bedrijfsparameters and not to the workflow Legal Documents.

in Short:
We want to recreate something like this (print screen form SHAREHOLDERS/ASSOCIATES & GOVERNANCE BODY/MANAGERS)

Can anyone help us to rebuild something similar or hive us part of the source code of the Silverfin template?

Via debug mode we can get the named results but the build up doesn’t seem clear to us.

Hey @AlexanderDB

The source code of that template is open-source, so you can find it in your Silverfin environment when you inspect the template under “Sjablonen” > “Toelichtingen” > Search for “be_legal_shareholders_and_directors”.

Although important to notice, you’ll also need to create new shared parts and link those to the reconciliation (the source code of those can also be found on the bottom when inspecting the reconciliation code):

  1. be_aa_data
  2. be_legal_doc_data
  3. be_legal_docs_navigation_bar

In case you have any deeper questions, I provide support for custom Silverfin templates with https://prioflux.com, so always open for a chat.

Kind regards
Wouter Bruynsteen

Hi Wouter,

I copied some parts of code from template ‘be_legal_shareholders_and_directors’

I don’t directly see which parts of code I can/should omit to display only the directors and shareholders present.

So I don’t want to display or eliminate the ‘Details shareholders and directors’ section

I think i’ll have to ajust the part ‘shareholders_and_directors’ but I cant seem to figure it out.

@AlexanderDB It can be a bit annoying to start with that template and delete things, because you have a lot of logic mixed up with the output in the tables, so it gets a little complicated to not delete too much or too little.

It’s a question that comes up often when creating templates, so I’ve already went through the trouble to extract the logic needed to get the most often requested information from the directors, shareholders and auditors (taking into account values that could be coming from a sync) and I use this as a starting point for my own templates.

Besides the VVPRbis, I think it already covers the values you’d want in your overview, feel free to use it if it can help you:

{% comment %}Translations{% endcomment %}
{% t= "t_represented_by" default:"with permanent representative" nl:"vertegenwoordigd door" fr:"représentée par son représentant permanent" %}
{% capture t_represented_by %} {% t "t_represented_by" %} {% endcapture %}

{% t= "t_class_a" nl:"Soort A" default:"Class A" fr:"Classe A" %}
{% t= "t_class_b" nl:"Soort B" default:"Class B" fr:"Classe B" %}
{% t= "t_class_c" nl:"Soort C" default:"Class C" fr:"Classe C" %}
{% t= "t_class_d" nl:"Soort D" default:"Class D" fr:"Classe D" %}
{% t= "t_class_e" nl:"Soort E" default:"Class E" fr:"Classe E" %}
{% t= "t_class_f" nl:"Soort F" default:"Class F" fr:"Classe F" %}
{% t= "t_class_g" nl:"Soort G" default:"Class G" fr:"Classe G" %}

{% t= "t_full_ownership" nl:"Volle eigendom" default:"Full ownership" fr:"Pleine propriété" %}
{% t= "t_bare_ownership" nl:"Blote eigendom" default:"Bare ownership" fr:"Nue-propriété" %}
{% t= "t_usufruct" nl:"Vruchtgebruik" default:"Usufruct" fr:"Usufruit" %}
{% t= "t_undivided" nl:"Onverdeeldheid" default:"Undivided" fr:"Indivision" %}

{% comment %}Create arrays used to hold the information about the people{% endcomment %}
{% assign people_values = "" | split:"|" %}
{% assign people_options = "" | split:"|" %}

{% comment %}Make sure that the variables to check the mandate dates with are always converted to the correct format to compare dates{% endcomment %}
{% assign applicable_date = applicable_date | date:"%F" %}
{% assign check_date_begin_mandate = check_date_begin_mandate | date:"%F" %}
{% assign check_date_end_mandate = check_date_end_mandate | date:"%F" %}

{% comment %}Store if there is at least one statutory director to determine if nanaging director agenda points are applicable{% endcomment %}
{% assign statutory_director = false %}

{% comment %}Variable that counts the directors{% endcomment %}
{% assign director_count = 0 %}
{% assign eligible_directors = "" | split:"|" %}
{% assign eligible_shareholders = "" | split:"|" %}
{% assign eligible_auditors = "" | split:"|" %}

{% for person in period.people %}

  {% comment %}Determine the type of the person (legal or natural){% endcomment %}
  {% assign default_type = "" %}
  {% if person.custom.represented_by_name != blank %}
    {% assign default_type = "legal" %}
  {% else %}
    {% assign default_type = "nature" %}
  {% endif %}
  {% assign type = person.custom.type | default:default_type %}
  {% assign begin_mandate = "" %}
  {% assign end_mandate = "" %}
  {% assign shares_bought = person.custom.shares_acquisition_date | date:"%F" %}
  {% assign shares_sold = person.custom.shares_date_of_sale | date:"%F" %}
  
  {% comment %}Determine if the person is a natural person and has a valid manddate{% endcomment %}
  {% assign eligible = false %}
  {% assign eligible_auditor = false %}
  {% assign eligible_shareholder = false %}
  {% assign eligible_director = false %}
  
  {% if include_chairman_or_secretary_or_scrutineer %}
    {% if person.custom.chairman_or_secretary_or_scrutineer == true %}
      {% assign eligible = true %}
    {% endif %}
  {% endif %}
  
  {% if person.custom.auditor %}
    {% assign eligible_auditor = true %}
    
    {% assign begin_mandate = person.custom.auditor_start_date | date:"%F" %}
    {% assign end_mandate = person.custom.auditor_end_date | date:"%F" %}
  {% endif %}
  
  {% if person.shareholder == true %}
    {% comment %}Show director if dates/ begin/end mandate are not blank & valid{% endcomment %}
      {% assign eligible = true %}
      {% assign eligible_shareholder = true %}
      
      {% comment %}Don't show shareholder if the shares were bought after the check of the begin mandate{% endcomment %}
      {% if shares_bought != blank and shares_bought > check_date_begin_mandate %}
        {% assign eligible = false %}
        {% assign eligible_shareholder = false %}
      {% endif %}
      
      {% comment %}Don't show shareholder if the shares were sold before the check of the end mandate{% endcomment %}
      {% if shares_sold != blank and shares_sold < check_date_end_mandate %}
        {% assign eligible = false %}
        {% assign eligible_shareholder = false %}
      {% endif %}
  {% endif %}
  
  {% if person.director == true %}
    {% assign eligible = true %}    
    {% assign eligible_director = true %}
    
    {% assign begin_mandate = person.director_start_date | date:"%F" %}
    {% assign end_mandate = person.director_end_date | date:"%F" %}
  {% endif %}   
  
  {% if person.statutory == true %}


    {% assign statutory_director = true %}
    {% assign eligible = true %}
    {% assign eligible_director = true %}
  {% else %}

    {% if applicable_date != blank %}
    
      {% comment %}Show director if dates/ begin/end mandate are not blank & valid{% endcomment %}
      {% assign eligible = true %}
      
      {% comment %}Don't show director if the mandate starts after the check of the begin mandate{% endcomment %}
      {% if begin_mandate != blank and begin_mandate > check_date_begin_mandate %}
        {% assign eligible = false %}
        {% assign eligible_director = true %}
      {% endif %}
      
      {% comment %}Don't show director if the mandate ended before the check of the end mandate{% endcomment %}
      {% if end_mandate != blank and end_mandate <  check_date_end_mandate %}
        {% assign eligible = false %}
        {% assign eligible_director = true %}
      {% endif %}
    
    {% endif %} {% comment %}endif applicable_date{% endcomment %}
    
  {% endif %} {% comment %}endif person.shareholder{% endcomment %}
  
  {% comment %}Count the directors that are eligible{% endcomment %}
  {% if eligible_director %}
    {% assign director_count = director_count | plus:1 %}
  {% endif %}
  
  {% comment %}Only add the person to the options & sign the data if he/she is eligible{% endcomment %}
  {% if eligible %}
    {% assign words = person.name | split: ' ' %}
    {% assign def_person_last_name = "" %}
    {% assign def_person_first_name = "" %}
   
    {% for word in words %}
      {% if forloop.last %} {% comment %}correct for syncs like adminis{% endcomment %}
        {% assign def_person_first_name = word %}
      {% else %}
        {% assign def_person_last_name = def_person_last_name | append:" " | append:word %}
      {% endif %}
    {% endfor %}
   
    {% assign person_first_name = person.custom.first_name | default:def_person_first_name %}
    {% assign person_last_name = person.custom.last_name | default:def_person_last_name %}
   
    {% if type == "legal" %}
      {% capture person_name %}{{ person.name }} {{ t_represented_by }} {{ person.custom.represented_by_name }}{% endcapture %}
    {% else %}
      {% capture person_name %}{{ person_first_name }} {{ person_last_name }}{% endcapture %}
    {% endif %}
    
    {% comment %}obtain gender{% endcomment %}
    {% assign person_gender = person.custom.applicable_gender %}
    
    {% comment %}Use the persistent_id, because this can be rollforwarded - the "replace" filter is used because of a bug that doesn't fetch names for synced values (core){% endcomment %}
    {% assign person_id = person.persistent_id | replace:"-", "-" %}
    
    {% comment %}Add the eligible person to the array{% endcomment %}
    {% if person_name != blank %}
      {% push person_name to:people_options %}
      {% push person_id to:people_values %}
      
      {% if eligible_director %}
        {% capture person_statutory_id %}person_statutory_{{ person_id }}{% endcapture %}
        {% assign [person_statutory_id] = person.statutory %}

        {% push person_id to:eligible_directors %}
      {% endif %}
      
      {% if eligible_shareholder %}
        {% assign amount_of_shares = person.amount_of_shares %}
        {% assign amount_of_votes = person.amount_of_votes %}
        {% assign kind_of_shares = person.custom.kind_of_shares %}
        {% assign shares_classes = person.custom.shares_classes %}
        
        {% capture person_amount_shares_id %}person_amount_shares_{{ person_id }}{% endcapture %}
        {% capture person_amount_of_votes_id %}person_amount_of_votes_{{ person_id }}{% endcapture %}
        {% capture person_kind_of_shares_id %}person_kind_of_shares_{{ person_id }}{% endcapture %}
        {% capture person_shares_classes_id %}person_shares_classes_{{ person_id }}{% endcapture %}
        
        {% assign [person_amount_of_votes_id] = amount_of_votes %}
        {% assign [person_amount_shares_id] = amount_of_shares %}
        {% assign [person_kind_of_shares_id] = kind_of_shares %}
        {% assign [person_shares_classes_id] = shares_classes %}
        
        {% assign total_shares = total_shares+amount_of_shares %}
      
        {% push person_id to:eligible_shareholders %}
      {% endif %}
      
      {% if eligible_auditor %}
        {% push person_id to:eligible_auditors %}
      {% endif %}       
    {% endif %}
    
    {% comment %}Store the person information in dynamic variables that can be used in other places{% endcomment %}
    {% capture person_name_id %}person_name_{{ person_id }}{% endcapture %}
    {% assign [person_name_id] = person_name %}
    
    {% capture person_begin_mandate_id %}person_begin_mandate_{{ person_id }}{% endcapture %}
    {% assign [person_begin_mandate_id] = begin_mandate %}
    
    {% capture person_end_mandate_id %}person_end_mandate_{{ person_id }}{% endcapture %}
    {% assign [person_end_mandate_id] = end_mandate %}
    
    {% capture person_gender_id %}person_gender_{{ person_id }}{% endcapture %}
    {% assign [person_gender_id] = person_gender %}
    
    {% comment %}active mandate for current legal doc{% endcomment %}
    {% capture person_mandate_active %}person_mandate_{{ person_id }}{% endcapture %}
    {% assign [person_mandate_active] = true %}
    
    {% comment %}Natural or legal person{% endcomment %}
    {% capture person_type %}person_type_{{ person_id }}{% endcapture %}
    {% assign [person_type] = type %}
    
  {% endif %} {% comment %}endif eligible{% endcomment %}
  
{% endfor %} {% comment %}endfor people{% endcomment %}

{% comment %}Convert the arrays to a string so that they can be used in the people dropdowns{% endcomment %}
{% assign people_options = people_options | join:"|" %}
{% assign people_values = people_values | join:"|" %}

DIRECTORS
<table class="usr-width-100 usr-bordered">
  <thead>
    <tr>
      <th>Name</th>
      <th>Begin mandate</th>
      <th>End mandate</th>
      <th>Statutory</th>
    </tr>
  </thead>
  <tbody>
    {% for person_id in eligible_directors %}
    {% capture person_name_id %}person_name_{{ person_id }}{% endcapture %}
    {% capture person_begin_mandate_id %}person_begin_mandate_{{ person_id }}{% endcapture %}
    {% capture person_end_mandate_id %}person_end_mandate_{{ person_id }}{% endcapture %}
    {% capture person_statutory_id %}person_statutory_{{ person_id }}{% endcapture %}

    <tr>
      <td>{{ [person_name_id] }}</td>
      <td>{{ [person_begin_mandate_id] | date:"%d/%m/%Y"  }}</td>
      <td>{{ [person_end_mandate_id] | date:"%d/%m/%Y"  }}</td>
      <td>{{ [person_statutory_id] }}</td>
    </tr>
    {% else %}
    <tr>
      <td colspan="4">No directors</td>
    </tr>
    {% endfor %}
  </tbody>
</table>

SHAREHOLDERS
<table class="usr-width-100 usr-bordered">
  <thead>
    <tr>
      <th>Name</th>
      <th>Amount of shares</th>
      <th>Amount of votes</th>
      <th>Kind of shares</th>
      <th>Shares classes</th>
      <th>VVPRbis</th>
    </tr>
  </thead>
  <tbody>
    {% for person_id in eligible_shareholders %}
      {% capture person_name_id %}person_name_{{ person_id }}{% endcapture %}
      {% capture person_amount_shares_id %}person_amount_shares_{{ person_id }}{% endcapture %}
      {% capture person_amount_of_votes_id %}person_amount_of_votes_{{ person_id }}{% endcapture %}
      {% capture person_kind_of_shares_id %}person_kind_of_shares_{{ person_id }}{% endcapture %}
      {% capture person_shares_classes_id %}person_shares_classes_{{ person_id }}{% endcapture %}
      
      {% capture kind_of_shares_translation_key %}t_{{ [person_kind_of_shares_id] }}{% endcapture %}
      {% capture shares_classes_translation_key %}t_{{ [person_shares_classes_id] }}{% endcapture %}

      {% capture kind_of_shares_translation %}{% t kind_of_shares_translation_key %}{% endcapture %}
      {% capture shares_classes_translation %}{% t shares_classes_translation_key %}{% endcapture %}
      
      <tr>
        <td>{{ [person_name_id] }}</td>
        <td>{{ [person_amount_shares_id] }}</td>
        <td>{{ [person_amount_of_votes_id] }}</td>
        <td>{{ kind_of_shares_translation }}</td>
        <td>{{ shares_classes_translation }}</td>
        <td>{{ [person_vvprbis] }}</td>
      </tr>
   {% else %}
    <tr>
      <td colspan="6">No shareholders</td>
    </tr>
    {% endfor %}
  </tbody>
</table>


AUDITORS

<table class="usr-width-100 usr-bordered">
  <thead>
    <tr>
      <th>Name</th>
    </tr>
  </thead>
  <tbody>
    {% for person_id in eligible_auditors %}
    {% capture person_name_id %}person_name_{{ person_id }}{% endcapture %}
    
    <tr>
      <td>{{ [person_name_id] }}</td>
    </tr>
    {% else %}
    <tr>
      <td>No auditors</td>
    </tr>
    {% endfor %}
  </tbody>
</table>

Kind regards
Wouter

Hi Wouter,

Thanks for sorting out/extracting the logic needed.
this helped me a lot!

I’ve ajusted some titles and translations.

2 things I can’t figure out:
How to get Kind_of_shares and shares_classes in the table

now the value t_ is given

It has something to do with coding underneath, I guess?

 {% for person_id in eligible_shareholders %}
      {% capture person_name_id %}person_name_{{ person_id }}{% endcapture %}
      {% capture person_amount_shares_id %}person_amount_shares_{{ person_id }}{% endcapture %}
      {% capture person_amount_of_votes_id %}person_amount_of_votes_{{ person_id }}{% endcapture %}
      {% capture person_kind_of_shares_id %}person_kind_of_shares_{{ person_id }}{% endcapture %}
      {% capture person_shares_classes_id %}person_shares_classes_{{ person_id }}{% endcapture %}
      
      {% capture kind_of_shares_translation_key %}t_{{ [person_kind_of_shares_id] }}{% endcapture %}
      {% capture shares_classes_translation_key %}t_{{ [person_shares_classes_id] }}{% endcapture %}

      {% capture kind_of_shares_translation %}{% t kind_of_shares_translation_key %}{% endcapture %}
      {% capture shares_classes_translation %}{% t shares_classes_translation_key %}{% endcapture %}

Hey @AlexanderDB

It indeed has something to do with this, probably the dropdowns for the class and kind of shares are still empty in that company, cause only the “t_” to be printed.

I think you can avoid this by adding checks for blank values:

{% for person_id in eligible_shareholders %}
  {% capture person_name_id %}person_name_{{ person_id }}{% endcapture %}
  {% capture person_amount_shares_id %}person_amount_shares_{{ person_id }}{% endcapture %}
  {% capture person_amount_of_votes_id %}person_amount_of_votes_{{ person_id }}{% endcapture %}
  {% capture person_kind_of_shares_id %}person_kind_of_shares_{{ person_id }}{% endcapture %}
  {% capture person_shares_classes_id %}person_shares_classes_{{ person_id }}{% endcapture %}
  
  {% if [person_kind_of_shares_id] != blank %}    
    {% capture kind_of_shares_translation_key %}t_{{ [person_kind_of_shares_id] }}{% endcapture %}
  {% endif %}

  {% if [person_shares_classes_id] != blank %}    
    {% capture shares_classes_translation_key %}t_{{ [person_shares_classes_id] }}{% endcapture %}
  {% endif %}

  {% capture kind_of_shares_translation %}{% t kind_of_shares_translation_key %}{% endcapture %}
  {% capture shares_classes_translation %}{% t shares_classes_translation_key %}{% endcapture %}