feat: 采购单据

This commit is contained in:
Czw 2021-11-12 18:28:54 +08:00
parent 1ea008805a
commit 5b5b859cdc
9 changed files with 73 additions and 31 deletions

View file

@ -22,14 +22,14 @@ class PaymentOrder(Model):
@classmethod
def get_number(cls, team):
start_date, end_date = pendulum.now(), pendulum.tomorrow()
start_date, end_date = get_today(), get_tomorrow()
instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last()
try:
result = re.match('^(.*?)([1-9]+)$', instance.number)
number = result.group(1) + str(int(result.group(2)) + 1)
except AttributeError:
number = 'FK' + start_date.format('YYYYMMDD') + '0001'
number = 'FK' + pendulum.today(settings.TIME_ZONE) + '0001'
return number
@ -70,14 +70,14 @@ class CollectionOrder(Model):
@classmethod
def get_number(cls, team):
start_date, end_date = pendulum.now(), pendulum.tomorrow()
start_date, end_date = get_today(), get_tomorrow()
instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last()
try:
result = re.match('^(.*?)([1-9]+)$', instance.number)
number = result.group(1) + str(int(result.group(2)) + 1)
except AttributeError:
number = 'CK' + start_date.format('YYYYMMDD') + '0001'
number = 'CK' + pendulum.today(settings.TIME_ZONE) + '0001'
return number
@ -123,14 +123,14 @@ class ChargeOrder(Model):
@classmethod
def get_number(cls, team):
start_date, end_date = pendulum.now(), pendulum.tomorrow()
start_date, end_date = get_today(), get_tomorrow()
instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last()
try:
result = re.match('^(.*?)([1-9]+)$', instance.number)
number = result.group(1) + str(int(result.group(2)) + 1)
except AttributeError:
number = 'SZ' + start_date.format('YYYYMMDD') + '0001'
number = 'SZ' + pendulum.today(settings.TIME_ZONE) + '0001'
return number

View file

@ -29,14 +29,14 @@ class PurchaseOrder(Model):
@classmethod
def get_number(cls, team):
start_date, end_date = pendulum.now(), pendulum.tomorrow()
start_date, end_date = get_today(), get_tomorrow()
instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last()
try:
result = re.match('^(.*?)([1-9]+)$', instance.number)
number = result.group(1) + str(int(result.group(2)) + 1)
except AttributeError:
number = 'CG' + start_date.format('YYYYMMDD') + '0001'
number = 'CG' + pendulum.today(settings.TIME_ZONE).format('YYYYMMDD') + '0001'
return number
@ -83,14 +83,14 @@ class PurchaseReturnOrder(Model):
@classmethod
def get_number(cls, team):
start_date, end_date = pendulum.now(), pendulum.tomorrow()
start_date, end_date = get_today(), get_tomorrow()
instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last()
try:
result = re.match('^(.*?)([1-9]+)$', instance.number)
number = result.group(1) + str(int(result.group(2)) + 1)
except AttributeError:
number = 'CR' + start_date.format('YYYYMMDD') + '0001'
number = 'CR' + pendulum.today(settings.TIME_ZONE) + '0001'
return number

View file

@ -8,6 +8,7 @@ from apps.purchase.schemas import *
from apps.purchase.models import *
from apps.goods.models import *
from apps.flow.models import *
from apps.stock_in.models import *
class PurchaseOrderViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin, CreateModelMixin):
@ -25,7 +26,7 @@ class PurchaseOrderViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin, Crea
@transaction.atomic
def perform_create(self, serializer):
purchase_order = super().perform_create(serializer)
purchase_order = serializer.save()
# 同步入库
if purchase_order.enable_auto_stock_in:
@ -52,7 +53,22 @@ class PurchaseOrderViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin, Crea
InventoryFlow.objects.bulk_create(inventory_flows)
else:
# 创建入库单据
pass
stock_in_order_number = StockInOrder.get_number(team=self.team)
stock_in_order = StockInOrder.objects.create(
number=stock_in_order_number, warehouse=purchase_order.warehouse,
type=StockInOrder.Type.PURCHASE, purchase_order=purchase_order,
total_quantity=purchase_order.total_quantity, creator=self.user, team=self.team
)
# 创建入库商品
stock_in_goods_set = []
for purchase_goods in purchase_order.purchase_goods_set.all():
stock_in_goods_set.append(StockInGoods(
stock_in_order=stock_in_order, goods=purchase_goods.goods,
stock_in_quantity=purchase_goods.purchase_quantity, team=self.team
))
else:
StockInGoods.objects.bulk_create(stock_in_goods_set)
# 同步欠款
supplier = purchase_order.supplier
@ -62,14 +78,14 @@ class PurchaseOrderViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin, Crea
# 同步账户, 流水
if payment_order := purchase_order.payment_order:
finance_flows = []
for payemnt_account in payment_order.payemnt_accounts.all():
account = payemnt_account.account
for payment_account in payment_order.payment_accounts.all():
account = payment_account.account
amount_before = account.balance_amount
amount_change = payemnt_account.payment_amount
amount_change = payment_account.payment_amount
amount_after = NP.minus(amount_before, amount_change)
finance_flows.append(FinanceFlow(
account=payemnt_account.account, type=FinanceFlow.Type.PAYMENT,
account=payment_account.account, type=FinanceFlow.Type.PAYMENT,
amount_before=amount_before, amount_change=amount_change, amount_after=amount_after,
payment_order=payment_order, creator=self.user, team=self.team
))

View file

@ -25,14 +25,14 @@ class SalesOrder(Model):
@classmethod
def get_number(cls, team):
start_date, end_date = pendulum.now(), pendulum.tomorrow()
start_date, end_date = get_today(), get_tomorrow()
instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last()
try:
result = re.match('^(.*?)([1-9]+)$', instance.number)
number = result.group(1) + str(int(result.group(2)) + 1)
except AttributeError:
number = 'XS' + start_date.format('YYYYMMDD') + '0001'
number = 'XS' + pendulum.today(settings.TIME_ZONE) + '0001'
return number
@ -79,14 +79,14 @@ class SalesReturnOrder(Model):
@classmethod
def get_number(cls, team):
start_date, end_date = pendulum.now(), pendulum.tomorrow()
start_date, end_date = get_today(), get_tomorrow()
instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last()
try:
result = re.match('^(.*?)([1-9]+)$', instance.number)
number = result.group(1) + str(int(result.group(2)) + 1)
except AttributeError:
number = 'SR' + start_date.format('YYYYMMDD') + '0001'
number = 'SR' + pendulum.today(settings.TIME_ZONE) + '0001'
return number

View file

@ -31,14 +31,14 @@ class StockCheckOrder(Model):
@classmethod
def get_number(cls, team):
start_date, end_date = pendulum.now(), pendulum.tomorrow()
start_date, end_date = get_today(), get_tomorrow()
instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last()
try:
result = re.match('^(.*?)([1-9]+)$', instance.number)
number = result.group(1) + str(int(result.group(2)) + 1)
except AttributeError:
number = 'PD' + start_date.format('YYYYMMDD') + '0001'
number = 'PD' + pendulum.today(settings.TIME_ZONE) + '0001'
return number

View file

@ -31,14 +31,14 @@ class StockInOrder(Model):
@classmethod
def get_number(cls, team):
start_date, end_date = pendulum.now(), pendulum.tomorrow()
start_date, end_date = get_today(), get_tomorrow()
instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last()
try:
result = re.match('^(.*?)([1-9]+)$', instance.number)
number = result.group(1) + str(int(result.group(2)) + 1)
except AttributeError:
number = 'RK' + start_date.format('YYYYMMDD') + '0001'
number = 'RK' + pendulum.today(settings.TIME_ZONE) + '0001'
return number
@ -49,7 +49,7 @@ class StockInGoods(Model):
stock_in_order = ForeignKey('stock_in.StockInOrder', on_delete=CASCADE,
related_name='stock_in_goods_set', verbose_name='入库单据')
goods = ForeignKey('goods.Goods', on_delete=PROTECT, related_name='stock_in_goods_set', verbose_name='商品')
total_quantity = FloatField(verbose_name='入库总数')
stock_in_quantity = FloatField(verbose_name='入库总数')
remain_quantity = FloatField(default=0, verbose_name='入库剩余数量')
is_completed = BooleanField(default=False, verbose_name='完成状态')
is_void = BooleanField(default=False, verbose_name='作废状态')
@ -80,7 +80,7 @@ class StockInRecordGoods(Model):
"""入库记录商品"""
stock_in_record = ForeignKey('stock_in.StockInRecord', on_delete=CASCADE,
related_name='stock_in_record_goods_set', verbose_name='入库记录')
related_name='stock_in_record_goods_set', verbose_name='入库记录')
stock_in_goods = ForeignKey('stock_in.StockInGoods', on_delete=CASCADE,
related_name='stock_in_record_goods_set', verbose_name='入库商品')
goods = ForeignKey('goods.Goods', on_delete=PROTECT, related_name='stock_in_record_goods_set', verbose_name='商品')

View file

@ -31,14 +31,14 @@ class StockOutOrder(Model):
@classmethod
def get_number(cls, team):
start_date, end_date = pendulum.now(), pendulum.tomorrow()
start_date, end_date = get_today(), get_tomorrow()
instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last()
try:
result = re.match('^(.*?)([1-9]+)$', instance.number)
number = result.group(1) + str(int(result.group(2)) + 1)
except AttributeError:
number = 'CK' + start_date.format('YYYYMMDD') + '0001'
number = 'CK' + pendulum.today(settings.TIME_ZONE) + '0001'
return number

View file

@ -23,14 +23,14 @@ class StockTransferOrder(Model):
unique_together = [('number', 'team')]
@classmethod
def get_number(cls, team):
start_date, end_date = pendulum.now(), pendulum.tomorrow()
start_date, end_date = get_today(), get_tomorrow()
instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last()
try:
result = re.match('^(.*?)([1-9]+)$', instance.number)
number = result.group(1) + str(int(result.group(2)) + 1)
except AttributeError:
number = 'DB' + start_date.format('YYYYMMDD') + '0001'
number = 'DB' + pendulum.today(settings.TIME_ZONE) + '0001'
return number

View file

@ -6,6 +6,8 @@ from django.db.models import Model, IntegerChoices, TextChoices
from django.db.models import Sum, Count, Value, F, Q, Prefetch
from django.db.models.functions import Coalesce
from django.db import transaction, connection
from datetime import datetime, timezone
from django.conf import settings
import pendulum
import re
@ -18,6 +20,30 @@ class AmountField(DecimalField):
super().__init__(verbose_name, name, **kwargs)
def get_yesterday():
"""昨日"""
time = pendulum.yesterday(settings.TIME_ZONE).to_datetime_string()
time = datetime.strptime(time, '%Y-%m-%d %H:%M:%S').astimezone(tz=timezone.utc).replace(tzinfo=timezone.utc)
return time
def get_today():
"""今日"""
time = pendulum.today(settings.TIME_ZONE).to_datetime_string()
time = datetime.strptime(time, '%Y-%m-%d %H:%M:%S').astimezone(tz=timezone.utc).replace(tzinfo=timezone.utc)
return time
def get_tomorrow():
"""明日"""
time = pendulum.tomorrow(settings.TIME_ZONE).to_datetime_string()
time = datetime.strptime(time, '%Y-%m-%d %H:%M:%S').astimezone(tz=timezone.utc).replace(tzinfo=timezone.utc)
return time
__all__ = [
'Model', 'IntegerChoices', 'TextChoices',
'CASCADE', 'SET_NULL', 'SET_DEFAULT', 'PROTECT',
@ -25,5 +51,5 @@ __all__ = [
'BooleanField', 'IntegerField', 'FloatField', 'DecimalField', 'AmountField',
'CharField', 'DateField', 'DateTimeField', 'JSONField', 'FileField', 'ImageField',
'Sum', 'Count', 'Value', 'F', 'Q', 'Prefetch', 'Coalesce', 'transaction', 'connection',
'pendulum', 're',
'pendulum', 're', 'settings', 'get_yesterday', 'get_today', 'get_tomorrow',
]