Esempio n. 1
0
class Contract(db.Model):
    __table_args__ = {'extend_existing': True}
    id = db.Column(db.Integer, primary_key=True)
    contract_no = db.Column(db.String(80), nullable=False)
    contract_year = db.Column(db.Integer, nullable=False)
    contract_date = db.Column(db.DateTime, nullable=False)
    validity_date = db.Column(db.DateTime, nullable=False)
    fruitVeg_products = db.Column(db.Integer, nullable=False)
    dairy_products = db.Column(db.Integer, nullable=False)
    is_annex = db.Column(db.Boolean, nullable=False, default=0)

    school_id = db.Column(db.Integer,
                          db.ForeignKey('school.id'),
                          nullable=False)
    school = db.relationship('School',
                             backref=db.backref(
                                 'contracts',
                                 lazy=True,
                                 order_by='Contract.validity_date.desc()'))
    program_id = db.Column(db.Integer,
                           db.ForeignKey('program.id'),
                           nullable=False)
    program = db.relationship('Program',
                              backref=db.backref('contracts', lazy=True))

    def update(self,
               contract_date,
               validity_date=None,
               fruitVeg_products=None,
               dairy_products=None):
        self.contract_date = DateConverter.to_date(contract_date)
        if validity_date:
            self.validity_date = validity_date
        if fruitVeg_products:
            self.fruitVeg_products = fruitVeg_products
        if dairy_products:
            self.dairy_products = dairy_products
        db.session.commit()

    def convert_date_to_string(self):
        return DateConverter.to_string(self.contract_date)

    def convert_validity_date_to_string(self):
        return DateConverter.to_string(self.validity_date)

    def __str__(self):
        return f"Contract_{self.contract_no}_{self.contract_year}"

    __table_args__ = (db.UniqueConstraint('validity_date', 'school_id'), )
Esempio n. 2
0
class Week(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    week_no = db.Column(db.Integer, nullable=False)
    start_date = db.Column(db.DateTime, nullable=False)
    end_date = db.Column(db.DateTime, nullable=False)

    program_id = db.Column(db.Integer,
                           db.ForeignKey('program.id'),
                           nullable=False)
    program = db.relationship('Program',
                              backref=db.backref('weeks', lazy=True))

    def convert_start_date_to_string(self):
        return DateConverter.to_string(self.start_date)

    def convert_start_end_to_string(self):
        return DateConverter.to_string(self.end_date)

    db.UniqueConstraint('week_no', 'program_id')
    __table_args__ = {'extend_existing': True}
Esempio n. 3
0
class Product(db.Model):
    __table_args__ = {'extend_existing': True}

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Enum(ProductName), nullable=False)
    type = db.Column(db.Enum(ProductType), nullable=False)
    min_amount = db.Column(db.Integer, nullable=False)
    program_id = db.Column(db.Integer,
                           db.ForeignKey('program.id'),
                           nullable=False)
    program = db.relationship('Program',
                              backref=db.backref('products', lazy=True))

    #@TODO remove language dependency
    def get_name_mapping(self):
        name = fruit_veg_mapping.get(self.name, None)
        if name:
            return name
        else:
            name = dairy_mapping.get(self.name, "")
        return name

    def get_record_title_mapping(self):
        if self.type == ProductType.DAIRY:
            return "Mleko i przetwory mleczne"
        if self.type == ProductType.FRUIT_VEG:
            return "Warzywa i owoce "

    def get_type_mapping(self):
        if self.type == ProductType.DAIRY:
            return "nb"
        if self.type == ProductType.FRUIT_VEG:
            return "wo"

    def is_dairy(self):
        return self.type == ProductType.DAIRY

    def is_fruit_veg(self):
        return self.type == ProductType.FRUIT_VEG
Esempio n. 4
0
class Record(db.Model):
    __table_args__ = {'extend_existing': True}

    id = db.Column(db.Integer, primary_key=True)
    date = db.Column(db.DateTime, nullable=False)
    generation_date = db.Column(db.DateTime)
    state = db.Column(db.Enum(RecordState),
                      nullable=False,
                      default=RecordState.NOT_DELIVERED)

    product_id = db.Column(db.Integer,
                           db.ForeignKey('product.id'),
                           nullable=False)
    product = db.relationship('Product',
                              backref=db.backref('records', lazy=True))

    contract_id = db.Column(db.Integer,
                            db.ForeignKey('contract.id'),
                            nullable=False)
    contract = db.relationship('Contract',
                               backref=db.backref(
                                   'records',
                                   lazy=True,
                                   order_by='Contract.validity_date.desc()',
                                   cascade="all, delete-orphan"))

    week_id = db.Column(db.Integer, db.ForeignKey('week.id'), nullable=False)
    week = db.relationship('Week', backref=db.backref('records', lazy=True))

    def __str__(self):
        return f"Week no {self.week.week_no} school {self.contract.school.nick} productType {self.product.type}"

    __table_args__ = (db.UniqueConstraint('date', 'product_id',
                                          'contract_id'), )

    def set_to_delivered(self):
        self.state = RecordState.DELIVERED
        db.session.commit()

    def update_product(self, product_id):
        self.product_id = product_id
        db.session.commit()

    def is_dairy(self):
        return self.product.type == ProductType.DAIRY

    def is_fruitVeg(self):
        return self.product.type == ProductType.FRUIT_VEG
Esempio n. 5
0
class School(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nick = db.Column(db.String(60), unique=True, nullable=False)
    name = db.Column(db.String(120), nullable=False)
    address = db.Column(db.String(120), unique=True, nullable=False)
    city = db.Column(db.String(30), unique=True, nullable=False)
    nip = db.Column(db.String(80))
    regon = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(80), unique=True, nullable=False)
    phone = db.Column(db.String(80), unique=True, nullable=False)
    responsible_person = db.Column(db.String(60), nullable=False)
    representative = db.Column(db.String(120))
    representative_nip = db.Column(db.String(80))
    representative_regon = db.Column(db.String(80))
    __table_args__ = {'extend_existing': True}

    def __repr__(self):
        return '<School: %r>' % self.name

    def generate_directory_name(self, specific_directory):
        return path.join(config_parser.get('Directories', 'school'), self.nick,
                         specific_directory)
Esempio n. 6
0
class Application(db.Model):
    __table_args__ = {'extend_existing': True}

    id = db.Column(db.Integer, primary_key=True)
    apple = db.Column(db.Integer, default=0)
    pear = db.Column(db.Integer, default=0)
    plum = db.Column(db.Integer, default=0)
    strawberry = db.Column(db.Integer, default=0)
    carrot = db.Column(db.Integer, default=0)
    radish = db.Column(db.Integer, default=0)
    pepper = db.Column(db.Integer, default=0)
    tomato = db.Column(db.Integer, default=0)
    kohlrabi = db.Column(db.Integer, default=0)
    milk = db.Column(db.Integer, default=0)
    yoghurt = db.Column(db.Integer, default=0)
    kefir = db.Column(db.Integer, default=0)
    cheese = db.Column(db.Integer, default=0)
    fruit_all = db.Column(db.Integer, default=0)
    veg_all = db.Column(db.Integer, default=0)
    dairy_all = db.Column(db.Integer, default=0)
    max_kids_perWeeks_fruitVeg = db.Column(db.Integer, default=0)
    max_kids_perWeeks_milk = db.Column(db.Integer, default=0)
    juice = db.Column(db.Integer, default=0)

    summary_id = db.Column(db.Integer,
                           db.ForeignKey('summary.id'),
                           nullable=False)
    summary = db.relationship('Summary',
                              backref=db.backref(
                                  'application',
                                  lazy=True,
                                  order_by='Contract.validity_date.desc()'))

    school_id = db.Column(db.Integer,
                          db.ForeignKey('school.id'),
                          nullable=False)
    school = db.relationship('School',
                             backref=db.backref(
                                 'application',
                                 lazy=True,
                                 order_by='Contract.validity_date.desc()'))

    __table_args__ = (db.UniqueConstraint('summary_id', 'school_id'), )
Esempio n. 7
0
class Summary(db.Model):
    __table_args__ = {'extend_existing': True}

    id = db.Column(db.Integer, primary_key=True)
    no = db.Column(db.Integer, nullable=False)
    year = db.Column(db.Integer, nullable=False)
    kids_no = db.Column(db.Integer, default=0)
    school_no = db.Column(db.Integer, default=0)
    apple = db.Column(db.Integer, default=0)
    pear = db.Column(db.Integer, default=0)
    plum = db.Column(db.Integer, default=0)
    strawberry = db.Column(db.Integer, default=0)
    juice = db.Column(db.Integer, default=0)
    carrot = db.Column(db.Integer, default=0)
    radish = db.Column(db.Integer, default=0)
    pepper = db.Column(db.Integer, default=0)
    tomato = db.Column(db.Integer, default=0)
    kohlrabi = db.Column(db.Integer, default=0)
    school_no_milk = db.Column(db.Integer, default=0)
    kids_no_milk = db.Column(db.Integer, default=0)
    milk = db.Column(db.Integer, default=0)
    yoghurt = db.Column(db.Integer, default=0)
    kefir = db.Column(db.Integer, default=0)
    cheese = db.Column(db.Integer, default=0)
    fruitVeg_income = db.Column(db.Float, default=0)
    milk_income = db.Column(db.Float, default=0)
    is_first = db.Column(db.Boolean)
    weeks = db.Column(db.PickleType)
    program_id = db.Column(db.Integer,
                           db.ForeignKey('program.id'),
                           nullable=False)
    program = db.relationship('Program',
                              backref=db.backref('summary', lazy=True))

    number_of_weeks = 0

    def set_number_of_weeks(self, weeks_no):
        if self.number_of_weeks != 0 and self.number_of_weeks != len(weeks_no):
            raise ValueError(
                f"weeks_no: {weeks_no} != {self.number_of_weeks}. "
                f"For one summary all schools must have the same number of weeks."
            )
        self.weeks = weeks_no
        self.number_of_weeks = len(weeks_no)
        return True

    def __fruit_list(self):
        return [
            ProductHandler(self.apple, 5, float(self.program.fruitVeg_price)),
            ProductHandler(self.plum, 5, float(self.program.fruitVeg_price)),
            ProductHandler(self.pear, 5, float(self.program.fruitVeg_price)),
            ProductHandler(self.strawberry, 5,
                           float(self.program.fruitVeg_price)),
            ProductHandler(self.juice, 5, float(self.program.fruitVeg_price))
        ]

    def __veg_list(self):
        return [
            ProductHandler(self.carrot, 8, float(self.program.fruitVeg_price)),
            ProductHandler(self.tomato, 5, float(self.program.fruitVeg_price)),
            ProductHandler(self.radish, 8, float(self.program.fruitVeg_price)),
            ProductHandler(self.kohlrabi, 8,
                           float(self.program.fruitVeg_price)),
            ProductHandler(self.pepper, 8, float(self.program.fruitVeg_price))
        ]

    def __dairy_list(self):
        return [
            ProductHandler(self.milk, 5, float(self.program.dairy_price)),
            ProductHandler(self.yoghurt, 5, float(self.program.dairy_price)),
            ProductHandler(self.kefir, 5, float(self.program.dairy_price)),
            ProductHandler(self.cheese, 5, float(self.program.dairy_price))
        ]

    def get_from_fruit_list(self, product: ProductName):
        if product == ProductName.APPLE:
            return self.__fruit_list()[0]
        if product == ProductName.PLUM:
            return self.__fruit_list()[1]
        if product == ProductName.PEAR:
            return self.__fruit_list()[2]
        if product == ProductName.STRAWBERRY:
            return self.__fruit_list()[3]
        if product == ProductName.JUICE:
            return self.__fruit_list()[4]
        if product == ProductName.CARROT:
            return self.__veg_list()[0]
        if product == ProductName.TOMATO:
            return self.__veg_list()[1]
        if product == ProductName.RADISH:
            return self.__veg_list()[2]
        if product == ProductName.KOHLRABI:
            return self.__veg_list()[3]
        if product == ProductName.PEPPER:
            return self.__veg_list()[4]

    def get_from_diary_list(self, product: ProductName):
        if product == ProductName.MILK:
            return self.__dairy_list()[0]
        if product == ProductName.YOGHURT:
            return self.__dairy_list()[1]
        if product == ProductName.KEFIR:
            return self.__dairy_list()[2]
        if product == ProductName.CHEESE:
            return self.__dairy_list()[3]

    @staticmethod
    def calculate_income(products_list: List[ProductHandler]):
        return sum([product.calculate_brutto() for product in products_list])

    @staticmethod
    def calculate_netto(products_list: List[ProductHandler]):
        return sum([product.calculate_netto() for product in products_list])

    @staticmethod
    def calculate_vat(products_list: List[ProductHandler]):
        return sum([product.calculate_vat() for product in products_list])

    def get_fruit_amount(self):
        return sum([product.amount for product in self.__fruit_list()])

    @convert_to_float
    def get_fruit_vat(self):
        return Summary.calculate_vat(self.__fruit_list())

    @convert_to_float
    def get_fruit_netto(self):
        return Summary.calculate_netto(self.__fruit_list())

    @convert_to_float
    def get_fruit_income(self):
        return self.calculate_income(self.__fruit_list())

    def get_veg_amount(self):
        return sum([product.amount for product in self.__veg_list()])

    def get_veg_vat(self):
        return Summary.calculate_vat(self.__veg_list())

    @convert_to_float
    def get_veg_netto(self):
        return Summary.calculate_netto(self.__veg_list())

    @convert_to_float
    def get_veg_income(self):
        return self.calculate_income(self.__veg_list())

    @convert_to_float
    def get_fruit_veg_income(self):
        return self.calculate_income(self.__fruit_list() + self.__veg_list())

    def get_dairy_amount(self):
        return sum([product.amount for product in self.__dairy_list()])

    @convert_to_float
    def get_dairy_vat(self):
        return Summary.calculate_vat(self.__dairy_list())

    @convert_to_float
    def get_dairy_netto(self):
        return Summary.calculate_netto(self.__dairy_list())

    @convert_to_float
    def get_dairy_income(self):
        return self.calculate_income(self.__dairy_list())

    def __str__(self):
        return f"[{self.id}]Summary {self.get_application_no()} program {self.program_id}"

    def get_application_no(self):
        return "{0}/{1}/{2}".format(self.program.semester_no, self.no,
                                    self.program.school_year)

    __table_args__ = (db.UniqueConstraint('no', 'year', 'program_id'), )
Esempio n. 8
0
class Program(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    semester_no = db.Column(db.Integer, nullable=False)
    school_year = db.Column(db.String(20), nullable=False)
    fruitVeg_price = db.Column(db.Float)
    dairy_price = db.Column(db.Float)
    start_date = db.Column(db.DateTime)
    end_date = db.Column(db.DateTime)
    dairy_min_per_week = db.Column(db.Integer)
    fruitVeg_min_per_week = db.Column(db.Integer)
    dairy_amount = db.Column(db.Integer)
    fruitVeg_amount = db.Column(db.Integer)
    db.UniqueConstraint('school_year', 'semester_no')
    __table_args__ = {
        'extend_existing': True,
    }

    def __repr__(self):
        return f"Program: {self.id} semester_no:{self.semester_no} year:{self.school_year}"

    def convert_start_date_to_string(self):
        return DateConverter.to_string(self.start_date)

    def convert_start_end_to_string(self):
        return DateConverter.to_string(self.end_date)

    def contract_no(self):
        cno = 0
        for contract in self.contracts:
            if not contract.is_annex:
                cno = cno + 1
        return cno

    def contract_date(self):
        if self.contracts:
            return DateConverter.to_string(self.contracts[0].contract_date)
        else:
            return DateConverter.to_string(datetime.datetime.now())

    def get_current_semester(self):
        if self.semester_no == 1:
            return "I"
        elif self.semester_no == 2:
            return "II"
        return "INVALID"

    @staticmethod
    def get_products_types():
        return [(ProductType.FRUIT_VEG, "owocowo-warzywny"),
                (ProductType.DAIRY, "nabiał")]

    @staticmethod
    def get_products_names(product_type):
        if int(product_type) == ProductType.FRUIT_VEG.value:
            return fruit_veg_mapping
        if int(product_type) == ProductType.DAIRY.value:
            return dairy_mapping
        return {}