---
# System prepended metadata

title: Projekt "Nemo" - draft

---

# Projekt "Nemo" - draft

[TOC]

## Cel biznesowy

- umożliwienie użytkownikowi kupienia maximum z puli zdefiniowanych produktów poprzez jak najmniej sklepów internetowych, tak aby w rezultacie paczek było jak najmniej


## Model monetyzacji

- reklamy afiliowane
- pay-for-click od integrowanych sklepów

## Flow biznesowy - High level


```plantuml
@startuml
start
:Użytkownik loguje się?;

:Użytkownik definiuje koszyk interesujących go produktów;


:Użytkownik definiuje ustawienia przypominania;

#palegreen: backend sprawdza dostępność produktów z koszyka w powiązanych sklepach;

#palegreen: backend kalkuluje w którym sklepie można kupić najwięcej z nich;

#palegreen: backend generuje komunikat zwrotny  (email albo PUSH);

stop
@enduml

```

### Ad.1 Użytkownik loguje się (?)
logowanie tak naprawdę potrzebne nam jest tylko po to żeby:
mieć pewność że sesja aplikacji należy do unikalnego użytkownika o jakimś mailu i ID
mieć jak przypisać preferowane przez niego produkty.

Wydaje się, że w przypadku gdybyśmy nie mieli aplikacji Desktopowej a tylko i wyłącznie mobilną, ten krok możnaby pominąć. Nowa instalacja aplikacji w telefonie rejestrowała by ją na naszym backendzie bez konieczności robienia czegokolwiek przez użytkownika, przy pierwszym uruchomieniu apki.


### Ad.2 Użytkownik definiuje koszyk interesujących go produktów

 w naszej apce użytkownik ma wirtualny koszyk ulubionych produktów.
 Powinien mieć możliwość dodania do niego produktów przez wyszukiwarkę 

> [wątpliwość]: Czy ekran smartphona jest odpowiedni żeby na nim definiować preferencje zakupowe? Sam chyba wolałbym na dużym ekranie laptopa, ale pewnie przy dobrym UI da się to dobrze i wygodnie zorganizować.

### Ad.3 Użytkownik definiuje ustawienia przypominania o dostępności produktów

### Ad.4 Komunikat zwrotny (email w przypadku używania apl. desktopowej, push w przypadku aplikacji mobilnej) z sugestią kupienia X z Y produktów w sklepie Z + link do tegoż z przybliżoną ceną zakupu

optymalnie: link powinien pozwalać na przekierowanie (po zalogowaniu do sklepu), do widoku koszyka już wypełnionego interesującymi nas produktami tak aby jedynymi rzeczami potrzebnymi do zrobienia przez użytkownika były:
 - płatność
 - ewent. szczegóły dostawy





## Flow techniczny na przykładzie integracji z API Ceneo

```plantuml
@startuml
autonumber
actor "Apka i Użytkownik" as Front
control Backend
control "Ceneo" as Partner

loop dodawanie produktów do obserwowanego koszyka
    note over Front, Backend #aqua
       User wpisuje nazwę produktu w wyszukiwarkę API
    end note
    Front -> Backend : Przekazujemy nazwę szukanego produktu do backendu
    Backend -> Partner: Backend odpytuje partenera o sugerowane produkty (ich ID, nazwa, zdjęcie) dla szukanej nazwy
    note over Front, Backend #aqua
       Użytkownik wybiera z sugerowanych produktów te które go interesują
    end note
    Front -> Backend : Apka przekazuje na backend id interesującego użytkownika produktu
    Backend -> Backend: Backend zapisuje sobie ID tego produktu w bazie danych
end
Backend-> Partner: Backend sprawdza dostępność produktów u partnera
Backend -> Backend: analizuje otrzymane dane pod kątem tego w jakim sklepie zakup będzie najkorzystniejszy
Backend -> Front: Backend zwraca odzyskane info o dostępności produktów do apki i link do sklepu (z kodem afiliacyjnym?)
group Opcjonalnie
    note over Front, Backend #aqua
       Użytkownik definiuje ustawienia sprawdzania dostępności produktów koszyka (raz dziennie, raz w tygodniu itp)
    end note
end
@enduml
```
[>większa wersja tego obrazka<](https://ptuml.hackmd.io/svg/dLHBRjim4Dth58DqOmFk1R9eaxOea5MzoG768krIb3WiHPOGzq7FOFGOtNPNvLuTqfQi12dGLWk1tpTltflXJU_H-T2r5GPF9dGxwIgiFJcukhKQGS7zuy_1Quf6wIl07ZuwChwg-UUeXNTOQsd4FBzwBusaSd3Bo8RXgfR8WY214OsIO1s9eFsl7v4NWNQzT95uInu8DFLfq5W1VuQy1FegtIdaPee5h_1BE1tXxvwlGxIg3uq4WocEnob2W0Xnw5FGAgBJl76xlIltCag6BvE23g_VpFZNi7L9QamCsGqJQCOvaPpXcVxkT2SKf0c0iSx9Nyzh9EpWCqVBEwoHGo3emq6wali4Ei1ArP_XxiEcnCKD9D6Cnrh9DOWM9nPDsHt-HQUBZIpAJcK2wK9WuA0BOnWn3vm4pbSPBvraWSU7lrAl58wT9MIgaqoWn1Ajpcg62p6SfNqkvtbuaJFXsVAUE1VMYoalhOaSCl66AAbLkKJFLryofxSEeqZ8ZlP-F5f3Zz_7Rqj1Gl4jsrQzH0iDjgeaIzwbeSkEYc8h2T3ZWvVTYM241hNgeDUjjCmleGuMTkDHPBO66qryl_VSA0stmZ9OKNgXG7HOSn49FfvBWeNTSpijKwZLisP3gnMtTAkCpjD28i0gSTy9PeXxrIgiXyOCtTjrTN34t3xPkY5EZndzPxa9kLT6PN42FpTHIQDmbZoF_qZv_1p0oc62h91X5Xl8CwxHuK22SK5vktvQcDdkczoM_B3z1W00)

## Potrzebne komponenty

Aplikacja mobilna
- Zawiera cały interfejs użytkownika

Backend
- odpowiada za komunikację ze sklepami, przetrzymywanie koszyka itp itd



## Problemy i wątpliwości

Ten sam produkt będzie posiadał różne ID w rożnych sklepach.
Kody kreskowe i identyfikatory pod nimi (EAN-13) nie zawierają globalnych ID produktów, lecz ID produktu w ramach sklepu/firmy/sieci handlowej więc nie są dla nas unikalną informacją identyfikującą produkt

Stąd też żeby apka działała trzeba nam zintegrować się:
- **Opcja A**: z porównywarką (1 lub więcej) cen taką jak Ceneo (najłatwiej)
albo
- **Opcja B**: z kilkoma sklepami z dość bogatą ofertą (nieco trudniej)
albo
- **Opcja C**: z jednym lub więcej rozwiązaniem ecommerce np. Shopify 

lub kombinacja powyższych

**centralny problem tutaj pozostaje taki:**
spytamy kilka sklepów/porównywarek/systemów o np. "Pieluszki Pampers Premium Care" i z każdego dostaniemy np. 3-5 wariantów tego produktu, ale możemy nie być w stanie powiązać ich ze sobą że np. 1 wariant ze sklepu A to ten sam co 3 wariant ze sklepu B i ten sam co 2 wariant ze sklepu C. Trzeba pokminić jak to zrobić.

Oczywiście problem odpada gdy masz tylko jedno źródło danych (takie Ceneo)

Generalnie chcemy mieć tych źródeł danych możliwie jak najmniej, bo np. przy 50,100,200 takich zintegrowanych sklepach, odpytywanie ich o element oferty, nawet po optymalizacji zajmie relatywnie długo (więcej niż 30 sekund) więc user nie może tam na to czekać. Przy wielu źrodłach danych to musiałoby działać tak, że user definiuje koszyk i raz na ustalony czas przesyłana jest mu informacja zwrotna (mail/push msg)


## Varia

### Ceneo

ma, jak się wydaje, dobre API do tego zadania: https://partnerzyapi.ceneo.pl/Pomoc/Service?name=PartnerService#title14




## Następne kroki

- podumać jaki jest ogólny kształt Apki (tylko mobilna, czy mobile i desktop?)
- podumać jaki jest model integracji ze sklepami:
    - z 1-2 porównywarkami (wtedy prościej, dla MVP wystarczy)
    - ze sklepami (trudniej, wolniej)

## Backend - najprostsza struktura danych


```plantuml
@startuml

class User {
    + id
}

class Cart {
    name
    user
    items
}

class CartItem {
    + id
    + name
    + img_url:string
    + requested_qty:int
}

class ItemProvider {
    + cart_item_id
    + partner_id
    + product_id
}

class Partner {
    + name
    + auth_infos
}
class ReminderSetting {
    cart_id
    cron:string
    active:bool
}

User --|{ Cart
Cart }|--|{ CartItem
CartItem --|{ ItemProvider
Partner --|{ ItemProvider
User --|{ ReminderSetting


```