Upcoming Payments — Documentation

Upcoming Payments — Πλήρες Documentation

Perfex CRM Module · MECE · v1.0.0 Τελευταία ενημέρωση: 2026-06-25


Πίνακας περιεχομένων

  1. Επισκόπηση
  2. Scope — τι κάνει / τι ΔΕΝ κάνει
  3. Κατάσταση φάσεων
  4. Οδηγός χρήσης ανά καρτέλα
  5. Σενάρια τεστ για συνεργάτη
  6. Αυτοματισμοί (Cron)
  7. Τεχνικό παράρτημα
  8. Known limitations / εκκρεμότητες
  9. Πρόσβαση για τεστ

1. Επισκόπηση

Το Upcoming Payments είναι αυτόνομο Perfex CRM module για τη διαχείριση αναμενόμενων εισπράξεων του λογιστηρίου. Αντικαθιστά ένα core-hack (eleni #21139) που υπήρχε απευθείας στο Perfex, μεταφέρει ανέπαφα ~1.128 υπάρχουσες εγγραφές, και επεκτείνεται με αυτοματισμούς είσπραξης.

Ποιο πρόβλημα λύνει

Το γραφείο κόβει τιμολόγια σε πελάτες. Μεταξύ έκδοσης τιμολογίου και πραγματικής είσπραξης μεσολαβεί χρόνος — συχνά εβδομάδες ή μήνες. Το module καταγράφει πότε αναμένεται να εισπραχθεί κάθε ποσό, παρακολουθεί αν τηρείται το πλάνο, στέλνει αυτόματες υπενθυμίσεις/οχλήσεις στους πελάτες που αργούν, και δίνει dashboard εικόνα της ταμειακής ροής.

Σε ποιον απευθύνεται

Ρόλος Χρήση
Λογιστής Καταχώρηση επερχόμενων πληρωμών ανά τιμολόγιο, παρακολούθηση inbox, export
Εισπράκτορας Worklist assigned πελατών, follow-up logs, legal marker
Manager/Admin Dashboard KPIs, ρύθμιση dunning ladder, εξουσιοδοτήσεις, απόφαση για νομική κλιμάκωση

2. Scope

✅ ΤΙ ΚΑΝΕΙ

❌ ΤΙ ΔΕΝ ΚΑΝΕΙ


3. Κατάσταση φάσεων (Φ0–Φ4)

Φάση Τίτλος Κατάσταση Περιεχόμενο
Φ0 Module-ization ✅ Ολοκληρωμένη Μεταφορά core-hack σε αυτόνομο module. Διατήρηση 1.128 records. Zero core hacks. Πλήρης parity λειτουργικότητας.
Φ1 Engine Foundations ✅ Ολοκληρωμένη Auto-status lifecycle cron, dunning engine (test+production), auto-split partial payment, F7 notification νέου τιμολογίου, audit log, error log, run log.
Φ2 Monthly Cash Dashboard ✅ Ολοκληρωμένη KPI cards (αναμενόμενα/εισπραχθέντα/εκτός πλάνου), εβδομαδιαίο chart, top-20 πελάτες, DSO/CEI/ADD/MDD strip, aging buckets, νυχτερινό snapshot cron. Bank Transactions data layer (sync από NBG — δεδομένα μόνο, ΟΧΙ matching).
Φ3 Collections ✅ Ολοκληρωμένη Off-plan clients table, Worklist tab, ανάθεση collector, follow-up log (τύπος/αποτέλεσμα/επόμενο βήμα), legal marker placeholder, φίλτρα (ημέρες/ποσό/collector).
Φ4 Payment Plans / Δόσεις ❌ Δεν έχει ξεκινήσει Splitting μιας οφειλής σε N αναμενόμενες εισπράξεις. Templates δόσεων. Πρόωρη εξόφληση, αναβολή δόσης.
Bank Φ2 Bank Matching Engine ❌ Δεν υλοποιήθηκε Auto-matching τραπεζικής κίνησης με upcoming payments. Υψηλό ρίσκο — schema έτοιμο, λογική όχι.

Υπόμνημα statuses

Τα 6 core statuses (αμετάβλητα — προστατευμένα από διαγραφή/μετονομασία):

Status Χρώμα Σημασία
Σε αναμονή 🔵 Μπλε Προγραμματισμένη, δεν έχει φτάσει η ημερομηνία
Προς Έλεγχο 🟣 Μωβ Η ημερομηνία έφτασε σήμερα — περιμένει επιβεβαίωση
Έχει λήξει 🔴 Κόκκινο Πέρασε η ημερομηνία χωρίς είσπραξη
Ολοκληρωμένη 🟢 Πράσινο Εισπράχθηκε
Με υπόλοιπο 🟠 Πορτοκαλί Μερική είσπραξη
Ακυρωμένη ⚫ Γκρι Ακυρώθηκε χειροκίνητα

4. Οδηγός χρήσης ανά καρτέλα

Πρόσβαση: Sidebar → «Upcoming Payments» (εικονίδιο credit card). 5 υπό-μενού: Dashboard · Inbox · Λίστα · Collections · Ρυθμίσεις.

Το sidebar badge (κόκκινος αριθμός) δείχνει τα τιμολόγια στο Inbox που δεν έχουν κάλυψη. Ανανεώνεται κάθε 15 λεπτά (ή μετά από cron run).


4.1 Dashboard

URL: ?group=dashboard

Η καρτέλα «σύνοψης» — ιδανική για το πρωινό check-in του manager.

Τι βλέπει ο χρήστης:

Month Picker

Πλοήγηση με < / > ανά μήνα. Κουμπί 📅 επιστρέφει στον τρέχοντα μήνα. Αλλαγή μήνα → AJAX reload KPIs + chart + clients (χωρίς reload σελίδας).

3 KPI Cards

Card Χρώμα Τι μετράει
Αναμενόμενα 🔵 Μπλε Σύνολο upcoming με status «Σε αναμονή» ή «Προς Έλεγχο» για τον επιλεγμένο μήνα
Εισπραχθέντα 🟢 Πράσινο Πραγματικές πληρωμές (tblinvoicepaymentrecords) για τον μήνα
Εκτός Πλάνου 🔴 Κόκκινο Upcoming με status «Έχει λήξει» για τον μήνα

Κάθε card δείχνει ποσό, πλήθος εγγραφών, και trend % vs προηγούμενο μήνα (↑/↓ ή «—» αν δεν υπάρχει ιστορικό).

Εβδομαδιαίο Bar Chart (W1–W5)

Σύγκριση αναμενόμενων / εισπραχθέντων / εκτός πλάνου ανά εβδομάδα μήνα. Χρησιμοποιεί Chart.js — fallback σε CSS bars αν δεν φορτωθεί.

Top-20 Πελάτες

Πίνακας με τους 20 πελάτες με το μεγαλύτερο υπόλοιπο (αναμενόμενα − εισπραχθέντα) για τον μήνα. Ταξινόμηση κατά υπόλοιπο φθίνον.

DSO/CEI/Aging Strip (μωβ panel)

Δεδομένα από forecast snapshot (νυχτερινός cron ή χειροκίνητο trigger). ΔΕΝ αλλάζει με το month picker — δείχνει πάντα την τελευταία ημερήσια εικόνα.

Μετρική Χρώμα Ερμηνεία
DSO (Days Sales Outstanding) 🔵 Info Μέσες ημέρες για είσπραξη (βάση 90d). Χαμηλότερο = καλύτερο.
CEI (Collection Effectiveness Index) 🟢 Success % αποτελεσματικότητας είσπραξης (0–100%). Υψηλότερο = καλύτερο.
ADD (Average Days Delinquent) 🟡 Warning Μέσες ημέρες καθυστέρησης. Χαμηλότερο = καλύτερο.
MDD (Maximum Days Delinquent) 🔴 Danger Μέγιστες ημέρες καθυστέρησης οποιουδήποτε overdue.

Aging buckets: τρέχον / 1–30 / 31–60 / 61–90 / 90+ ημέρες, με horizontal bar chart.

Κουμπί «Ανανέωση Snapshot» (για edit/configure permission): εκτελεί χειροκίνητα το forecast.


4.2 Inbox (Προς Καταχώρηση)

URL: ?group=inbox

Τιμολόγια που έχουν υπόλοιπο αλλά δεν καλύπτονται πλήρως από upcoming payments. Αυτά χρειάζονται προγραμματισμό.

Στήλες DataTable:

Φίλτρα: Πελάτης · Ημερομηνία Από–Έως.

Ροή χρήσης:

  1. Ο λογιστής ανοίγει το Inbox
  2. Βλέπει τα ανοιχτά τιμολόγια χωρίς κάλυψη
  3. Κλικ «Πρόσθεσε Πληρωμή» → modal με φόρμα batch καταχώρησης
  4. Καταχωρεί ποσό + ημερομηνία αναμενόμενης είσπραξης (μπορεί περισσότερες γραμμές)
  5. Submit → εγγραφές στο tblupcomingpayments + activity log

4.3 Λίστα (Όλες οι Επερχόμενες)

URL: ?group=list

Πλήρης λίστα όλων των upcoming payments με πλούσια φίλτρα, bulk actions, και CSV export.

Φίλτρα:

Στήλες DataTable:

Ενέργειες ανά γραμμή:

Bulk Actions (επιλογή πολλαπλών):

CSV Export: «Εξαγωγή CSV» εξάγει τα τρέχοντα φιλτραρισμένα αποτελέσματα. Περιλαμβάνει BOM για σωστά ελληνικά σε Excel.

Drill-down ανά τιμολόγιο: Κλικ στον αριθμό τιμολογίου → σελίδα invoice_upcoming/{id} με όλες οι upcoming + timeline δραστηριότητας + επισυναπτόμενα.


4.4 Ρυθμίσεις (Settings)

URL: ?group=settings — ορατό μόνο σε χρήστες με edit permission

Dunning Banner

Αν το dunning engine είναι ανενεργό, εμφανίζεται banner προειδοποίησης με κουμπί «Ενεργοποίηση Test Mode». Αν είναι σε test mode, εμφανίζεται info banner. Όταν ενεργοποιηθεί production, τα banner εξαφανίζονται.

Γενικές Ρυθμίσεις (αριστερά panel)

Ρύθμιση Τι κάνει
Ειδοποίηση Email Γενικό toggle ειδοποιήσεων (placeholder — δεν ελέγχει dunning)
Ειδοποίηση SMS Γενικό toggle SMS
Production Email Dunning Αν ON: στέλνει πραγματικά emails στους πελάτες (απαιτεί enabled engine)
Production SMS Dunning Αν ON: στέλνει πραγματικά SMS
Email για νέο τιμολόγιο (F7) Στέλνει email στον default_assignee όταν ανοιχτεί νέο τιμολόγιο
Auto-split μερικής πληρωμής Αυτόματη δημιουργία υπολειπόμενης upcoming μετά μερική πληρωμή
Default Υπεύθυνος Staff που αναλαμβάνει auto-tasks και λαμβάνει F7 notifications
Ώρα cron Ώρα εκτέλεσης auto-status lifecycle (0–23, default: 9)
Εξαιρέσεις Πελατών Multi-select: πελάτες που εξαιρούνται από auto-tasks και dunning

Καταστάσεις (δεξί panel)

Διαχείριση statuses: add/edit (χρώμα + σειρά). Τα 6 system statuses είναι προστατευμένα (σήμα «system» — επιτρέπεται μόνο αλλαγή χρώματος/σειράς, ΟΧΙ μετονομασία ή διαγραφή). Custom statuses: πλήρης CRUD.

Dunning Ladder (κάτω panel)

Πίνακας κανόνων ειδοποίησης. Default ladder (seed αν άδειο):

# Stage Offset Direction Channel
1 Υπενθύμιση (πριν τη λήξη) 3 μέρες before email
2 1η όχληση 1 μέρα after email
3 2η όχληση 15 μέρες after email
4 Τελική όχληση 30 μέρες after SMS

Ενέργειες ladder:

Error Log

Εμφανίζεται μόνο αν υπάρχουν errors στην τελευταία ώρα. Δείχνει τα 5 τελευταία errors με timestamp, automation, και μήνυμα σφάλματος.


4.5 Collections (Εκτός Πλάνου)

URL: ?group=collections

Εργαλείο είσπραξης: πελάτες με overdue upcoming payments (status «Έχει λήξει»), ανατεθειμένοι σε υπεύθυνους, με follow-up tracking.

Φίλτρα

Sub-tabs

«Εκτός Πλάνου» (default): Όλοι οι πελάτες με overdue, ταξινομημένοι κατά συνολικό overdue ποσό (φθίνον). Ανεξάρτητο της ανάθεσης.

«Worklist μου»: Μόνο πελάτες με assigned_collector = τρέχων_χρήστης. Προσωπική λίστα εισπράκτορα.

Στήλες DataTable (server-side)

Στήλη Περιεχόμενο
Πελάτης Link → client profile
Overdue Πλήθος εγγραφών (κόκκινο badge)
Ποσό Σύνολο overdue
Ημέρες Μέγιστο (badge danger/warning/default) + μέση τιμή
Τελευταία Επαφή Ημ/νία τελευταίου follow-up (ή «—»)
Υπεύθυνος Assigned collector
Ενέργειες 4 κουμπιά

4 Κουμπιά Ενεργειών

1. «Ανάθεση» (Assign):

2. «Follow-up» (📞):

3. «Νέο Πλάνο» (link):

4. «Νομικά» (⚖️):


5. Σενάρια τεστ

Για τον συνεργάτη: Δοκιμάστε στο https://c3.mece.app. Ο λογαριασμός σας έχει admin δικαιώματα. Email/SMS αποστολή είναι κομμένη στο clone — τα logs γράφονται κανονικά.


Σενάριο 1 — Πλοήγηση & sidebar badge

Βήματα:

  1. Login ως admin
  2. Ανοίξτε το sidebar και εντοπίστε το «Upcoming Payments»
  3. Παρατηρήστε τον κόκκινο αριθμό badge
  4. Κάντε κλικ → φορτώνει dashboard (default landing)
  5. Δοκιμάστε κλικ σε κάθε submenu (Dashboard · Inbox · Λίστα · Collections · Ρυθμίσεις)

Αναμενόμενο: Κάθε καρτέλα φορτώνει χωρίς error. Badge = αριθμός εγγραφών Inbox.


Σενάριο 2 — Καταχώρηση επερχόμενης πληρωμής από Inbox

Βήματα:

  1. Πηγαίνετε στο Inbox
  2. Βρείτε ένα τιμολόγιο με % καλυμμένο < 100%
  3. Κλικ «Πρόσθεσε Πληρωμή»
  4. Στο modal: καταχωρήστε ποσό = π.χ. 500 και ημερομηνία 30 ημέρες από σήμερα
  5. Submit

Αναμενόμενο: Alert «Επερχόμενες πληρωμές καταχωρήθηκαν επιτυχώς». Το τιμολόγιο εμφανίζεται με ενημερωμένο % στο Inbox (ή εξαφανίζεται αν 100%). Στη Λίστα εμφανίζεται η νέα εγγραφή με status «Σε αναμονή».


Σενάριο 3 — Φίλτρα & export στη Λίστα

Βήματα:

  1. Πηγαίνετε στη Λίστα
  2. Επιλέξτε status «Έχει λήξει»
  3. Επιλέξτε ένα συγκεκριμένο πελάτη
  4. Κλικ «Εφαρμογή Φίλτρων» (ή Enter)
  5. Κλικ «Εξαγωγή CSV»

Αναμενόμενο: Το datatable φιλτράρει. Το CSV κατεβαίνει με τα φιλτραρισμένα δεδομένα. Τα ελληνικά εμφανίζονται σωστά στο Excel (BOM).


Σενάριο 4 — Αλλαγή status (μεμονωμένη)

Βήματα:

  1. Στη Λίστα, βρείτε μια εγγραφή «Σε αναμονή»
  2. Κλικ στο εικονίδιο ενεργειών → «Αλλαγή κατάστασης» → «Ολοκληρωμένη»

Αναμενόμενο: AJAX response, το badge status αλλάζει αμέσως. Στο audit log (tblupcomingpayments_audit) υπάρχει νέα εγγραφή με action status_change.


Σενάριο 5 — Bulk actions

Βήματα:

  1. Στη Λίστα, επιλέξτε 3–4 γραμμές (checkbox)
  2. Dropdown «Μαζικές ενέργειες» → «Αλλαγή κατάστασης» → status = «Με υπόλοιπο»
  3. Confirm

Αναμενόμενο: Alert «X εγγραφές ενημερώθηκαν». Οι επιλεγμένες γραμμές αλλάζουν status.


Σενάριο 6 — Dashboard: navigation + KPIs

Βήματα:

  1. Πηγαίνετε στο Dashboard
  2. Παρατηρήστε τα 3 KPI cards για τον τρέχοντα μήνα
  3. Κλικ < για τον προηγούμενο μήνα
  4. Παρατηρήστε ότι οι αριθμοί αλλάζουν (AJAX) χωρίς reload
  5. Κλικ 📅 για επιστροφή στον τρέχοντα μήνα

Αναμενόμενο: Ομαλή AJAX πλοήγηση. Τα KPIs, chart, και clients table ανανεώνονται.


Σενάριο 7 — DSO/CEI Aging Strip

Βήματα:

  1. Στο Dashboard, κοιτάξτε το μωβ panel «Ταμειακή Πρόβλεψη»
  2. Αν λέει «Δεν υπάρχει snapshot», κλικ «Ανανέωση Snapshot»
  3. Επιβεβαιώστε το confirm dialog

Αναμενόμενο: Alert επιτυχίας. Το panel εμφανίζει DSO/CEI/ADD/MDD και aging bars με ημερομηνία snapshot σήμερα.


Σενάριο 8 — Ρυθμίσεις: dunning ladder

Βήματα:

  1. Πηγαίνετε στις Ρυθμίσεις
  2. Δείτε το dunning banner (αν engine off) — κλικ «Ενεργοποίηση Test Mode»
  3. Δείτε τον πίνακα dunning rules
  4. Κλικ «+ Νέος Κανόνας» → modal: stage = «Test Rule», offset = 7, direction = after, channel = email, active ✅
  5. Save
  6. Βεβαιωθείτε ότι εμφανίζεται στον πίνακα
  7. Κλικ «Δοκιμαστικό Τρέξιμο» → confirm

Αναμενόμενο: Νέος κανόνας εμφανίζεται. Alert «Δοκιμαστικό τρέξιμο ολοκληρώθηκε — X εγγραφές run log». ΔΕΝ έχουν σταλεί πραγματικά emails.


Σενάριο 9 — Εξαίρεση πελάτη από αυτοματισμούς

Βήματα:

  1. Ρυθμίσεις → «Εξαιρέσεις Πελατών»
  2. Επιλέξτε ένα πελάτη (π.χ. «Test Client»)
  3. Save
  4. Βεβαιωθείτε ότι ο πελάτης εμφανίζεται επιλεγμένος μετά το reload

Αναμενόμενο: Αποθηκεύεται ως JSON array στο settings. Ο cron ΔΕΝ θα δημιουργεί task για αυτόν τον πελάτη (μόνο αλλάζει status). Το dunning engine τον παρακάμπτει.


Σενάριο 10 — Collections: ανάθεση & follow-up

Βήματα:

  1. Πηγαίνετε στο Collections
  2. Βρείτε έναν πελάτη στο «Εκτός Πλάνου» tab
  3. Κλικ «Ανάθεση» → modal → επιλέξτε έναν staff → «Αποθήκευση»
  4. Κλικ «Follow-up» → modal → τύπος «τηλέφωνο», outcome «Ο πελάτης υποσχέθηκε να πληρώσει εντός 5 ημερών», next_action_date = 5 ημέρες → Save

Αναμενόμενο: Η στήλη «Υπεύθυνος» ενημερώνεται. Η στήλη «Τελευταία Επαφή» δείχνει τώρα. Worklist tab δείχνει τον πελάτη αν ο τρέχων χρήστης είναι ο assigned collector.


Βήματα:

  1. Στο Collections, βρείτε έναν πελάτη με μεγάλη οφειλή
  2. Κλικ «Νομικά» (εικονίδιο σφυρί)

Αναμενόμενο: Κουμπί αλλάζει χρώμα σε κίτρινο (marked). Δεύτερο κλικ → ξαναγίνεται γκρι (unmark). Audit log καταγράφει την αλλαγή.


Σενάριο 12 — Worklist (προσωπική λίστα)

Βήματα:

  1. Στο Collections, κλικ sub-tab «Worklist μου»
  2. Βεβαιωθείτε ότι εμφανίζονται μόνο πελάτες assigned στον τρέχοντα χρήστη

Αναμενόμενο: Αν δεν είναι ανατεθειμένος κανείς → κενή λίστα. Αν έγινε ανάθεση στο Σενάριο 10 με τον τρέχοντα χρήστη → εμφανίζεται εκεί.


Σενάριο 13 — Invoice integration (per-invoice tab)

Βήματα:

  1. Πηγαίνετε σε οποιοδήποτε τιμολόγιο (Invoices → προβολή)
  2. Δείτε το button «+ Επερχόμενες Πληρωμές» επάνω δεξιά
  3. Κλικ → modal batch καταχώρησης
  4. Δείτε το tab «Επερχόμενες Πληρωμές» στο τιμολόγιο (badge με πλήθος εγγραφών)

Αναμενόμενο: Το button και το tab εμφανίζονται μέσω hooks (χωρίς core template hacks). Οι εγγραφές εμφανίζονται και στη Λίστα του module.


Σενάριο 14 — Statuses: add custom + προστασία system

Βήματα:

  1. Ρυθμίσεις → «+ Νέα Κατάσταση» → name = «Σε Διαπραγμάτευση», color = #673AB7
  2. Save → εμφανίζεται στον πίνακα
  3. Δοκιμάστε επεξεργασία ενός system status (π.χ. «Έχει λήξει») → αλλάξτε χρώμα
  4. Δοκιμάστε διαγραφή system status

Αναμενόμενο: Custom status: δημιουργία/επεξεργασία/διαγραφή OK. System status: αλλαγή χρώματος ΟΚ, μετονομασία αδύνατη, διαγραφή αδύνατη (warning alert).


6. Αυτοματισμοί (Cron)

Τρεις cron tasks — τρέχουν αυτόματα από τον Perfex native cron (per-minute via /cron/index).

6.1 upcoming_payments_cron — Auto-Status Lifecycle

Πότε τρέχει: Κάθε cron cycle, αλλά εκτελεί transitions μόνο στην ορισμένη ώρα (default: 9:00 π.μ., ρυθμιζόμενο από Ρυθμίσεις).

Τι κάνει:

  1. Σε αναμονή → Προς Έλεγχο: upcoming με date = σήμερα και status «Σε αναμονή» μεταβαίνουν σε «Προς Έλεγχο»
  2. Προς Έλεγχο → Έχει λήξει: upcoming με date = χθες και status «Προς Έλεγχο» μεταβαίνουν σε «Έχει λήξει»
  3. Auto-task: για κάθε νέα «Έχει λήξει» (εκτός εξαιρούμενων πελατών), δημιουργεί Perfex task:
  4. Dunning engine run (run_dunning_cron): ελέγχει active κανόνες vs target dates
  5. Badge cache refresh: ανανεώνει το sidebar badge

Ρύθμιση ώρας: Ρυθμίσεις → «Ώρα εκτέλεσης αυτοματισμών» (0–23). Αποθηκεύεται στο tbloptions.upcomingpayments_auto_operations_hour.

6.2 upcoming_payments_forecast_snapshot_cron — Νυχτερινό Snapshot

Πότε τρέχει: Κάθε cron cycle, αλλά εκτελεί μόνο μεταξύ 00:00–05:59 (νυχτερινό window). Idempotent (UPSERT ανά ημέρα).

Τι κάνει: Υπολογίζει και αποθηκεύει στο tblupcomingpayments_forecast_snapshots:

KPI Υπολογισμός
aging_current Σύνολο upcoming με date ≥ σήμερα (μη-ακυρωμένα/ολοκληρωμένα)
aging_1_30 Overdue 1–30 ημέρες
aging_31_60 Overdue 31–60 ημέρες
aging_61_90 Overdue 61–90 ημέρες
aging_90plus Overdue > 90 ημέρες
dso (total_AR / revenue_90d) × 90
cei (begin_AR + revenue_30d − total_AR) / (begin_AR + revenue_30d) × 100
add DSO − Best Possible DSO
mdd MAX(DATEDIFF(today, date)) για overdue

Χειροκίνητο trigger: Dashboard → «Ανανέωση Snapshot» (edit/configure permission).

6.3 bank_transactions_sync — Τραπεζικός Συγχρονισμός

Πότε τρέχει: Κάθε cron cycle, αλλά με throttle ≥ 6 ώρες από το τελευταίο επιτυχές run.

Τι κάνει: POST στον NBG bank collector (PC 10.0.0.10:8044) → κατεβάζει κινήσεις → INSERT IGNORE στο tblbanktransactions (dedupe by transaction_id + source). Timeout 120 δευτερόλεπτα.

Απαιτεί ρύθμιση: tbloptions: bank_collector_url, bank_collector_key, bank_nbg_username, bank_nbg_password — διαμορφώνεται χειροκίνητα (δεν υπάρχει UI ακόμα).

⚠️ Σε clone (c3): Τα credentials δεν είναι configured → ο cron κάνει skip αθόρυβα.


7. Τεχνικό παράρτημα

7.1 Αρχιτεκτονική (MVC)

modules/upcoming_payments/
├── upcoming_payments.php          # Init file — hooks, menu, cron registration
├── install.php                    # Idempotent schema (ADOPT + ALTER + CREATE IF NOT EXISTS)
├── uninstall.php                  # Drop module-only tables (ΠΟΤΕ core tables)
├── controllers/
│   └── Upcoming_payments.php     # AdminController — 30+ endpoints
├── models/
│   ├── Upcoming_payments_model.php  # Business logic (~2140 γραμμές)
│   └── Bank_transactions_model.php  # Bank sync data layer
├── views/
│   ├── manage.php                 # Main tabbed container
│   ├── tabs/
│   │   ├── inbox.php              # Καρτέλα 1
│   │   ├── list.php               # Καρτέλα 2
│   │   ├── settings.php           # Καρτέλα 3
│   │   ├── dashboard.php          # Καρτέλα 4
│   │   └── collections.php        # Καρτέλα 5
│   ├── tables/
│   │   ├── upcoming_payments_table.php   # DataTable config (Λίστα)
│   │   └── inbox_table.php               # DataTable config (Inbox)
│   ├── invoices/
│   │   ├── invoice_upcomingpayments_tab.php  # Per-invoice tab content
│   │   └── record_upcomingpayment_template.php  # Per-invoice batch modal
│   ├── invoice_drilldown.php      # Drill-down σελίδα ανά τιμολόγιο
│   ├── upcoming_payment_view.php  # Single upcoming payment view
│   ├── status_modal.php           # Add/edit status modal
│   └── dunning_rule_modal.php     # Add/edit dunning rule modal
├── assets/
│   └── js/upcoming_payments.js   # Client-side: DataTables, AJAX, modals, Chart.js
├── helpers/
│   └── upcoming_payments_helper.php  # get_upcomingpayments_status_by_id()
├── libraries/merge_fields/
│   ├── Upcomingpayment_merge_fields.php
│   └── Upcomingpayments_list_merge_fields.php
└── language/
    ├── greek/upcoming_payments_lang.php
    └── english/upcoming_payments_lang.php

7.2 Endpoints (Route → Method → Σκοπός)

Βάση URL: admin/upcoming_payments/

Route Method Permission Σκοπός
/ ή list_payments GET view Main tabbed UI (default: dashboard)
table POST view DataTable AJAX — Λίστα
inbox_table POST view DataTable AJAX — Inbox
export_csv GET view CSV export με φίλτρα
bulk_action POST edit Bulk change_status / assign
invoice_upcoming/{id} GET view Drill-down ανά τιμολόγιο
upcoming_payment/{id} GET view Προβολή single upcoming
upcoming_payment/{id} POST edit Ενημέρωση upcoming
delete/{id} GET delete Διαγραφή upcoming
mark_as/{status}/{id} GET edit Status change (AJAX)
pdf/{id} GET view PDF receipt
send_to_email/{id} GET/POST payments/view Email receipt σε contacts
batch_upcomingpayment_modal/{id} GET create Modal AJAX (batch)
add_upcomingpayment POST create Batch insert από modal
record_upcomingpayment POST create Single payment record
delete_upcomingpayment/{id}/{invid} GET delete Διαγραφή από invoice view
save_settings POST edit Αποθήκευση ρυθμίσεων
dunning_rule_modal/{id?} GET edit Modal AJAX (rule add/edit)
save_dunning_rule POST edit Upsert dunning rule
delete_dunning_rule/{id} GET edit/delete Διαγραφή rule
status_modal/{id?} GET edit Modal AJAX (status add/edit)
save_status POST edit Upsert status
delete_status/{id} GET edit/delete Διαγραφή status
dunning_test_run GET edit/configure Manual test run dunning
enable_dunning_production GET edit/configure Ενεργοποίηση production sends
disable_dunning_production GET edit/configure Απενεργοποίηση production
enable_dunning_test_mode GET edit Test mode ON + engine ON
dashboard_kpis GET view AJAX KPIs (?month=YYYY-MM)
dashboard_chart GET view AJAX chart data
dashboard_clients GET view AJAX top-20 clients
trigger_forecast_snapshot GET edit/configure Manual snapshot trigger
collections_data GET view AJAX off-plan DataTable
worklist_data GET view AJAX worklist DataTable
assign_collector POST edit Ανάθεση collector
add_followup POST view Καταχώρηση follow-up
legal_marker POST edit Toggle legal marker

7.3 DB Schema

Adopted (υπάρχοντες πίνακες — ΠΟΤΕ drop)

tblupcomingpayments — κύριος πίνακας

id              INT(11) PK AUTO_INCREMENT
invoiceid       INT(11) FK → tblinvoices.id
amount          DECIMAL(15,2)
date            DATE                          -- αναμενόμενη ημερομηνία είσπραξης
daterecorded    DATETIME
note            TEXT
status          INT(11) FK → tblupcomingpayments_status.id
assigned        INT(11) NULL                  -- Φ0: νέο column (ALTER)
assigned_collector INT(11) NULL              -- Φ3: εισπράκτορας (ALTER)
legal_marker    TINYINT(1) DEFAULT 0          -- Φ3: νομική παραπομπή (ALTER)

tblupcomingpayments_status — καταστάσεις

id              INT(11) PK AUTO_INCREMENT
name            VARCHAR(191)
color           VARCHAR(7)
status_order    INT(11) DEFAULT 0             -- Φ0: νέο column (ALTER)

Νέοι πίνακες (CREATE IF NOT EXISTS)

tblupcomingpayments_settings — ρυθμίσεις module

id    INT(11) PK AUTO_INCREMENT
name  VARCHAR(191) UNIQUE KEY
value LONGTEXT

tblupcomingpayments_dunning_rules — ladder κανόνων

id           INT(11) PK
stage        VARCHAR(191)           -- περιγραφή σταδίου
offset_days  INT(11)
direction    VARCHAR(10)            -- 'before' | 'after'
channel      VARCHAR(20)            -- 'email' | 'sms' | 'inapp'
template_id  INT(11) NULL
sender_role  VARCHAR(100) NULL
active       TINYINT(1)
rule_order   INT(11)

tblupcomingpayments_audit — audit log

id         INT(11) PK
entity     VARCHAR(64)     -- 'upcoming_payment', 'settings', 'client_collector', κλπ
entity_id  INT(11)
action     VARCHAR(32)     -- 'create', 'update', 'delete', 'status_change', 'auto_split', κλπ
old_value  JSON NULL
new_value  JSON NULL
user_id    INT(11) NULL    -- 0 αν cron
ts         DATETIME

tblupcomingpayments_run_log — dunning execution history

id                   INT(11) PK
rule_id              INT(11)
upcomingpayment_id   INT(11)
channel              VARCHAR(20)
action_type          VARCHAR(50)     -- 'test_log' | 'send_email' | 'send_sms' | 'send_inapp'
sent_at              DATETIME
payload              JSON NULL
status               VARCHAR(20)     -- 'logged' | 'sent' | 'failed' | 'skipped'

tblupcomingpayments_error_log — automation errors

id          INT(11) PK
automation  VARCHAR(100)    -- 'dunning_cron'
error       JSON NULL
ts          DATETIME

tblupcomingpayments_forecast_snapshots — DSO/CEI/aging

snap_date   DATE          \
kpi         VARCHAR(64)    > PK(snap_date, kpi) -- UPSERT daily
value       DECIMAL(15,2)
payload     JSON NULL       -- extra context (π.χ. components του DSO)
created_at  DATETIME

tblupcomingpayments_followups — follow-up log (Collections)

id                   INT(11) PK
upcomingpayment_id   INT(11)
staff_id             INT(11)
type                 ENUM('τηλέφωνο','email','συνάντηση','sms')
outcome              TEXT NULL
next_action_date     DATE NULL
call_log_id          INT(11) NULL      -- placeholder για 3CX integration
created_at           DATETIME

tblbanktransactions — bank transactions (Φ1 data layer)

id                  INT(11) PK
transaction_id      VARCHAR(255)    \
source              VARCHAR(50)      > UNIQUE KEY — dedupe
txn_date            DATE
amount              DECIMAL(15,2)
currency            VARCHAR(10)
credit_debit        VARCHAR(10)
counter_party       VARCHAR(500) NULL
related_account     VARCHAR(100) NULL
description         TEXT NULL
accounting_balance  DECIMAL(15,2) NULL
raw_json            JSON NULL
match_status        ENUM('unmatched','suggested','approved','rejected','manual')
match_type          ENUM(...) NULL     -- Φ2 placeholder
match_ref_id        INT(11) NULL       -- Φ2 placeholder
match_confidence    TINYINT NULL       -- Φ2 placeholder
matched_by          INT(11) NULL       -- Φ2 placeholder
matched_at          DATETIME NULL      -- Φ2 placeholder
harvested_at        DATETIME
created_at          DATETIME

tbloptions (Perfex native)

Key Default Σκοπός
upcomingpayments_auto_operations_hour 9 Ώρα εκτέλεσης auto-status
upcomingpayments_inbox_count 0 Badge cache count
upcomingpayments_inbox_count_refreshed 0 Badge cache timestamp
dunning_test_mode 0 Dunning test mode flag
bank_collector_url http://10.0.0.10:8044 NBG collector URL
bank_sync_last_run '' Unix timestamp τελευταίου sync
bank_sync_last_count_new 0 Νέες εγγραφές τελευταίου sync

7.4 Permissions (feature slug: upcomingpayments)

Capability Σε ποιον ανήκει Τι επιτρέπει
view Λογιστής, εισπράκτορας Βλέπει Inbox, Λίστα, Dashboard, Collections
view_all Manager Βλέπει όλα (incl. non-assigned)
create Λογιστής Καταχώρηση νέων upcoming, batch modal
edit Λογιστής, supervisor Αλλαγή status, bulk, Ρυθμίσεις, dunning rules, statuses, assign collector
delete Supervisor Διαγραφή upcoming
configure Admin Enable/disable production dunning, trigger snapshot
view_collections Εισπράκτορας Πρόσβαση Collections tab

7.5 Hooks & Integrations

Hook Πότε φωτίζει Τι κάνει το module
admin_init Κάθε admin request Καταχωρεί permissions + sidebar menu
before_invoice_preview_more_menu_button Invoice view Εμφανίζει button «+ Επερχόμενες»
after_admin_invoice_preview_template_tab_menu_last_item Invoice tabs menu Προσθέτει tab «Επερχόμενες»
after_admin_invoice_preview_template_tab_content_last_item Invoice tab content Περιεχόμενο upcoming tab
after_invoice_preview_template_rendered Invoice rendered Inject modal wrapper + JS assets
after_payment_added Πραγματική πληρωμή εισαχθεί Auto-split partial payment (αν enabled)
after_invoice_added Νέο τιμολόγιο Badge +1 + in-app notification + email (αν f7_notify_email=1)

7.6 Εξωτερικές Εξαρτήσεις

Εξάρτηση Υποχρεωτική Σκοπός
Perfex CRM ≥ 2.3.* ✅ Ναι Core platform
sms_manage module ❌ Προαιρετική SMS dunning (skip αν ανενεργό)
debt_overview module ❌ Προαιρετική Link button στο Dashboard (visible αν active)
Chart.js ❌ Fallback υπάρχει Weekly bar chart — fallback σε CSS bars
NBG Bank Collector (PC 10.0.0.10:8044) ❌ Για bank sync REST API collector για κινήσεις λογαριασμού

7.7 Deploy Flow

1. Ανάπτυξη: τοπικό bench (MECE_BENCH=1, http://127.0.0.1:3301)
2. Commit σε branch feat/* → push
3. PR review (Niko approval)
4. Deploy σε clone: mece-deploy c3
5. Authenticated HTTP verify (c3.mece.app)
6. Merge → deploy live: mece-deploy live

Απόλυτοι κανόνες deploy:


8. Known Limitations / Εκκρεμότητες

Λειτουργικά

Θέμα Κατάσταση Ρίσκο
Payment Plans (Φ4) ❌ Δεν υλοποιήθηκε
Bank matching engine (Bank Φ2) ❌ Schema έτοιμο, λογική absent Υψηλό — auto-matching bank↔︎invoice έχει false positive risk
3CX call_logs integration 🔄 Placeholder μόνο call_log_id column υπάρχει, δεν χρησιμοποιείται
Promise-to-pay tracking ❌ Planned
Legal escalation workflow 🔄 Marker only Το κουμπί «Νομικά» σηματοδοτεί μόνο — δεν ξεκινά workflow
Auto-split ⚠️ Off by default Experimental — δεν δοκιμάστηκε με edge cases μεγάλων ποσών
Followers hardcoded ⚠️ staff id 19 hardcoded Ο follower στις auto-tasks δεν ρυθμίζεται από UI

Τεχνικά

Θέμα Κατάσταση Ρίσκο
Badge TTL 15min ✅ Γνωστό, αποδεκτό Μπορεί να δείχνει παλιό count έως 15 λεπτά
Dunning production off by default ✅ Σκόπιμο Απαιτεί ρητή ενεργοποίηση από admin
Default assignee fallback id=23 ⚠️ Hardcoded fallback Αν το staff id 23 δεν υπάρχει στο target σύστημα, τα auto-tasks δεν αναθέτονται
Bank credentials χωρίς UI ⚠️ Manual config bank_collector_url κλπ χρειάζονται χειροκίνητο INSERT στο tbloptions
SMS εξαρτάται από sms_manage 🔄 Defensive handling Αν δεν είναι active, το SMS channel κάνει skip με status 'skipped_no_sms_module'
Charts fallback ✅ Υλοποιημένο CSS fallback αν Chart.js δεν φορτωθεί

Ρίσκα deployment


9. Πρόσβαση για τεστ

URL https://c3.mece.app
Περιβάλλον Clone (test data — δεν επηρεάζει production)
Credentials Θα σας δοθούν ξεχωριστά (admin account)
Email/SMS Κομμένα στο clone — τα logs γράφονται κανονικά στο DB
Bank sync Skip (credentials δεν configured)
Dunning Test mode — logs only, ΔΕΝ στέλνει

Μετά το τεστ: Οι αλλαγές σας στο c3 δεν μεταφέρονται αυτόματα στο live (mece.app). Κάθε deploy στο live γίνεται μέσω PR + mece-deploy live.


DOC READY: 851