89 lines
2.8 KiB
Python
89 lines
2.8 KiB
Python
import csv
|
|
import datetime
|
|
import re
|
|
from decimal import Decimal
|
|
|
|
from django.core.management.base import BaseCommand
|
|
|
|
from main.models import FuelPurchase
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Import fuel purchases from CSV file"
|
|
|
|
# Valintakenttien sanakirjat nimistä arvoiksi
|
|
GAS_STATION_MAP = {
|
|
'Neste': 1,
|
|
'Teboil': 2,
|
|
'ABC': 3,
|
|
'Shell': 4,
|
|
'St1': 5,
|
|
'SEO': 6,
|
|
'ysi5': 7,
|
|
'-': 0,
|
|
}
|
|
|
|
OCTANE_MAP = {
|
|
'95': 95,
|
|
'98': 98,
|
|
}
|
|
|
|
CAR_MAP = {
|
|
'_': 0,
|
|
'Renault': 1,
|
|
'Nissan': 2,
|
|
'Smart': 3,
|
|
}
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument('csvfile', type=str, help='Path to the CSV file')
|
|
|
|
def parse_decimal(self, value_str):
|
|
# Poista kaikki ei-numerot/pilkku/piste ja korvaa pilkut pisteeksi
|
|
# esim. "10,00 €" -> "10.00"
|
|
value_str = value_str.strip()
|
|
# poista valuuttamerkit ja välilyönnit
|
|
value_str = re.sub(r'[^\d,.-]', '', value_str)
|
|
value_str = value_str.replace(',', '.')
|
|
return Decimal(value_str)
|
|
|
|
def parse_date(self, date_str):
|
|
# Muoto: 08.02.2015
|
|
return datetime.datetime.strptime(date_str, "%d.%m.%Y").date()
|
|
|
|
def handle(self, *args, **options):
|
|
file_path = options['csvfile']
|
|
with open(file_path, newline='', encoding='utf-8') as csvfile:
|
|
reader = csv.DictReader(csvfile, delimiter=';')
|
|
count = 0
|
|
for row in reader:
|
|
try:
|
|
purchase_date = self.parse_date(row['Päivämäärä'])
|
|
total_cost = self.parse_decimal(row['Hinta €'])
|
|
price_per_litre = self.parse_decimal(row['Litrahinta €'])
|
|
amount_litres = self.parse_decimal(row['Litraa'])
|
|
|
|
gas_station_name = row['Asema'].strip()
|
|
gas_station = self.GAS_STATION_MAP.get(gas_station_name, 0)
|
|
|
|
octane_name = row['Polttoaine'].strip()
|
|
octane = self.OCTANE_MAP.get(octane_name, 95)
|
|
|
|
car_name = row['Auto'].strip()
|
|
car = self.CAR_MAP.get(car_name, 0)
|
|
|
|
obj, created = FuelPurchase.objects.get_or_create(
|
|
purchase_date=purchase_date,
|
|
gas_station=gas_station,
|
|
octane=octane,
|
|
car=car,
|
|
total_cost=total_cost,
|
|
price_per_litre=price_per_litre,
|
|
amount_litres=amount_litres
|
|
)
|
|
if created:
|
|
count += 1
|
|
except Exception as e:
|
|
self.stderr.write(f"Error processing row {row}: {e}")
|
|
|
|
self.stdout.write(self.style.SUCCESS(f"Imported {count} fuel purchase records"))
|