Plugin Directory

Changeset 3763979


Ignore:
Timestamp:
10/25/2026 06:13:21 AM (2 hours ago)
Author:
oh6kw
Message:

Update to version 4.9.0 from GitHub

Location:
oh6kw-jasenrekisteri
Files:
14 edited
1 copied

Legend:

Unmodified
Added
Removed
  • oh6kw-jasenrekisteri/tags/4.9.0/CHANGELOG.md

    r3755968 r3763979  
    22
    33Tekijä: Jarno Jaskari (oh6kw). Versiosta 3.0 alkaen lisäosaa on kehitetty yhdessä Claude-tekoälyn (Anthropic) kanssa.
     4
     5## 4.9.0 (2026-10-25)
     6
     7### Asetussivu selkeämmäksi – vain ulkoasu muuttuu
     8- Asetukset on jaettu välilehdille: **Yhdistys**, **Jäsenet**, **Laskut**, **Sähköposti** ja **Ylläpito**. Kaikki kentät ovat edelleen samassa lomakkeessa: *Tallenna asetukset* tallentaa kaikkien välilehtien asetukset kerralla, eikä mikään asetus muutu tai katoa. Avoinna ollut välilehti muistetaan.
     9- **Yhdistys:** nimi, IBAN, BIC, Y-tunnus ja osoite.
     10- **Jäsenet:** jäsenten lisätunniste (siirretty yhdistyksen tiedoista), jäsenluokat, omat lisäkentät ja merkkipäivät.
     11- **Laskut** omissa lokeroissaan: *Kaikki laskut* (oletussaate ja maksukoodi), *Sähköpostilaskut* (malli ja PDF-liite), *Paperilaskut* (postimaksu, malli ja palautusosoite), *Maksumuistutukset* (muistutuksen teksti ja automaattinen muistutus yhdessä), *Maksuvahvistus* ja *Jäsenmaksut kirjanpitoon*.
     12- **Sähköposti:** lähettäjä, vastausosoite ja yhteystiedot viestien alalaitaan sekä `{omat_tiedot}`-kentät.
     13- **Muutosloki:** muutoslokin säilytysaika.
     14- **Varmuuskopiot ja poisto:** varmuuskopio ja siirto, automaattinen varmuuskopio sähköpostiin sekä lisäosan poistaminen.
     15- Muilta sivuilta tulevat linkit (esim. *Asetukset → Paperilaskut*, *Jäsenluokat*, *Varmuuskopio*) avaavat oikean välilehden. Jos tallennettaessa jokin kenttä on virheellinen (esim. sähköpostiosoite), sen välilehti avataan, jotta selain voi näyttää virheen. Ilman JavaScriptiä välilehtirivi on piilossa ja kaikki asetukset näkyvät allekkain kuten ennen.
     16- README:n asetussivun kuva päivitetty (Laskut-välilehti).
    417
    518## 4.8.9 (2026-10-19)
  • oh6kw-jasenrekisteri/tags/4.9.0/README.md

    r3755968 r3763979  
    9090| ![Laskun lähetys ja maksutilanne](docs/kuvat/04-lasku.png) **Lasku:** lähetys, muistutukset ja maksutilanne. Maksajan nimi ja poikkeava summa näkyvät. | ![Lasku sähköpostissa](docs/kuvat/06-lasku-sahkoposti.png) **Jäsenen saama sähköpostilasku (maksukortti):** summa ja eräpäivä, kopioitavat maksutiedot, QR-koodi ja virtuaaliviivakoodi. |
    9191| ![Uusi lasku](docs/kuvat/05-uusi-lasku.png) **Uusi lasku:** summat jäsenluokittain. Luokat, joiden jäsenmaksu on 0 €, jätetään laskutuksesta pois. | ![Maksujen tuonti](docs/kuvat/07-maksujen-tuonti.png) **Maksujen tuonti pankista:** esikatselu ennen kirjausta. |
    92 | ![Jäsenen tiedot](docs/kuvat/02-jasen.png) **Jäsenen tiedot** sekä kaikki laskut ja maksut. | ![Asetukset](docs/kuvat/08-asetukset.png) **Asetukset:** jäsenluokat ja automaattinen muistutus. |
     92| ![Jäsenen tiedot](docs/kuvat/02-jasen.png) **Jäsenen tiedot** sekä kaikki laskut ja maksut. | ![Asetukset](docs/kuvat/08-asetukset.png) **Asetukset** välilehdillä: laskujen asetukset omissa lokeroissaan. |
    9393| ![Tiedote](docs/kuvat/09-tiedote.png) **Tiedote** koko jäsenistölle tai yhdelle luokalle. | ![Laskut](docs/kuvat/03-laskut.png) **Laskut:** maksukertymä ja maksujen tuonti. |
    9494| ![Paperilaskut](docs/kuvat/13-paperilaskut.png) **Paperilaskut** laskun sivulla: tulosta, laita kuoreen ja merkitse postitetuksi. | ![Tulostettava paperilasku](docs/kuvat/14-paperilasku.png) **Tulostettava lasku** ikkunakuoreen (C5 tai DL) tilisiirtolomakkeella. Sähköpostilaskun PDF-liite on samanlainen. |
  • oh6kw-jasenrekisteri/tags/4.9.0/assets/admin.css

    r3755968 r3763979  
    254254.jasrek-mail-intro { max-width: 900px; margin: 12px 0 14px; }
    255255.jasrek-esikatselu .jasrek-preview-frame { display: block; width: 100%; max-width: 700px; height: 640px; border: 1px solid var(--jasrek-border); border-radius: 6px; background: #eef1f5; }
     256
     257/* Asetussivun välilehdet */
     258.jasrek-settabs { margin-bottom: 16px; }
     259.jasrek-tab[hidden] { display: none; }
     260.jasrek-panel h3 { font-size: 1em; margin: 18px 0 6px; }
     261.jasrek-save { margin-top: 4px; }
  • oh6kw-jasenrekisteri/tags/4.9.0/assets/admin.js

    r3755968 r3763979  
    194194    });
    195195
     196    // Asetussivun välilehdet: kaikki kentät ovat samassa lomakkeessa, joten tallennus koskee aina kaikkia.
     197    // Ilman JavaScriptiä kaikki välilehdet näkyvät allekkain.
     198    (function () {
     199        var $nav = $('.jasrek-settabs');
     200        if (!$nav.length) return;
     201        $nav.prop('hidden', false); // ilman JavaScriptiä välilehtirivi pysyy piilossa ja kaikki näkyy allekkain
     202        var KEY = 'jasrek_asetus_tab';
     203        function show(k, keepHash) {
     204            if (!$nav.find('a[data-tab="' + k + '"]').length) k = $nav.find('a').first().data('tab');
     205            $('.jasrek-tab').each(function () { $(this).prop('hidden', $(this).data('tab') !== k); });
     206            $nav.find('a').removeClass('nav-tab-active').filter('[data-tab="' + k + '"]').addClass('nav-tab-active');
     207            try { window.localStorage.setItem(KEY, k); } catch (err) { /* ei tallennusta */ }
     208            if (!keepHash && window.history && history.replaceState) history.replaceState(null, '', '#' + k);
     209        }
     210        // Avaa välilehti, jolla annettu elementti on (esim. linkki …#jasrek-paperi-asetukset)
     211        function showFor(id) {
     212            var $el = id ? $(document.getElementById(id)) : $();
     213            if (!$el.length) return false;
     214            var $tab = $el.closest('.jasrek-tab');
     215            if (!$tab.length) return false;
     216            show($tab.data('tab'), true);
     217            setTimeout(function () { $el[0].scrollIntoView({ block: 'start' }); }, 0);
     218            return true;
     219        }
     220        var hash = window.location.hash.replace('#', '');
     221        if (!showFor(hash)) {
     222            var k = hash;
     223            if (!$nav.find('a[data-tab="' + k + '"]').length) {
     224                try { k = window.localStorage.getItem(KEY) || ''; } catch (err) { k = ''; }
     225            }
     226            show(k, !hash);
     227        }
     228        $nav.on('click', 'a', function (e) { e.preventDefault(); show($(this).data('tab')); });
     229        $(window).on('hashchange', function () {
     230            var h = window.location.hash.replace('#', '');
     231            if (!showFor(h) && $nav.find('a[data-tab="' + h + '"]').length) show(h, true);
     232        });
     233        $(document).on('click', 'a[href^="#jasrek-"]', function (e) {
     234            if (showFor(this.getAttribute('href').slice(1))) e.preventDefault();
     235        });
     236        // Virheellinen kenttä piilotetulla välilehdellä: näytetään se, jotta selain voi kertoa virheestä
     237        document.addEventListener('invalid', function (e) {
     238            var tab = $(e.target).closest('.jasrek-tab');
     239            if (tab.length && tab.prop('hidden')) show(tab.data('tab'));
     240        }, true);
     241    })();
     242
    196243    // Sähköpostin esikatselu: kehys yhtä korkeaksi kuin viesti
    197244    function fitPreview(frame) {
  • oh6kw-jasenrekisteri/tags/4.9.0/includes/settings.php

    r3755968 r3763979  
    146146        <h1>Jäsenrekisterin asetukset</h1>
    147147        <?php jasrek_notice(); ?>
     148        <nav class="nav-tab-wrapper jasrek-navtabs jasrek-settabs" hidden>
     149            <a class="nav-tab" href="#yhdistys" data-tab="yhdistys">Yhdistys</a>
     150            <a class="nav-tab" href="#jasenet" data-tab="jasenet">Jäsenet</a>
     151            <a class="nav-tab" href="#laskut" data-tab="laskut">Laskut</a>
     152            <a class="nav-tab" href="#sposti" data-tab="sposti">Sähköposti</a>
     153            <a class="nav-tab" href="#loki" data-tab="loki">Muutosloki</a>
     154            <a class="nav-tab" href="#varmuus" data-tab="varmuus">Varmuuskopiot ja poisto</a>
     155        </nav>
     156        <div class="jasrek-tab" data-tab="varmuus">
     157            <?php jasrek_backup_panel(); ?>
     158        </div>
    148159        <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" class="jasrek-form">
    149160            <input type="hidden" name="action" value="jasrek_save_settings">
    150161            <?php wp_nonce_field('jasrek_save_settings'); ?>
    151162
     163
     164            <div class="jasrek-tab" data-tab="yhdistys">
    152165            <div class="jasrek-panel">
    153166                <h2>Yhdistys ja tilitiedot</h2>
    154                 <p class="description">Näkyvät laskuissa.</p>
     167                <p class="description">Näkyvät laskuissa ja tilisiirtolomakkeessa.</p>
    155168                <div class="jasrek-grid">
    156169                    <p class="jasrek-span-2"><label for="jasrek-yhdistys">Yhdistyksen nimi (laskun saaja)</label>
    … …  
    170183                   <textarea id="jasrek-osoite" name="osoite" rows="2" style="max-width:420px" placeholder="esim. Kerhotie 1&#10;60100 Seinäjoki"><?php echo esc_textarea($s['osoite']); ?></textarea>
    171184                   <span class="description">Yhdistyksen virallinen osoite. Näkyy tilisiirtolomakkeen Saaja-kentässä ja tietosuojaselosteen rekisterinpitäjän tiedoissa. Kuoren palautusosoitteen voi antaa erikseen kohdassa <em>Paperilaskut</em>.</span></p>
    172                 <fieldset class="jasrek-fieldset" id="jasrek-lisatunniste"><legend>Jäsenten lisätunniste</legend>
    173                     <span class="description">Vapaaehtoinen lisäkenttä jäsenille, esim. jäsennumero, tunnus tai kutsutunnus. Näkyy jäsenlistassa, jäsenen lomakkeella ja laskussa. Nimen voi vaihtaa vapaasti.</span>
     185            </div>
     186            </div>
     187            <div class="jasrek-tab" data-tab="jasenet">
     188            <div class="jasrek-panel" id="jasrek-lisatunniste">
     189                <h2>Jäsenten lisätunniste</h2>
     190                <span class="description">Vapaaehtoinen lisäkenttä jäsenille, esim. jäsennumero, tunnus tai kutsutunnus. Näkyy jäsenlistassa, jäsenen lomakkeella ja laskussa. Nimen voi vaihtaa vapaasti.</span>
    174191                    <label class="jasrek-radio"><input type="checkbox" name="tunnus_kaytossa" value="1" <?php checked($s['tunnus_kaytossa'], '1'); ?>> Lisätunniste käytössä</label>
    175192                    <div class="jasrek-grid">
    … …  
    178195                        <p><label class="jasrek-radio" style="margin-top:28px"><input type="checkbox" name="tunnus_isot" value="1" <?php checked($s['tunnus_isot'], '1'); ?>> Muunna isoiksi kirjaimiksi (esim. kutsutunnukset)</label></p>
    179196                    </div>
    180                 </fieldset>
    181                 <p><label for="jasrek-maksukoodi">Maksukoodi laskussa</label>
    182                    <select id="jasrek-maksukoodi" name="maksukoodi">
    183                        <option value="molemmat" <?php selected($s['maksukoodi'], 'molemmat'); ?>>QR-koodi ja pankkiviivakoodi</option>
    184                        <option value="qr" <?php selected($s['maksukoodi'], 'qr'); ?>>Vain QR-koodi</option>
    185                        <option value="viivakoodi" <?php selected($s['maksukoodi'], 'viivakoodi'); ?>>Vain pankkiviivakoodi</option>
    186                        <option value="ei" <?php selected($s['maksukoodi'], 'ei'); ?>>Ei kuvaa (vain virtuaaliviivakoodi tekstinä)</option>
    187                    </select>
    188                    <span class="description">QR-koodi on EPC-standardin mukainen (viite RF-muodossa, jonka pankit kohdistavat samaan viitteeseen). Pankkiviivakoodi on perinteinen suomalainen laskun viivakoodi. Virtuaaliviivakoodi tekstinä on laskussa aina.</span></p>
    189                 <fieldset class="jasrek-fieldset"><legend>Sähköpostilaskun malli</legend>
    190                     <label class="jasrek-radio"><input type="radio" name="sposti_malli" value="perus" <?php checked($s['sposti_malli'], 'perus'); ?>> <strong>Perusmalli</strong> – maksutiedot taulukkona sekä QR-koodi ja pankkiviivakoodi kuvina (kohdan <em>Maksukoodi laskussa</em> mukaan).</label>
    191                     <label class="jasrek-radio"><input type="radio" name="sposti_malli" value="maksukortti" <?php checked($s['sposti_malli'], 'maksukortti'); ?>> <strong>Maksukortti</strong> (suositus) – summa ja eräpäivä isolla, maksun tiedot allekkain helposti kopioitavina, virtuaaliviivakoodi ja QR-koodi (jos valittu kohdassa <em>Maksukoodi laskussa</em>). Toimii hyvin puhelimessa ja tietokoneella. Pankkiviivakoodia ei näytetä, koska sitä ei voi lukea näytöltä – tulostettava lasku viivakoodeineen tulee PDF-liitteenä, jos se on valittu alla.</label>
    192                     <label class="jasrek-radio"><input type="checkbox" name="sposti_pdf" value="1" <?php checked($s['sposti_pdf'], '1'); ?>> <strong>Liitä lasku PDF:nä</strong> – viestin liitteenä sama lasku kuin paperilaskussa: A4-sivu tilisiirtolomakkeineen, QR-koodi ja pankkiviivakoodi kohdan <em>Maksukoodi laskussa</em> mukaan. Jäsen voi tulostaa ja arkistoida laskun. Liite kasvattaa viestiä noin 5–10 kt. Koskee myös muistutuksia ja testilaskuja.</label>
    193                 </fieldset>
    194                 <p><label for="jasrek-yhteystiedot">Yhteystiedot viestien alalaitaan</label>
    195                    <textarea id="jasrek-yhteystiedot" name="yhteystiedot" rows="3" placeholder="Esim. Yhdistys ry · rahastonhoitaja@example.fi · www.example.fi"><?php echo esc_textarea($s['yhteystiedot']); ?></textarea></p>
    196197            </div>
    197198
    … …  
    223224                <p><button type="button" class="button" id="jasrek-laji-add">+ Lisää jäsenluokka</button></p>
    224225                <p class="description">Jos poistat luokan, sen jäsenet siirtyvät välilehdelle ”Ilman jäsenluokkaa”, josta heille voi valita uuden luokan joukkona. Luokan voi nimetä uudelleen – jäsenet pysyvät siinä.</p>
    225             </div>
    226 
    227             <div class="jasrek-panel" id="jasrek-paperi-asetukset">
    228                 <h2>Paperilaskut</h2>
    229                 <p class="description">Paperilaskun saavat jäsenet, joille on valittu ”Haluaa laskun paperilla”, sekä jäsenet ilman sähköpostia.</p>
    230                 <p><label for="jasrek-postimaksu">Postimaksu (€)</label>
    231                    <input type="text" id="jasrek-postimaksu" name="postimaksu" inputmode="decimal" style="max-width:140px" value="<?php echo esc_attr(number_format((float) $s['postimaksu'], 2, ',', '')); ?>" placeholder="0,00">
    232                    <span class="description">Lisätään jäsenmaksuun vain paperilaskun saajille, esim. postimerkin ja kirjekuoren hinta. 0 = ei postimaksua. Summaa voi muuttaa laskua tehdessä.
    233                    Postimaksu näkyy laskussa omana rivinään, ja se on mukana QR- ja viivakoodin summassa. Sähköpostilaskuihin sitä ei lisätä.
    234                    Saatetekstissä <code>{summa}</code> on jäsenmaksu ilman postimaksua ja <code>{maksettava}</code> maksettava yhteensä.</span></p>
    235                 <fieldset class="jasrek-fieldset"><legend>Laskun malli</legend>
    236                     <label class="jasrek-radio"><input type="radio" name="paperi_malli" value="perus" <?php checked($s['paperi_malli'], 'perus'); ?>> <strong>Perusmalli</strong> – maksutiedot, QR-koodi ja pankkiviivakoodi saatteen alla.</label>
    237                     <label class="jasrek-radio"><input type="radio" name="paperi_malli" value="tilisiirto" <?php checked($s['paperi_malli'], 'tilisiirto'); ?>> <strong>Tilisiirtolomake</strong> – perinteinen suomalainen pankkisiirtolomake sivun alareunassa, QR-koodi sen yläpuolella. Saateteksti mahtuu noin puolelle sivulle.</label>
    238                     <span class="description">Kummassakin mallissa jäsenen nimi ja osoite osuvat ikkunakuoren (C5 tai DL) ikkunaan. QR-koodi ja pankkiviivakoodi tulostuvat kohdan <em>Maksukoodi</em> mukaan.</span>
    239                 </fieldset>
    240                 <p><label for="jasrek-postiosoite">Palautusosoite (kuoren ikkuna)</label>
    241                    <textarea id="jasrek-postiosoite" name="postiosoite" rows="2" style="max-width:420px" placeholder="esim. Rahastonhoitaja Matti Meikäläinen&#10;Kotikatu 5, 60100 Seinäjoki"><?php echo esc_textarea($s['postiosoite']); ?></textarea>
    242                    <span class="description">Tulostetaan pienellä ikkunakuoren ikkunaan vastaanottajan yläpuolelle, jotta kirje palautuu, jos sitä ei voida toimittaa. Voi olla eri kuin yhdistyksen osoite, esim. rahastonhoitajan osoite, jos yhdistyksellä ei ole postilaatikkoa. Yhdistyksen nimi lisätään eteen automaattisesti.
    243                    Mahtuu enintään kaksi riviä (noin 110 merkkiä yhdistyksen nimi mukaan lukien); pidempi teksti pienennetään tai siitä varoitetaan tulostettaessa. Tyhjänä palautusosoitetta ei tulosteta.</span></p>
    244226            </div>
    245227
    … …  
    276258            </div>
    277259
     260            <div class="jasrek-panel" id="jasrek-merkkipaivat">
     261                <h2>Merkkipäivät</h2>
     262                <p class="description">Vuosiraportti ja jäsenlista kertovat, ketkä täyttävät valittuja tasavuosia tai ovat olleet jäsenenä valitut vuodet. Täytettävät vuodet lasketaan jäsenen tiedoissa olevasta <em>syntymävuodesta tai -päivästä</em>. Kenttä on vapaaehtoinen, ja se näkyy jäsenen lomakkeella vain, kun merkkipäivät ovat käytössä. Jos jäsenestä on merkitty vain syntymävuosi, merkkipäivä näkyy vuosiraportissa ilman päivää. Jäsenyysvuodet lasketaan liittymispäivästä. Tyhjä kenttä = sitä merkkipäivää ei näytetä.</p>
     263                <p><label class="jasrek-radio"><input type="checkbox" name="merkki_kaytossa" value="1" <?php checked($s['merkki_kaytossa'], '1'); ?>> Merkkipäivät käytössä</label>
     264                   <span class="description">Pois päältä merkkipäiviä ei näytetä jäsenlistassa, vuosiraportissa eikä Excel-viennissä, eikä jäsenen lomakkeella kysytä syntymävuotta. Asetetut vuodet ja tallennetut syntymävuodet säilyvät.</span></p>
     265                <div class="jasrek-grid">
     266                    <p><label for="jasrek-merkki-ika">Täytettävät vuodet</label>
     267                       <input type="text" id="jasrek-merkki-ika" name="merkki_ika" value="<?php echo esc_attr($s['merkki_ika']); ?>" placeholder="50, 60, 70, 80, 90"></p>
     268                    <p><label for="jasrek-merkki-jasen">Jäsenyysvuodet</label>
     269                       <input type="text" id="jasrek-merkki-jasen" name="merkki_jasen" value="<?php echo esc_attr($s['merkki_jasen']); ?>" placeholder="10, 20, 25, 30, 40, 50"></p>
     270                </div>
     271            </div>
     272            </div>
     273            <div class="jasrek-tab" data-tab="laskut">
     274            <div class="jasrek-panel" id="jasrek-laskut-yleiset">
     275                <h2>Kaikki laskut</h2>
     276                <p class="description">Koskevat sekä sähköposti- että paperilaskuja.</p>
     277                <p><label for="jasrek-vo">Laskun saateteksti (oletus uusille laskuille)</label>
     278                   <textarea id="jasrek-vo" name="viesti_oletus" rows="7"><?php echo esc_textarea($s['viesti_oletus']); ?></textarea>
     279                   <?php echo wp_kses_post(jasrek_placeholders('jasrek-vo', 'lasku')); ?></p>
     280                <p><label for="jasrek-maksukoodi">Maksukoodi laskussa</label>
     281                   <select id="jasrek-maksukoodi" name="maksukoodi">
     282                       <option value="molemmat" <?php selected($s['maksukoodi'], 'molemmat'); ?>>QR-koodi ja pankkiviivakoodi</option>
     283                       <option value="qr" <?php selected($s['maksukoodi'], 'qr'); ?>>Vain QR-koodi</option>
     284                       <option value="viivakoodi" <?php selected($s['maksukoodi'], 'viivakoodi'); ?>>Vain pankkiviivakoodi</option>
     285                       <option value="ei" <?php selected($s['maksukoodi'], 'ei'); ?>>Ei kuvaa (vain virtuaaliviivakoodi tekstinä)</option>
     286                   </select>
     287                   <span class="description">QR-koodi on EPC-standardin mukainen (viite RF-muodossa, jonka pankit kohdistavat samaan viitteeseen). Pankkiviivakoodi on perinteinen suomalainen laskun viivakoodi. Virtuaaliviivakoodi tekstinä on laskussa aina.</span></p>
     288            </div>
     289
     290            <div class="jasrek-panel" id="jasrek-sposti-laskut">
     291                <h2>Sähköpostilaskut</h2>
     292                <fieldset class="jasrek-fieldset"><legend>Laskun malli</legend>
     293                    <label class="jasrek-radio"><input type="radio" name="sposti_malli" value="perus" <?php checked($s['sposti_malli'], 'perus'); ?>> <strong>Perusmalli</strong> – maksutiedot taulukkona sekä QR-koodi ja pankkiviivakoodi kuvina (kohdan <em>Maksukoodi laskussa</em> mukaan).</label>
     294                    <label class="jasrek-radio"><input type="radio" name="sposti_malli" value="maksukortti" <?php checked($s['sposti_malli'], 'maksukortti'); ?>> <strong>Maksukortti</strong> (suositus) – summa ja eräpäivä isolla, maksun tiedot allekkain helposti kopioitavina, virtuaaliviivakoodi ja QR-koodi (jos valittu kohdassa <em>Maksukoodi laskussa</em>). Toimii hyvin puhelimessa ja tietokoneella. Pankkiviivakoodia ei näytetä, koska sitä ei voi lukea näytöltä – tulostettava lasku viivakoodeineen tulee PDF-liitteenä, jos se on valittu alla.</label>
     295                    <label class="jasrek-radio"><input type="checkbox" name="sposti_pdf" value="1" <?php checked($s['sposti_pdf'], '1'); ?>> <strong>Liitä lasku PDF:nä</strong> – viestin liitteenä sama lasku kuin paperilaskussa: A4-sivu tilisiirtolomakkeineen, QR-koodi ja pankkiviivakoodi kohdan <em>Maksukoodi laskussa</em> mukaan. Jäsen voi tulostaa ja arkistoida laskun. Liite kasvattaa viestiä noin 5–10 kt. Koskee myös muistutuksia ja testilaskuja.</label>
     296                </fieldset>
     297            </div>
     298
     299            <div class="jasrek-panel" id="jasrek-paperi-asetukset">
     300                <h2>Paperilaskut</h2>
     301                <p class="description">Paperilaskun saavat jäsenet, joille on valittu ”Haluaa laskun paperilla”, sekä jäsenet ilman sähköpostia.</p>
     302                <p><label for="jasrek-postimaksu">Postimaksu (€)</label>
     303                   <input type="text" id="jasrek-postimaksu" name="postimaksu" inputmode="decimal" style="max-width:140px" value="<?php echo esc_attr(number_format((float) $s['postimaksu'], 2, ',', '')); ?>" placeholder="0,00">
     304                   <span class="description">Lisätään jäsenmaksuun vain paperilaskun saajille, esim. postimerkin ja kirjekuoren hinta. 0 = ei postimaksua. Summaa voi muuttaa laskua tehdessä.
     305                   Postimaksu näkyy laskussa omana rivinään, ja se on mukana QR- ja viivakoodin summassa. Sähköpostilaskuihin sitä ei lisätä.
     306                   Saatetekstissä <code>{summa}</code> on jäsenmaksu ilman postimaksua ja <code>{maksettava}</code> maksettava yhteensä.</span></p>
     307                <fieldset class="jasrek-fieldset"><legend>Laskun malli</legend>
     308                    <label class="jasrek-radio"><input type="radio" name="paperi_malli" value="perus" <?php checked($s['paperi_malli'], 'perus'); ?>> <strong>Perusmalli</strong> – maksutiedot, QR-koodi ja pankkiviivakoodi saatteen alla.</label>
     309                    <label class="jasrek-radio"><input type="radio" name="paperi_malli" value="tilisiirto" <?php checked($s['paperi_malli'], 'tilisiirto'); ?>> <strong>Tilisiirtolomake</strong> – perinteinen suomalainen pankkisiirtolomake sivun alareunassa, QR-koodi sen yläpuolella. Saateteksti mahtuu noin puolelle sivulle.</label>
     310                    <span class="description">Kummassakin mallissa jäsenen nimi ja osoite osuvat ikkunakuoren (C5 tai DL) ikkunaan. QR-koodi ja pankkiviivakoodi tulostuvat kohdan <em>Maksukoodi</em> mukaan.</span>
     311                </fieldset>
     312                <p><label for="jasrek-postiosoite">Palautusosoite (kuoren ikkuna)</label>
     313                   <textarea id="jasrek-postiosoite" name="postiosoite" rows="2" style="max-width:420px" placeholder="esim. Rahastonhoitaja Matti Meikäläinen&#10;Kotikatu 5, 60100 Seinäjoki"><?php echo esc_textarea($s['postiosoite']); ?></textarea>
     314                   <span class="description">Tulostetaan pienellä ikkunakuoren ikkunaan vastaanottajan yläpuolelle, jotta kirje palautuu, jos sitä ei voida toimittaa. Voi olla eri kuin yhdistyksen osoite, esim. rahastonhoitajan osoite, jos yhdistyksellä ei ole postilaatikkoa. Yhdistyksen nimi lisätään eteen automaattisesti.
     315                   Mahtuu enintään kaksi riviä (noin 110 merkkiä yhdistyksen nimi mukaan lukien); pidempi teksti pienennetään tai siitä varoitetaan tulostettaessa. Tyhjänä palautusosoitetta ei tulosteta.</span></p>
     316            </div>
     317
     318            <div class="jasrek-panel" id="jasrek-muistutukset">
     319                <h2>Maksumuistutukset</h2>
     320                <p><label for="jasrek-mt">Maksumuistutuksen teksti</label>
     321                   <textarea id="jasrek-mt" name="muistutus_teksti" rows="6"><?php echo esc_textarea($s['muistutus_teksti']); ?></textarea>
     322                   <?php echo wp_kses_post(jasrek_placeholders('jasrek-mt', 'lasku')); ?></p>
     323                <h3>Automaattinen maksumuistutus</h3>
     324                <p><label class="jasrek-radio"><input type="checkbox" name="auto_muistutus" value="1" <?php checked($s['auto_muistutus'], '1'); ?>> Lähetä maksamattomille muistutus automaattisesti</label></p>
     325                <div class="jasrek-grid">
     326                    <p><label for="jasrek-apaiv">Päivää eräpäivän jälkeen</label>
     327                       <input type="number" id="jasrek-apaiv" name="auto_paivia" min="1" max="365" value="<?php echo esc_attr($s['auto_paivia']); ?>"></p>
     328                    <p><label for="jasrek-amax">Muistutuksia enintään</label>
     329                       <input type="number" id="jasrek-amax" name="auto_max" min="1" max="10" value="<?php echo esc_attr($s['auto_max']); ?>">
     330                       <span class="description">Seuraava muistutus lähtee aina saman päivämäärän kuluttua edellisestä.</span></p>
     331                </div>
     332                <p><label class="jasrek-radio"><input type="checkbox" name="auto_raportti" value="1" <?php checked($s['auto_raportti'], '1'); ?>> Lähetä yhteenveto lähetetyistä muistutuksista osoitteeseen <?php echo esc_html($raportti_to); ?></label></p>
     333                <p class="description">Muistutuksen saavat vain jäsenet, joille lasku on jo lähetetty ja joilla on sähköpostiosoite. Automaattisen muistutuksen voi kytkeä pois myös yksittäiseltä laskulta. WordPress tarkistaa tilanteen kerran tunnissa, kun sivustolla on kävijöitä.
     334                <?php if ($s['auto_muistutus'] === '1' && $next): ?><br>Seuraava tarkistus: <?php echo esc_html(wp_date('j.n.Y H:i', $next)); ?><?php endif; ?></p>
     335            </div>
     336
     337            <div class="jasrek-panel" id="jasrek-vahvistus">
     338                <h2>Maksuvahvistus jäsenelle</h2>
     339                <p><label class="jasrek-radio"><input type="checkbox" name="vahvistus_kaytossa" value="1" <?php checked($s['vahvistus_kaytossa'], '1'); ?>> Lähetä jäsenelle sähköpostilla vahvistus, kun hänen maksunsa kirjataan</label></p>
     340                <p class="description">Kun maksuja kirjataan pankkitiedostosta tai joukkotoiminnolla, kirjauksen yhteydessä on ruksi <em>Lähetä maksuvahvistus</em> (valmiiksi valittuna), jonka voi poistaa esim. vanhoja maksuja kirjattaessa. Laskun sivulla maksetun rivin kohdalla on lisäksi painike <em>Lähetä vahvistus</em>. Vahvistukset lähtevät taustalla pienissä erissä. Vain jäsenille, joilla on sähköpostiosoite.</p>
     341                <p><label for="jasrek-vot">Otsikko</label>
     342                   <input type="text" id="jasrek-vot" name="vahvistus_otsikko" value="<?php echo esc_attr($s['vahvistus_otsikko']); ?>"></p>
     343                <p><label for="jasrek-vte">Viesti</label>
     344                   <textarea id="jasrek-vte" name="vahvistus_teksti" rows="6"><?php echo esc_textarea($s['vahvistus_teksti']); ?></textarea>
     345                   <?php echo wp_kses_post(jasrek_placeholders('jasrek-vte', 'vahvistus', '{summa} on maksettu summa.')); ?></p>
     346            </div>
     347
    278348            <div class="jasrek-panel" id="jasrek-kirjanpito">
    279349                <h2>Jäsenmaksut kirjanpitoon</h2>
    … …  
    289359                </div>
    290360            </div>
    291 
    292             <div class="jasrek-panel" id="jasrek-merkkipaivat">
    293                 <h2>Merkkipäivät</h2>
    294                 <p class="description">Vuosiraportti ja jäsenlista kertovat, ketkä täyttävät valittuja tasavuosia tai ovat olleet jäsenenä valitut vuodet. Täytettävät vuodet lasketaan jäsenen tiedoissa olevasta <em>syntymävuodesta tai -päivästä</em>. Kenttä on vapaaehtoinen, ja se näkyy jäsenen lomakkeella vain, kun merkkipäivät ovat käytössä. Jos jäsenestä on merkitty vain syntymävuosi, merkkipäivä näkyy vuosiraportissa ilman päivää. Jäsenyysvuodet lasketaan liittymispäivästä. Tyhjä kenttä = sitä merkkipäivää ei näytetä.</p>
    295                 <p><label class="jasrek-radio"><input type="checkbox" name="merkki_kaytossa" value="1" <?php checked($s['merkki_kaytossa'], '1'); ?>> Merkkipäivät käytössä</label>
    296                    <span class="description">Pois päältä merkkipäiviä ei näytetä jäsenlistassa, vuosiraportissa eikä Excel-viennissä, eikä jäsenen lomakkeella kysytä syntymävuotta. Asetetut vuodet ja tallennetut syntymävuodet säilyvät.</span></p>
    297                 <div class="jasrek-grid">
    298                     <p><label for="jasrek-merkki-ika">Täytettävät vuodet</label>
    299                        <input type="text" id="jasrek-merkki-ika" name="merkki_ika" value="<?php echo esc_attr($s['merkki_ika']); ?>" placeholder="50, 60, 70, 80, 90"></p>
    300                     <p><label for="jasrek-merkki-jasen">Jäsenyysvuodet</label>
    301                        <input type="text" id="jasrek-merkki-jasen" name="merkki_jasen" value="<?php echo esc_attr($s['merkki_jasen']); ?>" placeholder="10, 20, 25, 30, 40, 50"></p>
    302                 </div>
    303             </div>
    304 
    305             <div class="jasrek-panel">
    306                 <h2>Automaattinen maksumuistutus</h2>
    307                 <p><label class="jasrek-radio"><input type="checkbox" name="auto_muistutus" value="1" <?php checked($s['auto_muistutus'], '1'); ?>> Lähetä maksamattomille muistutus automaattisesti</label></p>
    308                 <div class="jasrek-grid">
    309                     <p><label for="jasrek-apaiv">Päivää eräpäivän jälkeen</label>
    310                        <input type="number" id="jasrek-apaiv" name="auto_paivia" min="1" max="365" value="<?php echo esc_attr($s['auto_paivia']); ?>"></p>
    311                     <p><label for="jasrek-amax">Muistutuksia enintään</label>
    312                        <input type="number" id="jasrek-amax" name="auto_max" min="1" max="10" value="<?php echo esc_attr($s['auto_max']); ?>">
    313                        <span class="description">Seuraava muistutus lähtee aina saman päivämäärän kuluttua edellisestä.</span></p>
    314                 </div>
    315                 <p><label class="jasrek-radio"><input type="checkbox" name="auto_raportti" value="1" <?php checked($s['auto_raportti'], '1'); ?>> Lähetä yhteenveto lähetetyistä muistutuksista osoitteeseen <?php echo esc_html($raportti_to); ?></label></p>
    316                 <p class="description">Muistutuksen saavat vain jäsenet, joille lasku on jo lähetetty ja joilla on sähköpostiosoite. Automaattisen muistutuksen voi kytkeä pois myös yksittäiseltä laskulta. WordPress tarkistaa tilanteen kerran tunnissa, kun sivustolla on kävijöitä.
    317                 <?php if ($s['auto_muistutus'] === '1' && $next): ?><br>Seuraava tarkistus: <?php echo esc_html(wp_date('j.n.Y H:i', $next)); ?><?php endif; ?></p>
    318             </div>
    319 
    320             <div class="jasrek-panel" id="jasrek-omat-tiedot">
    321                 <h2>Jäsenen omat tiedot viesteissä <code>{omat_tiedot}</code></h2>
    322                 <p class="description">Valitse, mitkä tiedot paikkamerkki <code>{omat_tiedot}</code> näyttää jäsenelle tietojentarkistuspyynnössä ja laskun saatteessa. Puuttuva osoite, puhelin tai sähköposti korostetaan. Jos kaikki on valittu, myöhemmin lisättävät omat kentät tulevat mukaan automaattisesti.</p>
    323                 <p class="jasrek-checks"><?php $ot_val = jasrek_omat_tiedot_valitut(); foreach (jasrek_omat_tiedot_valinnat() as $k => $nimi): ?>
    324                     <label class="jasrek-radio"><input type="checkbox" name="ot_kentat[]" value="<?php echo esc_attr($k); ?>" <?php checked(in_array($k, $ot_val, true)); ?>> <?php echo esc_html($nimi); ?></label>
    325                 <?php endforeach; ?></p>
    326             </div>
    327 
    328             <div class="jasrek-panel" id="jasrek-vahvistus">
    329                 <h2>Maksuvahvistus jäsenelle</h2>
    330                 <p><label class="jasrek-radio"><input type="checkbox" name="vahvistus_kaytossa" value="1" <?php checked($s['vahvistus_kaytossa'], '1'); ?>> Lähetä jäsenelle sähköpostilla vahvistus, kun hänen maksunsa kirjataan</label></p>
    331                 <p class="description">Kun maksuja kirjataan pankkitiedostosta tai joukkotoiminnolla, kirjauksen yhteydessä on ruksi <em>Lähetä maksuvahvistus</em> (valmiiksi valittuna), jonka voi poistaa esim. vanhoja maksuja kirjattaessa. Laskun sivulla maksetun rivin kohdalla on lisäksi painike <em>Lähetä vahvistus</em>. Vahvistukset lähtevät taustalla pienissä erissä. Vain jäsenille, joilla on sähköpostiosoite.</p>
    332                 <p><label for="jasrek-vot">Otsikko</label>
    333                    <input type="text" id="jasrek-vot" name="vahvistus_otsikko" value="<?php echo esc_attr($s['vahvistus_otsikko']); ?>"></p>
    334                 <p><label for="jasrek-vte">Viesti</label>
    335                    <textarea id="jasrek-vte" name="vahvistus_teksti" rows="6"><?php echo esc_textarea($s['vahvistus_teksti']); ?></textarea>
    336                    <?php echo wp_kses_post(jasrek_placeholders('jasrek-vte', 'vahvistus', '{summa} on maksettu summa.')); ?></p>
    337             </div>
    338 
     361            </div>
     362            <div class="jasrek-tab" data-tab="sposti">
    339363            <div class="jasrek-panel">
    340364                <h2>Sähköpostin lähettäjä</h2>
    … …  
    351375                <?php endif; ?>
    352376                <p class="description">Suositus: asenna SMTP-lisäosa (esim. WP Mail SMTP tai FluentSMTP), jolloin viestit lähtevät yhdistyksen oikean sähköpostitilin kautta eivätkä päädy roskapostiin. Kokeile asetukset lähettämällä testilasku itsellesi.</p>
    353             </div>
    354 
    355             <div class="jasrek-panel">
    356                 <h2>Oletustekstit</h2>
    357                 <p><label for="jasrek-vo">Laskun saateteksti (oletus uusille laskuille)</label>
    358                    <textarea id="jasrek-vo" name="viesti_oletus" rows="7"><?php echo esc_textarea($s['viesti_oletus']); ?></textarea>
    359                    <?php echo wp_kses_post(jasrek_placeholders('jasrek-vo', 'lasku')); ?></p>
    360                 <p><label for="jasrek-mt">Maksumuistutuksen teksti</label>
    361                    <textarea id="jasrek-mt" name="muistutus_teksti" rows="6"><?php echo esc_textarea($s['muistutus_teksti']); ?></textarea>
    362                    <?php echo wp_kses_post(jasrek_placeholders('jasrek-mt', 'lasku')); ?></p>
    363             </div>
    364 
     377                <p><label for="jasrek-yhteystiedot">Yhteystiedot viestien alalaitaan</label>
     378                   <textarea id="jasrek-yhteystiedot" name="yhteystiedot" rows="3" placeholder="Esim. Yhdistys ry · rahastonhoitaja@example.fi · www.example.fi"><?php echo esc_textarea($s['yhteystiedot']); ?></textarea></p>
     379            </div>
     380
     381            <div class="jasrek-panel" id="jasrek-omat-tiedot">
     382                <h2>Jäsenen omat tiedot viesteissä <code>{omat_tiedot}</code></h2>
     383                <p class="description">Valitse, mitkä tiedot paikkamerkki <code>{omat_tiedot}</code> näyttää jäsenelle tietojentarkistuspyynnössä ja laskun saatteessa. Puuttuva osoite, puhelin tai sähköposti korostetaan. Jos kaikki on valittu, myöhemmin lisättävät omat kentät tulevat mukaan automaattisesti.</p>
     384                <p class="jasrek-checks"><?php $ot_val = jasrek_omat_tiedot_valitut(); foreach (jasrek_omat_tiedot_valinnat() as $k => $nimi): ?>
     385                    <label class="jasrek-radio"><input type="checkbox" name="ot_kentat[]" value="<?php echo esc_attr($k); ?>" <?php checked(in_array($k, $ot_val, true)); ?>> <?php echo esc_html($nimi); ?></label>
     386                <?php endforeach; ?></p>
     387            </div>
     388            </div>
     389            <div class="jasrek-tab" data-tab="loki">
    365390            <div class="jasrek-panel" id="jasrek-loki">
    366391                <h2>Muutosloki</h2>
    … …  
    374399                   <span class="description">Loki sisältää henkilötietoja (esim. vanhoja osoitteita), joten sitä ei kannata säilyttää tarpeettoman pitkään. Vanhemmat merkinnät poistetaan automaattisesti.</span></p>
    375400            </div>
    376 
     401            </div>
     402
     403            <div class="jasrek-tab" data-tab="varmuus">
    377404            <?php jasrek_autobackup_panel($s); ?>
    378405
    … …  
    382409                <label class="jasrek-radio"><input type="radio" name="poista_tiedot" value="0" <?php checked($s['poista_tiedot'], '0'); ?>> <strong>Säilytä tiedot</strong> – jäsenet, laskut, maksut ja asetukset jäävät tietokantaan, ja lisäosan voi asentaa myöhemmin uudelleen.</label>
    383410                <label class="jasrek-radio"><input type="radio" name="poista_tiedot" value="1" <?php checked($s['poista_tiedot'], '1'); ?> data-confirm="Haluatko varmasti, että kaikki jäsenrekisterin tiedot poistetaan pysyvästi, kun lisäosa poistetaan? Tätä ei voi perua."> <strong>Poista kaikki tiedot</strong> – kaikki lisäosan luomat taulut ja asetukset poistetaan pysyvästi.</label>
    384                 <p class="description">Ota ennen poistamista <a href="#jasrek-varmuuskopio">varmuuskopio</a> (alla), jolla kaikki tiedot voi palauttaa myöhemmin. Valinta kysytään myös, kun lisäosa poistetaan käytöstä.</p>
    385             </div>
    386 
    387             <p><button type="submit" class="button button-primary button-large">Tallenna asetukset</button></p>
     411                <p class="description">Ota ennen poistamista <a href="#jasrek-varmuuskopio">varmuuskopio</a> (ylempänä), jolla kaikki tiedot voi palauttaa myöhemmin. Valinta kysytään myös, kun lisäosa poistetaan käytöstä.</p>
     412            </div>
     413            </div>
     414
     415            <p class="jasrek-save"><button type="submit" class="button button-primary button-large">Tallenna asetukset</button>
     416               <span class="description">Tallentaa kaikkien välilehtien asetukset.</span></p>
    388417        </form>
    389         <?php jasrek_backup_panel(); ?>
    390418    </div>
    391419    <?php
  • oh6kw-jasenrekisteri/tags/4.9.0/oh6kw-jasenrekisteri.php

    r3755968 r3763979  
    44Plugin URI: https://github.com/oh6kw/oh6kw-jasenrekisteri
    55Description: Yhdistyksen jäsenrekisteri: jäsenet, jäsenluokat ja omat lisäkentät, jäsenmaksulaskut omilla viitenumeroilla sähköpostilla tai paperilla, QR-koodi ja pankkiviivakoodi, maksujen tuonti pankista, muistutukset, tiedotteet, vuosiraportti ja muutosloki.
    6 Version: 4.8.9
     6Version: 4.9.0
    77Author: Jarno Jaskari (oh6kw)
    88Author URI: https://github.com/oh6kw
    … …  
    2828}
    2929
    30 define('JASREK_VERSION', '4.8.9');
     30define('JASREK_VERSION', '4.9.0');
    3131define('JASREK_DB_VERSION', '10');
    3232define('JASREK_FILE', __FILE__);
  • oh6kw-jasenrekisteri/tags/4.9.0/readme.txt

    r3755968 r3763979  
    66Tested up to: 7.1
    77Requires PHP: 7.4
    8 Stable tag: 4.8.9
     8Stable tag: 4.9.0
    99License: AGPLv3 or later
    1010License URI: https://www.gnu.org/licenses/agpl-3.0.html
    … …  
    146146== Changelog ==
    147147
     148= 4.9.0 =
     149* The settings page is now divided into tabs: Association, Members, Invoices, Email, Audit log, and Backups and removal. Invoice settings are grouped into boxes for all invoices, email invoices, paper invoices, reminders, payment confirmation and bookkeeping accounts. Only the layout changed – every setting is kept and still saved with one button.
     150
    148151= 4.8.9 =
    149152* New (optional): payment confirmation email to the member when a payment is imported from the bank file or marked as paid on the invoice page; a single confirmation can also be sent from the invoice row. Off by default; subject and text are editable in the settings. Sent in the background in small batches, only to members with an email address.
  • oh6kw-jasenrekisteri/trunk/CHANGELOG.md

    r3755968 r3763979  
    22
    33Tekijä: Jarno Jaskari (oh6kw). Versiosta 3.0 alkaen lisäosaa on kehitetty yhdessä Claude-tekoälyn (Anthropic) kanssa.
     4
     5## 4.9.0 (2026-10-25)
     6
     7### Asetussivu selkeämmäksi – vain ulkoasu muuttuu
     8- Asetukset on jaettu välilehdille: **Yhdistys**, **Jäsenet**, **Laskut**, **Sähköposti** ja **Ylläpito**. Kaikki kentät ovat edelleen samassa lomakkeessa: *Tallenna asetukset* tallentaa kaikkien välilehtien asetukset kerralla, eikä mikään asetus muutu tai katoa. Avoinna ollut välilehti muistetaan.
     9- **Yhdistys:** nimi, IBAN, BIC, Y-tunnus ja osoite.
     10- **Jäsenet:** jäsenten lisätunniste (siirretty yhdistyksen tiedoista), jäsenluokat, omat lisäkentät ja merkkipäivät.
     11- **Laskut** omissa lokeroissaan: *Kaikki laskut* (oletussaate ja maksukoodi), *Sähköpostilaskut* (malli ja PDF-liite), *Paperilaskut* (postimaksu, malli ja palautusosoite), *Maksumuistutukset* (muistutuksen teksti ja automaattinen muistutus yhdessä), *Maksuvahvistus* ja *Jäsenmaksut kirjanpitoon*.
     12- **Sähköposti:** lähettäjä, vastausosoite ja yhteystiedot viestien alalaitaan sekä `{omat_tiedot}`-kentät.
     13- **Muutosloki:** muutoslokin säilytysaika.
     14- **Varmuuskopiot ja poisto:** varmuuskopio ja siirto, automaattinen varmuuskopio sähköpostiin sekä lisäosan poistaminen.
     15- Muilta sivuilta tulevat linkit (esim. *Asetukset → Paperilaskut*, *Jäsenluokat*, *Varmuuskopio*) avaavat oikean välilehden. Jos tallennettaessa jokin kenttä on virheellinen (esim. sähköpostiosoite), sen välilehti avataan, jotta selain voi näyttää virheen. Ilman JavaScriptiä välilehtirivi on piilossa ja kaikki asetukset näkyvät allekkain kuten ennen.
     16- README:n asetussivun kuva päivitetty (Laskut-välilehti).
    417
    518## 4.8.9 (2026-10-19)
  • oh6kw-jasenrekisteri/trunk/README.md

    r3755968 r3763979  
    9090| ![Laskun lähetys ja maksutilanne](docs/kuvat/04-lasku.png) **Lasku:** lähetys, muistutukset ja maksutilanne. Maksajan nimi ja poikkeava summa näkyvät. | ![Lasku sähköpostissa](docs/kuvat/06-lasku-sahkoposti.png) **Jäsenen saama sähköpostilasku (maksukortti):** summa ja eräpäivä, kopioitavat maksutiedot, QR-koodi ja virtuaaliviivakoodi. |
    9191| ![Uusi lasku](docs/kuvat/05-uusi-lasku.png) **Uusi lasku:** summat jäsenluokittain. Luokat, joiden jäsenmaksu on 0 €, jätetään laskutuksesta pois. | ![Maksujen tuonti](docs/kuvat/07-maksujen-tuonti.png) **Maksujen tuonti pankista:** esikatselu ennen kirjausta. |
    92 | ![Jäsenen tiedot](docs/kuvat/02-jasen.png) **Jäsenen tiedot** sekä kaikki laskut ja maksut. | ![Asetukset](docs/kuvat/08-asetukset.png) **Asetukset:** jäsenluokat ja automaattinen muistutus. |
     92| ![Jäsenen tiedot](docs/kuvat/02-jasen.png) **Jäsenen tiedot** sekä kaikki laskut ja maksut. | ![Asetukset](docs/kuvat/08-asetukset.png) **Asetukset** välilehdillä: laskujen asetukset omissa lokeroissaan. |
    9393| ![Tiedote](docs/kuvat/09-tiedote.png) **Tiedote** koko jäsenistölle tai yhdelle luokalle. | ![Laskut](docs/kuvat/03-laskut.png) **Laskut:** maksukertymä ja maksujen tuonti. |
    9494| ![Paperilaskut](docs/kuvat/13-paperilaskut.png) **Paperilaskut** laskun sivulla: tulosta, laita kuoreen ja merkitse postitetuksi. | ![Tulostettava paperilasku](docs/kuvat/14-paperilasku.png) **Tulostettava lasku** ikkunakuoreen (C5 tai DL) tilisiirtolomakkeella. Sähköpostilaskun PDF-liite on samanlainen. |
  • oh6kw-jasenrekisteri/trunk/assets/admin.css

    r3755968 r3763979  
    254254.jasrek-mail-intro { max-width: 900px; margin: 12px 0 14px; }
    255255.jasrek-esikatselu .jasrek-preview-frame { display: block; width: 100%; max-width: 700px; height: 640px; border: 1px solid var(--jasrek-border); border-radius: 6px; background: #eef1f5; }
     256
     257/* Asetussivun välilehdet */
     258.jasrek-settabs { margin-bottom: 16px; }
     259.jasrek-tab[hidden] { display: none; }
     260.jasrek-panel h3 { font-size: 1em; margin: 18px 0 6px; }
     261.jasrek-save { margin-top: 4px; }
  • oh6kw-jasenrekisteri/trunk/assets/admin.js

    r3755968 r3763979  
    194194    });
    195195
     196    // Asetussivun välilehdet: kaikki kentät ovat samassa lomakkeessa, joten tallennus koskee aina kaikkia.
     197    // Ilman JavaScriptiä kaikki välilehdet näkyvät allekkain.
     198    (function () {
     199        var $nav = $('.jasrek-settabs');
     200        if (!$nav.length) return;
     201        $nav.prop('hidden', false); // ilman JavaScriptiä välilehtirivi pysyy piilossa ja kaikki näkyy allekkain
     202        var KEY = 'jasrek_asetus_tab';
     203        function show(k, keepHash) {
     204            if (!$nav.find('a[data-tab="' + k + '"]').length) k = $nav.find('a').first().data('tab');
     205            $('.jasrek-tab').each(function () { $(this).prop('hidden', $(this).data('tab') !== k); });
     206            $nav.find('a').removeClass('nav-tab-active').filter('[data-tab="' + k + '"]').addClass('nav-tab-active');
     207            try { window.localStorage.setItem(KEY, k); } catch (err) { /* ei tallennusta */ }
     208            if (!keepHash && window.history && history.replaceState) history.replaceState(null, '', '#' + k);
     209        }
     210        // Avaa välilehti, jolla annettu elementti on (esim. linkki …#jasrek-paperi-asetukset)
     211        function showFor(id) {
     212            var $el = id ? $(document.getElementById(id)) : $();
     213            if (!$el.length) return false;
     214            var $tab = $el.closest('.jasrek-tab');
     215            if (!$tab.length) return false;
     216            show($tab.data('tab'), true);
     217            setTimeout(function () { $el[0].scrollIntoView({ block: 'start' }); }, 0);
     218            return true;
     219        }
     220        var hash = window.location.hash.replace('#', '');
     221        if (!showFor(hash)) {
     222            var k = hash;
     223            if (!$nav.find('a[data-tab="' + k + '"]').length) {
     224                try { k = window.localStorage.getItem(KEY) || ''; } catch (err) { k = ''; }
     225            }
     226            show(k, !hash);
     227        }
     228        $nav.on('click', 'a', function (e) { e.preventDefault(); show($(this).data('tab')); });
     229        $(window).on('hashchange', function () {
     230            var h = window.location.hash.replace('#', '');
     231            if (!showFor(h) && $nav.find('a[data-tab="' + h + '"]').length) show(h, true);
     232        });
     233        $(document).on('click', 'a[href^="#jasrek-"]', function (e) {
     234            if (showFor(this.getAttribute('href').slice(1))) e.preventDefault();
     235        });
     236        // Virheellinen kenttä piilotetulla välilehdellä: näytetään se, jotta selain voi kertoa virheestä
     237        document.addEventListener('invalid', function (e) {
     238            var tab = $(e.target).closest('.jasrek-tab');
     239            if (tab.length && tab.prop('hidden')) show(tab.data('tab'));
     240        }, true);
     241    })();
     242
    196243    // Sähköpostin esikatselu: kehys yhtä korkeaksi kuin viesti
    197244    function fitPreview(frame) {
  • oh6kw-jasenrekisteri/trunk/includes/settings.php

    r3755968 r3763979  
    146146        <h1>Jäsenrekisterin asetukset</h1>
    147147        <?php jasrek_notice(); ?>
     148        <nav class="nav-tab-wrapper jasrek-navtabs jasrek-settabs" hidden>
     149            <a class="nav-tab" href="#yhdistys" data-tab="yhdistys">Yhdistys</a>
     150            <a class="nav-tab" href="#jasenet" data-tab="jasenet">Jäsenet</a>
     151            <a class="nav-tab" href="#laskut" data-tab="laskut">Laskut</a>
     152            <a class="nav-tab" href="#sposti" data-tab="sposti">Sähköposti</a>
     153            <a class="nav-tab" href="#loki" data-tab="loki">Muutosloki</a>
     154            <a class="nav-tab" href="#varmuus" data-tab="varmuus">Varmuuskopiot ja poisto</a>
     155        </nav>
     156        <div class="jasrek-tab" data-tab="varmuus">
     157            <?php jasrek_backup_panel(); ?>
     158        </div>
    148159        <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" class="jasrek-form">
    149160            <input type="hidden" name="action" value="jasrek_save_settings">
    150161            <?php wp_nonce_field('jasrek_save_settings'); ?>
    151162
     163
     164            <div class="jasrek-tab" data-tab="yhdistys">
    152165            <div class="jasrek-panel">
    153166                <h2>Yhdistys ja tilitiedot</h2>
    154                 <p class="description">Näkyvät laskuissa.</p>
     167                <p class="description">Näkyvät laskuissa ja tilisiirtolomakkeessa.</p>
    155168                <div class="jasrek-grid">
    156169                    <p class="jasrek-span-2"><label for="jasrek-yhdistys">Yhdistyksen nimi (laskun saaja)</label>
    … …  
    170183                   <textarea id="jasrek-osoite" name="osoite" rows="2" style="max-width:420px" placeholder="esim. Kerhotie 1&#10;60100 Seinäjoki"><?php echo esc_textarea($s['osoite']); ?></textarea>
    171184                   <span class="description">Yhdistyksen virallinen osoite. Näkyy tilisiirtolomakkeen Saaja-kentässä ja tietosuojaselosteen rekisterinpitäjän tiedoissa. Kuoren palautusosoitteen voi antaa erikseen kohdassa <em>Paperilaskut</em>.</span></p>
    172                 <fieldset class="jasrek-fieldset" id="jasrek-lisatunniste"><legend>Jäsenten lisätunniste</legend>
    173                     <span class="description">Vapaaehtoinen lisäkenttä jäsenille, esim. jäsennumero, tunnus tai kutsutunnus. Näkyy jäsenlistassa, jäsenen lomakkeella ja laskussa. Nimen voi vaihtaa vapaasti.</span>
     185            </div>
     186            </div>
     187            <div class="jasrek-tab" data-tab="jasenet">
     188            <div class="jasrek-panel" id="jasrek-lisatunniste">
     189                <h2>Jäsenten lisätunniste</h2>
     190                <span class="description">Vapaaehtoinen lisäkenttä jäsenille, esim. jäsennumero, tunnus tai kutsutunnus. Näkyy jäsenlistassa, jäsenen lomakkeella ja laskussa. Nimen voi vaihtaa vapaasti.</span>
    174191                    <label class="jasrek-radio"><input type="checkbox" name="tunnus_kaytossa" value="1" <?php checked($s['tunnus_kaytossa'], '1'); ?>> Lisätunniste käytössä</label>
    175192                    <div class="jasrek-grid">
    … …  
    178195                        <p><label class="jasrek-radio" style="margin-top:28px"><input type="checkbox" name="tunnus_isot" value="1" <?php checked($s['tunnus_isot'], '1'); ?>> Muunna isoiksi kirjaimiksi (esim. kutsutunnukset)</label></p>
    179196                    </div>
    180                 </fieldset>
    181                 <p><label for="jasrek-maksukoodi">Maksukoodi laskussa</label>
    182                    <select id="jasrek-maksukoodi" name="maksukoodi">
    183                        <option value="molemmat" <?php selected($s['maksukoodi'], 'molemmat'); ?>>QR-koodi ja pankkiviivakoodi</option>
    184                        <option value="qr" <?php selected($s['maksukoodi'], 'qr'); ?>>Vain QR-koodi</option>
    185                        <option value="viivakoodi" <?php selected($s['maksukoodi'], 'viivakoodi'); ?>>Vain pankkiviivakoodi</option>
    186                        <option value="ei" <?php selected($s['maksukoodi'], 'ei'); ?>>Ei kuvaa (vain virtuaaliviivakoodi tekstinä)</option>
    187                    </select>
    188                    <span class="description">QR-koodi on EPC-standardin mukainen (viite RF-muodossa, jonka pankit kohdistavat samaan viitteeseen). Pankkiviivakoodi on perinteinen suomalainen laskun viivakoodi. Virtuaaliviivakoodi tekstinä on laskussa aina.</span></p>
    189                 <fieldset class="jasrek-fieldset"><legend>Sähköpostilaskun malli</legend>
    190                     <label class="jasrek-radio"><input type="radio" name="sposti_malli" value="perus" <?php checked($s['sposti_malli'], 'perus'); ?>> <strong>Perusmalli</strong> – maksutiedot taulukkona sekä QR-koodi ja pankkiviivakoodi kuvina (kohdan <em>Maksukoodi laskussa</em> mukaan).</label>
    191                     <label class="jasrek-radio"><input type="radio" name="sposti_malli" value="maksukortti" <?php checked($s['sposti_malli'], 'maksukortti'); ?>> <strong>Maksukortti</strong> (suositus) – summa ja eräpäivä isolla, maksun tiedot allekkain helposti kopioitavina, virtuaaliviivakoodi ja QR-koodi (jos valittu kohdassa <em>Maksukoodi laskussa</em>). Toimii hyvin puhelimessa ja tietokoneella. Pankkiviivakoodia ei näytetä, koska sitä ei voi lukea näytöltä – tulostettava lasku viivakoodeineen tulee PDF-liitteenä, jos se on valittu alla.</label>
    192                     <label class="jasrek-radio"><input type="checkbox" name="sposti_pdf" value="1" <?php checked($s['sposti_pdf'], '1'); ?>> <strong>Liitä lasku PDF:nä</strong> – viestin liitteenä sama lasku kuin paperilaskussa: A4-sivu tilisiirtolomakkeineen, QR-koodi ja pankkiviivakoodi kohdan <em>Maksukoodi laskussa</em> mukaan. Jäsen voi tulostaa ja arkistoida laskun. Liite kasvattaa viestiä noin 5–10 kt. Koskee myös muistutuksia ja testilaskuja.</label>
    193                 </fieldset>
    194                 <p><label for="jasrek-yhteystiedot">Yhteystiedot viestien alalaitaan</label>
    195                    <textarea id="jasrek-yhteystiedot" name="yhteystiedot" rows="3" placeholder="Esim. Yhdistys ry · rahastonhoitaja@example.fi · www.example.fi"><?php echo esc_textarea($s['yhteystiedot']); ?></textarea></p>
    196197            </div>
    197198
    … …  
    223224                <p><button type="button" class="button" id="jasrek-laji-add">+ Lisää jäsenluokka</button></p>
    224225                <p class="description">Jos poistat luokan, sen jäsenet siirtyvät välilehdelle ”Ilman jäsenluokkaa”, josta heille voi valita uuden luokan joukkona. Luokan voi nimetä uudelleen – jäsenet pysyvät siinä.</p>
    225             </div>
    226 
    227             <div class="jasrek-panel" id="jasrek-paperi-asetukset">
    228                 <h2>Paperilaskut</h2>
    229                 <p class="description">Paperilaskun saavat jäsenet, joille on valittu ”Haluaa laskun paperilla”, sekä jäsenet ilman sähköpostia.</p>
    230                 <p><label for="jasrek-postimaksu">Postimaksu (€)</label>
    231                    <input type="text" id="jasrek-postimaksu" name="postimaksu" inputmode="decimal" style="max-width:140px" value="<?php echo esc_attr(number_format((float) $s['postimaksu'], 2, ',', '')); ?>" placeholder="0,00">
    232                    <span class="description">Lisätään jäsenmaksuun vain paperilaskun saajille, esim. postimerkin ja kirjekuoren hinta. 0 = ei postimaksua. Summaa voi muuttaa laskua tehdessä.
    233                    Postimaksu näkyy laskussa omana rivinään, ja se on mukana QR- ja viivakoodin summassa. Sähköpostilaskuihin sitä ei lisätä.
    234                    Saatetekstissä <code>{summa}</code> on jäsenmaksu ilman postimaksua ja <code>{maksettava}</code> maksettava yhteensä.</span></p>
    235                 <fieldset class="jasrek-fieldset"><legend>Laskun malli</legend>
    236                     <label class="jasrek-radio"><input type="radio" name="paperi_malli" value="perus" <?php checked($s['paperi_malli'], 'perus'); ?>> <strong>Perusmalli</strong> – maksutiedot, QR-koodi ja pankkiviivakoodi saatteen alla.</label>
    237                     <label class="jasrek-radio"><input type="radio" name="paperi_malli" value="tilisiirto" <?php checked($s['paperi_malli'], 'tilisiirto'); ?>> <strong>Tilisiirtolomake</strong> – perinteinen suomalainen pankkisiirtolomake sivun alareunassa, QR-koodi sen yläpuolella. Saateteksti mahtuu noin puolelle sivulle.</label>
    238                     <span class="description">Kummassakin mallissa jäsenen nimi ja osoite osuvat ikkunakuoren (C5 tai DL) ikkunaan. QR-koodi ja pankkiviivakoodi tulostuvat kohdan <em>Maksukoodi</em> mukaan.</span>
    239                 </fieldset>
    240                 <p><label for="jasrek-postiosoite">Palautusosoite (kuoren ikkuna)</label>
    241                    <textarea id="jasrek-postiosoite" name="postiosoite" rows="2" style="max-width:420px" placeholder="esim. Rahastonhoitaja Matti Meikäläinen&#10;Kotikatu 5, 60100 Seinäjoki"><?php echo esc_textarea($s['postiosoite']); ?></textarea>
    242                    <span class="description">Tulostetaan pienellä ikkunakuoren ikkunaan vastaanottajan yläpuolelle, jotta kirje palautuu, jos sitä ei voida toimittaa. Voi olla eri kuin yhdistyksen osoite, esim. rahastonhoitajan osoite, jos yhdistyksellä ei ole postilaatikkoa. Yhdistyksen nimi lisätään eteen automaattisesti.
    243                    Mahtuu enintään kaksi riviä (noin 110 merkkiä yhdistyksen nimi mukaan lukien); pidempi teksti pienennetään tai siitä varoitetaan tulostettaessa. Tyhjänä palautusosoitetta ei tulosteta.</span></p>
    244226            </div>
    245227
    … …  
    276258            </div>
    277259
     260            <div class="jasrek-panel" id="jasrek-merkkipaivat">
     261                <h2>Merkkipäivät</h2>
     262                <p class="description">Vuosiraportti ja jäsenlista kertovat, ketkä täyttävät valittuja tasavuosia tai ovat olleet jäsenenä valitut vuodet. Täytettävät vuodet lasketaan jäsenen tiedoissa olevasta <em>syntymävuodesta tai -päivästä</em>. Kenttä on vapaaehtoinen, ja se näkyy jäsenen lomakkeella vain, kun merkkipäivät ovat käytössä. Jos jäsenestä on merkitty vain syntymävuosi, merkkipäivä näkyy vuosiraportissa ilman päivää. Jäsenyysvuodet lasketaan liittymispäivästä. Tyhjä kenttä = sitä merkkipäivää ei näytetä.</p>
     263                <p><label class="jasrek-radio"><input type="checkbox" name="merkki_kaytossa" value="1" <?php checked($s['merkki_kaytossa'], '1'); ?>> Merkkipäivät käytössä</label>
     264                   <span class="description">Pois päältä merkkipäiviä ei näytetä jäsenlistassa, vuosiraportissa eikä Excel-viennissä, eikä jäsenen lomakkeella kysytä syntymävuotta. Asetetut vuodet ja tallennetut syntymävuodet säilyvät.</span></p>
     265                <div class="jasrek-grid">
     266                    <p><label for="jasrek-merkki-ika">Täytettävät vuodet</label>
     267                       <input type="text" id="jasrek-merkki-ika" name="merkki_ika" value="<?php echo esc_attr($s['merkki_ika']); ?>" placeholder="50, 60, 70, 80, 90"></p>
     268                    <p><label for="jasrek-merkki-jasen">Jäsenyysvuodet</label>
     269                       <input type="text" id="jasrek-merkki-jasen" name="merkki_jasen" value="<?php echo esc_attr($s['merkki_jasen']); ?>" placeholder="10, 20, 25, 30, 40, 50"></p>
     270                </div>
     271            </div>
     272            </div>
     273            <div class="jasrek-tab" data-tab="laskut">
     274            <div class="jasrek-panel" id="jasrek-laskut-yleiset">
     275                <h2>Kaikki laskut</h2>
     276                <p class="description">Koskevat sekä sähköposti- että paperilaskuja.</p>
     277                <p><label for="jasrek-vo">Laskun saateteksti (oletus uusille laskuille)</label>
     278                   <textarea id="jasrek-vo" name="viesti_oletus" rows="7"><?php echo esc_textarea($s['viesti_oletus']); ?></textarea>
     279                   <?php echo wp_kses_post(jasrek_placeholders('jasrek-vo', 'lasku')); ?></p>
     280                <p><label for="jasrek-maksukoodi">Maksukoodi laskussa</label>
     281                   <select id="jasrek-maksukoodi" name="maksukoodi">
     282                       <option value="molemmat" <?php selected($s['maksukoodi'], 'molemmat'); ?>>QR-koodi ja pankkiviivakoodi</option>
     283                       <option value="qr" <?php selected($s['maksukoodi'], 'qr'); ?>>Vain QR-koodi</option>
     284                       <option value="viivakoodi" <?php selected($s['maksukoodi'], 'viivakoodi'); ?>>Vain pankkiviivakoodi</option>
     285                       <option value="ei" <?php selected($s['maksukoodi'], 'ei'); ?>>Ei kuvaa (vain virtuaaliviivakoodi tekstinä)</option>
     286                   </select>
     287                   <span class="description">QR-koodi on EPC-standardin mukainen (viite RF-muodossa, jonka pankit kohdistavat samaan viitteeseen). Pankkiviivakoodi on perinteinen suomalainen laskun viivakoodi. Virtuaaliviivakoodi tekstinä on laskussa aina.</span></p>
     288            </div>
     289
     290            <div class="jasrek-panel" id="jasrek-sposti-laskut">
     291                <h2>Sähköpostilaskut</h2>
     292                <fieldset class="jasrek-fieldset"><legend>Laskun malli</legend>
     293                    <label class="jasrek-radio"><input type="radio" name="sposti_malli" value="perus" <?php checked($s['sposti_malli'], 'perus'); ?>> <strong>Perusmalli</strong> – maksutiedot taulukkona sekä QR-koodi ja pankkiviivakoodi kuvina (kohdan <em>Maksukoodi laskussa</em> mukaan).</label>
     294                    <label class="jasrek-radio"><input type="radio" name="sposti_malli" value="maksukortti" <?php checked($s['sposti_malli'], 'maksukortti'); ?>> <strong>Maksukortti</strong> (suositus) – summa ja eräpäivä isolla, maksun tiedot allekkain helposti kopioitavina, virtuaaliviivakoodi ja QR-koodi (jos valittu kohdassa <em>Maksukoodi laskussa</em>). Toimii hyvin puhelimessa ja tietokoneella. Pankkiviivakoodia ei näytetä, koska sitä ei voi lukea näytöltä – tulostettava lasku viivakoodeineen tulee PDF-liitteenä, jos se on valittu alla.</label>
     295                    <label class="jasrek-radio"><input type="checkbox" name="sposti_pdf" value="1" <?php checked($s['sposti_pdf'], '1'); ?>> <strong>Liitä lasku PDF:nä</strong> – viestin liitteenä sama lasku kuin paperilaskussa: A4-sivu tilisiirtolomakkeineen, QR-koodi ja pankkiviivakoodi kohdan <em>Maksukoodi laskussa</em> mukaan. Jäsen voi tulostaa ja arkistoida laskun. Liite kasvattaa viestiä noin 5–10 kt. Koskee myös muistutuksia ja testilaskuja.</label>
     296                </fieldset>
     297            </div>
     298
     299            <div class="jasrek-panel" id="jasrek-paperi-asetukset">
     300                <h2>Paperilaskut</h2>
     301                <p class="description">Paperilaskun saavat jäsenet, joille on valittu ”Haluaa laskun paperilla”, sekä jäsenet ilman sähköpostia.</p>
     302                <p><label for="jasrek-postimaksu">Postimaksu (€)</label>
     303                   <input type="text" id="jasrek-postimaksu" name="postimaksu" inputmode="decimal" style="max-width:140px" value="<?php echo esc_attr(number_format((float) $s['postimaksu'], 2, ',', '')); ?>" placeholder="0,00">
     304                   <span class="description">Lisätään jäsenmaksuun vain paperilaskun saajille, esim. postimerkin ja kirjekuoren hinta. 0 = ei postimaksua. Summaa voi muuttaa laskua tehdessä.
     305                   Postimaksu näkyy laskussa omana rivinään, ja se on mukana QR- ja viivakoodin summassa. Sähköpostilaskuihin sitä ei lisätä.
     306                   Saatetekstissä <code>{summa}</code> on jäsenmaksu ilman postimaksua ja <code>{maksettava}</code> maksettava yhteensä.</span></p>
     307                <fieldset class="jasrek-fieldset"><legend>Laskun malli</legend>
     308                    <label class="jasrek-radio"><input type="radio" name="paperi_malli" value="perus" <?php checked($s['paperi_malli'], 'perus'); ?>> <strong>Perusmalli</strong> – maksutiedot, QR-koodi ja pankkiviivakoodi saatteen alla.</label>
     309                    <label class="jasrek-radio"><input type="radio" name="paperi_malli" value="tilisiirto" <?php checked($s['paperi_malli'], 'tilisiirto'); ?>> <strong>Tilisiirtolomake</strong> – perinteinen suomalainen pankkisiirtolomake sivun alareunassa, QR-koodi sen yläpuolella. Saateteksti mahtuu noin puolelle sivulle.</label>
     310                    <span class="description">Kummassakin mallissa jäsenen nimi ja osoite osuvat ikkunakuoren (C5 tai DL) ikkunaan. QR-koodi ja pankkiviivakoodi tulostuvat kohdan <em>Maksukoodi</em> mukaan.</span>
     311                </fieldset>
     312                <p><label for="jasrek-postiosoite">Palautusosoite (kuoren ikkuna)</label>
     313                   <textarea id="jasrek-postiosoite" name="postiosoite" rows="2" style="max-width:420px" placeholder="esim. Rahastonhoitaja Matti Meikäläinen&#10;Kotikatu 5, 60100 Seinäjoki"><?php echo esc_textarea($s['postiosoite']); ?></textarea>
     314                   <span class="description">Tulostetaan pienellä ikkunakuoren ikkunaan vastaanottajan yläpuolelle, jotta kirje palautuu, jos sitä ei voida toimittaa. Voi olla eri kuin yhdistyksen osoite, esim. rahastonhoitajan osoite, jos yhdistyksellä ei ole postilaatikkoa. Yhdistyksen nimi lisätään eteen automaattisesti.
     315                   Mahtuu enintään kaksi riviä (noin 110 merkkiä yhdistyksen nimi mukaan lukien); pidempi teksti pienennetään tai siitä varoitetaan tulostettaessa. Tyhjänä palautusosoitetta ei tulosteta.</span></p>
     316            </div>
     317
     318            <div class="jasrek-panel" id="jasrek-muistutukset">
     319                <h2>Maksumuistutukset</h2>
     320                <p><label for="jasrek-mt">Maksumuistutuksen teksti</label>
     321                   <textarea id="jasrek-mt" name="muistutus_teksti" rows="6"><?php echo esc_textarea($s['muistutus_teksti']); ?></textarea>
     322                   <?php echo wp_kses_post(jasrek_placeholders('jasrek-mt', 'lasku')); ?></p>
     323                <h3>Automaattinen maksumuistutus</h3>
     324                <p><label class="jasrek-radio"><input type="checkbox" name="auto_muistutus" value="1" <?php checked($s['auto_muistutus'], '1'); ?>> Lähetä maksamattomille muistutus automaattisesti</label></p>
     325                <div class="jasrek-grid">
     326                    <p><label for="jasrek-apaiv">Päivää eräpäivän jälkeen</label>
     327                       <input type="number" id="jasrek-apaiv" name="auto_paivia" min="1" max="365" value="<?php echo esc_attr($s['auto_paivia']); ?>"></p>
     328                    <p><label for="jasrek-amax">Muistutuksia enintään</label>
     329                       <input type="number" id="jasrek-amax" name="auto_max" min="1" max="10" value="<?php echo esc_attr($s['auto_max']); ?>">
     330                       <span class="description">Seuraava muistutus lähtee aina saman päivämäärän kuluttua edellisestä.</span></p>
     331                </div>
     332                <p><label class="jasrek-radio"><input type="checkbox" name="auto_raportti" value="1" <?php checked($s['auto_raportti'], '1'); ?>> Lähetä yhteenveto lähetetyistä muistutuksista osoitteeseen <?php echo esc_html($raportti_to); ?></label></p>
     333                <p class="description">Muistutuksen saavat vain jäsenet, joille lasku on jo lähetetty ja joilla on sähköpostiosoite. Automaattisen muistutuksen voi kytkeä pois myös yksittäiseltä laskulta. WordPress tarkistaa tilanteen kerran tunnissa, kun sivustolla on kävijöitä.
     334                <?php if ($s['auto_muistutus'] === '1' && $next): ?><br>Seuraava tarkistus: <?php echo esc_html(wp_date('j.n.Y H:i', $next)); ?><?php endif; ?></p>
     335            </div>
     336
     337            <div class="jasrek-panel" id="jasrek-vahvistus">
     338                <h2>Maksuvahvistus jäsenelle</h2>
     339                <p><label class="jasrek-radio"><input type="checkbox" name="vahvistus_kaytossa" value="1" <?php checked($s['vahvistus_kaytossa'], '1'); ?>> Lähetä jäsenelle sähköpostilla vahvistus, kun hänen maksunsa kirjataan</label></p>
     340                <p class="description">Kun maksuja kirjataan pankkitiedostosta tai joukkotoiminnolla, kirjauksen yhteydessä on ruksi <em>Lähetä maksuvahvistus</em> (valmiiksi valittuna), jonka voi poistaa esim. vanhoja maksuja kirjattaessa. Laskun sivulla maksetun rivin kohdalla on lisäksi painike <em>Lähetä vahvistus</em>. Vahvistukset lähtevät taustalla pienissä erissä. Vain jäsenille, joilla on sähköpostiosoite.</p>
     341                <p><label for="jasrek-vot">Otsikko</label>
     342                   <input type="text" id="jasrek-vot" name="vahvistus_otsikko" value="<?php echo esc_attr($s['vahvistus_otsikko']); ?>"></p>
     343                <p><label for="jasrek-vte">Viesti</label>
     344                   <textarea id="jasrek-vte" name="vahvistus_teksti" rows="6"><?php echo esc_textarea($s['vahvistus_teksti']); ?></textarea>
     345                   <?php echo wp_kses_post(jasrek_placeholders('jasrek-vte', 'vahvistus', '{summa} on maksettu summa.')); ?></p>
     346            </div>
     347
    278348            <div class="jasrek-panel" id="jasrek-kirjanpito">
    279349                <h2>Jäsenmaksut kirjanpitoon</h2>
    … …  
    289359                </div>
    290360            </div>
    291 
    292             <div class="jasrek-panel" id="jasrek-merkkipaivat">
    293                 <h2>Merkkipäivät</h2>
    294                 <p class="description">Vuosiraportti ja jäsenlista kertovat, ketkä täyttävät valittuja tasavuosia tai ovat olleet jäsenenä valitut vuodet. Täytettävät vuodet lasketaan jäsenen tiedoissa olevasta <em>syntymävuodesta tai -päivästä</em>. Kenttä on vapaaehtoinen, ja se näkyy jäsenen lomakkeella vain, kun merkkipäivät ovat käytössä. Jos jäsenestä on merkitty vain syntymävuosi, merkkipäivä näkyy vuosiraportissa ilman päivää. Jäsenyysvuodet lasketaan liittymispäivästä. Tyhjä kenttä = sitä merkkipäivää ei näytetä.</p>
    295                 <p><label class="jasrek-radio"><input type="checkbox" name="merkki_kaytossa" value="1" <?php checked($s['merkki_kaytossa'], '1'); ?>> Merkkipäivät käytössä</label>
    296                    <span class="description">Pois päältä merkkipäiviä ei näytetä jäsenlistassa, vuosiraportissa eikä Excel-viennissä, eikä jäsenen lomakkeella kysytä syntymävuotta. Asetetut vuodet ja tallennetut syntymävuodet säilyvät.</span></p>
    297                 <div class="jasrek-grid">
    298                     <p><label for="jasrek-merkki-ika">Täytettävät vuodet</label>
    299                        <input type="text" id="jasrek-merkki-ika" name="merkki_ika" value="<?php echo esc_attr($s['merkki_ika']); ?>" placeholder="50, 60, 70, 80, 90"></p>
    300                     <p><label for="jasrek-merkki-jasen">Jäsenyysvuodet</label>
    301                        <input type="text" id="jasrek-merkki-jasen" name="merkki_jasen" value="<?php echo esc_attr($s['merkki_jasen']); ?>" placeholder="10, 20, 25, 30, 40, 50"></p>
    302                 </div>
    303             </div>
    304 
    305             <div class="jasrek-panel">
    306                 <h2>Automaattinen maksumuistutus</h2>
    307                 <p><label class="jasrek-radio"><input type="checkbox" name="auto_muistutus" value="1" <?php checked($s['auto_muistutus'], '1'); ?>> Lähetä maksamattomille muistutus automaattisesti</label></p>
    308                 <div class="jasrek-grid">
    309                     <p><label for="jasrek-apaiv">Päivää eräpäivän jälkeen</label>
    310                        <input type="number" id="jasrek-apaiv" name="auto_paivia" min="1" max="365" value="<?php echo esc_attr($s['auto_paivia']); ?>"></p>
    311                     <p><label for="jasrek-amax">Muistutuksia enintään</label>
    312                        <input type="number" id="jasrek-amax" name="auto_max" min="1" max="10" value="<?php echo esc_attr($s['auto_max']); ?>">
    313                        <span class="description">Seuraava muistutus lähtee aina saman päivämäärän kuluttua edellisestä.</span></p>
    314                 </div>
    315                 <p><label class="jasrek-radio"><input type="checkbox" name="auto_raportti" value="1" <?php checked($s['auto_raportti'], '1'); ?>> Lähetä yhteenveto lähetetyistä muistutuksista osoitteeseen <?php echo esc_html($raportti_to); ?></label></p>
    316                 <p class="description">Muistutuksen saavat vain jäsenet, joille lasku on jo lähetetty ja joilla on sähköpostiosoite. Automaattisen muistutuksen voi kytkeä pois myös yksittäiseltä laskulta. WordPress tarkistaa tilanteen kerran tunnissa, kun sivustolla on kävijöitä.
    317                 <?php if ($s['auto_muistutus'] === '1' && $next): ?><br>Seuraava tarkistus: <?php echo esc_html(wp_date('j.n.Y H:i', $next)); ?><?php endif; ?></p>
    318             </div>
    319 
    320             <div class="jasrek-panel" id="jasrek-omat-tiedot">
    321                 <h2>Jäsenen omat tiedot viesteissä <code>{omat_tiedot}</code></h2>
    322                 <p class="description">Valitse, mitkä tiedot paikkamerkki <code>{omat_tiedot}</code> näyttää jäsenelle tietojentarkistuspyynnössä ja laskun saatteessa. Puuttuva osoite, puhelin tai sähköposti korostetaan. Jos kaikki on valittu, myöhemmin lisättävät omat kentät tulevat mukaan automaattisesti.</p>
    323                 <p class="jasrek-checks"><?php $ot_val = jasrek_omat_tiedot_valitut(); foreach (jasrek_omat_tiedot_valinnat() as $k => $nimi): ?>
    324                     <label class="jasrek-radio"><input type="checkbox" name="ot_kentat[]" value="<?php echo esc_attr($k); ?>" <?php checked(in_array($k, $ot_val, true)); ?>> <?php echo esc_html($nimi); ?></label>
    325                 <?php endforeach; ?></p>
    326             </div>
    327 
    328             <div class="jasrek-panel" id="jasrek-vahvistus">
    329                 <h2>Maksuvahvistus jäsenelle</h2>
    330                 <p><label class="jasrek-radio"><input type="checkbox" name="vahvistus_kaytossa" value="1" <?php checked($s['vahvistus_kaytossa'], '1'); ?>> Lähetä jäsenelle sähköpostilla vahvistus, kun hänen maksunsa kirjataan</label></p>
    331                 <p class="description">Kun maksuja kirjataan pankkitiedostosta tai joukkotoiminnolla, kirjauksen yhteydessä on ruksi <em>Lähetä maksuvahvistus</em> (valmiiksi valittuna), jonka voi poistaa esim. vanhoja maksuja kirjattaessa. Laskun sivulla maksetun rivin kohdalla on lisäksi painike <em>Lähetä vahvistus</em>. Vahvistukset lähtevät taustalla pienissä erissä. Vain jäsenille, joilla on sähköpostiosoite.</p>
    332                 <p><label for="jasrek-vot">Otsikko</label>
    333                    <input type="text" id="jasrek-vot" name="vahvistus_otsikko" value="<?php echo esc_attr($s['vahvistus_otsikko']); ?>"></p>
    334                 <p><label for="jasrek-vte">Viesti</label>
    335                    <textarea id="jasrek-vte" name="vahvistus_teksti" rows="6"><?php echo esc_textarea($s['vahvistus_teksti']); ?></textarea>
    336                    <?php echo wp_kses_post(jasrek_placeholders('jasrek-vte', 'vahvistus', '{summa} on maksettu summa.')); ?></p>
    337             </div>
    338 
     361            </div>
     362            <div class="jasrek-tab" data-tab="sposti">
    339363            <div class="jasrek-panel">
    340364                <h2>Sähköpostin lähettäjä</h2>
    … …  
    351375                <?php endif; ?>
    352376                <p class="description">Suositus: asenna SMTP-lisäosa (esim. WP Mail SMTP tai FluentSMTP), jolloin viestit lähtevät yhdistyksen oikean sähköpostitilin kautta eivätkä päädy roskapostiin. Kokeile asetukset lähettämällä testilasku itsellesi.</p>
    353             </div>
    354 
    355             <div class="jasrek-panel">
    356                 <h2>Oletustekstit</h2>
    357                 <p><label for="jasrek-vo">Laskun saateteksti (oletus uusille laskuille)</label>
    358                    <textarea id="jasrek-vo" name="viesti_oletus" rows="7"><?php echo esc_textarea($s['viesti_oletus']); ?></textarea>
    359                    <?php echo wp_kses_post(jasrek_placeholders('jasrek-vo', 'lasku')); ?></p>
    360                 <p><label for="jasrek-mt">Maksumuistutuksen teksti</label>
    361                    <textarea id="jasrek-mt" name="muistutus_teksti" rows="6"><?php echo esc_textarea($s['muistutus_teksti']); ?></textarea>
    362                    <?php echo wp_kses_post(jasrek_placeholders('jasrek-mt', 'lasku')); ?></p>
    363             </div>
    364 
     377                <p><label for="jasrek-yhteystiedot">Yhteystiedot viestien alalaitaan</label>
     378                   <textarea id="jasrek-yhteystiedot" name="yhteystiedot" rows="3" placeholder="Esim. Yhdistys ry · rahastonhoitaja@example.fi · www.example.fi"><?php echo esc_textarea($s['yhteystiedot']); ?></textarea></p>
     379            </div>
     380
     381            <div class="jasrek-panel" id="jasrek-omat-tiedot">
     382                <h2>Jäsenen omat tiedot viesteissä <code>{omat_tiedot}</code></h2>
     383                <p class="description">Valitse, mitkä tiedot paikkamerkki <code>{omat_tiedot}</code> näyttää jäsenelle tietojentarkistuspyynnössä ja laskun saatteessa. Puuttuva osoite, puhelin tai sähköposti korostetaan. Jos kaikki on valittu, myöhemmin lisättävät omat kentät tulevat mukaan automaattisesti.</p>
     384                <p class="jasrek-checks"><?php $ot_val = jasrek_omat_tiedot_valitut(); foreach (jasrek_omat_tiedot_valinnat() as $k => $nimi): ?>
     385                    <label class="jasrek-radio"><input type="checkbox" name="ot_kentat[]" value="<?php echo esc_attr($k); ?>" <?php checked(in_array($k, $ot_val, true)); ?>> <?php echo esc_html($nimi); ?></label>
     386                <?php endforeach; ?></p>
     387            </div>
     388            </div>
     389            <div class="jasrek-tab" data-tab="loki">
    365390            <div class="jasrek-panel" id="jasrek-loki">
    366391                <h2>Muutosloki</h2>
    … …  
    374399                   <span class="description">Loki sisältää henkilötietoja (esim. vanhoja osoitteita), joten sitä ei kannata säilyttää tarpeettoman pitkään. Vanhemmat merkinnät poistetaan automaattisesti.</span></p>
    375400            </div>
    376 
     401            </div>
     402
     403            <div class="jasrek-tab" data-tab="varmuus">
    377404            <?php jasrek_autobackup_panel($s); ?>
    378405
    … …  
    382409                <label class="jasrek-radio"><input type="radio" name="poista_tiedot" value="0" <?php checked($s['poista_tiedot'], '0'); ?>> <strong>Säilytä tiedot</strong> – jäsenet, laskut, maksut ja asetukset jäävät tietokantaan, ja lisäosan voi asentaa myöhemmin uudelleen.</label>
    383410                <label class="jasrek-radio"><input type="radio" name="poista_tiedot" value="1" <?php checked($s['poista_tiedot'], '1'); ?> data-confirm="Haluatko varmasti, että kaikki jäsenrekisterin tiedot poistetaan pysyvästi, kun lisäosa poistetaan? Tätä ei voi perua."> <strong>Poista kaikki tiedot</strong> – kaikki lisäosan luomat taulut ja asetukset poistetaan pysyvästi.</label>
    384                 <p class="description">Ota ennen poistamista <a href="#jasrek-varmuuskopio">varmuuskopio</a> (alla), jolla kaikki tiedot voi palauttaa myöhemmin. Valinta kysytään myös, kun lisäosa poistetaan käytöstä.</p>
    385             </div>
    386 
    387             <p><button type="submit" class="button button-primary button-large">Tallenna asetukset</button></p>
     411                <p class="description">Ota ennen poistamista <a href="#jasrek-varmuuskopio">varmuuskopio</a> (ylempänä), jolla kaikki tiedot voi palauttaa myöhemmin. Valinta kysytään myös, kun lisäosa poistetaan käytöstä.</p>
     412            </div>
     413            </div>
     414
     415            <p class="jasrek-save"><button type="submit" class="button button-primary button-large">Tallenna asetukset</button>
     416               <span class="description">Tallentaa kaikkien välilehtien asetukset.</span></p>
    388417        </form>
    389         <?php jasrek_backup_panel(); ?>
    390418    </div>
    391419    <?php
  • oh6kw-jasenrekisteri/trunk/oh6kw-jasenrekisteri.php

    r3755968 r3763979  
    44Plugin URI: https://github.com/oh6kw/oh6kw-jasenrekisteri
    55Description: Yhdistyksen jäsenrekisteri: jäsenet, jäsenluokat ja omat lisäkentät, jäsenmaksulaskut omilla viitenumeroilla sähköpostilla tai paperilla, QR-koodi ja pankkiviivakoodi, maksujen tuonti pankista, muistutukset, tiedotteet, vuosiraportti ja muutosloki.
    6 Version: 4.8.9
     6Version: 4.9.0
    77Author: Jarno Jaskari (oh6kw)
    88Author URI: https://github.com/oh6kw
    … …  
    2828}
    2929
    30 define('JASREK_VERSION', '4.8.9');
     30define('JASREK_VERSION', '4.9.0');
    3131define('JASREK_DB_VERSION', '10');
    3232define('JASREK_FILE', __FILE__);
  • oh6kw-jasenrekisteri/trunk/readme.txt

    r3755968 r3763979  
    66Tested up to: 7.1
    77Requires PHP: 7.4
    8 Stable tag: 4.8.9
     8Stable tag: 4.9.0
    99License: AGPLv3 or later
    1010License URI: https://www.gnu.org/licenses/agpl-3.0.html
    … …  
    146146== Changelog ==
    147147
     148= 4.9.0 =
     149* The settings page is now divided into tabs: Association, Members, Invoices, Email, Audit log, and Backups and removal. Invoice settings are grouped into boxes for all invoices, email invoices, paper invoices, reminders, payment confirmation and bookkeeping accounts. Only the layout changed – every setting is kept and still saved with one button.
     150
    148151= 4.8.9 =
    149152* New (optional): payment confirmation email to the member when a payment is imported from the bank file or marked as paid on the invoice page; a single confirmation can also be sent from the invoice row. Off by default; subject and text are editable in the settings. Sent in the background in small batches, only to members with an email address.
Note: See TracChangeset for help on using the changeset viewer.