#!/usr/bin/env python import datetime import faker import itertools import random import sqlite3 import sys LOCALE = "es" NUM_PERSONS = 6 DATE_START = datetime.date(2025, 9, 1) DATE_END = datetime.date(2025, 12, 31) DATE_DURATION = 7 NUM_MACHINES = 5 CREATE_PERSONS = """\ create table person( person_id text not null primary key, personal text not null, family text not null, supervisor_id text, foreign key(supervisor_id) references person(person_id) ); """ INSERT_PERSONS = """\ insert into person values (:person_id, :personal, :family, :supervisor_id); """ CREATE_SURVEYS = """\ create table survey( survey_id text not null primary key, person_id text not null, start_date text, end_date text, foreign key(person_id) references person(person_id) ); """ INSERT_SURVEYS = """\ insert into survey values(:survey_id, :person_id, :start, :end); """ CREATE_MACHINES = """\ create table machine( machine_id text not null primary key, machine_type text not null ); """ INSERT_MACHINES = """\ insert into machine values(:machine_id, :machine_type); """ CREATE_RATINGS = """\ create table rating( person_id text not null, machine_id text not null, level integer, foreign key(person_id) references person(person_id), foreign key(machine_id) references machine(machine_id) ); """ INSERT_RATINGS = """\ insert into rating values(:person_id, :machine_id, :level); """ def main(): db_name = sys.argv[1] seed = int(sys.argv[2]) random.seed(seed) persons_counter = itertools.count() next(persons_counter) persons = gen_persons(NUM_PERSONS, persons_counter) supers = gen_persons(int(NUM_PERSONS / 2), persons_counter) for p in persons: p["supervisor_id"] = random.choice(supers)["person_id"] if len(supers) > 1: supers[0]["supervisor_id"] = supers[-1]["person_id"] surveys = gen_surveys(persons + supers[0:int(len(supers)/2)]) surveys[int(len(surveys)/2)]["start"] = None cnx = sqlite3.connect(db_name) cur = cnx.cursor() everyone = persons + supers random.shuffle(everyone) cur.execute(CREATE_PERSONS) cur.executemany(INSERT_PERSONS, everyone) cur.execute(CREATE_SURVEYS) cur.executemany(INSERT_SURVEYS, surveys) machines = gen_machines() cur.execute(CREATE_MACHINES) cur.executemany(INSERT_MACHINES, machines) ratings = gen_ratings(everyone, machines) cur.execute(CREATE_RATINGS) cur.executemany(INSERT_RATINGS, ratings) cnx.commit() cnx.close() def gen_machines(): adjectives = "hydraulic rotary modular industrial automated".split() nouns = "press conveyor generator actuator compressor".split() machines = set() while len(machines) < NUM_MACHINES: candidate = f"{random.choice(adjectives)} {random.choice(nouns)}" if candidate not in machines: machines.add(candidate) counter = itertools.count() next(counter) return [ {"machine_id": f"M{next(counter):04d}", "machine_type": m} for m in machines ] def gen_persons(num, counter): fake = faker.Faker(LOCALE) fake.seed_instance(random.randint(0, 1_000_000)) return [ { "person_id": f"P{next(counter):03d}", "personal": fake.first_name(), "family": fake.last_name(), "supervisor_id": None, } for _ in range(num) ] def gen_ratings(persons, machines): temp = {} while len(temp) < int(len(persons) * len(machines) / 4): p = random.choice(persons)["person_id"] m = random.choice(machines)["machine_id"] if (p, m) in temp: continue temp[(p, m)] = random.choice([None, 1, 2, 3]) return [ {"person_id": p, "machine_id": m, "level": v} for ((p, m), v) in temp.items() ] def gen_surveys(persons): surveys = [] counter = itertools.count() next(counter) for person in persons: person_id = person["person_id"] start = DATE_START while start <= DATE_END: survey_id = f"S{next(counter):04d}" end = start + datetime.timedelta(days=random.randint(1, DATE_DURATION)) surveys.append({ "survey_id": survey_id, "person_id": person_id, "start": start.isoformat(), "end": end.isoformat() if end <= DATE_END else None }) start = end + datetime.timedelta(days=random.randint(1, DATE_DURATION)) return surveys if __name__ == "__main__": main()