diff --git a/isjkhrs/crud.py b/isjkhrs/crud.py index b2b89e8..0ab76bb 100644 --- a/isjkhrs/crud.py +++ b/isjkhrs/crud.py @@ -33,6 +33,11 @@ def exec_procedure_wo_result(session, proc_name, params, database: str = None): session.commit() +class GeneralViewSet: + + def get_changing_list(db: Session, data: schemas.ChangingListInit): + return exec_procedure(db, 'uspGetChangingList', data.dict(), 'General') + class FilterViewSet: """get""" @@ -45,4 +50,4 @@ class FilterViewSet: return exec_procedure(db, 'uspGetFilterList', data.dict(), 'ISJKHRSTO') def set_filter_list(db: Session, data: schemas.FilterSetInit): - return exec_procedure_wo_result(db, 'uspSetFilterList', data.dict(), 'ISJKHRSTO') \ No newline at end of file + return exec_procedure_wo_result(db, 'uspSetFilterList', data.dict(), 'ISJKHRSTO') diff --git a/isjkhrs/isapi.py b/isjkhrs/is.py similarity index 100% rename from isjkhrs/isapi.py rename to isjkhrs/is.py diff --git a/isjkhrs/routers/general.py b/isjkhrs/routers/general.py index 126ba42..ecc313e 100644 --- a/isjkhrs/routers/general.py +++ b/isjkhrs/routers/general.py @@ -2,9 +2,10 @@ from fastapi import APIRouter, Depends from auth.login.schemas import login as models from auth import oauth2 from databases.mssql import general -import kv.schemas as schemas +import isjkhrs.schemas as schemas from sqlalchemy.orm import Session from typing import List +import isjkhrs.crud as crud router = APIRouter(dependencies= [Depends(oauth2.get_current_user) ]) @@ -20,6 +21,11 @@ async def get_cities(db = Depends(general.get_db)): async def get_city(region_id: int,db = Depends(general.get_db)): return db.execute(f"SELECT id, name FROM General.dbo.vCities WHERE id_region = {region_id}").fetchall() +@router.get('/getBoilersByRegion/IDRegion={IDRegion}') +async def get_boiler_by_region(IDRegion: int,db = Depends(general.get_db)): + return db.execute(f"select * from General..vBoilers b " + +"inner join General..vCities c on c.id = b.id_city " + +"where c.id_region = {IDRegion}").fetchall() @router.get('/getAddress/city-id={city_id}') async def get_address(city_id: int, db= Depends(general.get_db)): @@ -27,4 +33,8 @@ async def get_address(city_id: int, db= Depends(general.get_db)): @router.get('/getRegions') async def get_region(db = Depends(general.get_db)): - return db.execute("SELECT id, name FROM General.dbo.vRegions").fetchall() \ No newline at end of file + return db.execute("SELECT id, name FROM General.dbo.vRegions").fetchall() + +@router.post('/get_changing_list') +async def get_filter_list(request: schemas.ChangingListInit, db: Session = Depends(general.get_db)): + return crud.GeneralViewSet.get_changing_list(db, request) \ No newline at end of file diff --git a/isjkhrs/schemas.py b/isjkhrs/schemas.py index 39d2207..e14d79c 100644 --- a/isjkhrs/schemas.py +++ b/isjkhrs/schemas.py @@ -29,4 +29,8 @@ class FilterTypeSerializer(BaseModel): class FilterListSerializer(BaseModel): ID: int Name: Optional[str] = None - IsChecked: bool \ No newline at end of file + IsChecked: bool + +class ChangingListInit(BaseModel): + IDGetType: int + IDRegion: int diff --git a/kv/crud.py b/kv/crud.py index 711b66f..93ece82 100644 --- a/kv/crud.py +++ b/kv/crud.py @@ -1,36 +1,38 @@ from sqlalchemy.orm import Session -from sqlalchemy import text +from sqlalchemy import text, sql from kv.database import get_table from kv import schemas def exec_procedure(session, proc_name, params, database: str = None): - sql_params = ",".join([f"@{name}='{value}'" if type(value) in [str] else f"@{name}={value}" - for name, value in params.items()]) + sql_params = ",".join([f"@{key} = :{key}" + for key, value in params.items()]) dbstr = "" if database: dbstr = f"[{database}]." - sql_string = """ + sql_string = sql.text(f''' DECLARE @return_value int; - EXEC @return_value = {dbstr}[dbo].[{proc_name}] {params}; + EXEC @return_value = {dbstr}[dbo].[{proc_name}] {sql_params}; SELECT 'Return Value' = @return_value; - """.format(dbstr=dbstr, proc_name=proc_name, params=sql_params) - data = session.execute(sql_string).fetchall() + ''') + data = session.execute( + sql_string, params).fetchall() session.commit() session.expire_all() return data def exec_procedure_wo_result(session, proc_name, params, database: str = None): - sql_params = ",".join([f"@{name}='{value}'" if type(value) in [str] else f"@{name}={value}" - for name, value in params.items()]) + sql_params = ",".join([f"@{key} = :{key}" + for key, value in params.items()]) dbstr = "" if database: dbstr = f"[{database}]." - sql_string = """ - EXEC {dbstr}[dbo].[{proc_name}] {params} - """.format(dbstr=dbstr, proc_name=proc_name, params=sql_params) - session.execute(sql_string) + sql_string = sql.text(f''' + EXEC @return_value = {dbstr}[dbo].[{proc_name}] {sql_params}; + ''') + session.execute( + sql_string, params).fetchall() session.commit() @@ -122,7 +124,7 @@ class ObjectViewSet: return exec_procedure(db, 'uspGetObjectMunicipals', {'IDCity': IDCity}) def get_services(db: Session, IDObject: str = None): - return exec_procedure(db, 'uspGetObjectMunicipals', {'IDObject': IDObject}) + return exec_procedure(db, 'uspGetObjectServices', {'IDObject': IDObject}) def get_addresses(db: Session, IDObject: str = None): return exec_procedure(db, 'uspGetObjectAddresses', {'IDObject': IDObject}) @@ -206,12 +208,8 @@ class PaymentViewSet: def get_receipt_calculate(db: Session, data: schemas.RecieptCalculateInit): return exec_procedure(db, 'uspGetReceiptCalculate', **data) - def save_receipt(db: Session, data: schemas.ReceiptSaveInit = None): - try: - exec_procedure_wo_result(db, 'uspSaveReceipt', data.dict()) - return {'msg': 'success'} - except: - return {'msg': 'error'} + def save_receipt(db: Session, data: schemas.ReceiptSaveInit): + return exec_procedure(db, 'uspSaveReceipt', data.dict()) def repayment_info(db: Session, data: schemas.RepaymentInfoInit): return exec_procedure(db, 'uspGetRepaymentInfo', **data) @@ -271,6 +269,13 @@ class RecalculationViewSet: except: return {'msg': 'error'} + def save_recalculation(db: Session, data: schemas.RecalculationSave = None): + try: + exec_procedure_wo_result(db, 'uspSaveRecalculation', data.dict()) + return {'msg': 'success'} + except: + return {'msg': 'error'} + """ReferenceViewSet""" diff --git a/kv/routers/filter.py b/kv/routers/filter.py new file mode 100644 index 0000000..fdd9c0f --- /dev/null +++ b/kv/routers/filter.py @@ -0,0 +1,24 @@ +import kv.schemas as schemas +import kv.crud as crud +from kv.database import get_db +from sqlalchemy.orm import Session +from fastapi import APIRouter, Depends +from typing import List +router = APIRouter() + +"""post""" + + +@router.post('/get_filter_types', response_model=List[schemas.FilterTypeSerializer]) +async def get_filter_types(request: schemas.FilterTypeInit, db: Session = Depends(get_db)): + return crud.FilterViewSet.get_filter_types(db, request) + + +@router.post('/get_filter_list', response_model=List[schemas.FilterListSerializer]) +async def get_filter_list(request: schemas.FilterListInit, db: Session = Depends(get_db)): + return crud.FilterViewSet.get_filter_list(db, request) + + +@router.post('/set_report_filter_list', response_model=List[schemas.FilterListSerializer]) +async def set_report_filter_list(request: schemas.FilterSetInit, db: Session = Depends(get_db)): + return crud.FilterViewSet.set_filter_list(db, request) diff --git a/kv/routers/objectvs.py b/kv/routers/objectvs.py index 87b234e..b31f544 100644 --- a/kv/routers/objectvs.py +++ b/kv/routers/objectvs.py @@ -29,7 +29,7 @@ async def get_services(IDObject: str, db: Session = Depends(get_db)): @router.get("/get_addresses/{IDObject}", response_model=List[schemas.ObjectAddressesSerializer]) async def get_addresses(IDObject: str, db: Session = Depends(get_db)): - data = crud.ObjectViewSet.get_addresses(db, id) + data = crud.ObjectViewSet.get_addresses(db, IDObject) return data diff --git a/kv/routers/payment.py b/kv/routers/payment.py index 63e7f8c..0a915fd 100644 --- a/kv/routers/payment.py +++ b/kv/routers/payment.py @@ -41,7 +41,7 @@ async def get_receipt_calculate(request: schemas.RecieptCalculateInit, db: Sessi return crud.PaymentViewSet.get_receipt_calculate(db, request) -@router.post('/save_receipt') +@router.post('/save_receipt', response_model=List[schemas.ReceiptSaveSerializer]) async def save_receipt(request: schemas.ReceiptSaveInit, db: Session = Depends(get_db)): return crud.PaymentViewSet.save_receipt(db, request) diff --git a/kv/routers/personalaccount.py b/kv/routers/personalaccount.py index 7cff2a0..b6d4a79 100644 --- a/kv/routers/personalaccount.py +++ b/kv/routers/personalaccount.py @@ -46,6 +46,5 @@ async def get_debts(IDPersonalAccount: int, GetType: bool, db: Session = Depends @router.post("/get_financial_account", response_model=List[schemas.ReportTOFinancialAccount]) -async def get_financial_account(request: schemas.PersonalAccountInit, db: Session = Depends(get_db)): - data = crud.PersonalAccountViewSet.get_financial_account(db, request) - return schemas.ReportTOFinancialAccount(**data) +async def get_financial_account(request: schemas.ReportTOFinancialAccountInit, db: Session = Depends(get_db)): + return crud.PersonalAccountViewSet.get_financial_account(db, request) diff --git a/kv/routers/recalculation.py b/kv/routers/recalculation.py index f0aeba0..2e3bdc7 100644 --- a/kv/routers/recalculation.py +++ b/kv/routers/recalculation.py @@ -32,6 +32,6 @@ async def get_accruals_can_be_recalculated(request: schemas.AccrualsCanBeRecalcu return crud.RecalculationViewSet.get_accruals_can_be_recalculated(db, request) -@router.post('/save_withdrawing') -async def save_withdrawing(request: schemas.WithdrawingSave, db: Session = Depends(get_db)): - return crud.RecalculationViewSet.save_withdrawing(db, request) +@router.post('/save_recalculation') +async def save_recalculation(request: schemas.RecalculationSave, db: Session = Depends(get_db)): + return crud.RecalculationViewSet.save_recalculation(db, request) diff --git a/kv/schemas.py b/kv/schemas.py index 7d7ce44..3604944 100644 --- a/kv/schemas.py +++ b/kv/schemas.py @@ -5,6 +5,8 @@ from pydantic import BaseModel from typing import Optional, List from datetime import date, datetime +from sqlalchemy import SmallInteger, null + class AddObjectInit(BaseModel): IDCity: int @@ -126,7 +128,7 @@ class WithdrawingCheckInit(PersonalAccountInit, GetTypeInit, DateInit): pass class AccrualsCanBeRecalculatedInit(BaseModel): - IDPersonalAccount: int + IDUser: int DateBegin: str DateEnd: str @@ -138,6 +140,14 @@ class WithdrawingSave(PersonalAccountInit, WithdrawingCheckSerializer, DateInit) IDProviderContract: int IDManagementCompany: int +class RecalculationSave(BaseModel): + IDUser: int + IDService: int + IDType: int + Percent: float + DateBegin: str + DateEnd: str + class RepaymentInfoInit(BaseModel): IDCashbox: int @@ -161,10 +171,10 @@ class ReceiptSaveInit(BaseModel): IDCashbox: int IDType: int IDPersonalAccount: int - IDDebtContract: int - IDService: int - DateBegin: date - DateEnd: date + IDDebtContract: int = None + IDService: int = None + DateBegin: str + DateEnd: str IDMoneyType: int Amount: float AmountFine: float @@ -384,25 +394,25 @@ class TOArchiveReceiptSerializer(BaseModel): class ReportTOFinancialAccount(BaseModel): - por: int + por: int = None ServiceName: Optional[str] = None ProviderName: Optional[str] = None - DateBegin: date - DateEnd: date - StandartVolume: float - TariffPopulation: float - TariffProvider: float - AmountSaldoBegin: float - AmountTotalAccrued: float - AmountAccruedSubsidy: float - AmountAccrued: float - AmountSubsidy: float - AmountWithdrawing: float - AmountActualAccrued: float - AmountReceipt: float - AmountSaldoCorrect: float - AmountAccruedPreferential: float - AmountSaldoEnd: float + DateBegin: str = None + DateEnd: str = None + StandartVolume: float = None + TariffPopulation: float = None + TariffProvider: float = None + AmountSaldoBegin: float = None + AmountTotalAccrued: float = None + AmountAccruedSubsidy: float = None + AmountAccrued: float = None + AmountSubsidy: float = None + AmountWithdrawing: float = None + AmountActualAccrued: float = None + AmountReceipt: float = None + AmountSaldoCorrect: float = None + AmountAccruedPreferential: float = None + AmountSaldoEnd: float = None class MoneyTypesSerializer(BaseModel): @@ -486,6 +496,11 @@ class ReceiptCalculatedSerializer(BaseModel): ServiceName: Optional[str] = None Amount: float +class ReceiptSaveSerializer(BaseModel): + IDService: int + ServiceName: Optional[str] = None + Amount: float + class RentRepaymentInfoSerializer(BaseModel): Name: Optional[str] = None @@ -627,52 +642,53 @@ class AccrualsCanBeRecalculatedSerializer(BaseModel): id: int IDService: int ServiceName: Optional[str] = None + Volume: float Amount: float class ObjectDetailsSerializer(BaseModel): - IDObject: str + IDObject: str = None IDFias: Optional[str] = None - IDBoiler: str - IDOwnershipType: int - IDProviderUtilityServices: int - BuildDate: int - FloorNumber: int - Entrance: int - CommissDate: date - Volume: float - FullArea: float + IDBoiler: str = None + IDOwnershipType: int = None + IDProviderUtilityServices: int = None + BuildDate: int = None + FloorNumber: int = None + Entrance: int = None + CommissDate: date = None + Volume: float = None + FullArea: float = None IDBuildingType: Optional[str] = None - IDOverlappingType: int - IDWallMaterial: int - IDRoofType: int - IDFoundationType: int - WithdrawingDate: date + IDOverlappingType: int = None + IDWallMaterial: int = None + IDRoofType: int = None + IDFoundationType: int = None + WithdrawingDate: date = None WithdrawingReason: Optional[str] = None - IDSystemHotWater: int - IDSystemHotWaterPeriodType: int - IDSystemColdWater: int - IDSystemColdWaterPeriodType: int - IDSystemSewerage: int - IDStandartVolume: int - IDHeatingType: int - IDGasType: int - IDWiringType: int - IDImprovementDegree: int - Amount: float - Deterioration: float - AreaRoof: float - AreaFoundation: float - AreaFacade: float - AreaPlub: float - AreaAttic: float - AreaTechnicalFloor: float - AreaBuilding: float - AreaLk: float - AreaYardArea: float - AreaBoiler: float - ActAvailabilityCounterInstallObjectHeating: int - ActAvailabilityCounterInstallObjectWater: int - DirectControl: bool + IDSystemHotWater: int = None + IDSystemHotWaterPeriodType: int = None + IDSystemColdWater: int = None + IDSystemColdWaterPeriodType: int = None + IDSystemSewerage: int = None + IDStandartVolume: int = None + IDHeatingType: int = None + IDGasType: int = None + IDWiringType: int = None + IDImprovementDegree: int = None + Amount: float = None + Deterioration: float = None + AreaRoof: float = None + AreaFoundation: float = None + AreaFacade: float = None + AreaPlub: float = None + AreaAttic: float = None + AreaTechnicalFloor: float = None + AreaBuilding: float = None + AreaLk: float = None + AreaYardArea: float = None + AreaBoiler: float = None + ActAvailabilityCounterInstallObjectHeating: int = None + ActAvailabilityCounterInstallObjectWater: int = None + DirectControl: bool = None class ObjectMunicipalsSerializer(BaseModel): @@ -683,15 +699,15 @@ class ObjectMunicipalsSerializer(BaseModel): class ObjectServicesSerializer(BaseModel): id: int IDService: int - IDProviderContract: int + IDProviderContract: int = None ServiceName: Optional[str] = None - por: int + por: int = None ProviderName: Optional[str] = None - DateBegin: date - DateEnd: date - IDTariffPopulation: int - TariffPopAmount: float - TariffProvAmount: float + DateBegin: date = None + DateEnd: date = None + IDTariffPopulation: int = None + TariffPopAmount: float = None + TariffProvAmount: float = None class ObjectAddressesSerializer(BaseModel): @@ -780,6 +796,7 @@ class ObjectWaterSystemVolumesInit(BaseModel): IDHotWater: int IDColdWater: int IDSewerage: int + class TariffPopulationSerializer(BaseModel): @@ -813,3 +830,11 @@ class ProviderUtilityService(BaseModel): CorrectAccount: str BIK: str WorkTime: Optional[str] = None + +class ReportTOFinancialAccountInit(BaseModel): + IDUser: int + IDCashbox: int + IDPersonalAccount: int + Month: int + vid: bool + IsAUP: bool diff --git a/main.py b/main.py index 8e1abad..8589bbb 100644 --- a/main.py +++ b/main.py @@ -5,7 +5,7 @@ from fastapi.middleware.cors import CORSMiddleware from kv import kv from auth import auth from kassa import kassa -from isjkhrs import isapi +from isjkhrs import ismain import uvicorn middleware = [Middleware( @@ -39,7 +39,7 @@ app.include_router( app.include_router( - router=isapi.router, + router=ismain.router, prefix='/is', tags=['Информационная система'], responses={404: {"description": "Not found"}}