import typer from sqlalchemy.orm.session import Session from client.measures_client import ClimaMeasuresClient from config.settings import CLIMA_API_URL from cruds.finca_company import create_finca_company, delete_finca_company from cruds.fincas import ( create_finca, get_finca_by_station_code, get_fincas_filter_company, update_finca_title, ) from database.sqlalchemy import SessionLocal from models.users import User from schemas.finca_company import FincaCompany as FincaCompanySchema def update_fincas(company_id: int): db: Session = SessionLocal() user = db.query(User).first() client = ClimaMeasuresClient( token=user.token, url=CLIMA_API_URL, ) fincas_api = client.get_stations(str(company_id)) fincas_local = get_fincas_filter_company(db, company_id) added = 0 deleted = 0 updated = 0 # Agregar Fincas que esten en clima pero no en este sistema for finca_api in fincas_api: if not any( finca_local.station_code == finca_api.station_code for finca_local in fincas_local ): if not get_finca_by_station_code(db, finca_api.station_code): finca = create_finca(db=db, finca=finca_api) else: finca = get_finca_by_station_code(db, finca_api.station_code) finca_company = FincaCompanySchema( finca_station_code=finca.station_code, company_id=company_id ) create_finca_company(db, finca_company) added += 1 # Eliminar Relaciones con Fincas que no esten en clima pero si en este sistema for finca_local in fincas_local: if not any( finca_local.station_code == finca_api.station_code for finca_api in fincas_api ): delete_finca_company( db=db, company_id=company_id, station_code=finca_local.station_code ) deleted += 1 fincas_local = get_fincas_filter_company(db, company_id) # Mantener congruencia de titulos for finca_local in fincas_local: finca_api = next( (x for x in fincas_api if x.station_code == finca_local.station_code), None, ) if finca_local.title != finca_api.title: update_finca_title( db=db, station_code=finca_local.station_code, new_title=finca_api.title ) updated += 1 response = { "added_fincas": added, "deleted_fincas": deleted, "updated_fincas": updated, } return response def update_fincas_console( company_id: int = typer.Option("", "--id"), ): return update_fincas(company_id)