لماذا؟
قبل بضع سنوات ، أصبحت مهتمًا بالحصول على دخل سلبي وقررت تجربة الاستثمار باستخدام منصات p2b. بعد مرور بعض الوقت ، أصبح من الواضح أن الأموال كانت مجزأة جدًا بسبب المواقع والبنوك والديون ، مما جعل من الصعب فهم الموقف. لم أستطع الإجابة على السؤالين الأكثر أهمية:
كم من المال لدي؟
ما هو الاتجاه؟ هل أنا أكثر ثراءً أم أفقرًا؟
كان من الضروري جمع المعلومات بطريقة أو بأخرى والحفاظ عليها محدثة.
كانت حلول المشكلة كما يلي:
الجدول في صحائف جوجل
المزايا: يتم ذلك بسرعة ، بمرونة ، مجانًا
العيوب: الحاجة إلى تحديث البيانات يدويا
في البداية ، استخدمت هذا الخيار ، ولكن العمل المستمر للحفاظ عليه كان متعبًا: اضطررت للذهاب إلى العديد من الحسابات الشخصية وإعادة كتابة البيانات من هناك. بالإضافة إلى ذلك ، كان لبعض الأصول تقلبات عالية ، وبالتالي فإن عدم انتظام البيانات أثر على جودة صنع القرار.
الحلول المتخصصة
في معظم الحالات ، هذه هي نفس الجداول ، فقط مع واجهة لطيفة / مريحة.
في حالات نادرة ، هناك تكامل مع العديد من البنوك ، ولكن في جميع الحالات التي حاولت - كانت غير مستقرة وغير موثوق بها. خائفًا أيضًا من الحاجة إلى إعطاء اسم المستخدم / كلمة المرور من الخدمات المصرفية عبر الإنترنت وعدم وجود تكامل مع مصادر البيانات غير القياسية.
أصبح من الواضح أنك ستضطر إلى كتابة خدمة مناسبة بنفسك - هذه هي الطريقة الوحيدة لأتمتة استلام البيانات المالية بشكل كامل ، وفي الوقت نفسه لا تقلق بشأن نقل التفاصيل إلى جهة خارجية. بالإضافة إلى ذلك ، سيسمح بتنفيذ أي واجهة مطلوبة. هكذا بدأ مشروع BudgetTracker ، الذي استخدمه بنجاح منذ عامين. يمكن تنزيله كمصدر و / أو تثبيته على الخادم الخاص بك كحاوية لرسو السفن الجاهزة.
الفكرة الرئيسية
هناك جانبان مختلفان لكيفية النظر إلى التمويل. من ناحية ، هناك الحالة الحالية (مشروطة - الآن هناك "Y" من المال على الحساب "X") ، من ناحية أخرى ، هناك معاملات (مشروطة - شراء "XX" مقابل أموال "UUU" في الوقت T).
هذان الجانبان من التمويل مستقلان عملياً عن بعضهما البعض ، لكنهما ضروريان لفهم الاتجاه العام. مثال بسيط هو أن لدينا أصلًا مشابهًا لإيداع (على سبيل المثال ، سندات) ، نشتريها بشكل دوري.
لبناء رسم بياني للتغير في قيمة هذا الأصل (والتوقعات) ، من المهم عدم مراعاة الشراء.
مصادر البيانات
هناك موفرين مختلفين - مصادر البيانات ، على سبيل المثال ، جمع البيانات من بنك العميل.
قائمة مقدمي الدعم- FX - أسعار الصرف: EUR ، USD
- LiveCoin - تبادل العملة المشفرة
- Penenza
- Alfabank
- الفا كابيتال
- الفا المباشر
- ألفا ستريم
- ModulBank
- ModulDengi
- رايفايزن
- الديون والقروض (للديون المدخلة يدويا)
- POST-api لتلقي البيانات التعسفية من النظم الخارجية
نظرًا لأن بعض مقدمي الخدمة يحتاجون إلى مصادقة الرسائل القصيرة ، فهناك أيضًا تكامل مع SMS عبر IFTTT (فقط لأجهزة Android).
كل يوم ، يجمع مزود حالة كل من الحسابات وقائمة بجميع المعاملات ويحفظها في قاعدة البيانات. للقيام بذلك ، يبدأ Chrome ، وبمساعدة السيلينيوم ، يتم استخراج البيانات اللازمة من البنوك عبر الإنترنت.
حسابات
تشكل حالات كل حساب جدول النموذج:

هذا يجعل من الممكن رؤية تفاصيل وحالة كل حساب ، لكنه لا يساعد في رؤية الصورة الكبيرة ، ولا يعطي إجابة على السؤال البسيط "كم من المال لدي؟".
للإجابة على هذا السؤال ، تمت إضافة دعم "الأعمدة المحتسبة" ، حيث يمكنك تحديد صيغة ، على سبيل المثال:

لكن بالإضافة إلى القيمة المحددة ، أريد أيضًا أن أرى الاتجاه ، والانبعاثات ، والتنبؤات - بمعنى آخر ، انظر ديناميات هذه القيمة (وأحيانًا ليست واحدة فقط).
للقيام بذلك ، هناك مفهوم "الصفحة الرئيسية" حيث يمكنك تكوين الحاجيات الفردية من أجل التركيز على أعمدة / اتجاهات محددة.
الحاجيات

هناك عدة أنواع من الحاجيات:
- دونات مع النفقات (من المعاملات)
- "القيمة الأخيرة" هي مخطط خطي للأعمدة التعسفية ، يُظهر التغيير المتوقع في السنوي (٪) ، والقيمة الفعلية لليوم الأخير (٪). يحدث هذا أيضًا في الوضع "المضغوط" ، عندما يعرض القيمة الحالية (الأخيرة) فقط.
- "دلتا" - يعرض تغييرات العمود في الأرقام خلال آخر 24 ساعة و 48 ساعة وأسبوع واحد وشهر واحد
- "دونات" - للأعمدة المحسوبة
- "الرسم البياني" - للأعمدة المحسوبة
لكل نوع من عناصر واجهة المستخدم حجمه الخاص ، ويمكن نقلها بالنسبة إلى بعضها البعض باستخدام "الأسهم". بشكل افتراضي ، تكون مخفية ، وتظهر عند النقر فوق الزر "العين" في الجزء العلوي من الصفحة:

أيضًا ، عند إنشاء عنصر واجهة مستخدم أو تحريره ، من الممكن تغيير أي من إعداداته:

المعاملات
للعمل مع المعاملات ، أو DDS ، هناك صفحة منفصلة حيث يمكنك رؤية جميع المعاملات مجمعة حسب الفئة.

كل معاملة لها "نوع" المعاملة - إنها "دخل" أو "حساب" أو "تحويل". يتم تعيين الترجمة يدويًا لاستبعاد الترجمات من المخططات من الصفحة الرئيسية.
قد يكون من المناسب تسهيل جدول الأصول من مزودي الخدمات الذين ليس لديهم معاملات. على سبيل المثال ، سوق الأوراق المالية. يمكنك شراء الأسهم ، ويمكنها أيضًا أن تنمو في السعر ، وعلى الرسم البياني ، غالبًا ما ترغب في رؤية النوع الثاني من الأحداث فقط.
إذا لم يكن مزود البيانات يدعم المعاملاتفي هذه الحالة ، من المناسب إضافة المعاملات التي تم إنشاؤها تلقائيًا في خصائص العمود ، وفي وقت الشراء ، قم بتحرير المعاملة التي تم شراء الأسهم فيها وتعيين النوع على "نقل".
يمكن تعيين الفئات والأنواع يدويًا (يجب عليك الحصول عليها أولاً) ، وبناءً على القواعد. عند تعيين فئة إلى معاملة ، يتم تثبيت نفسه تلقائيًا على جميع المعاملات الأخرى بنفس الوصف (وسيتم تطبيقه أيضًا على المعاملات المماثلة في المستقبل). بالإضافة إلى إعداد الفئة يدويًا على معاملة ما ، يمكنك إضافة قاعدة في شكل تعبير عادي أو سلسلة فرعية لتعيين الفئة تلقائيًا إلى جميع المعاملات المناسبة.
يوجد أيضًا قسم منفصل "الديون" ، حيث يمكنك عمل الديون يدويًا. لكل دين ، يمكنك أيضًا تعيين قالب للمعاملة ، بحيث يتم تحديث المبلغ المتبقي عند ظهور DDS جديدة متعلقة بهذا الدين.

كومة التكنولوجية
تعمل الواجهة الخلفية حاليًا على .NET Core 3 ، الواجهة الأمامية على Svelte 3.
يستخدم ObjectRepository + LiteDB لتخزين البيانات.
للتكامل مع مصادر البيانات ، يتم استخدام حزمة Selenium + Chrome.
في البداية ، تم كتابة كل شيء بالكامل في .NET Core ، ولكن منذ بعض الوقت ، تمت إعادة كتابة الواجهة الأمامية في Svelte.
بسبب هذا التراث ، لم يتم التواصل مع الخادم على النحو الأمثل وهناك خطط لإعادة كتابة هذا الجزء من المشروع إلى نموذج تفاعلي.
كيف تحاول
سيساعد ملف docker-compose.yml في المستودع :
version: "3.3" services: budgettracker: image: diverofdark/budgettracker:master restart: unless-stopped environment: Properties__IsProduction: 'true' # true . ConnectionStrings__LiteDb: '/data/budgettracker.db' volumes: - /dev/shm:/dev/shm # Google Chrome - /root/bt:/data ports: - "80:80" networks: public: {} networks: public: driver: bridge