Files
Comparison_Project/app/models/laying_model.py

61 lines
2.7 KiB
Python

from app import db
from datetime import datetime
from sqlalchemy import event
from app.utils.regex_utils import RegularExpression
from decimal import Decimal
class Laying(db.Model):
__tablename__ = "laying"
id = db.Column(db.Integer, primary_key=True)
# Foreign Key to Subcontractor tables
subcontractor_id = db.Column(db.Integer, db.ForeignKey("subcontractors.id"), nullable=False)
# Relationship for easy access (subcontractor.subcontractor_name)
subcontractor = db.relationship("Subcontractor", backref="laying_records")
# Pipe Laying Fields
RA_Bill_No=db.Column(db.String(500))
Location = db.Column(db.String(500))
MH_NO = db.Column(db.String(100))
CC_length = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
Pipe_Dia_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
ID_of_MH_m = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
Laying_Length = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
pipe_150_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
pipe_200_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
pipe_250_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
pipe_300_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
pipe_350_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
pipe_400_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
pipe_450_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
pipe_500_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
pipe_600_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
pipe_700_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
pipe_900_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
pipe_1200_mm = db.Column(db.Numeric(10, 2), default=Decimal("0.00"))
Total = db.Column(db.Numeric(12, 2), default=Decimal("0.00"))
Remarks = db.Column(db.String(500), default="Import File")
created_at = db.Column(db.DateTime,default=datetime.now,nullable=False)
def __repr__(self):
return f"<LayingModel {self.Location}>"
def serialize(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
# AUTO TOTAL USING REGEX
def calculate_laying_total(mapper, connection, target):
total = Decimal("0.00")
for column in target.__table__.columns:
if RegularExpression.PIPE_MM_PATTERN.match(column.name):
value = getattr(target, column.name)
if value is not None:
total += Decimal(value)
target.Total = total.quantize(Decimal("0.01"))
event.listen(Laying, "before_insert", calculate_laying_total)
event.listen(Laying, "before_update", calculate_laying_total)