PU bundle
Τι είναι
Πλέον οι προμηθευτές μας δίνουν τους καταλόγους τους σε ηλεκτρονική μορφή καθημερινά με ενημερωμένες τιμές και αποθέματα. Το πρόβλημα είναι να ενημερώσουμε το κατάστημα μας με τις νέες τιμές και τα τρέχοντα αποθέματα καθημερινά. Το PU αυτοματοποιεί αυτή τη χρονοβόρα διαδικασία.
Το PU αποτελείτε από δύο εξαρτήματα το Merger και τον PU. Ο merger συγκεντρώνει τα feed των προμηθευτών και τα μετατρέπει σε ένα unified xml αρχείο. Ο PU διαβάζει αυτό το αρχείο και ενημερώνει το κατάστημα.
Feeds Merger
Μπορεί να διαχειριστεί απεριόριστο αριθμό από feed προμηθευτών.
Τα feed μπορεί να τα κατεβάσει από το site του προμηθευτή ή να τα ανεβάζουμε χειροκίνητα (ναι, ακόμα υπάρχουν προμηθευτές που διανέμουν μέσω email).
O Fetcher είναι το «εξάρτημα» που κατεβάζει το feed από το site του προμηθευτή. Έχουμε customized fetcher για κάθε προμηθευτή.
Το feed του προμηθευτή μπορεί να είναι xml, csv ή excel.

O merger παράγει το unified xml αρχείο με τα feed όλων των προμηθευτών μας.
Οι προμηθευτές έχουν ο καθένας διαφορετικό format για το feed τους, o merger
έχει για τον καθένα τον ειδικό parser που διαβάζει το feed/αρχείο του κάθε προμηθευτή
και με τα δεδομένα δημιουργεί το unified xml.
Αυτό το αρχείο διαβάζει ο PU και ενημερώνει τα προϊόντα στο κατάστημά μας.
PU (Product updater)
Ο PU διαβάζει το unified xml και για κάθε προμηθευτή που βρίσκει σε αυτό ενημερώνει τα προϊόντα του. Δημιουργεί όσα δεν υπάρχουν στο κατάστημα, ενημερώνει όσα υπάρχουν στο κατάστημα, απενεργοποιεί όσα δεν υπάρχουν πλέον στο feed. Υπάρχουν πάρα πολλές ρυθμίσεις για τη διαδικασία αυτή ανά προμηθευτή.
Το εργαλείο έχει κατασκευαστεί ώστε να μπορεί για διαχειριστεί μεγάλους όγκους δεδομένων. Έχουμε εγκαταστάσεις που ενημερώνει πάνω δεκάδες χιλιάδες προϊόντα.
Setup
Σημείωση
merger php 8.0 και πάνω
Install addons:
slx_updater_adminέχει μέσα και suppliers.slx_pu
Σημείωση
shop_feed is required!
Upload
putoolspackageUpload pu.sh in cs-cart’s root folder.
cd /var/www/vhosts/pc-bonus.gr/public_html/putools/icecat /opt/plesk/php/8.0/bin/php console.php pu:supmerger cd /var/www/vhosts/pc-bonus.gr/public_html /opt/plesk/php/8.0/bin/php admin.php --dispatch=pu_cli.run
Προσοχή! άλλαξε η εντολή για να τρέχει το import! Δεν υπάρχει πλέον script στο root, είναι controller, –dispatch κλπ.
In
pu.shchange path and php versionCheck if file
app/addons/slx_pu/bin/imres.shis executable,
if notchmod +x app/addons/slx_pu/bin/imres.sh
fix config.yml database connection, absolute urls and suppliers
create cronjob with the right path!
e.g.sh /var/www/vhosts/goride.bike/public_html/pu.sh sh /var/www/vhosts/fabulousaccessories.gr/httpdocs/pu.sh
Βάλε το σωστό brand feature id στο slx_updater_admin
Ρυθμίσεις στα πρόσθετα
Updater Admin

Brand feature:Merger absolut path to tmp: Που να ανεβαίνουν τα αρχεία των χειροκίνητων uploadersΕνεργοποίηση copier: Να είναι ενεργή ή όχι η λειτουργία του copier.
PU
Υπάρχει στο pu μια ρύθμιση που είναι ο χρήστης και το group, στα αρχεία. Το χρησιμοποιεί ο ImagesTrait όταν κατεβάζει τις εικόνες. Αυτά τα βρίσκει το addon κατά την εγκατάσταση. Βάζει αυτά που έχει ο φάκελος images του cs-cart. Αν δεν είναι σωστά μπορούμε να τα αλλάξουμε.

Με τα ίδια φτιάχνει κατά την εγκατάσταση και τους φακέλους μέσα στο var του cs-cart (updater_files κλπ).
Ρυθμίσεις στους προμηθευτές.
Άλλαξε εμφάνιση, έχει πλέον μόνο τα πεδία που μας ενδιαφέρουν. Λίγο άλλαξε και η εμφάνιση και υπάρχει λόγος.

Ρυθμίσεις:
Product matching method: Η μέθοδος αναζήτησης των προϊόντων. ΕπιλογέςProduct codeκαιProduct code OR EANΚατάσταση προίόντων: Ισχύει όταν τα προϊόντα δεν πάνε σε κατηγορίαΒαρέλιΚατάσταση όταν βαρέλι: Ισχύει όταν τα προϊόντα πάνε σε κατηγορίαΒαρέλιΚατάσταση χωρίς απόθεμα: Ισχύει όταν τα προϊόντα δεν έχουν απόθεμα.Διαθεσιμότητα:No stock Διαθεσιμότητα:Προβολή λεπτομερειών προϊόντος:Επιλεγμένος φόρος: Ο φόρος που θα έχει το προϊόν. Ένας από τους φόρους που έχουμε ορίσει στοΜεταφορικά και Φόροι. To ποσοστό αυτού του φόρου χρησιμοποιείτε στον υπολογισμό της τιμής όταν γίνεται με βάση την κατηγορία, και όχι τοFallback Markup.Stock limit: Κάτω από αυτό το απόθεμα απορρίπτονται. Λειτουργεί για προμηθευτές που μας δίνουν το απόθεμα τους και όχι μόνο διαθεσιμότητα.Ποσότητα από: Αν το feed έχει ποσότητα και θέλουμε να χρησιμοποιήσουμε αυτή, αλλιώς θα βάζει στα είδη την ποσότητα του επόμενου πεδίου.Ποσότητα στα προιόντα: Αν το πεδίοΠοσότητα απόέχει τιμήΣταθερή τιμήσε όλα τα προϊόντα θα βάλει την τιμή αυτού του πεδίου.Κάτω όριο τιμής: Προϊόντα με τιμή κάτω από αυτή απορρίπτονται.Άνω όριο τιμής: Προϊόντα με τιμή πάνω από αυτή απορρίπτονται.Κατηγορία νέων προϊόντων: Η κατηγορία που θα εισαχθούν τα νέα προϊόντα (το Βαρέλι).Update images: στο update τι θα κάνει με τις εικόνες.Ενημέρωση περιγραφής: Αν θα ενημερωθούν οι περιγραφές των προϊόντων κατά το updateUpdate titles: Στο update αν γίνει ενημέρωση της περιγραφής, αν θα ενημερώσει τον τίτλο ή όχι.Τιμή: Τα πεδία του feed με τις τιμέςΤιμή βάσης: το πεδίο που έχει την τιμή πάνω στην οποία θα γίνει ο υπολογισμός της τελικής τιμής.List Price: το πεδίο που έχει την τιμή καταλόγου.
Category markup: Στις κατηγορίες μπορούμε να ορίσουμε κανόνες ανάλογα με την τιμή του προϊόντος για το ποσό\ποσοστό κέρδους.Markup κατηγορίας πρόσθεσε ΦΠΑ: Αν υπάρχουν κανόνες για markup στις κατηγορίες, πρόσθεσε το φόρο που ορίζει οΕπιλεγμένος φόρος.
Fallback MarkupΟ υπολογισμός (αν χρειάζεται) της τιμής πώλησης των ειδών του προμηθευτή αν δεν υπάρχουν κανόνες για υπολογισμούς στις κατηγορίες. Ο υπολογισμός είναι(Τιμή βάσης + Κέρδος) + ΦόροςΕνεργοποίηση markup: Αν είναι off, τότε βάζει στο price την τιμή βάσης και επιστρέφει χωρίς παραπάνω υπολογισμούς.Τύπος κέρδους: Ποσό ή ποσοστόΠοσοστό/Ποσό κέρδους: Η τιμήΦόρος %: Το ποσοστό του φόρου που θα προστεθεί στην αξία.
Προσαύξηση βάρους: Στην τιμή του είδους που υπολογίζουμε μπορούμε να κάνουμε κάποια προσαύξηση ανάλογα με το βάρος του.Προσαύξηση βάρους: Ενεργοποίηση ή όχι της προσαύξησης βάρους. Τα παρακάτω ισχύουν αν έχει επιλεγεί η Προσαύξηση ΒάρουςΒάρος (όριο βαρους):Βάρος για υπολογισμό:Βάρος,Βάρος-Όριο βάρους,Όριο βάρουςΥπολογισμός:Βάρος Χ Ποσό,+ ΠοσόΠοσό: το ποσό/ποσοστό της προσαύξησης
Χαρακτηριστικά. Αν είναι ενεργοποιημένη η αντιστοίχιση και ένα χαρ/κο δεν έχει αντιστοιχιστεί, αν η επιλογή αυτή είναι ενεργή θα κάνει τη διαδικασία να το βρει με το όνομα και αν δεν υπάρχει να το προσθέσει. Αν η επιλογή αυτή δεν είναι ενεργή, τότε θα το αγνοήσει.Χρήση της αντιστοίχισης χαρακτηριστικών: Ενεργοποίηση της αντιστοίχισηςΑντιστοίχιση χαρακτηριστικώνΕτικέτα στο feedΧαρακτηριστικό καταστήματος
Ο λόγος που άλλαξε η εμφάνιση, τα πεδία στη βάση κλπ, είναι γιατί τα πεδία των ρυθμίσεων του προμηθευτή ορίζονται στο schema και όλα αποθηκεύονται σε ένα json πεδίο. Είχανε γίνει πολλά και βαρετό να φτιάχνουμε πεδία όλη την ώρα.
Αν θέλουμε να βάλουμε κάποια ακόμα ρύθμιση πάμε στο app/addons/slx_updater_admin/schemas/pu/supplier_params.php
και προσθέτουμε ότι θέλουμε, έχει πολλά για παραδείγματα. Καλό είναι να βάζουμε πάντα default τιμή και για αριθμητικά το get_conv.
Migration tool
Επειδή στον cscart_suppliers δεν αποθηκεύονται οι ρυθμίσεις σε πεδία 1-1, αλλά στο
πεδίο pu_params σε json. Μπορεί να χρειαστεί να κάνουμε migration κάποιον. Έφτιαξα
το php admin.php --dispatch=pua.migrate_params (ζει στο updater_admin), που μαζεύει
τις τιμές από τα πεδία και τις βάζει στο pu_params σε json. Μετά μπορούμε να κάνουμε drop τα πεδία να καθαρίσει ο πίνακας,
μας δίνει οδηγίες το παραπάνω όταν τρέξει.
Ρυθμίσεις στις κατηγορίες
Στην καρτέλα Πρόσθετα

Αντιστοίχιση με προμηθευτήΣχόλιαΧώρος για δικές μας σημειώσεις.Βάρος κατηγορίαςΌταν έχει ενημερωθεί πλέον το προϊόν με την τελική του κύρια κατηγορία (όχι την κατηγορία Βαρέλι), τότε αν το βάρος του είναι μικρότερο από την τιμή τουΒάρος κατηγορίαςορίζεται βάρος στο προϊόν η τιμή τουΒάρος κατηγορίας
Στην καρτέλα Markup τιμών
Στις κατηγορίες μπορούμε να ορίσουμε κανόνες ανά προμηθευτή για τον υπολογισμό της τιμής πώλησης με κριτήριο την τιμή αγοράς των ειδών της κατηγορίας. Ουσιαστικά ορίζουμε για κάθε προμηθευτή μια κλίμακα τιμών αγοράς και αντίστοιχα σε κάθε σκαλί το markup που επιθυμούμε.
Αν σε μια κατηγορία δεν υπάρχουν κανόνες για τον προμηθευτή, τότε η τιμή
πώλησης υπολογίζεται με βάση τις ρυθμίσεις στον προμηθευτή στην ενότητα
Fallback Markup.

ΠρομηθευτήςΟ προμηθευτήςαπόΗ βάση του σκαλιού της κλίμακαςMarkupΤο markup, αν ορίσουμε τον τύπο ποσοστό, τότε είναι το ποσοστό (πχ 30). Διαφορετικά είναι σε ευρώ.τύποςΟ τύπος του markup,Αξίαήποσοστόστρογγυλοποίηση σεόταν γίνονται πράξεις με ποσοστά το αποτέλεσμα είναι κάποιος αριθμός με δεκαδικά και δεν πολύ «εμπορικά όμορφος». Για παράδειγμα, τιμή σε είδος 13.24 δεν είναι πολύ εμφανίσιμο. Μπορούμε λοιπόν, να ορίσουμε στρογγυλοποίηση. Οι επιλογές που έχουμε είναι:0.00στον πλησιέστερο ακέραιο0.20στο πλησιέστερο 20λεπτο0.50στο πλησιέστερο 0,5 ή ολόκληρο ευρώ.
Σημείωση
Οι κανόνες ισχύουν και για τις υποκατηγορίες της κατηγορίας.
Σημείωση
Ο υπολογισμός γίνεται με βάση την κύρια κατηγορία του προϊόντος!
Ρυθμίσεις στα προϊόντα
Στην καρτέλα Πρόσθετα
Υπάρχει μια πολύ σημαντική ρύθμιση που μπορεί να γίνει σε ένα προϊόν.

ΕνημέρωσηΌταν ένα είδος υπάρχει στο κατάστημα και έρθει ενημέρωση στο feed, τότε αυτό θα ενημερωθεί. Μπορεί για κάποιο δικό μας λόγο, να μη θέλουμε να ενημερωθεί κανονικά.ΚανονικάΝα μην ενημερωθείΝα μην ενημερωθεί καθόλου.Μόνο τιμήΝα ενημερωθεί μόνο η τιμήΜόνο απόθεμαΝα ενημερωθεί μόνο το απόθεμαΜόνο τιμή και απόθεμαΝα ενημερωθεί μόνο τιμή και απόθεμα.
Supplier code(πληροφοριακό)Κωδικός προμηθευτή(πληροφοριακό)ΕΑΝ(πληροφοριακό) Το barcode, αν μας το παρέχει ο προμηθευτήςΤιμή αγοράς(πληροφοριακό)
Προειδοποίηση
Είναι πολύ σημαντικό! Αν αλλάξουμε στο πεδίο Ενημέρωση την τιμή σε κάτι διαφορετικό από το Κανονικά
να παρακολουθούμε αν δε συντρέχουν πλέον οι συνθήκες που μας έκαναν να το αλλάξουμε,
ισχύουν ακόμα. Διαφορετικά το προϊόν δε θα ενημερώνετε κανονικά, μέχρι να το
επαναφέρουμε σε Κανονικά.
Αναζήτηση προϊόντων
Στη σύνθετη αναζήτηση των προϊόντων υπάρχουν διάφορα νέα πεδία.
Αναζήτηση με τον προμηθευτή.

Αναζήτηση με τον κωδικό του προμηθευτή.
Αναζήτηση ανάλογα με τον τρόπο ενημέρωσης.

Οι επιλογές πέραν αυτών του πεδίου Ενημέρωση στο προϊόν, υπάρχουν οι:
Οχι κανονικάτο αντίθετο τουΚανονικάΟχι προμηθευτήτα προϊόντα που δεν έχουν προμηθευτήΜε προμηθευτήτα προϊόντα που έχουν προμηθευτή

Τέλος, αν το προϊόν έχει εικόνες ή όχι. Βοηθάει να εντοπίσουμε προϊόντα που δεν έχουν εικόνες, για να τα εμπλουτίσουμε.

Προϊόντα με το ίδιο ΕΑΝ
Στις περιπτώσεις που έχουμε προϊόντα από διαφορετικούς προμηθευτές με το ίδιο ΕΑΝ και εμπλουτίζουμε το περιεχόμενο σε ένα από αυτά, αν είναι ενεργός ο copier, τότε θα μεταφέρει τις περιγραφές κλπ και στα άλλα με το ίδιο ΕΑΝ.
Αν σε κάποια περίπτωση δε θέλουμε να συμβεί αυτό, για κάποιο λόγο θέλουμε στο προϊόν από τον προμηθευτή Χ να γράφει κάτι διαφορετικό από τον προμηθευτή Υ, μπορούμε να παρακάμψουμε τον copier με αυτή την επιλογή.

Η επιλογή εμφανίζεται μόνο στα προϊόντα που υπάρχει και άλλο με το ίδιο ΕΑΝ.
Αν αφήσουμε την προεπιλεγμένη επιλογή (Ναι…) τότε θα λειτουργήσει κανονικά ο copier.
Αν όμως επιλέξουμε την επιλογή Όχι... τότε δεν θα γίνει αντιγραφή.
Προειδοποίηση
Προσοχή, δεν είναι ρύθμιση! είναι επιλογή για την αποθήκευση που θα κάνουμε τώρα.
Manual Uploads
Για την περίπτωση που κάποιο feed πρέπει να το ανεβάζει ο διαχειριστής
χειροκίνητα, υπάρχει η επιλογή Προϊόντα > Upload αρχείων προμηθευτών.
Μπορούμε να ορίσουμε όσες φόρμες χρειαζόμαστε.

Πάλι με schema, app/addons/slx_updater_admin/schemas/pu/data_uploaders.php.
Έχει παράδειγμα, μόνο δυο πράγματα θέλει.
Τα αρχεία τα ανεβάζει εκεί που λέει το Merger absolut path to tmp στις ρυθμίσεις του updater admin.
$schema = [
'quest' => [
'label' => 'Quest',
'target_fn' => 'catalog.xml'
],
];
To key του πίνακα να μην έχει κενά κλπ γιατί το χρησιμοποιεί για html id, όνομα πεδίου κλπ.
config.yml του merger
Έχει δύο ενότητες,
databaseοι ρυθμίσεις για τη σύνδεση στη βάσηimportρυθμίσεις για κάθε feed
Database
database:
host: 192.168.56.30
name: dbname
user: root
pass: 'panos'
use_categories_whitelist: false
Ελέγχει όταν ξεκινάει:
αν υπάρχει
ProductStreamμε icecat (πάει να πει χρειάζεται βάση για την cache του icecat)αν
use_categories_whitelist=true(πάει να πει, ότι θέλει να διαβάσει τις κατηγορίες κλπ)
Αν ισχύει κάποιο τότε κάνει σύνδεση στη βάση, αλλιώς δεν προσπαθεί καν.
Import
Για κάθε προμηθευτή υπάρχει μια ενότητα με τα παρακάτω:
supplier_nameΤο όνομα του προμηθευτή όπως το ορίσαμε στουςΠρομηθευτές, lower case.idTo Id του προμηθευτή όπως στην εγγραφή που δημιουργήσαμε στουςΠρομηθευτέςactivetrue ή false Αν είναι ενεργό ή όχι το feed.langselΗ γλώσσα που κάνουμε την εισαγωγήfnΤο όνομα του αρχείου που είναι αποθηκευμένο το feed....ότι άλλες παραμέτρους χρειάζονται από τον fetcher ή τον merger για το συγκεκριμένο προμηθευτή. Συνήθως το URL από όπου κατεβάζουμε το feed.
Παράδειγμα:
import:
zazopoulos:
id: 1
active: true
langs:
el:
fn: '%tmp_dir%zazopoulos.xml'
ftp: 'ftp.zazopoulossa.gr'
Σημείωση
Δε χρειάζονται απόλυτα path! Υπάρχει το %tmp_dir% που αντικαθίσταται σε όλο
το περιεχόμενο του config.yml με το απόλυτο path του tmp φακέλου του merger.
Extras
Διπλότυπα προϊόντα με βάση το ΕΑΝ
Όταν έχουμε feeds από διαφορετικούς προμηθευτές, τότε μπορεί να υπάρχουν
Διπλότυπα προϊόντα με βάση το ΕΑΝ σε διαφορετικούς προμηθευτές. Δηλαδή,
αν για παράδειγμα,
το είδος με ΕΑΝ 1234567890123 μπορεί να το έχουμε από τον προμηθευτή Α,
αλλά και από τον Β ή και τον Γ. Λογικά δε θέλουμε να έχουμε το
ίδιο είδος ενεργό στο κατάστημα και από τους τρεις. Αλλά, μόνο το φθηνότερο.
Υπάρχει το εργαλείο που το βάζουμε να τρέχει μετά τον PU, με την εντολή:
php admin.php --dispatch=eanfilterer.run --company_id=1
Προϊόντα με ίδιο ΕΑΝ - copier
Όταν έχουμε προϊόντα με ίδιο ΕΑΝ, τότε υπάρχει η δυνατότητα όταν αλλάζουμε το περιεχόμενο σε ένα από αυτά, να μεταφέρεται και στα υπόλοιπα με το ίδιο ΕΑΝ.
Το περιεχόμενο που αντιγράφεται είναι:
περιγραφές
εικόνες
χαρακτηριστικά
Ο copier επίσης όταν δημιουργηθεί ένα προϊόν από τον PU και βρεθεί υπάρχον προϊόν με το ίδιο ΕΑΝ και αυτό είναι ενεργό και σε ενεργή κατηγορία, τότε θα αντιγράψει στο νέο προϊόν το περιεχόμενο.
Ο copier ενεργοποιείτε από τις ρυθμίσεις του Updater Admin.
Τέλος, υπάρχει και η εντολή για αρχικοποίηση (όταν υπάρχουν ήδη προϊόντα με ίδια ΕΑΝ) να αντιγραφεί το περιεχόμενο από το ενεργό σε ενεργή κατηγορία στα υπόλοιπα.
php admin.php --dispatch=copier.run --company_id=1
Σημείωση
Το εκτελούμε μία φορά και το ξεχνάμε. Κάθε φορά που το τρέχουμε θα κάνει αντιγραφή.