File size: 3,677 Bytes
bc02e50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import pandas as pd
import numpy as np
from faker import Faker
from datetime import datetime, timedelta
import random

fake = Faker()

class SAPDataGenerator:
    def __init__(self):
        self.suppliers = [
            "Acme Corp", "Global Supplies Inc", "Tech Solutions Ltd", 
            "Industrial Partners", "Premium Materials Co", "Swift Logistics",
            "Quality Components", "Reliable Vendors", "Innovative Systems",
            "Professional Services"
        ]
        
        self.categories = [
            "Raw Materials", "IT Equipment", "Office Supplies", 
            "Professional Services", "Maintenance", "Transportation",
            "Marketing", "Facilities", "Security", "Consulting"
        ]
        
        self.plant_codes = ["1000", "2000", "3000", "4000", "5000"]
        self.company_codes = ["US01", "DE02", "IN03", "UK04", "SG05"]

    def generate_purchase_orders(self, n=1000):
        data = []
        for i in range(n):
            po_date = fake.date_between(start_date='-2y', end_date='today')
            delivery_date = po_date + timedelta(days=random.randint(7, 90))
            
            unit_price = round(random.uniform(10, 10000), 2)
            quantity = random.randint(1, 1000)
            total_value = round(unit_price * quantity, 2)
            
            data.append({
                'PO_Number': f"PO{str(i+1).zfill(8)}",
                'Supplier': random.choice(self.suppliers),
                'Category': random.choice(self.categories),
                'Plant': random.choice(self.plant_codes),
                'Company_Code': random.choice(self.company_codes),
                'PO_Date': po_date,
                'Delivery_Date': delivery_date,
                'Material': fake.catch_phrase(),
                'Quantity': quantity,
                'Unit_Price': unit_price,
                'Total_Value': total_value,
                'Currency': 'USD',
                'Status': random.choice(['Open', 'Delivered', 'Partially Delivered', 'Cancelled']),
                'Buyer': fake.name(),
                'Payment_Terms': random.choice(['Net 30', 'Net 60', '2/10 Net 30', 'Immediate']),
                'Delivery_Performance': round(random.uniform(85, 99), 1)
            })
        
        return pd.DataFrame(data)

    def generate_supplier_performance(self):
        data = []
        for supplier in self.suppliers:
            data.append({
                'Supplier': supplier,
                'On_Time_Delivery': round(random.uniform(85, 98), 1),
                'Quality_Score': round(random.uniform(80, 99), 1),
                'Cost_Performance': round(random.uniform(90, 99), 1),
                'Total_Spend_YTD': round(random.uniform(100000, 5000000), 2),
                'Active_Contracts': random.randint(5, 50),
                'Risk_Score': random.choice(['Low', 'Medium', 'High']),
                'Certification_Status': random.choice(['ISO 9001', 'ISO 14001', 'Multiple', 'None'])
            })
        
        return pd.DataFrame(data)

    def generate_spend_analysis(self):
        months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
                 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
        data = []
        
        for month in months:
            for category in self.categories:
                data.append({
                    'Month': month,
                    'Category': category,
                    'Spend': round(random.uniform(50000, 500000), 2),
                    'Budget': round(random.uniform(60000, 550000), 2),
                    'Variance': round(random.uniform(-10, 15), 1)
                })
        
        return pd.DataFrame(data)