mirror of
https://github.com/himool/HimoolERP.git
synced 2025-03-20 03:19:03 +08:00
feat: 采购单据
This commit is contained in:
parent
1ea008805a
commit
5b5b859cdc
9 changed files with 73 additions and 31 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
))
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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='商品')
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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',
|
||||
]
|
||||
|
|
Loading…
Add table
Reference in a new issue