Perfex CRM Module · MECE · v1.0.0 Τελευταία ενημέρωση: 2026-06-25
Το 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, εξουσιοδοτήσεις, απόφαση για νομική κλιμάκωση |
modules/sales_tower (συνυπάρχει στο repo ως
ξεχωριστό module)| Φάση | Τίτλος | Κατάσταση | Περιεχόμενο |
|---|---|---|---|
| Φ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 έτοιμο, λογική όχι. |
Τα 6 core statuses (αμετάβλητα — προστατευμένα από διαγραφή/μετονομασία):
| Status | Χρώμα | Σημασία |
|---|---|---|
| Σε αναμονή | 🔵 Μπλε | Προγραμματισμένη, δεν έχει φτάσει η ημερομηνία |
| Προς Έλεγχο | 🟣 Μωβ | Η ημερομηνία έφτασε σήμερα — περιμένει επιβεβαίωση |
| Έχει λήξει | 🔴 Κόκκινο | Πέρασε η ημερομηνία χωρίς είσπραξη |
| Ολοκληρωμένη | 🟢 Πράσινο | Εισπράχθηκε |
| Με υπόλοιπο | 🟠 Πορτοκαλί | Μερική είσπραξη |
| Ακυρωμένη | ⚫ Γκρι | Ακυρώθηκε χειροκίνητα |
Πρόσβαση: Sidebar → «Upcoming Payments» (εικονίδιο credit card). 5 υπό-μενού: Dashboard · Inbox · Λίστα · Collections · Ρυθμίσεις.
Το sidebar badge (κόκκινος αριθμός) δείχνει τα τιμολόγια στο Inbox που δεν έχουν κάλυψη. Ανανεώνεται κάθε 15 λεπτά (ή μετά από cron run).
URL: ?group=dashboard
Η καρτέλα «σύνοψης» — ιδανική για το πρωινό check-in του manager.
Τι βλέπει ο χρήστης:
Πλοήγηση με < / > ανά μήνα. Κουμπί 📅
επιστρέφει στον τρέχοντα μήνα. Αλλαγή μήνα → AJAX
reload KPIs + chart + clients (χωρίς reload σελίδας).
| Card | Χρώμα | Τι μετράει |
|---|---|---|
| Αναμενόμενα | 🔵 Μπλε | Σύνολο upcoming με status «Σε αναμονή» ή «Προς Έλεγχο» για τον επιλεγμένο μήνα |
| Εισπραχθέντα | 🟢 Πράσινο | Πραγματικές πληρωμές (tblinvoicepaymentrecords) για τον μήνα |
| Εκτός Πλάνου | 🔴 Κόκκινο | Upcoming με status «Έχει λήξει» για τον μήνα |
Κάθε card δείχνει ποσό, πλήθος εγγραφών, και trend % vs προηγούμενο μήνα (↑/↓ ή «—» αν δεν υπάρχει ιστορικό).
Σύγκριση αναμενόμενων / εισπραχθέντων / εκτός πλάνου ανά εβδομάδα μήνα. Χρησιμοποιεί Chart.js — fallback σε CSS bars αν δεν φορτωθεί.
Πίνακας με τους 20 πελάτες με το μεγαλύτερο υπόλοιπο (αναμενόμενα − εισπραχθέντα) για τον μήνα. Ταξινόμηση κατά υπόλοιπο φθίνον.
Δεδομένα από 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.
URL: ?group=inbox
Τιμολόγια που έχουν υπόλοιπο αλλά δεν καλύπτονται πλήρως από upcoming payments. Αυτά χρειάζονται προγραμματισμό.
Στήλες DataTable:
Φίλτρα: Πελάτης · Ημερομηνία Από–Έως.
Ροή χρήσης:
tblupcomingpayments + activity
logURL: ?group=list
Πλήρης λίστα όλων των upcoming payments με πλούσια φίλτρα, bulk actions, και CSV export.
Φίλτρα:
Στήλες DataTable:
Ενέργειες ανά γραμμή:
Bulk Actions (επιλογή πολλαπλών):
change_status: μαζική αλλαγή κατάστασηςassign: μαζική ανάθεση υπευθύνουCSV Export: «Εξαγωγή CSV» εξάγει τα τρέχοντα φιλτραρισμένα αποτελέσματα. Περιλαμβάνει BOM για σωστά ελληνικά σε Excel.
Drill-down ανά τιμολόγιο: Κλικ στον αριθμό
τιμολογίου → σελίδα invoice_upcoming/{id} με όλες οι
upcoming + timeline δραστηριότητας + επισυναπτόμενα.
URL: ?group=settings — ορατό
μόνο σε χρήστες με edit permission
Αν το dunning engine είναι ανενεργό, εμφανίζεται banner προειδοποίησης με κουμπί «Ενεργοποίηση Test Mode». Αν είναι σε test mode, εμφανίζεται info banner. Όταν ενεργοποιηθεί production, τα banner εξαφανίζονται.
| Ρύθμιση | Τι κάνει |
|---|---|
| Ειδοποίηση 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 |
Διαχείριση statuses: add/edit (χρώμα + σειρά). Τα 6 system statuses είναι προστατευμένα (σήμα «system» — επιτρέπεται μόνο αλλαγή χρώματος/σειράς, ΟΧΙ μετονομασία ή διαγραφή). Custom statuses: πλήρης CRUD.
Πίνακας κανόνων ειδοποίησης. Default ladder (seed αν άδειο):
| # | Stage | Offset | Direction | Channel |
|---|---|---|---|---|
| 1 | Υπενθύμιση (πριν τη λήξη) | 3 μέρες | before | |
| 2 | 1η όχληση | 1 μέρα | after | |
| 3 | 2η όχληση | 15 μέρες | after | |
| 4 | Τελική όχληση | 30 μέρες | after | SMS |
Ενέργειες ladder:
Εμφανίζεται μόνο αν υπάρχουν errors στην τελευταία ώρα. Δείχνει τα 5 τελευταία errors με timestamp, automation, και μήνυμα σφάλματος.
URL: ?group=collections
Εργαλείο είσπραξης: πελάτες με overdue upcoming payments (status «Έχει λήξει»), ανατεθειμένοι σε υπεύθυνους, με follow-up tracking.
«Εκτός Πλάνου» (default): Όλοι οι πελάτες με overdue, ταξινομημένοι κατά συνολικό overdue ποσό (φθίνον). Ανεξάρτητο της ανάθεσης.
«Worklist μου»: Μόνο πελάτες με
assigned_collector = τρέχων_χρήστης. Προσωπική λίστα
εισπράκτορα.
| Στήλη | Περιεχόμενο |
|---|---|
| Πελάτης | Link → client profile |
| Overdue | Πλήθος εγγραφών (κόκκινο badge) |
| Ποσό | Σύνολο overdue |
| Ημέρες | Μέγιστο (badge danger/warning/default) + μέση τιμή |
| Τελευταία Επαφή | Ημ/νία τελευταίου follow-up (ή «—») |
| Υπεύθυνος | Assigned collector |
| Ενέργειες | 4 κουμπιά |
1. «Ανάθεση» (Assign):
2. «Follow-up» (📞):
tblupcomingpayments_followups —
ενημερώνει «Τελευταία Επαφή»3. «Νέο Πλάνο» (link):
4. «Νομικά» (⚖️):
Για τον συνεργάτη: Δοκιμάστε στο
https://c3.mece.app. Ο λογαριασμός σας έχει admin δικαιώματα. Email/SMS αποστολή είναι κομμένη στο clone — τα logs γράφονται κανονικά.
Βήματα:
Αναμενόμενο: Κάθε καρτέλα φορτώνει χωρίς error. Badge = αριθμός εγγραφών Inbox.
Βήματα:
Αναμενόμενο: Alert «Επερχόμενες πληρωμές καταχωρήθηκαν επιτυχώς». Το τιμολόγιο εμφανίζεται με ενημερωμένο % στο Inbox (ή εξαφανίζεται αν 100%). Στη Λίστα εμφανίζεται η νέα εγγραφή με status «Σε αναμονή».
Βήματα:
Αναμενόμενο: Το datatable φιλτράρει. Το CSV κατεβαίνει με τα φιλτραρισμένα δεδομένα. Τα ελληνικά εμφανίζονται σωστά στο Excel (BOM).
Βήματα:
Αναμενόμενο: AJAX response, το badge status αλλάζει
αμέσως. Στο audit log (tblupcomingpayments_audit) υπάρχει
νέα εγγραφή με action status_change.
Βήματα:
Αναμενόμενο: Alert «X εγγραφές ενημερώθηκαν». Οι επιλεγμένες γραμμές αλλάζουν status.
Βήματα:
< για τον προηγούμενο μήναΑναμενόμενο: Ομαλή AJAX πλοήγηση. Τα KPIs, chart, και clients table ανανεώνονται.
Βήματα:
Αναμενόμενο: Alert επιτυχίας. Το panel εμφανίζει DSO/CEI/ADD/MDD και aging bars με ημερομηνία snapshot σήμερα.
Βήματα:
Αναμενόμενο: Νέος κανόνας εμφανίζεται. Alert «Δοκιμαστικό τρέξιμο ολοκληρώθηκε — X εγγραφές run log». ΔΕΝ έχουν σταλεί πραγματικά emails.
Βήματα:
Αναμενόμενο: Αποθηκεύεται ως JSON array στο settings. Ο cron ΔΕΝ θα δημιουργεί task για αυτόν τον πελάτη (μόνο αλλάζει status). Το dunning engine τον παρακάμπτει.
Βήματα:
Αναμενόμενο: Η στήλη «Υπεύθυνος» ενημερώνεται. Η στήλη «Τελευταία Επαφή» δείχνει τώρα. Worklist tab δείχνει τον πελάτη αν ο τρέχων χρήστης είναι ο assigned collector.
Βήματα:
Αναμενόμενο: Κουμπί αλλάζει χρώμα σε κίτρινο (marked). Δεύτερο κλικ → ξαναγίνεται γκρι (unmark). Audit log καταγράφει την αλλαγή.
Βήματα:
Αναμενόμενο: Αν δεν είναι ανατεθειμένος κανείς → κενή λίστα. Αν έγινε ανάθεση στο Σενάριο 10 με τον τρέχοντα χρήστη → εμφανίζεται εκεί.
Βήματα:
Αναμενόμενο: Το button και το tab εμφανίζονται μέσω hooks (χωρίς core template hacks). Οι εγγραφές εμφανίζονται και στη Λίστα του module.
Βήματα:
Αναμενόμενο: Custom status: δημιουργία/επεξεργασία/διαγραφή OK. System status: αλλαγή χρώματος ΟΚ, μετονομασία αδύνατη, διαγραφή αδύνατη (warning alert).
Τρεις cron tasks — τρέχουν αυτόματα από τον Perfex native cron
(per-minute via /cron/index).
upcoming_payments_cron — Auto-Status LifecycleΠότε τρέχει: Κάθε cron cycle, αλλά εκτελεί transitions μόνο στην ορισμένη ώρα (default: 9:00 π.μ., ρυθμιζόμενο από Ρυθμίσεις).
Τι κάνει:
date = σήμερα και status «Σε αναμονή» μεταβαίνουν σε «Προς
Έλεγχο»date = χθες και status «Προς Έλεγχο» μεταβαίνουν σε «Έχει
λήξει»default_assignee από Ρυθμίσεις (fallback:
staff id 23)run_dunning_cron):
ελέγχει active κανόνες vs target datesΡύθμιση ώρας: Ρυθμίσεις → «Ώρα εκτέλεσης
αυτοματισμών» (0–23). Αποθηκεύεται στο
tbloptions.upcomingpayments_auto_operations_hour.
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).
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 αθόρυβα.
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
Βάση 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 |
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)
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
| 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 |
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 |
| 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) |
| Εξάρτηση | Υποχρεωτική | Σκοπός |
|---|---|---|
| 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 για κινήσεις λογαριασμού |
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:
mece-deploy χειρίζεται owner/permissions αυτόματα| Θέμα | Κατάσταση | Ρίσκο |
|---|---|---|
| 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 δεν φορτωθεί |
default_assignee = 23 είναι hardcoded fallback —
βεβαιωθείτε ότι υπάρχει staff id 23 στο target σύστημα
ή αλλάξτε το default από Ρυθμίσεις πριν ενεργοποιήσετε το crondunning_engine_enabled είναι off by default —
χρειάζεται ρητή ενεργοποίηση| 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