# Tuotetarvelaskenta

Tuotetarve-näkymä näyttää tuotteiden varastosaldojen kehityksen ja tulevat tarpeet myynti-, tuotanto- ja ostotilausten sekä materiaalitarpeiden perusteella.

## Näkymät

Saldo/Tarve-välilehdellä on kaksi näkymää:

| Välilehti | Kuvaus |
|-----------|--------|
| Saldo | Viikoittainen yhteenveto tuotteittain ostotilausten luontia varten |
| Tarve | Yksityiskohtainen rivikohtainen näkymä, jossa näkyvät kaikki tapahtumat ja laskennat |

## Valintaruudut

Valintaruudut ohjaavat mitä lasketaan ja näytetään. Mikä tahansa laskennan valintaruuduista käynnistää päivityksen.

### Laskennan valintaruudut

| Valintaruutu | Oletus | Kuvaus |
|--------------|--------|--------|
| Negatiivinen aloitussaldo | ei | Sisällytä negatiivinen aloitussaldo juoksevaan saldoon |
| Negatiivinen loppusaldo | kyllä | Lisää tarve kun loppusaldo on negatiivinen |
| Minimivarasto | kyllä | Lisää tarve kun saldo laskee tuotteen minimivaraston alle |
| Toimintaraja | kyllä | Varoita kun saldo laskee tuotteen toimintarajan alle |
| Arviotilaus | kyllä | Sisällytä arviotilaukset laskentaan |
| Kriittinen päivämäärä | ei | Laske kriittinen päivämäärä jolloin varasto loppuu |
| Vain myyntitarve | ei | Laske vain myyntitilausten perusteella. Poistaa minimivaraston, toimintarajan, negatiivisen loppusaldon ja kriittisen päivämäärän käytöstä |

### Näytön valintaruudut

| Valintaruutu | Oletus | Kuvaus |
|--------------|--------|--------|
| Vain tarve | kyllä | Näytä vain tuotteet joilla on tarvetta (negatiivinen saldo tai alaspäin tarve) |
| Piilota tyhjät | kyllä | Piilota tuotteet joilla nollasaldo eikä tapahtumia. Ei käytössä kun Vain tarve on päällä |
| Virheet | ei | Näytä vain tuotteet joilla on virheitä |
| Valitse ylä | kyllä | Korosta ylemmän tason tuotteet kun rivi valitaan |
| Valitse ala | kyllä | Korosta alemman tason tuotteet kun rivi valitaan |
| Kaavio nykyinen | ei | Näytä vain valitun tuotteen kaavio |
| Luo aikataulu | ei | Merkitse vastaavat tuotantotilaukset aikataulutetuiksi |
| Virtuaalinen tuotantotilaus | ei | Luo virtuaaliset tuotantotilaustunnukset tarveriveille joilla ei ole olemassa olevaa tilausta |

### Lisäasetukset

| Valintaruutu | Oletus | Kuvaus |
|--------------|--------|--------|
| Inkrementaalinen | ei | Lähetä vain muuttuneet tiedot päivityksissä |
| Lataa uudelleen | ei | Pakota täysi tietojen lataus tietokannasta |
| Vanha työpäivä | ei | Käytä vanhaa työpäivää laskennassa |
| Maksimi alaspäin | 500 | Kaskaadisilmukan toistojen enimmäismäärä |

## Tuotekohtaiset asetukset

Jokaisella tuotteella on asetukset jotka ohjaavat sen osallistumista laskentaan. Nämä asetetaan tuotetietueella:

| Asetus | Kuvaus |
|--------|--------|
| Tarvelaskenta käytössä | Kun pois päältä, tuote jätetään laskennan ulkopuolelle. Automaattisesti päällä kun ei asetettu. Myös pois kun tuote on merkitty ei käytössä |
| Varastosaldo | Nykyinen varastosaldo, käytetään aloitussaldona |
| Toimintaraja | Tuotekohtainen toimintarajan kynnysarvo |
| Minimivarasto | Tuotekohtainen minimivarastotaso |
| Kriittinen loppupäivä | Tallennettu kriittinen loppupäivä, johon verrataan laskettua arvoa |

## Rivityypit (db-sarake)

Jokaisella tarvelaskennan rivillä on lähdetyyppi joka näkyy **db**-sarakkeessa:

| db-arvo | Kuvaus |
|---------|--------|
| product | Tuotteen otsikkorivi aloitussaldolla |
| work | Tuotantotilaus (positiivinen = saapuva) |
| purchase | Ostotilaus (positiivinen = saapuva) |
| sales | Myyntitilaus (negatiivinen = lähtevä) |
| material | Materiaalitarve (negatiivinen = lähtevä) |
| estimate | Arviotarverivi eli ennustettu kysyntä tästä tuotteesta |
| est. | Ylemmän tason arviotarve ylätuotteesta |
| act. limit | Toimintarajan varoitus |
| actl. | Ylemmän tason toimintaraja |
| neg. balance | Negatiivinen loppusaldo (synteettinen rivi) |
| balance | Ylemmän tason negatiivinen loppusaldo |

### Luodut tuotantotilaustunnukset

Kun **Virtuaalinen tuotantotilaus** on päällä, myynti- ja materiaalirivit joilla on alaspäin tarve muttei olemassa olevaa tuotantotilausta saavat luodun tunnuksen:

- Muoto: `V-{tilaustunnus}.{tilausrivi}`, jossa etuliite `V-` on määritettävissä
- Esimerkki: myyntitilaus `12345` rivi `2` muuttuu muotoon `V-12345.2`
- Nämä rivit näkyvät ruskeana ruudukossa
- Vaatii että rivillä on sekä tilaustunnus että tilausrivi, muuten näytetään virhe

Kun **Luo aikataulu** on päällä, rivit joilla on olemassa oleva tuotantotilaus saavat loppuliitteen:

- Loppuliite on määritettävissä (oletus: `c`)
- Esimerkki: tuotantotilaus `2024/123` muuttuu muotoon `2024/123c`

## Laskentasäännöt

### Juokseva saldo

Jokaiselle tuotteelle rivit lajitellaan päivämäärän, tyypin ja tilauksen mukaan. Juokseva saldo lasketaan:

- Jos aloitussaldo on negatiivinen ja **Negatiivinen aloitussaldo** on pois päältä: ensimmäisen tapahtumarivin saldo = vain rivin määrä (aloitussaldo ohitetaan)
- Muuten: saldo = edellinen saldo + rivin määrä

### Alaspäin tarve

Alaspäin tarve on määrä joka on hankittava tai tuotettava puutteen kattamiseksi. Se kulkee tuotepuussa alaspäin valmiista tuotteista raaka-aineisiin.

#### Kun alaspäin tarve asetetaan

| Ehto | Alaspäin tarve määrä | Huomautukset |
|------|----------------------|--------------|
| Tuotantotilausrivi (positiivinen määrä) | määrä | Vain tuotteille joilla on materiaaleja työrakenteessa |
| Saldo muuttuu negatiiviseksi (negatiivinen määrä) | -määrä | Vain tuotteille jotka ovat tuotepuussa |
| Aikataulurivi | abs(määrä) | Kun edellinen saldo miinus määrä olisi negatiivinen |
| Viimeinen rivi, negatiivinen loppusaldo päällä | väli edelliseen alaspäin tarpeeseen | Kattaa jäljellä olevan puutteen |
| Viimeinen rivi, minimivarasto päällä (vain viimeinen läpikäynti) | minimivarasto - saldo | Kun saldo on alle minimivaraston |
| Tuotteella vain aloitussaldo, negatiivinen, ei tapahtumia | -saldo | Synteettinen rivi luotu määrällä 0 |

#### Kun alaspäin tarve nollataan

- Rivin määrä on nolla (virheilmoituksen kera tuotanto-, myynti- ja materiaaliriveillä)
- Tuotteella tarvelaskenta käytössä = pois
- Rivin lähdetietokanta on merkitty ei käytössä
- Laskennan jälkeen: alaspäin tarve joka on pienempi tai yhtä suuri kuin 0 poistetaan
- Jos saldo on palautunut edelliselle alaspäin tarvetasolle tai yli, alaspäin tarve nollataan

#### Σ-tieto

Σ näkyy kun alaspäin tarvetta on pienennetty koska osa puutteesta oli jo laskettu aiemman rivin perusteella. Σ-arvo näyttää jo lasketun määrän.

Esimerkki: tuote alkaa saldolla 0 ja sillä on kolme myyntiriviä:

| Rivi | Määrä | Saldo | Alaspäin tarve ennen Σ:ää | Matalin negatiivinen | Toimenpide |
|------|-------|-------|---------------------------|----------------------|------------|
| Myynti A | -5 | -5 | 5 | -5 | Uusi matalin, alaspäin tarve = 5 |
| Tuotanto | +3 | -2 | - | -5 | Saldo palautui, ei uutta tarvetta |
| Myynti B | -4 | -6 | 4 | -6 | Uusi matalin, alaspäin tarve pienennetty 1:een |

Rivillä 3 myynti B luo alaspäin tarpeen 4. Mutta myynti A aiheutti jo alaspäin tarpeen 5 joka kattaa suurimman osan puutteesta. Alaspäin tarve pienennetään 1:een — vain uusi osuus. Σ näyttää `Σ5` eli 5 oli jo laskettu.

Σ-tieto näytetään vain kun pienennysmäärä eroaa lopullisesta alaspäin tarpeesta.

### Negatiivinen aloitussaldo

Kun **päällä**:

- Negatiivinen aloitusvarastosaldo sisällytetään juoksevaan saldoon
- Kaikki tapahtumat lisätään saldoon joka voi alkaa negatiivisena
- Ensimmäinen rivi näyttää tiedon `"negative"` kun otsikkosaldo on negatiivinen
- Viimeinen rivi: jos saldo on yhä negatiivinen ja alaspäin tarve on olemassa, sitä suurennetaan kattamaan koko puute

Kun **pois päältä**:

- Jos aloitussaldo on negatiivinen, ensimmäinen tapahtumarivi ohittaa sen: saldo = vain rivin määrä
- Juokseva saldo alkaa nollasta ensimmäisestä tapahtumasta
- Negatiivinen loppusaldo toimii yhä viimeisen rivin saldossa joka voi olla negatiivinen tapahtumista

### Negatiivinen loppusaldo

Kun **päällä** ja tuotteella ei ole tapahtumarivejä (vain aloitussaldo):

- Luo synteettisen rivin määrällä 0 ja saldo = aloitussaldo
- Asettaa alaspäin tarpeen = -saldo jos aloitussaldo on negatiivinen ja negatiivinen aloitussaldo on päällä

Kun **päällä** ja tuotteella on tapahtumarivejä:

- Viimeisellä rivillä: jos saldo < 0, asettaa alaspäin tarpeen kattamaan jäljellä olevan puutteen
- "neg. balance" -syyteksti näkyy Info-sarakkeessa

### Minimivarasto

Kun **päällä** (vain viimeinen läpikäynti):

- Viimeisellä rivillä: jos saldo < minimivarasto, asettaa alaspäin tarpeen = minimivarasto - saldo
- Yhdistettynä negatiiviseen loppusaldoon: jos molemmat vaikuttavat, käytetään suurempaa alaspäin tarvetta
- Info-sarake näyttää "min. stock" tai "neg. balance, min. stock"

### Toimintaraja

Kun **päällä**:

- Varoitus näytetään kun tuotesaldo laskee toimintarajan alle
- Toimintarajan arvo tulee tuotetietueesta

### Kriittinen päivämäärä

Kun **päällä**:

- Laskee päivämäärän jolloin varastosaldo ensimmäisen kerran menee nollaan tai alle
- Vertaa laskettua kriittistä päivämäärää tuotteen tallennettuun kriittiseen loppupäivään
- Jos ne eroavat, näytetään virhe tuotteella

### Vain myyntitarve

Kun **päällä**:

- Laskenta käyttää vain myyntitilauksia (ei tuotanto-, ostotilauksia tai materiaalitarpeita)
- Aloitussaldo asetetaan 0:ksi varastosaldon sijaan
- Poistaa automaattisesti käytöstä: minimivaraston, toimintarajan, negatiivisen loppusaldon ja kriittisen päivämäärän

## Arviotarve

Arviotarve ennustaa tulevaa tuotekysyntää historiallisen myynnin perusteella. Se laskee päivittäisen kulutusasteen tarkastelujaksolta ja lisää negatiivisia rivejä tuotesaldotaulukkoihin kuvaamaan odotettua tulevaa kysyntää.

Kaksi laskentamenetelmää:

| Menetelmä | Kuvaus |
|-----------|--------|
| Viimeisin | Yksinkertainen keskiarvo: toimitettujen kokonaismäärä jaettuna tarkastelupäivillä (oletus 78 päivää). Kasvunopeus on aina 1.0 |
| Jakso | Vertaa päivämääräväliä tämän vuoden samaan väliin viime vuonna. Laskee automaattisesti vuosittaisen kasvunopeuden. Jakso määritellään ennen- ja jälkipäivillä ankkuripäivän ympärillä |

Tuoteryhmäkohtaiset ohitukset: jokainen tuoteryhmä voi käyttää eri menetelmää ja kasvunopeuden kertoimaa. Tuotteet jotka eivät ole ohitustaulussa käyttävät yleisiä asetuksia.

Päivittäisen kulutuksen kaava: `kulutus / päivät × automaattinen kasvunopeus × manuaalinen kasvunopeus`. Arviorivit lisätään olemassa olevien tuoterivien väliin ja ne jaetaan kun materiaalirivit osuvat niiden päivämäärävälin sisään. Tämä varmistaa oikeet välisaldolaskennat kaskaadisilmukan aikana.

## Kaskaadisilmukka

Alaspäin tarve kulkee valmiista tuotteista raaka-aineisiin. Jokainen askel voi luoda uutta alaspäin tarvetta joka laukaisee seuraavan tason.

### Kulku

```mermaid
flowchart TD
    L1["Laske saldo kaikille muuttuneille tuotteille"] --> L2{"Alaspäin tarve löytyi?"}
    L2 -->|kyllä| L3["Lataa alemman tason materiaalit tietokannasta"]
    L3 --> L4["Lisää kaskaadirivit alimateriaalien taulukkoon"]
    L4 --> L5["Laske uudelleen vaikuttavat alimateriaalit"]
    L5 --> L1
    L2 -->|ei| L6{"Viimeisen läpikäynnin ominaisuudet päällä?"}
    L6 -->|kyllä| L7["Yksi viimeinen laskentaläpikäynti"]
    L7 --> L8["Käytä minimivarasto ja negatiivinen loppusaldo"]
    L6 -->|ei| DONE["Valmis"]
    L8 --> DONE
```

### Esimerkki

Tuotteella A on tuoterakenne joka vaatii materiaalia B. Tuote A saa alaspäin tarpeen.

1. Saldolaskenta tuotteelle A tuottaa alaspäin tarpeen
2. Tietokannasta ladataan materiaalin B vaatimus tuoterakenteen määrällä
3. Kaskaadirivi lisätään materiaaliin B: **db** näyttää `"work"`, **Alkuperä** näyttää `"work -"`, **Mistä** linkittää takaisin tuotteen A riviin
4. Saldolaskenta materiaalille B suoritetaan, voi tuottaa oman alaspäin tarpeen
5. Jos materiaalilla B on alimateriaali C, prosessi toistetaan C:lle
6. Silmukka päättyy kun ei synny uutta alaspäin tarvetta tai maksimimäärä saavutetaan

### Kaskaadirivi ruudukossa

Kaskaadirivit näkyvät normaaleina riveinä alimateriaalin tuotenäkymässä. Avainsarakkeet:

- **Alkuperä**: näyttää `"work -"` materiaalikaskaadissa, osoittaen että tämä tarve tulee ylemmän tuotantotilauksen tarpeesta
- **Mistä**: linkittää takaisin ylemmän tuotteen riviin, klikattava navigointia varten
- **Määrä**: negatiivinen arvo = materiaalimäärä × ylemmän tuotteen alaspäin tarve

### Kaskaadisilmukan jälkeen

Yksi viimeinen läpikäynti suoritetaan kun mikä tahansa näistä on päällä: minimivarasto, toimintaraja, arviotilaus, negatiivinen loppusaldo. Tämä läpikäynti käyttää ominaisuuksia jotka on suoritettava vasta kaikkien tasojen laskennan jälkeen.

## Kaaviotyypit

Kaaviotyypin valitsin tarjoaa seuraavat näkymät:

| Kaavio | Kuvaus |
|--------|--------|
| Varastosaldo | Viivakaavio joka näyttää saldon kehityksen ajan suhteen tuotteittain |
| Tuotepuu | Puukaavio joka näyttää tuotehierarkian ja alemman tason yhteydet |
| Työvaiheet | Gantt-kaavio joka näyttää tuotantotilausten työvaiheet ja ajoituksen |

## Scope-sarake

Scope-sarake näyttää hierarkkiset suhteet valitulle riville:

| Symboli | Merkitys | Esimerkki |
|---------|----------|-----------|
| ↓3 | 3 alemman tason tuotetta, kaikki näkyvillä | Klikkaa tuotetta A, näet 3 materiaalia alla |
| ↓3/1 | 3 alituotetta yhteensä, 1 näkyvissä nykyisessä suodattimessa | 2 materiaalia suodattimen piilottamia |
| ↑2 | 2 ylemmän tason tuotetta, kaikki näkyvillä | Materiaalia käytetään 2 valmiissa tuotteessa |
| ↑2/1 | 2 ylätuotetta yhteensä, 1 näkyvissä | 1 ylätuote suodattimen piilottama |
| ↓3 ↑2 | 3 alitua ja 2 ylätuotetta | Molemmat suhteet näkyvillä |

## Info-sarake (Info ⇣)

Info-sarake näyttää miksi ja kuinka paljon alaspäin tarvetta laskettiin:

| Info | Merkitys | Esimerkki |
|------|----------|-----------|
| `negative` | Otsikkorivillä negatiivinen aloitussaldo | Tuotteen varastosaldo = -10 |
| `neg. balance` | Alaspäin tarve negatiivisesta loppusaldosta | Viimeisen rivin saldo = -8, alaspäin tarve = 8 |
| `min. stock` | Alaspäin tarve minimivarastovaatimuksesta | Saldo = 2, minimivarasto = 10, alaspäin tarve = 8 |
| `neg. balance, min. stock` | Molemmat negatiivinen loppusaldo ja minimivarasto vaikuttavat | Saldo = -8, minimivarasto = 5, alaspäin tarve = 8 |
| `Σ5` | Alaspäin tarve pienennetty koska 5 yksikköä oli jo laskettu | Myynti A aiheutti jo alaspäin tarpeen 5 yksikölle |
| `⇣2/3` | 2/3 materiaalista työrakenteessa vaikuttaa alaspäin tarpeeseen | Tuotteella 3 materiaalia, vain 2:lla on alaspäin tarve |
| `⇣` | Alaspäin tarve asetettu mutta materiaalimäärätietoja ei saatavilla | Tuotteella ei työrakennetietoja |

## Ruudukon värit

### Solujen värit

| Väri | Sarake | Ehto |
|------|--------|------|
| Puolilihavoitu teksti | Kaikki sarakkeet | Tuotteen otsikkorivi |
| Puolilihavoitu + alleviivattu | Saldo | Tuotteen viimeinen rivi |
| Harmaa | Päivämäärä | Päivämäärä on mennyt (ei otsikko) |
| Ruskea | Päivämäärä | Päivämäärä on mennyt (otsikkorivi) |
| Sininen | Päivämäärä | Otsikkorivi kelvollisella päivämäärällä |
| Tummanharmaa | Nimi, Määrä (arvio) | Arviotyyppiset rivit |
| Tummanpunainen | Saldo (ei viimeinen rivi) | Saldo on negatiivinen |
| Punainen | Saldo (viimeinen rivi) | Loppusaldo on negatiivinen |
| Punainen | Rivinumero | Virhe joka ei ole huomautus |
| Vihreä + lihavoitu | Työ / tuotantoerä | Olemassa oleva tuotantotilaus (ei virtuaalinen) |
| Tummanpunainen + lihavoitu | Scope | Rivi korostettu mutta scope-kohde ei näkyvillä |
| Haalea | Scope | Rivi ei korostettu, scope ei näkyvillä |
| Valkoinen | Tilausrivi, Määrä, Alaspäin tarve | Nolla-arvo |
| Musta | Määrä | Positiivinen määrä (saapuva) |
| Sininen | Alaspäin tarve | Alaspäin tarve > 0 |

### Rivien värit

| Väri | Ehto |
|------|------|
| Ruskea | Virtuaalinen tuotantotilaus (ei arviotyyppi) |
| Vaaleanruskea | Arviotilaustyyppi |
| Sinivihreä | Arviorivi |
| Kullankeltainen tausta | Ylemmän tason korostus (ylätuote valittu) |
| Vaaleanvihreä tausta | Alemman tason korostus (alituote valittu) |
| Punainen reuna + punainen teksti | Puuttuvat tilaustiedot |
| Lohenpunainen | Tuote poissuljettu laskennasta |

### Virhevärit

| Väri | Ehto |
|------|------|
| Vihreä teksti | Tiedonantava huomautus |
| Punainen teksti | Virhe |
| Punainen tausta + reuna | Solun validointi epäonnistui |

## Inkrementaalinen päivitys

Kun Inkrementaalinen-valintaruutu on päällä, palvelin seuraa tietojen muutoksia muutosaikaleimojen avulla:

- Ensimmäinen lataus palauttaa kaikki tiedot
- Seuraavat päivitykset palauttavat vain muuttuneet rivit
- Putoaa täyteen uudelleenlataukseen jos inkrementaalinen päivitys epäonnistuu
- Jokaisella taululla on oltava muutosten seurantakenttä

## Lisää ostotilaus (Saldo-näkymä)

Saldo-näkymässä voit luoda ostotilauksia:

1. Valitse yksi tai useampia rivejä
2. Aseta tilausmäärä (oltava > 0) jokaiselle riville
3. Aseta toimittaja jokaiselle riville
4. Klikkaa "Lisää tilaus"

Validointi vaatii molemmat kentät kaikilla valituilla riveillä ennen tallentamista.
