86 lines
2.8 KiB
Python

import uuid
from decimal import Decimal
from django.conf import settings
from django.core.validators import MinValueValidator, RegexValidator
from django.db import models
class PayrollOffCyclePayment(models.Model):
"""A cash fact; never a payroll input or a new employee statement."""
employee = models.ForeignKey(
settings.AUTH_USER_MODEL,
null=True,
blank=True,
on_delete=models.PROTECT,
related_name="off_cycle_payments",
)
payee_name = models.CharField("Получатель", max_length=250)
paid_on = models.DateField("Дата выдачи", db_index=True)
amount = models.DecimalField(
"Выдано",
max_digits=19,
decimal_places=2,
validators=[MinValueValidator(Decimal("0.01"))],
)
currency = models.CharField(
max_length=3,
default="RUB",
validators=[RegexValidator(r"^[A-Z]{3}$")],
)
source_period = models.ForeignKey(
"finance.PayrollPeriod",
null=True,
blank=True,
on_delete=models.PROTECT,
related_name="off_cycle_payments",
)
source_statement = models.ForeignKey(
"finance.PayrollStatement",
null=True,
blank=True,
on_delete=models.PROTECT,
related_name="off_cycle_payments",
)
note = models.CharField("Основание", max_length=1000)
request_id = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)
created_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.PROTECT,
related_name="off_cycle_payments_created",
)
created_at = models.DateTimeField(auto_now_add=True)
voided_at = models.DateTimeField(null=True, blank=True)
voided_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
null=True,
blank=True,
on_delete=models.PROTECT,
related_name="off_cycle_payments_voided",
)
void_reason = models.CharField(max_length=1000, blank=True)
class Meta:
ordering = ["-paid_on", "-pk"]
constraints = [
models.CheckConstraint(
condition=models.Q(amount__gt=0),
name="off_cycle_payment_positive",
),
models.CheckConstraint(
condition=(
models.Q(
voided_at__isnull=True, voided_by__isnull=True, void_reason=""
)
| (
models.Q(voided_at__isnull=False, voided_by__isnull=False)
& ~models.Q(void_reason="")
)
),
name="off_cycle_payment_void_consistent",
),
]
verbose_name = "Выплата вне периода"
verbose_name_plural = "Выплаты вне периода"