Files
iface_ecosio/invoice_all_stores.py
2026-02-25 10:24:12 +01:00

138 lines
5.2 KiB
Python

import os
from datetime import datetime, timedelta
import csv
import time
from lib_poslog import find_invoices_in_storeday
from localconfig import *
from stores import Stores
import io
import zipfile
from pprint import pprint
import urllib.request
import json
import tempfile
import models
SORTED_PATH = os.path.join(BASEPATH, "Sorted")
ECOSIO_PATH = os.path.join(BASEPATH, "Ecosio")
stores = Stores()
def save_edate(yyyymmdd):
if not TEST:
with open(EARLIEST_DATE_FILE, 'w') as file:
file.write(yyyymmdd)
def load_edate():
yyyymmdd = '20260201'
if os.path.exists(EARLIEST_DATE_FILE):
with open(EARLIEST_DATE_FILE, 'r') as f:
yyyymmdd = f.readline()
return yyyymmdd
def remove_duplicates_inplace(file_path):
seen = set()
# Create temporary file in same directory
dir_name = os.path.dirname(file_path)
with tempfile.NamedTemporaryFile(
mode='w',
newline='',
encoding='utf-8',
delete=False,
dir=dir_name
) as temp_file:
temp_path = temp_file.name
with open(file_path, mode='r', newline='', encoding='utf-8') as infile:
reader = csv.reader(infile)
writer = csv.writer(temp_file)
for row in reader:
if not row:
continue
key = row[0]
if key not in seen:
seen.add(key)
writer.writerow(row)
# Replace original file with cleaned file
os.replace(temp_path, file_path)
def invoice_all_stores_for(YYYY, MM, DD, update_store_file=False):
"""
from CSV file "stores_to_invoice" (global: stores) Get all the stores who creates archive files for <date>
check for <date> if processing is done/not
if not: for all stores check if a invoice found is already processed/not
if not: process invoice and write to the processing service: invoicenr, system-isues, data-issues
processing results on a list of invoices, they should be save to the ecosio folder - a service will pick themn up
if a date has completely been processed, write to the processing service: date, poslogged, ecosiod
If there is any file in the folder-structure NOT in the csv file, add it to the csv and issue a warning
Pick up all the stores from the csv files who are tagged to create-invoices
...and have those invoices created
:param YYYY: year
:param MM: month
:param DD: date
"""
global process_results
name_prexif = 'TST_' if TEST else ''
# open the results file
buyer_issues = 0
system_issues = 0
date = f"{YYYY}-{MM}-{DD}"
# contents = json.loads(urllib.request.urlopen(INVOICE_SERVICE + f"getStatusOfDate/{YYYY}/{MM}/{DD}").read())
# if contents['status'] == 'pending':
print(f"Invoicing for {YYYY} {MM} {DD}")
for country in stores.all_countries():
for store in stores.stores_for(country):
# try:
# get the invoices that are good to sent, and the number of data-fails
invoices, invoices_with_data_issues = find_invoices_in_storeday(store, YYYY, MM, DD)
for invoice in invoices:
contents = json.loads(urllib.request.urlopen(INVOICE_SERVICE + f"poslog/canBeConverted/{invoice.poslogid}").read())
if (contents['status'] == 'Ok') or TEST:
with open(os.path.join(ECOSIO_PATH, f"{name_prexif}{country}_{invoice.poslogid}.xml"), "w", encoding="utf-8") as lfile:
lfile.write(str(invoice))
if not TEST:
contents = urllib.request.urlopen(INVOICE_SERVICE + f"poslog/isConverted/{invoice.poslogid}/{invoice.receipt_id()}/{invoice.country()}").read()
# save status to service
for invoice in invoices_with_data_issues:
if not TEST:
contents = urllib.request.urlopen(INVOICE_SERVICE + f"poslog/hasIssues/{invoice.poslogid}/{invoice.receipt_id()}/{invoice.country()}").read()
buyer_issues += 1
# except:
# log(f"Programming error while processing {store} {YYYY}-{MM}-{DD}", 3)
# # something went dreadfully wrong: send state to service
# system_issues += 1
if not TEST:
contents = urllib.request.urlopen(INVOICE_SERVICE + f"setStatusOfDate/{YYYY}/{MM}/{DD}/{system_issues}/{buyer_issues}").read()
if __name__ == '__main__':
today = datetime.datetime.today().date()
earliest_date_str = load_edate()
earliest_date = datetime.datetime.strptime(earliest_date_str, "%Y%m%d").date()
process_date = earliest_date
while process_date <= today:
year4 = process_date.strftime('%Y') # 4-digit year
month = process_date.strftime('%m') # 2-digit month
day = process_date.strftime('%d') # 2-digit day
d = f"{year4}-{month}-{day}"
invoice_all_stores_for(year4,month,day)
process_date = process_date + timedelta(days=1)
# in the broken buyers csv files, remove any duplicates that may have caused it with multiple runs
remove_duplicates_inplace(BUYERS_BROKEN)
contents = json.loads(urllib.request.urlopen(INVOICE_SERVICE + f"getNextProcessDate/{earliest_date_str}").read())
save_edate(contents['data'])