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.

merger1.drawio.png

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 και πάνω

  1. Install addons:

    • slx_updater_admin έχει μέσα και suppliers.

    • slx_pu

Σημείωση

shop_feed is required!

  1. Upload putools package

  2. Upload 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 κλπ.

  3. In pu.sh change path and php version

  4. Check if file app/addons/slx_pu/bin/imres.sh is executable,
    if not

     chmod +x app/addons/slx_pu/bin/imres.sh
    
  5. fix config.yml database connection, absolute urls and suppliers

  6. 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
    
  7. Βάλε το σωστό brand feature id στο slx_updater_admin

Ρυθμίσεις στα πρόσθετα

Updater Admin

upadm-1.png

  • Brand feature:

  • Merger absolut path to tmp: Που να ανεβαίνουν τα αρχεία των χειροκίνητων uploaders

  • Ενεργοποίηση copier: Να είναι ενεργή ή όχι η λειτουργία του copier.

PU

Υπάρχει στο pu μια ρύθμιση που είναι ο χρήστης και το group, στα αρχεία. Το χρησιμοποιεί ο ImagesTrait όταν κατεβάζει τις εικόνες. Αυτά τα βρίσκει το addon κατά την εγκατάσταση. Βάζει αυτά που έχει ο φάκελος images του cs-cart. Αν δεν είναι σωστά μπορούμε να τα αλλάξουμε.

pu-1.png

Με τα ίδια φτιάχνει κατά την εγκατάσταση και τους φακέλους μέσα στο var του cs-cart (updater_files κλπ).

Ρυθμίσεις στους προμηθευτές.

Άλλαξε εμφάνιση, έχει πλέον μόνο τα πεδία που μας ενδιαφέρουν. Λίγο άλλαξε και η εμφάνιση και υπάρχει λόγος.

sup-1.png sup-2.png

Ρυθμίσεις:

  • Product matching method: Η μέθοδος αναζήτησης των προϊόντων. Επιλογές Product code και Product code OR EAN

  • Κατάσταση προίόντων: Ισχύει όταν τα προϊόντα δεν πάνε σε κατηγορία Βαρέλι

  • Κατάσταση όταν βαρέλι: Ισχύει όταν τα προϊόντα πάνε σε κατηγορία Βαρέλι

  • Κατάσταση χωρίς απόθεμα: Ισχύει όταν τα προϊόντα δεν έχουν απόθεμα.

  • Διαθεσιμότητα:

  • No stock Διαθεσιμότητα:

  • Προβολή λεπτομερειών προϊόντος:

  • Επιλεγμένος φόρος: Ο φόρος που θα έχει το προϊόν. Ένας από τους φόρους που έχουμε ορίσει στο Μεταφορικά και Φόροι. To ποσοστό αυτού του φόρου χρησιμοποιείτε στον υπολογισμό της τιμής όταν γίνεται με βάση την κατηγορία, και όχι το Fallback Markup.

  • Stock limit: Κάτω από αυτό το απόθεμα απορρίπτονται. Λειτουργεί για προμηθευτές που μας δίνουν το απόθεμα τους και όχι μόνο διαθεσιμότητα.

  • Ποσότητα από: Αν το feed έχει ποσότητα και θέλουμε να χρησιμοποιήσουμε αυτή, αλλιώς θα βάζει στα είδη την ποσότητα του επόμενου πεδίου.

  • Ποσότητα στα προιόντα: Αν το πεδίο Ποσότητα από έχει τιμή Σταθερή τιμή σε όλα τα προϊόντα θα βάλει την τιμή αυτού του πεδίου.

  • Κάτω όριο τιμής: Προϊόντα με τιμή κάτω από αυτή απορρίπτονται.

  • Άνω όριο τιμής: Προϊόντα με τιμή πάνω από αυτή απορρίπτονται.

  • Κατηγορία νέων προϊόντων: Η κατηγορία που θα εισαχθούν τα νέα προϊόντα (το Βαρέλι).

  • Update images: στο update τι θα κάνει με τις εικόνες.

  • Ενημέρωση περιγραφής: Αν θα ενημερωθούν οι περιγραφές των προϊόντων κατά το update

  • Update 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 τα πεδία να καθαρίσει ο πίνακας, μας δίνει οδηγίες το παραπάνω όταν τρέξει.

Ρυθμίσεις στις κατηγορίες

Στην καρτέλα Πρόσθετα

category-1.png

  • Αντιστοίχιση με προμηθευτή

  • Σχόλια Χώρος για δικές μας σημειώσεις.

  • Βάρος κατηγορίας Όταν έχει ενημερωθεί πλέον το προϊόν με την τελική του κύρια κατηγορία (όχι την κατηγορία Βαρέλι), τότε αν το βάρος του είναι μικρότερο από την τιμή του Βάρος κατηγορίας ορίζεται βάρος στο προϊόν η τιμή του Βάρος κατηγορίας

Στην καρτέλα Markup τιμών

Στις κατηγορίες μπορούμε να ορίσουμε κανόνες ανά προμηθευτή για τον υπολογισμό της τιμής πώλησης με κριτήριο την τιμή αγοράς των ειδών της κατηγορίας. Ουσιαστικά ορίζουμε για κάθε προμηθευτή μια κλίμακα τιμών αγοράς και αντίστοιχα σε κάθε σκαλί το markup που επιθυμούμε.

Αν σε μια κατηγορία δεν υπάρχουν κανόνες για τον προμηθευτή, τότε η τιμή πώλησης υπολογίζεται με βάση τις ρυθμίσεις στον προμηθευτή στην ενότητα Fallback Markup.

category-2.png

  • Προμηθευτής Ο προμηθευτής

  • από Η βάση του σκαλιού της κλίμακας

  • Markup Το markup, αν ορίσουμε τον τύπο ποσοστό, τότε είναι το ποσοστό (πχ 30). Διαφορετικά είναι σε ευρώ.

  • τύπος Ο τύπος του markup, Αξία ή ποσοστό

  • στρογγυλοποίηση σε όταν γίνονται πράξεις με ποσοστά το αποτέλεσμα είναι κάποιος αριθμός με δεκαδικά και δεν πολύ «εμπορικά όμορφος». Για παράδειγμα, τιμή σε είδος 13.24 δεν είναι πολύ εμφανίσιμο. Μπορούμε λοιπόν, να ορίσουμε στρογγυλοποίηση. Οι επιλογές που έχουμε είναι:

    • 0.00 στον πλησιέστερο ακέραιο

    • 0.20 στο πλησιέστερο 20λεπτο

    • 0.50 στο πλησιέστερο 0,5 ή ολόκληρο ευρώ.

Σημείωση

Οι κανόνες ισχύουν και για τις υποκατηγορίες της κατηγορίας.

Σημείωση

Ο υπολογισμός γίνεται με βάση την κύρια κατηγορία του προϊόντος!

Ρυθμίσεις στα προϊόντα

Στην καρτέλα Πρόσθετα

Υπάρχει μια πολύ σημαντική ρύθμιση που μπορεί να γίνει σε ένα προϊόν.

product-1.png

  • Ενημέρωση Όταν ένα είδος υπάρχει στο κατάστημα και έρθει ενημέρωση στο feed, τότε αυτό θα ενημερωθεί. Μπορεί για κάποιο δικό μας λόγο, να μη θέλουμε να ενημερωθεί κανονικά.

    • Κανονικά

    • Να μην ενημερωθεί Να μην ενημερωθεί καθόλου.

    • Μόνο τιμή Να ενημερωθεί μόνο η τιμή

    • Μόνο απόθεμα Να ενημερωθεί μόνο το απόθεμα

    • Μόνο τιμή και απόθεμα Να ενημερωθεί μόνο τιμή και απόθεμα.

  • Supplier code (πληροφοριακό)

  • Κωδικός προμηθευτή (πληροφοριακό)

  • ΕΑΝ (πληροφοριακό) Το barcode, αν μας το παρέχει ο προμηθευτής

  • Τιμή αγοράς (πληροφοριακό)

Προειδοποίηση

Είναι πολύ σημαντικό! Αν αλλάξουμε στο πεδίο Ενημέρωση την τιμή σε κάτι διαφορετικό από το Κανονικά να παρακολουθούμε αν δε συντρέχουν πλέον οι συνθήκες που μας έκαναν να το αλλάξουμε, ισχύουν ακόμα. Διαφορετικά το προϊόν δε θα ενημερώνετε κανονικά, μέχρι να το επαναφέρουμε σε Κανονικά.

Αναζήτηση προϊόντων

Στη σύνθετη αναζήτηση των προϊόντων υπάρχουν διάφορα νέα πεδία.

Αναζήτηση με τον προμηθευτή.

product-2.png

  • Αναζήτηση με τον κωδικό του προμηθευτή.

  • Αναζήτηση ανάλογα με τον τρόπο ενημέρωσης.

product-3.png

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

  • Οχι κανονικά το αντίθετο του Κανονικά

  • Οχι προμηθευτή τα προϊόντα που δεν έχουν προμηθευτή

  • Με προμηθευτή τα προϊόντα που έχουν προμηθευτή

product-4.png

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

product-5.png

Προϊόντα με το ίδιο ΕΑΝ

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

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

product-6.png

Η επιλογή εμφανίζεται μόνο στα προϊόντα που υπάρχει και άλλο με το ίδιο ΕΑΝ.

Αν αφήσουμε την προεπιλεγμένη επιλογή (Ναι…) τότε θα λειτουργήσει κανονικά ο copier. Αν όμως επιλέξουμε την επιλογή Όχι... τότε δεν θα γίνει αντιγραφή.

Προειδοποίηση

Προσοχή, δεν είναι ρύθμιση! είναι επιλογή για την αποθήκευση που θα κάνουμε τώρα.

Manual Uploads

Για την περίπτωση που κάποιο feed πρέπει να το ανεβάζει ο διαχειριστής χειροκίνητα, υπάρχει η επιλογή Προϊόντα > Upload αρχείων προμηθευτών. Μπορούμε να ορίσουμε όσες φόρμες χρειαζόμαστε.

upload-1.png

Πάλι με 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.

    • id To Id του προμηθευτή όπως στην εγγραφή που δημιουργήσαμε στους Προμηθευτές

    • active true ή false Αν είναι ενεργό ή όχι το feed.

    • langs

      • el Η γλώσσα που κάνουμε την εισαγωγή

        • 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

Σημείωση

Το εκτελούμε μία φορά και το ξεχνάμε. Κάθε φορά που το τρέχουμε θα κάνει αντιγραφή.