אימות ייבוא מוצרים: ניקוי והסרת כפילויות

כאשר רשימת המחירים של ספק מגיעה עם מחירים שליליים, SKUs ריקים ותגי HTML בתיאורים, היא פוגעת בקטלוג ומאטה את האתר. אנו בונים מערכת ולידציה שבודקת, מנקה ומסירה כפילויות לפני שהנתונים מגיעים למסד הנתונים. הצוות שלנו מספק את הפרויקט במפתח מלא—מאודיט ועד הטמעה ותמיכה שוטפת—כך שהקטלוג שלך נשאר נקי ואמין.

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

אלה רק חלק מהסוגים הטכניים של אתרים שאנו עובדים איתם, ולכל אחד מהם יכולים להיות מאפיינים ופונקציונליות ספציפיים משלו, וכן ניתן להתאים אותם לצרכים ולמטרות הספציפיים של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
אימות ייבוא מוצרים: ניקוי והסרת כפילויות
בינוני
~3-5 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113
  • פיתוח אתר עבור SBH Partners
    פיתוח אתר עבור SBH Partners
    1201
  • פיתוח אתר עבור Red Pear
    פיתוח אתר עבור Red Pear
    619

אימות נתונים לייבוא מוצרים

מערכת אימות נתוני ייבוא המוצרים שלנו מטפלת בבדיקת נתונים, ניקוי (סניטציה) והסרת כפילויות SKU, ותופסת שגיאות כמו מחירים שליליים, SKU ריקים ו-XSS בתיאורים. ללא מערכת כזו, נתונים פגומים מובילים לבעיות בקטלוג ולעלויות תפעול גבוהות. לפי סטטיסטיקות, עד 30% מנתוני הספקים מכילים שגיאות — תיקון ההשלכות עולה כ-$9–13 בחיסכון חודשי. בהתבסס על הנתונים שלנו, אוטומציית אימות ייבוא מוצרים חוסכת עד $7.2k–10k בשנה בפרויקט ממוצע. הגישה שלנו: עצירת זבל בנקודת הכניסה, כך שלעולם לא יגיע למסד הנתונים. התמחור להטמעת מערכת האימות מתחיל ב-$1.4k–1.9k (כ-$2,000). החיסכון השנתי האופייני עולה על $10,000, עם החזר השקעה תוך 3 חודשים. עם הערבות שלנו לאיכות נתונים, אתה יכול לסמוך על תהליך הייבוא. למפתחים המוסמכים שלנו יש ניסיון של למעלה מ-7 שנים בשילוב נתוני מסחר אלקטרוני והם השלימו למעלה מ-50 פרויקטי אימות.

בעיות שאנו פותרים

אימות מבני — אנו בודקים פורמט וסוגים: שדות חובה, מספרים, תאריכים, אורכי מחרוזות. אם רשימת מחירים מכילה "N/A" במקום מספר, אנו תופסים זאת לפני הכנסה למסד הנתונים.

אימות עסקי — כללים סמנטיים: מחיר אינו חורג ממגבלות, SKU ייחודי, קטגוריה קיימת, שינוי מחיר לא יותר מ-50%. לדוגמה, ספק מגדיר בטעות מחיר 999999 במקום 999 — אנו מסננים את החריגה.

סניטציה (ניקוי) — אנו מנקים נתונים לפני בדיקות: מסירים תווים בלתי נראים, מנתחים מספרים עם רווחים ופסיקים, מסירים HTML מסוכן.

הסרת כפילויות SKU — קובץ בודד עשוי להכיל SKU כפולים אם הספק מיזג כמה רשימות מחירים. אנו עוקבים אחר כל ה-SKU בתוך הייבוא ומתריעים על כפילויות.

אם אתה מבחין בבעיות דומות בנתונים שלך, צור קשר לבדיקה.

איך אנחנו עושים זאת: מחסנית וארכיטקטורה

אנו משתמשים ב-Laravel 11 עם PHP 8.3. הוולידטור בנוי על Laravel Validator עם כללים עסקיים נוספים. הסניטייזר מנתח מספרים, מנקה מחרוזות ותמונות. שגיאות נאספות עם חומרה ונכתבות בקבוצות למסד הנתונים.

דוגמת ולידטור:

class ProductImportValidator {
    private array $rules = [
        'sku' => ['required', 'string', 'max:100'],
        'name' => ['required', 'string', 'max:500'],
        'price' => ['required', 'numeric', 'min:0.01', 'max:100000000'],
        'qty' => ['nullable', 'integer', 'min:0', 'max:9999999'],
        'description' => ['nullable', 'string', 'max:100000'],
        'category' => ['nullable', 'string', 'max:300'],
        'images' => ['nullable', 'array', 'max:20'],
        'images.*' => ['url', 'max:2000'],
        'weight' => ['nullable', 'numeric', 'min:0', 'max:10000'],
    ];

    public function validate(array $row): ValidationResult {
        $validator = \Illuminate\Support\Facades\Validator::make(
            $row,
            $this->rules,
            $this->customMessages()
        );

        $errors = [];
        if ($validator->fails()) {
            $errors = $validator->errors()->toArray();
        }

        // Бизнес-правила
        $errors = array_merge($errors, $this->applyBusinessRules($row));

        return new ValidationResult(
            valid: empty($errors),
            errors: $errors,
            data: $validator->validated(),
        );
    }

    private function applyBusinessRules(array $row): array {
        $errors = [];

        // Проверка аномального изменения цены
        if (!empty($row['sku']) && !empty($row['price'])) {
            $existing = Product::where('sku', $row['sku'])->value('price');
            if ($existing && $existing > 0) {
                $change = abs($row['price'] - $existing) / $existing;
                if ($change > 0.5) {
                    $errors['price'][] = "Price change {$change}% exceeds 50% threshold";
                }
            }
        }

        // Проверка на XSS в описании
        if (!empty($row['description'])) {
            $clean = strip_tags($row['description']);
            if ($clean !== $row['description']) {
                $errors['description'][] = 'HTML tags detected in description';
            }
        }

        return $errors;
    }
}

דוגמת סניטייזר:

class ProductDataSanitizer {
    public function sanitize(array $raw): array {
        return [
            'sku' => $this->cleanString($raw['sku'] ?? ''),
            'name' => $this->cleanString($raw['name'] ?? ''),
            'price' => $this->parseDecimal($raw['price'] ?? null),
            'qty' => $this->parseInt($raw['qty'] ?? null),
            'description' => $this->sanitizeHtml($raw['description'] ?? ''),
            'weight' => $this->parseDecimal($raw['weight'] ?? null),
            'images' => $this->parseImageUrls($raw['images'] ?? []),
        ];
    }

    private function cleanString(?string $value): string {
        if ($value === null) return '';
        $value = trim($value);
        $value = preg_replace('/\p{C}/u', '', $value); // невидимые символы
        return mb_substr($value, 0, 1000);
    }

    private function parseDecimal(mixed $value): ?float {
        if ($value === null || $value === '') return null;
        $value = str_replace([' ', ',', "\xc2\xa0"], ['', '.', ''], (string) $value);
        return is_numeric($value) ? (float) $value : null;
    }

    private function parseInt(mixed $value): ?int {
        $decimal = $this->parseDecimal($value);
        return $decimal !== null ? (int) $decimal : null;
    }

    private function sanitizeHtml(?string $html): string {
        if (!$html) return '';
        // Разрешаем только безопасные теги
        return strip_tags($html, '<p><br><b><strong><i><em><ul><ol><li>');
    }

    private function parseImageUrls(mixed $raw): array {
        if (is_string($raw)) {
            $raw = array_map('trim', explode(',', $raw));
        }
        return array_values(array_filter(
            (array) $raw,
            fn($url) => filter_var($url, FILTER_VALIDATE_URL)
        ));
    }
}

חשיבות סניטציית הנתונים לאבטחה

התרת תגי HTML בתיאורי מוצרים עלולה להוביל להתקפות XSS בעמוד הקטלוג. הסניטייזר שלנו מסיר את כל התגים המסוכנים, ומשאיר רק class ProductImportValidator { private array $rules = [ 'sku' => ['required', 'string', 'max:100'], 'name' => ['required', 'string', 'max:500'], 'price' => ['required', 'numeric', 'min:0.01', 'max:100000000'], 'qty' => ['nullable', 'integer', 'min:0', 'max:9999999'], 'description' => ['nullable', 'string', 'max:100000'], 'category' => ['nullable', 'string', 'max:300'], 'images' => ['nullable', 'array', 'max:20'], 'images.*' => ['url', 'max:2000'], 'weight' => ['nullable', 'numeric', 'min:0', 'max:10000'], ]; public function validate(array $row): ValidationResult { $validator = \Illuminate\Support\Facades\Validator::make( $row, $this->rules, $this->customMessages() ); $errors = []; if ($validator->fails()) { $errors = $validator->errors()->toArray(); } // Бизнес-правила $errors = array_merge($errors, $this->applyBusinessRules($row)); return new ValidationResult( valid: empty($errors), errors: $errors, data: $validator->validated(), ); } private function applyBusinessRules(array $row): array { $errors = []; // Проверка аномального изменения цены if (!empty($row['sku']) && !empty($row['price'])) { $existing = Product::where('sku', $row['sku'])->value('price'); if ($existing && $existing > 0) { $change = abs($row['price'] - $existing) / $existing; if ($change > 0.5) { $errors['price'][] = "Price change {$change}% exceeds 50% threshold"; } } } // Проверка на XSS в описании if (!empty($row['description'])) { $clean = strip_tags($row['description']); if ($clean !== $row['description']) { $errors['description'][] = 'HTML tags detected in description'; } } return $errors; } } , class ProductDataSanitizer { public function sanitize(array $raw): array { return [ 'sku' => $this->cleanString($raw['sku'] ?? ''), 'name' => $this->cleanString($raw['name'] ?? ''), 'price' => $this->parseDecimal($raw['price'] ?? null), 'qty' => $this->parseInt($raw['qty'] ?? null), 'description' => $this->sanitizeHtml($raw['description'] ?? ''), 'weight' => $this->parseDecimal($raw['weight'] ?? null), 'images' => $this->parseImageUrls($raw['images'] ?? []), ]; } private function cleanString(?string $value): string { if ($value === null) return ''; $value = trim($value); $value = preg_replace('/\p{C}/u', '', $value); // невидимые символы return mb_substr($value, 0, 1000); } private function parseDecimal(mixed $value): ?float { if ($value === null || $value === '') return null; $value = str_replace([' ', ',', "\xc2\xa0"], ['', '.', ''], (string) $value); return is_numeric($value) ? (float) $value : null; } private function parseInt(mixed $value): ?int { $decimal = $this->parseDecimal($value); return $decimal !== null ? (int) $decimal : null; } private function sanitizeHtml(?string $html): string { if (!$html) return ''; // Разрешаем только безопасные теги return strip_tags($html, '<p><br><b><strong><i><em><ul><ol><li>'); } private function parseImageUrls(mixed $raw): array { if (is_string($raw)) { $raw = array_map('trim', explode(',', $raw)); } return array_values(array_filter( (array) $raw, fn($url) => filter_var($url, FILTER_VALIDATE_URL) )); } } , <p> בטוחים. זה מונע התקפות XSS (ראה XSS ו-OWASP XSS Prevention Cheat Sheet). בפרויקט אחד, מצאנו עד 5% שורות עם HTML מסוכן פוטנציאלי.

סיווג שגיאות וחשיבותו

לא כל השגיאות מסוכנות באותה מידה. אנו מפרידים אותן לפי חומרה: CRITICAL (השורה נדלגת), WARNING (השורה מיובאת עם דגל), INFO (מתועד בלבד). אם חלק השגיאות הקריטיות עולה על 20%, כל הייבוא מופסק — זה מונע זיהום המוני של הקטלוג.

כלל חומרה פעולה
SKU ריק CRITICAL השורה נדלגת
שם חסר CRITICAL השורה נדלגת
מחיר < 0.01 CRITICAL השורה נדלגת
שינוי מחיר > 50% WARNING השורה מיובאת עם דגל
HTML בתיאור WARNING הטקסט נוקה, השורה מיובאת
קטגוריה לא נמצאה INFO מתועד
כתובת תמונה שבורה INFO מתועד, התמונה נדלגת

בנוסף, אנו משתמשים בסף הפסקת ייבוא: אם שגיאות קריטיות עולות על 20%, התהליך נעצר. זה אמין פי 5 מוולידציית Laravel סטנדרטית ללא הגנה כזו.

סוג אימות מה הוא בודק דוגמת שגיאה
מבני פורמט שדה, חובה SKU ריק
עסקי לוגיקת דומיין מחיר > מגבלה
סניטציה אבטחה וניקוי תגי HTML

תהליך

  1. ניתוח — אנו לומדים את פורמטי הספקים הנוכחיים (CSV, XML, Excel), מזהים שגיאות אופייניות, ומסכימים על כללים. בממוצע, אנו מעבדים 12 ספקים ביומיים.
  2. עיצוב — אנו מתכננים את סכמת האימות, מגדירים חומרה, ספים, ואסטרטגיית הסרת כפילויות. עד 50 שדות למוצר.
  3. יישום — אנו כותבים ולידטורים, סניטייזרים, ואספני שגיאות. עבור Laravel אנו משתמשים ב-Validator; עבור מחסניות אחרות, כלים מקבילים.
  4. בדיקות — אנו מריצים על נתוני ספקים אמיתיים (בדרך כלל 1000+ שורות), ומתקנים כללים.
  5. פריסה — פריסה לייצור, ניטור ייבוא ראשוני.
מקרה בוחן: רשת של 50 חנויות

לקוח אחד ייבא מוצרים מ-12 ספקים. כל אחד שלח נתונים בפורמט משלו — CSV, XML, Excel. בממוצע, 15% מהשורות הכילו שגיאות. לפני המערכת, שגיאות נמצאו ידנית, ולקח עד 4 שעות ביום. לאחר יישום האימות שלנו עם התראות אוטומטיות על שגיאות קריטיות, זמן הבדיקה ירד ב-80% — חיסכון של כ-$11k–16k בשנה במשכורות מפעילים. בנוסף, המערכת מעבדת 1000 מוצרים ב-2 שניות, מהיר פי 50 מהמאקרו של Excel ששימש קודם. הפחתת השגיאות האופיינית שלנו היא מ-15% לפחות מ-3%, והמערכת מטפלת בעד 100,000 מוצרים ביום.

מה כלול

  • מערכת אימות מבני ועסקי עם כללים הניתנים להגדרה
  • סניטייזר לניקוי מחרוזות, מספרים, כתובות URL ו-HTML
  • הסרת כפילויות SKU בתוך ייבוא בודד
  • אספן שגיאות עם שלוש רמות חומרה ואחסון במסד נתונים
  • סף הפסקת ייבוא לשגיאות קריטיות
  • ממשק ניהולי לצפייה בשגיאות ובסטטוסי ייבוא
  • תיעוד כללים ותיאור API לחיבור ספקים חדשים
  • שיפור איכות נתונים באמצעות בדיקות אוטומטיות

לוחות זמנים

  • אימות מבני (Laravel Validator), סניטציה, איסוף שגיאות — מיום אחד
  • כללים עסקיים, הסרת כפילויות SKU, רמות חומרה — מיום אחד
  • אחסון שגיאות במסד נתונים, סף הפסקה, ממשק ניהול — מיום אחד

סה"כ 3 ימים במפתח פתוח. העלות מחושבת בנפרד לפי מספר הספקים ומורכבות הכללים. אם יש לך בעיה דומה, צור קשר לבדיקה. הזמן פיתוח מערכת אימות — קבל ייעוץ תוך שעתיים. יש לנו ניסיון של 7+ שנים בפתרונות מסחר אלקטרוני — נעריך את הפרויקט שלך תוך שעתיים לאחר היכרות עם הנתונים שלך.