"""견적 서비스 파사드 — 관심사별 모듈(mixin)을 QuotationService 하나로 조립한다. 밖(라우터·테스트)에서 보는 클래스 이름·메서드 시그니처는 분할 전과 동일하다. pricing.py 목표가·앵커 계산 + 산정내역 build.py 생성·재생성(_build_quotation) closing.py 마감 판정·수동 마감·직접 낙찰 queries.py 조회·삭제·공용 _fetch invites.py 초청 메일 """ from fastapi import Depends from crud.quotation_crud import IQuotationCRUD, QuotationCRUD from services.quotation.build import BuildMixin from services.quotation.closing import ClosingMixin from services.quotation.invites import InvitesMixin from services.quotation.pricing import PricingMixin from services.quotation.queries import QueriesMixin class QuotationService(PricingMixin, BuildMixin, ClosingMixin, QueriesMixin, InvitesMixin): """견적 비즈니스 로직. 회사 스코프(멀티테넌트)는 작성자(user_id)→users.company_id 조인으로 건다(quotations 에 company_id 컬럼이 없음). 목록(list_quotations)은 회사 스코프로 제한한다. user_id 는 '내 견적만' 추가 필터로도 쓴다. """ def __init__(self, quotation_crud: IQuotationCRUD = Depends(QuotationCRUD)): self.quotation_crud = quotation_crud