work_record.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """WorkRecord model for Work Statistics System."""
  2. from datetime import datetime, timezone, date
  3. from app import db
  4. class WorkRecord(db.Model):
  5. """WorkRecord model representing a work entry for a person on a specific date.
  6. Attributes:
  7. id: Primary key, auto-incremented
  8. person_id: Foreign key to Person
  9. item_id: Foreign key to Item
  10. work_date: Date of the work
  11. quantity: Number of items produced (positive integer)
  12. is_settled: Settlement status (default False)
  13. created_at: Timestamp when the record was created
  14. updated_at: Timestamp when the record was last updated
  15. """
  16. __tablename__ = 'work_records'
  17. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  18. person_id = db.Column(db.Integer, db.ForeignKey('persons.id'), nullable=False)
  19. item_id = db.Column(db.Integer, db.ForeignKey('items.id'), nullable=False)
  20. work_date = db.Column(db.Date, nullable=False)
  21. quantity = db.Column(db.Integer, nullable=False)
  22. is_settled = db.Column(db.Boolean, nullable=False, default=False)
  23. created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
  24. updated_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc))
  25. # Relationships
  26. person = db.relationship('Person', backref=db.backref('work_records', lazy='dynamic'))
  27. item = db.relationship('Item', backref=db.backref('work_records', lazy='dynamic'))
  28. @property
  29. def total_price(self):
  30. """Calculate total price as unit_price * quantity.
  31. Returns:
  32. Float representing the total price
  33. """
  34. if self.item:
  35. return self.item.unit_price * self.quantity
  36. return 0.0
  37. def to_dict(self):
  38. """Convert model to dictionary for JSON serialization.
  39. Returns:
  40. Dictionary representation of the work record
  41. """
  42. return {
  43. 'id': self.id,
  44. 'person_id': self.person_id,
  45. 'person_name': self.person.name if self.person else None,
  46. 'item_id': self.item_id,
  47. 'item_name': self.item.name if self.item else None,
  48. 'unit_price': self.item.unit_price if self.item else None,
  49. 'supplier_id': self.item.supplier_id if self.item else None,
  50. 'supplier_name': self.item.supplier.name if self.item and self.item.supplier else '',
  51. 'work_date': self.work_date.isoformat() if self.work_date else None,
  52. 'quantity': self.quantity,
  53. 'total_price': self.total_price,
  54. 'is_settled': self.is_settled,
  55. 'created_at': self.created_at.isoformat() if self.created_at else None,
  56. 'updated_at': self.updated_at.isoformat() if self.updated_at else None
  57. }
  58. def __repr__(self):
  59. return f'<WorkRecord {self.id}: Person {self.person_id}, Item {self.item_id}, Qty {self.quantity}>'