[HomeWallet] Planujemy

Jest niedziela, jest podsumowanie prac nad HomeWallet. Zapraszam!


Cykliczny rachunek

Tak jak pisałem tydzień temu, w tym tygodniu zacząłem prace od cyklicznego rachunku. Mając już gotowy normalny rachunek, pracy tak naprawdę było niewiele. Cykliczny rachunek od zwykłego różni się tym, że ustawiamy w nim datę początkową i końcową oraz cykl co ile ma się on odnawiać.

Widok tworzenia rachunku cyklicznego

Tutaj jednak naszły małe zmiany. Wcześniej w bazie rachunek cykliczny miał swoją tabelę która posiadała ID zwykłego rachunku. Zorientowałem się jednak, że nie ma to sensu. Rachunek ma swoją konkretną datę, więc ta musiałaby się zmieniać, co nie może mieć miejsca. Dodatkowo nie ma sensu dodawać do bazy rachunku dopiero w dniu jego opłacenia, skoro można to zrobić od razu. Pozostaje jedynie kwestia statystyk dla tych rachunków, ale nad tym będę głowić się później.

Kod dodawania rachunku cyklicznego:

var start = model.StartDate;
while (start<=model.EndDate)
{
    var receipt = CreateProduct.CreateReceipt(model.ShopID, _userManager.GetUserId(HttpContext.User), start, _context);
    CreateProduct.CreateReceiptProducts(model.Products, receipt, _context);
    start = start.AddMonths(model.Cycle);
}

Podsumowując: rachunek cykliczny dodajemy bardzo podobnie do zwykłego, ustalając datę początkową i końcową oraz cykl liczony w miesiącach który oznacza co ile ma się ten rachunek odnawiać. Rachunki te są dodawane do bazy od razu, bez czekania na właściwą datę.


Planowanie wydatków

Jedną z podstawowych funkcjonalności aplikacji miało być również planowanie wydatków. Ustalamy jaką kwotę chcemy wydać w danym okresie i dostajemy informacje o tym ile wydaliśmy, ile nam zostało itp.

Aby stworzyć plan wystarczy podać kwotę oraz datę początkową i końcową.

Widok tworzenia planu

Gdy plan już zostanie utworzony, wyświetlą nam się informacje. Na razie są one dostępne pod konkretnym linkiem, docelowo być może będą przypięte na stronie głównej, nie jestem jeszcze pewny jak to ładnie zrobić.

Dostajemy informacje o tym ile wynosi nasz limit, ile już wydaliśmy, ile nam pozostało, ile zostało dni do końca oraz ile wydaliśmy procentowo.

Aktualne założenie jest takie, że możemy mieć jedynie jeden plan w danym czasie. Należało więc zabezpieczyć się przed tworzeniem wielu planów poprzez zwykłe wpisanie adresu. To samo tyczy się edytowania cudzych planów.

Widok podsumowania aktualnego planu

Aby zapobiec tworzeniu nowego planu sprawdzam, czy w bazie znajduje się już dla danego użytkownika plan, który ma datę zakończenia większa niż aktualna. Jeżeli tak, to użytkownik jest przekierowywany do domyślnej strony. W przeciwnym wypadku jest w stanie utworzyć plan.

Przy próbie edycji planu sprawdzam, czy dane id odwołuje się do id planu danego użytkownika oraz czy plan ten jeszcze trwa. Jeżeli któryś z warunków nie jest spełniony to użytkownik również jest przekierowywany do domyślnego widoku. Powoduje to, że plany z przeszłości nie zostaną zmienione przez co statystyki zawsze będą prawdziwe.

public static bool CheckPlanByUserId(string userid,int planid, ApplicationDbContext context)
{
     var lastplan = context.Plans.Max(p => p.ID);
     if (lastplan<planid)
     {
          return false;
     }
     var plan = context.Plans.FirstOrDefault(p => p.ID == planid);
     return plan.UserID == userid;
}

Podobny mechanizm muszę zastosować w przypadku rachunków, z tą różnicą, że edycja wstecz musi być możliwa.


Logika

Zgodnie z założeniami staram się jak najbardziej oddzielać logikę od kontrolerów. Wychodzi mi to coraz lepiej, chociaż nadal potrafię złapać się na pisaniu z rozpędu operacji wewnątrz kontrolera które swobodnie mogę przenieść do oddzielnej klasy. Jestem jednak na dobrej drodze.

public static double GetAlreadySpend(string userid, DateTime startDate, DateTime endDate, ApplicationDbContext context)
{
      var receipts = context.Receipts.Where(r => r.UserID == userid).Include(r=>r.ReceiptProducts).ToList();
      receipts = receipts.Where(r => r.PurchaseDate >= startDate && r.PurchaseDate < endDate).ToList();
      return receipts.SelectMany(receipt => receipt.ReceiptProducts).Sum(product => product.Amount * product.Price);
}

Podsumowanie

 

Ten tydzień był mam nadzieję ostatnim, w którym tak mało czasu poświęciłem na HomeWallet. Powinienem mieć już więcej czasu, który planuje wykorzystać na stworzenie podsumowania danego dnia oraz prawdopodobnie utworzeniu nowych mockupów które być może pomogą mi zauważyć jakieś błędy w dotychczasowym myśleniu lub przynieść nowe pomysły.

Tymczasem na dzisiaj to tyle, dzięki za odwiedziny. Oczywiście cały kod znajdziecie na GitHubie projektu.

Do zobaczenia, cześć!

1 komentarz

  1. Mocno trzymam kciuki za Twój projekt. Mam problem z obecnym rozwiązaniem do spisywania wydatków i budżetowania. A nie mogę znaleźć sensownej alternatywy. Także liczę na Ciebie 🙂

Dodaj komentarz