# 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
```