Files
order_system/po_app/models.py
T

155 lines
5.1 KiB
Python

# -*- coding: utf-8 -*-
"""数据模型:用户、供应商、物料、订单、明细、审核记录。"""
from datetime import datetime
from sqlalchemy import (Boolean, Column, DateTime, Float, ForeignKey, Integer,
String, Text, create_engine)
from sqlalchemy.orm import declarative_base, relationship, sessionmaker
Base = declarative_base()
COMPANY_NAME = u"苏州博特维智能科技有限公司"
DEFAULT_DELIVERY_PLACE = (u"苏州市工业园区星汉街5号腾飞新苏工业坊B幢5楼05-06单元 "
u"胡乃琛 13913172516")
# 需方(我方)默认信息:新建单据时自动预置到联系人 / 电话 / 税号 / 税点
DEFAULT_OUR_CONTACT = u"胡乃琛"
DEFAULT_OUR_PHONE = u"13913172516"
DEFAULT_OUR_TAX_NO = u"91320507MA1WW8D15D"
DEFAULT_TAX_RATE = u"13%"
DOC_TYPES = {
"purchase": u"采购单",
"outsourcing": u"委外生产订单",
}
STATUS_TEXT = {
"draft": u"草稿",
"pending_review": u"待主管审核",
"pending_approval": u"待经理批准",
"approved": u"已批准",
"rejected": u"已驳回",
}
ROLE_TEXT = {
"admin": u"系统管理员",
"maker": u"制单员",
"reviewer": u"主管审核",
"approver": u"经理批准",
}
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
username = Column(String(50), unique=True, nullable=False)
password_hash = Column(String(200), nullable=False)
name = Column(String(50), nullable=False)
role = Column(String(20), nullable=False, default="maker")
active = Column(Boolean, default=True)
created_at = Column(DateTime, default=datetime.now)
class Supplier(Base):
__tablename__ = "suppliers"
id = Column(Integer, primary_key=True)
code = Column(String(50))
name = Column(String(200), nullable=False)
contact = Column(String(50))
phone = Column(String(50))
tax_no = Column(String(80))
bank_name = Column(String(120))
bank_account = Column(String(80))
payment_terms = Column(String(120))
active = Column(Boolean, default=True)
class Material(Base):
__tablename__ = "materials"
id = Column(Integer, primary_key=True)
code = Column(String(80), nullable=False)
spec = Column(String(300))
unit = Column(String(20))
price = Column(Float, default=0)
active = Column(Boolean, default=True)
class Order(Base):
__tablename__ = "orders"
id = Column(Integer, primary_key=True)
order_no = Column(String(50), nullable=False)
doc_type = Column(String(20), nullable=False, default="purchase")
supplier_name = Column(String(200))
supplier_contact = Column(String(50))
supplier_phone = Column(String(50))
supplier_tax_no = Column(String(80))
supplier_bank_name = Column(String(120))
supplier_bank_account = Column(String(80))
payment_terms = Column(String(120))
our_company = Column(String(200), default=COMPANY_NAME)
our_contact = Column(String(50), default=DEFAULT_OUR_CONTACT)
our_phone = Column(String(50), default=DEFAULT_OUR_PHONE)
our_tax_no = Column(String(80), default=DEFAULT_OUR_TAX_NO)
tax_rate = Column(String(30), default=DEFAULT_TAX_RATE)
order_date = Column(String(20))
delivery_place = Column(String(300), default=DEFAULT_DELIVERY_PLACE)
note = Column(Text)
total_amount = Column(Float, default=0)
status = Column(String(20), default="draft")
created_by = Column(Integer, ForeignKey("users.id"))
created_by_name = Column(String(50))
created_at = Column(DateTime, default=datetime.now)
submitted_at = Column(DateTime)
reviewed_by = Column(String(50))
reviewed_at = Column(DateTime)
approved_by = Column(String(50))
approved_at = Column(DateTime)
reject_reason = Column(Text)
items = relationship("OrderItem", backref="order", cascade="all, delete-orphan",
order_by="OrderItem.seq")
logs = relationship("ApprovalLog", backref="order", cascade="all, delete-orphan",
order_by="ApprovalLog.id")
@property
def status_text(self):
return STATUS_TEXT.get(self.status, self.status)
@property
def doc_type_text(self):
return DOC_TYPES.get(self.doc_type, self.doc_type)
class OrderItem(Base):
__tablename__ = "order_items"
id = Column(Integer, primary_key=True)
order_id = Column(Integer, ForeignKey("orders.id"))
seq = Column(Integer, default=1)
material_code = Column(String(80))
material_spec = Column(String(300))
unit = Column(String(20))
qty = Column(Float, default=0)
price = Column(Float, default=0)
amount = Column(Float, default=0)
delivery_date = Column(String(30))
remark = Column(String(200))
class ApprovalLog(Base):
__tablename__ = "approval_logs"
id = Column(Integer, primary_key=True)
order_id = Column(Integer, ForeignKey("orders.id"))
action = Column(String(50))
user_name = Column(String(50))
comment = Column(Text)
created_at = Column(DateTime, default=datetime.now)
def init_db(db_path):
engine = create_engine("sqlite:///" + db_path, echo=False)
Base.metadata.create_all(engine)
return engine, sessionmaker(bind=engine)