콘텐츠로 건너뛰기

Odoo sale.order.line 모델 완벽 해부: Sales Order Line 구조 이해하기

개발자와 기능 컨설턴트를 위한 Odoo 판매 주문 라인 모델 완전 가이드
2026년 3월 10일 작성자
Odoo sale.order.line 모델 완벽 해부: Sales Order Line 구조 이해하기
Dasolo
| 아직 댓글이 없습니다

소개


Odoo에서 ‘모델’은 데이터베이스에 정보를 어떻게 담고 구조화할지를 규정하는 청사진입니다. 판매 주문, 송장, 거래처 같은 모든 비즈니스 데이터는 각기 모델이라는 그릇 안에 저장됩니다.


모델을 이해하는 것은 개발자와 기능 컨설턴트 모두에게 필수입니다. 모델은 필드 정의, 관계 설정, 비즈니스 로직을 담아 Odoo 전체 데이터 구조를 지탱하는 기반이 됩니다.


이 글은 판매(Sales) 모듈의 핵심 모델 중 하나인 sale.order.line을 집중적으로 다룹니다. 맞춤 모듈을 만들거나 외부 시스템과 연동하거나 가격 정책을 설정할 때 이 모델을 반드시 다루게 됩니다.

sale.order.line 모델이란 무엇인가


sale.order.line은 견적서나 판매 주문서의 개별 품목(라인)을 나타냅니다. 보통 한 라인은 하나의 제품에 대응하며 수량, 단가, 세금 정보 등을 포함합니다.


이 모델은 판매(sale) 모듈에서 사용되며, analytic.mixin을 상속받아 프로젝트 비용과 근무시간 연동을 지원합니다. 견적서에 제품을 추가하면 내부적으로 sale.order.line 레코드가 생성됩니다.


모델 정의는 sale 모듈에 위치하며, 다른 모듈이 Odoo 상속을 통해 필요한 필드와 기능을 추가합니다. 예를 들어 sale_stock는 배송 관련 필드를, sale_margin은 마진 계산 관련 항목을 덧붙입니다. 핵심 구조는 중복 없이 유지됩니다.

모델의 핵심 필드들


다음은 sale.order.line 모델에서 꼭 알아야 할 주요 필드들입니다. 이들 속성을 이해하면 견적과 주문을 보다 정확히 다룰 수 있습니다.


1. order_id

형식: Many2one (sale.order). 필수. 부모 판매 주문을 참조합니다. 각 라인은 이 필드를 통해 부모 주문과 연결되며, 주문이 삭제되면 라인도 함께 삭제됩니다(종속 삭제).


2. sequence

형식: Integer. 기본값 10. 주문서 상에서 라인의 표시 순서를 제어합니다. 섹션, 메모, 제품 라인의 정렬에 사용됩니다.


3. company_id

형식: Many2one (res.company). order_id로부터 관련 필드입니다. 다중회사 규칙과 접근 제어에 사용됩니다.


4. currency_id

형식: Many2one (res.currency). order_id에서 가져옵니다. 라인의 모든 금전 필드에 적용되어 올바른 통화로 가격을 관리합니다.


5. order_partner_id

형식: Many2one (res.partner). order_id로부터 연관된 고객입니다. 가격표(pricelist)와 세금 규칙 적용에 사용됩니다.


6. salesman_id

형식: Many2one (res.users). order_id로부터 가져오는 영업 담당자 필드로 커미션 계산과 보고에 활용됩니다.


7. state

형식: Selection. order_id에 연동된 주문 상태(draft, sent, sale, done, cancel)입니다. 상태에 따라 수정 가능 필드가 달라집니다.


8. display_type

형식: Selection. 값: line_section 또는 line_note. 이 값이 설정되면 해당 라인은 섹션 헤더나 메모로 취급되어 제품 관련 필드는 비어 있게 됩니다.


9. is_downpayment

형식: Boolean. 해당 라인이 계약금(선수금)인지 표시합니다. 선수금은 별도로 청구됩니다.


10. is_expense

형식: Boolean. 라인이 비용이나 공급업체 청구서에서 생성된 경우 True가 됩니다. 프로젝트 비용 추적에 사용됩니다.


11. product_id

형식: Many2one (product.product). 판매하는 제품을 가리킵니다. 도메인으로 판매 가능한 제품만 허용되며, 제품 라인에는 필수입니다.


12. product_template_id

형식: Many2one (product.template). product_id로부터 계산됩니다. 제품 구성기에서 변형(variant) 선택에 사용됩니다.


13. name

형식: Text. 라인 설명입니다. 제품과 사용자 지정 속성으로 계산되며, 변형 정보가 포함될 수 있습니다.


14. product_uom_qty

형식: Float. 필수. 주문 수량으로 기본값은 1.0입니다. 포장 단위에 따라 자동으로 조정될 수 있습니다.


15. product_uom

형식: Many2one (uom.uom). 단위(예: 개, 박스)로 제품에서 기본값을 가져옵니다. 수량 및 가격 계산에 사용됩니다.


16. tax_id

형식: Many2many (account.tax). 라인에 적용되는 세금들입니다. 제품과 회계적 위치(fiscal position)에 따라 계산됩니다.


17. price_unit

형식: Float. 필수. 제품 단위당 가격입니다. 가격표나 제품 설정에서 계산되며 수동으로 덮어쓸 수 있습니다.


18. discount

형식: Float. 할인률(%)입니다. 세금 적용 전 price_unit에 반영됩니다.


19. price_subtotal

형식: Monetary. 세전 소계로 수량, 단가, 할인에서 계산됩니다.


20. price_tax

형식: Float. 세금 총액으로 price_subtotal과 tax_id로부터 계산됩니다.


21. price_total

형식: Monetary. 세금 포함 총액이며 청구 금액의 핵심 수치입니다.


22. product_packaging_id

형식: Many2one (product.packaging). 선택적 포장 단위(예: 12개들이 상자)입니다. 설정되면 수량이 포장 단위에 의해 영향을 받을 수 있습니다.


23. customer_lead

형식: Float. 리드 타임(일 단위)으로 주문 확정에서 배송까지의 예상 일수입니다. 배송일 계산에 사용됩니다.


24. qty_delivered

형식: Float. 실제로 출고된 수량입니다. 재고 이동에 의해 갱신되거나 수동 입력할 수 있으며 부분 청구 처리에 활용됩니다.


25. qty_invoiced

형식: Float. 이미 청구된 수량으로 송장 라인에서 계산됩니다.


26. qty_to_invoice

형식: Float. 아직 청구해야 할 남은 수량입니다. qty_delivered와 qty_invoiced로부터 계산됩니다.


27. invoice_status

형식: Selection. 값: upselling, invoiced, to invoice, no. 라인의 청구 상태를 나타냅니다.


28. invoice_lines

형식: Many2many (account.move.line). 이 판매 라인에서 생성된 송장 라인과 연결되어 트레이스 가능성을 제공합니다.


29. create_date

형식: Datetime. 레코드 생성 시각으로 Odoo가 자동 관리합니다.


30. write_date

형식: Datetime. 레코드가 마지막으로 수정된 시각으로 감사 용도로 사용됩니다.

비즈니스 흐름에서의 활용 방식


1. 견적서와 판매 주문 처리

영업 담당자가 견적을 작성할 때 제품을 한 줄씩 추가하면 각 항목이 sale.order.line으로 생성됩니다. 라인은 수량, 단가, 할인, 합계 등을 보여주며 고객 승인 시 주문이 확정됩니다.


2. 가격표와 할인 적용

가격표(pricelist)는 라인 단위로 적용되어 price_unit과 discount를 결정합니다. 대량 할인이나 고객별 맞춤 가격도 이 단계에서 처리됩니다.


3. 배송과 청구

재고가 출고되면 qty_delivered가 갱신되고, 청구는 부분별 또는 일괄로 진행할 수 있습니다. invoice_status는 어떤 항목이 아직 청구되지 않았는지 사용자를 안내합니다.


4. 프로젝트와 서비스 상품

서비스 상품의 라인은 프로젝트 작업(task)과 근무시간(timesheet)과 연결되기도 합니다. analytic.mixin 상속 덕분에 프로젝트별 비용 추적이 가능합니다.


5. 전자상거래와 포털

웹사이트 방문자가 장바구니에 담은 각 항목은 주문 생성 시 sale.order.line으로 전환됩니다. 제품 구성기는 product_template_id와 사용자 지정 속성으로 변형 선택을 돕습니다.

개발자가 이 모델을 확장하는 방법


개발자는 여러 패턴으로 sale.order.line을 확장할 수 있으며, Odoo의 모델 상속이 주된 수단입니다.


모델 상속 방식

모델을 확장하려면 _inherit = 'sale.order.line'를 사용합니다. 새 필드 추가, 메서드 오버라이드, 제약 조건 추가가 가능하며, 변경 사항을 별도 모듈에 두면 향후 업그레이드가 쉬워집니다.


필드 추가

상속 모델에 새로운 Odoo 필드를 정의하세요. Char, Many2one, Boolean, Integer, Text, Selection 등 적절한 타입을 선택하고, 다중회사 환경이라면 company-dependent 필드를 고려해야 합니다.


파이썬 확장

예: _compute_price_unit이나 _compute_price_subtotal을 오버라이드하거나 create/write 후처리 로직을 추가할 수 있습니다. 기존 동작을 유지하려면 super()를 호출하고 계산 필드의 의존성 관리를 신중히 하세요.


Odoo Studio 활용

코드 없이 필드를 추가할 수 있는 Odoo Studio는 빠른 커스터마이징에 유용합니다. 그러나 복잡한 비즈니스 로직이나 유지보수성, 향후 업그레이드를 고려하면 전통적 커스텀 모듈이 더 적합합니다.

모범 사례


  • 섹션이나 메모는 실제 제품 라인을 흉내 내어 처리하지 말고 display_type을 사용하세요. 이렇게 하면 리포팅과 유효성 검증이 깔끔해집니다.
  • API 통합을 구축할 때는 order_id 컨텍스트에서 라인을 생성하세요. sale.order의 order_line_ids 필드에 Odoo 명령 형식으로 삽입해야 충돌 없이 동작합니다.
  • SQL 제약 조건을 준수하세요. 제품 라인에는 product_id와 product_uom이 필수이며, 섹션이나 메모 라인에는 display_type이 반드시 있어야 합니다.
  • 맞춤 가격 정책은 가능하면 가격표 규칙(pricelist)을 사용하세요. 가격표로 해결할 수 없는 특별한 로직만 compute 메서드를 오버라이드하는 것이 안전합니다.
  • 커스텀 필드는 충돌을 피하기 위해 x_ 접두사나 모듈 접두사를 사용해 네임스페이스를 확보하세요.

자주 범하는 실수들


  • order_id 없이 라인을 생성하려 하지 마세요. 이 필드는 필수이며 항상 주문 컨텍스트에서 라인을 만들도록 합니다.
  • product_id와 product_template_id를 혼동하지 마세요. 제품 라인에서는 product_id를 설정하고, 구성기 흐름에서는 product_template_id를 사용해 변형을 선택합니다.
  • qty_invoiced가 이미 0보다 큰 상태에서 price_unit이나 discount를 임의로 수정하면 데이터 불일치가 발생할 수 있습니다. 청구된 항목은 금액 변경에 주의하세요.
  • core 메서드를 오버라이드할 때 super()를 호출하지 않으면 다른 모듈이나 향후 업그레이드에서 문제가 생길 수 있습니다.
  • 섹션이나 메모 라인을 만들 때 display_type을 설정하지 않으면 해당 라인은 제품 라인으로 처리되어 유효성 검사에서 실패합니다. 의도에 맞는 표시 유형을 꼭 지정하세요.

결론


sale.order.line 모델은 Odoo 판매 프로세스의 핵심입니다. 각 견적과 주문의 제품 라인을 저장하며, 필드와 확장 방식을 이해하면 설정, 커스터마이즈, 통합 작업을 훨씬 수월하게 수행할 수 있습니다.


비즈니스 프로세스를 매핑하는 기능 컨설턴트든, 맞춤 모듈을 개발하는 엔지니어든 sale.order.line을 제대로 이해하면 시간과 비용을 절약하고 오류를 방지할 수 있습니다.

Odoo 도입 지원이 필요하신가요?


Dasolo는 기업의 Odoo 도입, 커스터마이즈, 최적화를 돕습니다. 저희는 API 연동과 Odoo 개발에 전문성이 있으며 sale.order.line 같은 데이터 모델 구조에 대한 깊은 경험을 보유하고 있습니다.


Odoo 구현, 맞춤 모듈 개발 또는 시스템 통합에 도움이 필요하시면 저희가 지원해 드립니다. 데모 예약하기 프로젝트에 관해 상담해 보세요.

Odoo sale.order.line 모델 완벽 해부: Sales Order Line 구조 이해하기
Dasolo 2026년 3월 10일
이 게시물 공유하기
로그인 의견을 남기기