from io import BytesIO from serenitas.utils.env import DAILY_DIR import datetime from csv_headers.citco import GIL, GTL from serenitas.utils.remote import Client from serenitas.analytics.dates import prev_business_day from report_ops.sma import build_position_file def concat_csv(file_type, date): match file_type: case "trade": file_tag = "innocap_serenitas_trades" case "instrument": file_tag = "i.innocap_serenitas" fname = f"Innocap_ISOSEL_{file_type}_{date:%Y-%m-%d}.csv" buf = BytesIO() buf.write((",".join(GTL if file_type == "trade" else GIL) + "\n").encode()) for f in (DAILY_DIR / str(date)).iterdir(): if f.is_file() and f.name.startswith(file_tag): with f.open("rb") as fh: next(fh) # Don't concat headers buf.write(fh.read()) return buf.getvalue(), fname def upload_citco_files(date, upload): for file_type in ("trade", "instrument"): buf, fname = concat_csv(file_type, date) dest = DAILY_DIR / str(date) / fname dest.write_bytes(buf) if upload: innocap_sftp = Client.from_creds("innocap", folder="Innocap") innocap_sftp.put(buf, fname) def upload_position_files(date, fund, upload): buf, dest = build_position_file( date, fund, ) if upload: client = Client.from_creds("innocap", folder="Innocap") client.put(buf, dest.name) client = Client.from_creds("citco") client.put(buf, dest.name) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument( "cob", nargs="?", type=datetime.date.fromisoformat, default=prev_business_day(datetime.date.today()), help="file transfer date", ) parser.add_argument( "--no-upload", "-n", action="store_true", default=False, help="uploads to citco and innocap", ) args = parser.parse_args() upload_citco_files(args.cob, not args.no_upload) upload_position_files(args.cob, "ISOSEL", not args.no_upload)