SMTP-palvelin aina näkyvissä + CuituNet → Cuitunet

- SMTP-palvelinkenttä näkyy nyt aina mailbox-lomakkeessa,
  myös kun "Käytä samoja tunnuksia" on päällä (vain käyttäjä
  ja salasana piiloutuvat)
- Korjattu CuituNet → Cuitunet kaikkialla (pieni n)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 23:28:31 +02:00
parent 0efd4c11ee
commit ff2613ff01
6 changed files with 97 additions and 6 deletions

91
PLAN.md Normal file
View File

@@ -0,0 +1,91 @@
# Sähköpostiallekirjoitus per käyttäjä per postilaatikko
## Tallennusrakenne
Allekirjoitukset tallennetaan **users.json**:iin käyttäjäkohtaisesti, avaimena postilaatikon ID:
```json
{
"id": "abc123",
"username": "jukka",
"nimi": "Jukka",
"signatures": {
"mailbox-cuitunet-1": "Jukka Lampikoski\nCuitunet Oy\nasiakaspalvelu@cuitunet.fi",
"mailbox-storagebox-1": "Jukka\nStorageBOX\nbox@storagebox.fi"
}
}
```
## Muutokset
### 1. index.html — Allekirjoitusten hallinta käyttäjälomakkeessa
Lisätään user-modal lomakkeeseen uusi osio "Sähköpostiallekirjoitukset":
- Jokaiselle postilaatikkolle (kaikkien käyttäjän yritysten) oma textarea
- Näyttää postilaatikon nimen + yrityksen nimen labelin
- Esim: "Cuitunet — Cuitunet-asiakaspalvelu"
### 2. script.js — openUserForm()
- Haetaan kaikkien yritysten postilaatikot API:lla (uusi endpoint `all_mailboxes` tai hyödynnetään olemassaolevia)
- Generoidaan allekirjoitus-textareat dynaamisesti
- Täytetään olemassa olevat allekirjoitukset user.signatures objektista
### 3. script.js — Käyttäjälomakkeen tallennus
- Kerätään allekirjoitus-textareoiden arvot `signatures`-objektiin
- Lähetetään `user_update`/`user_create` mukana
### 4. api.php — user_update/user_create
- Vastaanotetaan ja tallennetaan `signatures`-kenttä users.json:iin
### 5. api.php — Uusi endpoint `all_mailboxes`
- Palauttaa kaikki postilaatikot käyttäjän yrityksistä (id, nimi, yrityksen nimi)
- Tarvitaan allekirjoituslomakkeen generointiin
### 6. script.js — Vastauslomake (ticket-reply)
- Kun tiketti avataan, haetaan kirjautuneen käyttäjän allekirjoitus kyseiselle postilaatikkolle
- Näytetään allekirjoitus vastaus-textarean alla esikatseluna (readonly, harmaa teksti)
- Allekirjoitusta EI laiteta itse tekstikenttään (käyttäjä ei vahingossa muokkaa sitä)
### 7. api.php — ticket_reply endpoint
- Haetaan käyttäjän allekirjoitus: users.json → kyseinen user → signatures[mailbox_id]
- Liitetään allekirjoitus viestin perään ennen lähettämistä: `$body . "\n\n-- \n" . $signature`
- Tallennetaan myös messages-tauluun allekirjoituksen kanssa (jotta näkyy viestiketjussa)
- Muistiinpanoon (ticket_note) EI liitetä allekirjoitusta
## Käyttöliittymä
Käyttäjälomakkeessa:
```
Sähköpostiallekirjoitukset
─────────────────────────
Cuitunet — Cuitunet-asiakaspalvelu
┌──────────────────────────────────┐
│ Jukka Lampikoski │
│ Cuitunet Oy │
│ asiakaspalvelu@cuitunet.fi │
└──────────────────────────────────┘
StorageBOX — Tuki
┌──────────────────────────────────┐
│ Jukka │
│ StorageBOX │
│ box@storagebox.fi │
└──────────────────────────────────┘
```
Tikettinäkymässä vastauslomakkeen alla:
```
[Kirjoita vastaus... ]
--
Jukka Lampikoski
Cuitunet Oy
asiakaspalvelu@cuitunet.fi
[Lähetä vastaus]
```

View File

@@ -1,7 +1,7 @@
[ [
{ {
"id": "cuitunet", "id": "cuitunet",
"nimi": "CuituNet", "nimi": "Cuitunet",
"luotu": "2026-03-10", "luotu": "2026-03-10",
"aktiivinen": true, "aktiivinen": true,
"domains": ["intra.cuitunet.fi"], "domains": ["intra.cuitunet.fi"],

View File

@@ -12,7 +12,7 @@ if (!file_exists($dataDir)) mkdir($dataDir, 0755, true);
$companies = [ $companies = [
[ [
"id" => "cuitunet", "id" => "cuitunet",
"nimi" => "CuituNet", "nimi" => "Cuitunet",
"luotu" => "2026-03-10 08:58:43", "luotu" => "2026-03-10 08:58:43",
"aktiivinen" => true, "aktiivinen" => true,
"domains" => ["intra.cuitunet.fi"], "domains" => ["intra.cuitunet.fi"],
@@ -33,7 +33,7 @@ $users = [
"companies" => ["cuitunet"], "companies" => ["cuitunet"],
"email" => "", "email" => "",
"signatures" => [ "signatures" => [
"846898d4a1cb3a08" => "Jukka Lampikoski\nCuituNet Oy\nasiakaspalvelu@cuitunet.fi" "846898d4a1cb3a08" => "Jukka Lampikoski\nCuitunet Oy\nasiakaspalvelu@cuitunet.fi"
] ]
] ]
]; ];

View File

@@ -830,8 +830,8 @@
<input type="checkbox" id="mailbox-form-smtp-same" checked> Käytä samoja tunnuksia kuin saapuvassa <input type="checkbox" id="mailbox-form-smtp-same" checked> Käytä samoja tunnuksia kuin saapuvassa
</label> </label>
</div> </div>
<div class="form-group"><label>Palvelin</label><input type="text" id="mailbox-form-smtp-host" placeholder="smtp.yritys.fi"></div>
<div id="smtp-custom-fields"> <div id="smtp-custom-fields">
<div class="form-group"><label>Palvelin</label><input type="text" id="mailbox-form-smtp-host" placeholder="mail.yritys.fi"></div>
<div class="form-group"><label>Käyttäjätunnus</label><input type="text" id="mailbox-form-smtp-user" placeholder="asiakaspalvelu@yritys.fi"></div> <div class="form-group"><label>Käyttäjätunnus</label><input type="text" id="mailbox-form-smtp-user" placeholder="asiakaspalvelu@yritys.fi"></div>
<div class="form-group"><label>Salasana</label><input type="password" id="mailbox-form-smtp-pass" placeholder="••••••••"></div> <div class="form-group"><label>Salasana</label><input type="password" id="mailbox-form-smtp-pass" placeholder="••••••••"></div>
</div> </div>

View File

@@ -2582,7 +2582,7 @@ document.getElementById('btn-save-mailbox').addEventListener('click', async () =
imap_encryption: imapEnc, imap_encryption: imapEnc,
smtp_from_email: document.getElementById('mailbox-form-smtp-email').value, smtp_from_email: document.getElementById('mailbox-form-smtp-email').value,
smtp_from_name: document.getElementById('mailbox-form-smtp-name').value, smtp_from_name: document.getElementById('mailbox-form-smtp-name').value,
smtp_host: useSame ? imapHost : document.getElementById('mailbox-form-smtp-host').value, smtp_host: document.getElementById('mailbox-form-smtp-host').value || (useSame ? imapHost : ''),
smtp_port: parseInt(document.getElementById('mailbox-form-smtp-port').value) || 587, smtp_port: parseInt(document.getElementById('mailbox-form-smtp-port').value) || 587,
smtp_user: useSame ? imapUser : document.getElementById('mailbox-form-smtp-user').value, smtp_user: useSame ? imapUser : document.getElementById('mailbox-form-smtp-user').value,
smtp_password: useSame ? imapPass : document.getElementById('mailbox-form-smtp-pass').value, smtp_password: useSame ? imapPass : document.getElementById('mailbox-form-smtp-pass').value,

View File

@@ -5,7 +5,7 @@ import sys
PORT = 3001 PORT = 3001
def main(): def main():
print(f"CuituNet Intra käynnistyy osoitteessa http://localhost:{PORT}") print(f"Cuitunet Intra käynnistyy osoitteessa http://localhost:{PORT}")
try: try:
subprocess.run( subprocess.run(
["php", "-S", f"localhost:{PORT}"], ["php", "-S", f"localhost:{PORT}"],