1
0
forked from erp-dev/erp

feat: correct first

This commit is contained in:
2026-05-19 23:41:34 +08:00
parent f409f2e6ee
commit b97e86257e
25 changed files with 3885 additions and 25 deletions

View File

@@ -981,6 +981,66 @@ class SalesReturnOrderItem(ModelBase):
def total_amount(self):
return round(self.price * self.real_quantity(), 2)
class ExternalCustomerStatementCategoryEnum(models.TextChoices):
SALE = 'sale', '外部销售单'
SALE_RETURN = 'sale_return', '外部销售退货单'
class ExternalCustomerStatementOrder(ModelBase):
"""仅用于对账单计算的外部业务来源单据。"""
id = models.BigAutoField(primary_key=True)
merchant = models.ForeignKey(
basic_info_models.Merchant,
on_delete=models.PROTECT,
related_name='external_customer_statement_orders',
verbose_name='所属商户',
)
customer = models.ForeignKey(
basic_info_models.Customer,
on_delete=models.PROTECT,
related_name='external_statement_orders',
verbose_name='客户',
)
category = models.CharField(
max_length=20,
choices=ExternalCustomerStatementCategoryEnum.choices,
verbose_name='外部业务分类',
)
external_customer_id = models.CharField(max_length=100, blank=True, default='', verbose_name='外部客户ID')
external_source_id = models.CharField(max_length=100, db_index=True, verbose_name='外部单号')
occurred_at = models.DateField(verbose_name='业务日期')
recorded_at = models.DateTimeField(blank=True, null=True, verbose_name='录单时间')
settlement_method = models.CharField(max_length=100, blank=True, default='', verbose_name='结算方式')
total_amount = models.DecimalField(max_digits=15, decimal_places=2, default=Decimal('0'), verbose_name='总金额')
sf_amount = models.DecimalField(
max_digits=15, decimal_places=2, default=Decimal('0'),
verbose_name='现场收款金额',
help_text='销售单上的现场收款(SfJinE)合计,仅 sale 类型有值',
)
zk_amount = models.DecimalField(
max_digits=15, decimal_places=2, default=Decimal('0'),
verbose_name='折扣金额',
help_text='该单据的折扣(ZkJinE)合计',
)
remarks = models.TextField(blank=True, null=True, verbose_name='备注')
items_payload = models.JSONField(default=list, blank=True, verbose_name='明细快照')
extra_payload = models.JSONField(default=dict, blank=True, verbose_name='扩展数据')
class Meta:
verbose_name = '外部客户对账来源单'
verbose_name_plural = '外部客户对账来源单'
constraints = [
models.UniqueConstraint(
fields=['merchant', 'category', 'external_source_id'],
name='uniq_external_customer_statement_order_source',
)
]
def __str__(self):
return f'外部对账来源 {self.external_source_id} ({self.category})'
def split_quantity_of_rolls(self) -> List[int]:
if self.quantity_of_rolls:
@@ -1036,6 +1096,17 @@ class PaymentOrder(OrderDirectionMixin, OrderCounterpartyMixin, ModelBase):
default=PaymentOrderStatusEnum.PENDING,
verbose_name='状态',
)
is_external_source = models.BooleanField(
default=False,
verbose_name='是否外部来源',
)
external_source_id = models.CharField(
max_length=100,
null=True,
blank=True,
db_index=True,
verbose_name='外部来源ID',
)
remarks = models.TextField(blank=True, null=True, verbose_name='备注')
class Meta:
@@ -1108,6 +1179,17 @@ class ReceiptOrder(OrderDirectionMixin, OrderCounterpartyMixin, ModelBase):
default=ReceiptOrderStatusEnum.PENDING,
verbose_name='状态',
)
is_external_source = models.BooleanField(
default=False,
verbose_name='是否外部来源',
)
external_source_id = models.CharField(
max_length=100,
null=True,
blank=True,
db_index=True,
verbose_name='外部来源ID',
)
remarks = models.TextField(blank=True, null=True, verbose_name='备注')
class Meta: