EV charging stations / SoftOne ERP integration
Electromotivo Technologiki AE
Custom WordPress plugin για direct SoftOne ERP integration
WC orders ↔ SoftOne SALDOCs σε real-time, plugin γραμμένο from scratch
Challenge
Τι έπρεπε να λυθεί
Ο πελάτης κατασκευάζει + εγκαθιστά σταθμούς φόρτισης ηλεκτρικών οχημάτων (Teltonika 22kW, EVC1211P1000) για enterprise συμβάσεις, με αυστηρό SoftOne enterprise setup. Παραγγελίες τίθεντο manually σε δύο σημεία (WP admin + SoftOne) → λάθη, missing entries, καθυστερήσεις στα τιμολόγια. Επίσης 95.000+ PHP warnings/day από προηγούμενο plugin (undefined vars, deprecated calls), σπάγανε το logging.
Solution
Τι χτίσαμε
Χτίσαμε δικό μας SoftOne plugin σε PHP 8.2 με custom SoftOne class (login, getBrowserInfo, getBrowserData, getData, setData, setDataSoft). Order push μέσω woocommerce_thankyou hook (immediate, όχι cron). Sync-back cron κάθε 1 λεπτό κοιτάει SALDOC FULLYTRANSF field για να μαρκάρει WC order ως completed. 3-step customer lookup (AFM → company name fuzzy → auto-create με TRDCATEGORY=3000). Item SKU validation με ISACTIVE check. Skip + log αν item missing.
Custom Modules
Τι το κάνει διαφορετικό
Custom SoftOne plugin σε PHP 8.2
From scratch plugin (όχι middleware). SoftOne.php κλάση κάνει direct JSON API calls στο `electromotivo.oncloud.gr/s1services` με .env credentials. softone-woocommerce-plugin.php main file με hooks + crons + admin UI. Έλυσε 95.802 PHP warnings/day από previous setup.
Order push + sync-back flow
Push (WC → SoftOne): woocommerce_thankyou hook → άμεσο SALDOC creation (όχι cron). Sync-back (SoftOne → WC): cron `ws1_softone_sync_orders` κάθε 1 λεπτό κοιτάει FULLYTRANSF field, μαρκάρει WC orders ως completed. REMARKS read μέσω individual getData (δεν είναι στο browser). Product sync κάθε 5 λεπτά, customer branches sync κάθε 1 λεπτό.
3-step customer lookup + auto-create
Step 1: search by AFM. Step 2: fallback search by billing company/name με wildcard. Step 3: auto-create σε SoftOne με billing data (TRDCATEGORY=3000). Δουλεύει και χωρίς AFM, που είναι κρίσιμο για customer-facing checkout.
Item SKU validation + skip logic
Πριν τη δημιουργία SALDOC, κάθε SKU validate-άρεται σε SoftOne: existence + ISACTIVE=1. Inactive ή missing items skip με logging, δε σπάει το order. Αν ΟΛΑ τα items invalid → SALDOC δεν δημιουργείται, order marked 'skipped' με order note + admin meta.
Admin SoftOne Sync column με resync button
Custom column στο WC orders list με 4 status badges (Συγχρονίστηκε / Αποτυχία / Παραλείφθηκε / Δεν έχει σταλεί). SALDOC ID + date + error messages. Resync button (AJAX) με nonce + manage_woocommerce capability gate ξανά-προσπαθεί τη συγχρονισμό. Order notes σε ελληνικά με JSON unicode encoding.
Backfill script + greek encoding
40 παλιές παραγγελίες backfilled με real dates από SoftOne TRNDATE. Email template fix από deprecated `$order->meta_data` σε `$order->get_meta()`. utf8_encode() replacement με mb_convert_encoding(). $wpdb->prepare() misuse fixed σε 4 σημεία.
Tech Stack
Με τι χτίστηκε
Όλο το stack είναι τυποποιημένο. Δεν βασίζεται σε κρυφά παραμετροποιημένα plugins ή proprietary cloud services. Μπορεί να μεταφερθεί ή να συντηρηθεί από οποιαδήποτε ομάδα γνωρίζει το stack.
FAQ
Συχνές ερωτήσεις
Πώς γίνεται sync μεταξύ WooCommerce και SoftOne ERP χωρίς middleware;
Φτιάξαμε δικό μας PHP 8.2 plugin που μιλάει direct με το SoftOne JSON API (electromotivo.oncloud.gr/s1services). Δεν υπάρχει third-party middleware ή external service. Custom SoftOne class χειρίζεται login, getBrowserInfo, getBrowserData, getData, setData και setDataSoft, ενώ το main file κρατάει τα WC hooks και crons. Έτσι δε πληρώνεις per-transaction fee σε middleware και δε μπλοκάρεται το flow αν πέσει εξωτερικό service.
Πόση είναι η καθυστέρηση από WooCommerce παραγγελία μέχρι SoftOne SALDOC;
Άμεση. Χρησιμοποιούμε woocommerce_thankyou hook που τρέχει SALDOC creation στη στιγμή που ο πελάτης βλέπει την thank-you page, όχι μέσω cron. Sync-back από SoftOne (όταν το λογιστήριο μαρκάρει FULLYTRANSF στο SALDOC) γυρνάει στο WC ως completed status κάθε 1 λεπτό μέσω cron ws1_softone_sync_orders.
Τι γίνεται αν ο πελάτης δεν έχει ΑΦΜ στο checkout;
Δουλεύει 3-step customer lookup. Πρώτα ψάχνει με ΑΦΜ. Αν δεν βρει, fallback σε search by billing company name με wildcard match. Αν πάλι δε βρει, δημιουργεί αυτόματα νέο customer στο SoftOne με billing data και TRDCATEGORY=3000. Έτσι λειτουργεί και customer-facing checkout χωρίς να αναγκάσει τον αγοραστή να δώσει ΑΦΜ, που είναι κρίσιμο για B2C orders.
Τι γίνεται αν κάποιο SKU είναι missing ή inactive στο SoftOne;
Πριν τη δημιουργία SALDOC, κάθε SKU validate-άρεται σε SoftOne (existence + ISACTIVE=1). Inactive ή missing items skip με logging, και η παραγγελία προχωράει με τα υπόλοιπα. Αν ΟΛΑ τα items είναι invalid, η SALDOC δε δημιουργείται και η παραγγελία marked ως skipped με order note + admin meta. Έτσι ο sales team βλέπει αμέσως τι χρειάζεται διόρθωση χωρίς να σπάει η ροή.
Πώς γίνεται resync μιας παραγγελίας που απέτυχε;
Στο WC orders list προσθέσαμε custom column SoftOne Sync με 4 status badges (Συγχρονίστηκε, Αποτυχία, Παραλείφθηκε, Δεν έχει σταλεί), SALDOC ID, date και error messages. Δίπλα υπάρχει AJAX Resync button με nonce protection και manage_woocommerce capability gate που ξανα-προσπαθεί τη συγχρονισμό σε ένα click. Order notes είναι σε ελληνικά με σωστό JSON unicode encoding ώστε να διαβάζονται καθαρά.
Είχατε 95.000+ PHP warnings την ημέρα. Πώς λύθηκε;
Ξαναγράψαμε το plugin from scratch σε PHP 8.2-compatible κώδικα. Διορθώθηκαν undefined variables, deprecated calls, $wpdb->prepare() misuse σε 4 σημεία, utf8_encode() αντικαταστάθηκε με mb_convert_encoding(), και το email template fix από deprecated $order->meta_data σε $order->get_meta(). Από 95.802 warnings/ημέρα πήγε σε μηδέν, και τα error logs ξαναέγιναν χρήσιμα για actual incidents.