feat(MySQL): Tables, Triggers, and Get Many and Save Stored Procedures for Suppliers, Supplier Purchase Orders (+ items), and Manufacturing Purchase Orders (+ items)

This commit is contained in:
2024-10-15 16:40:35 +01:00
parent 1e2dff4ad3
commit 697963e28a
621 changed files with 3023 additions and 2945 deletions

View File

@@ -35,6 +35,8 @@ class Base():
FLAG_CURRENCY_COST: ClassVar[str] = 'currency_cost'
FLAG_DESCRIPTION: ClassVar[str] = 'description'
FLAG_DISPLAY_ORDER: ClassVar[str] = 'display_order'
FLAG_EMAIL: ClassVar[str] = 'email'
FLAG_FAX: ClassVar[str] = 'fax'
FLAG_GUID: ClassVar[str] = 'guid'
FLAG_IS_NOT_EMPTY: ClassVar[str] = 'is_not_empty'
# FLAG_KEY_PRIMARY: ClassVar[str] = 'key_primary'
@@ -43,14 +45,17 @@ class Base():
FLAG_NAME_ATTR_OPTION_VALUE: ClassVar[str] = 'NAME_ATTR_OPTION_VALUE'
FLAG_NAME_SINGULAR: ClassVar[str] = 'name_singular'
FLAG_NAME_PLURAL: ClassVar[str] = 'name_plural'
FLAG_PHONE_NUMBER: ClassVar[str] = 'phone_number'
FLAG_POSTCODE: ClassVar[str] = 'postcode'
FLAG_PRIORITY: ClassVar[str] = 'priority'
FLAG_REGION: ClassVar[str] = 'region'
FLAG_ROWS: ClassVar[str] = 'rows'
FLAG_SYMBOL: ClassVar[str] = 'symbol'
FLAG_URL: ClassVar[str] = 'url'
FLAG_USER: ClassVar[str] = 'authorisedUser' # 'user' already used
FLAG_VALUE_LOCAL_VAT_EXCL: ClassVar[str] = 'value_local_vat_excl'
FLAG_VALUE_LOCAL_VAT_INCL: ClassVar[str] = 'value_local_vat_incl'
FLAG_WEBSITE: ClassVar[str] = 'website'
"""
NAME_ATTR_OPTION_TEXT: ClassVar[str] = 'name-attribute-option-text'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = 'name-attribute-option-value'

View File

@@ -58,9 +58,12 @@ class I_Store_Base():
class Store_Base(Base):
# ATTR_ID_CURRENCY_COST: ClassVar[str] = 'id_currency_cost'
ATTR_ID_CUSTOMER: ClassVar[str] = 'id_customer'
ATTR_ID_CUSTOMER_SALES_ORDER: ClassVar[str] = 'id_customer_sales_order'
ATTR_ID_DELIVERY_OPTION: ClassVar[str] = 'id_delivery_option'
ATTR_ID_DISCOUNT: ClassVar[str] = 'id_discount'
ATTR_ID_IMAGE: ClassVar[str] = 'id_image'
ATTR_ID_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = 'id_manufacturing_purchase_order'
ATTR_ID_PLANT: ClassVar[str] = 'id_plant'
ATTR_ID_PRODUCT: ClassVar[str] = 'id_product'
ATTR_ID_PRODUCT_CATEGORY: ClassVar[str] = 'id_category'
@@ -71,13 +74,18 @@ class Store_Base(Base):
ATTR_ID_PRODUCT_VARIATION_TYPE: ClassVar[str] = 'id_type'
ATTR_ID_STOCK_ITEM: ClassVar[str] = 'id_stock_item'
ATTR_ID_STORAGE_LOCATION: ClassVar[str] = 'id_location'
ATTR_ID_SUPPLIER: ClassVar[str] = 'id_supplier'
ATTR_ID_SUPPLIER_PURCHASE_ORDER: ClassVar[str] = 'id_supplier_purchase_order'
FLAG_COST_LOCAL: ClassVar[str] = 'cost_local'
FLAG_COST_LOCAL_VAT_EXCL: ClassVar[str] = FLAG_COST_LOCAL + '_vat_excl'
FLAG_COST_LOCAL_VAT_INCL: ClassVar[str] = FLAG_COST_LOCAL + '_vat_incl'
FLAG_CUSTOMER: ClassVar[str] = 'customer'
FLAG_CUSTOMER_SALES_ORDER: ClassVar[str] = 'customer_sales_order'
FLAG_DELIVERY_OPTION: ClassVar[str] = 'delivery_option'
FLAG_HAS_VARIATIONS: ClassVar[str] = 'has_variations'
FLAG_IS_OUT_OF_STOCK: ClassVar[str] = 'is_out_of_stock'
FLAG_DISCOUNT: ClassVar[str] = 'discount'
FLAG_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = 'manufacturing_purchase_order'
FLAG_PLANT: ClassVar[str] = 'plant'
FLAG_PRODUCT: ClassVar[str] = 'product'
FLAG_PRODUCT_CATEGORY: ClassVar[str] = 'product_category'
@@ -91,6 +99,8 @@ class Store_Base(Base):
FLAG_QUANTITY_MAX: ClassVar[str] = 'quantity_max'
FLAG_STOCK_ITEM: ClassVar[str] = 'stock_item'
FLAG_STORAGE_LOCATION: ClassVar[str] = 'storage_location'
FLAG_SUPPLIER: ClassVar[str] = 'supplier'
FLAG_SUPPLIER_PURCHASE_ORDER: ClassVar[str] = 'supplier_purchase_order'
FLAG_TEXT: ClassVar[str] = 'text'
FLAG_VALUE_TEXT: ClassVar[str] = 'value_text'

View File

@@ -0,0 +1,111 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Supplier Business Object
Description:
Business object for supplier
"""
# internal
import lib.argument_validation as av
from business_objects.store.store_base import Store_Base
from extensions import db
# external
from pydantic import BaseModel
from typing import ClassVar
class Supplier(db.Model, Store_Base):
FLAG_DEPARTMENT_CONTACT: ClassVar[str] = 'department_contact'
FLAG_NAME_COMPANY: ClassVar[str] = 'name_company'
FLAG_NAME_CONTACT: ClassVar[str] = 'name_contact'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_SUPPLIER
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME
__tablename__ = 'Shop_Supplier_Temp'
id_supplier = db.Column(db.Integer, primary_key=True)
id_address = db.Column(db.Integer)
id_currency = db.Column(db.Integer)
name_company = db.Column(db.String(255))
name_contact = db.Column(db.String(255))
department_contact = db.Column(db.String(255))
# address
phone_number = db.Column(db.String(50))
fax = db.Column(db.String(50))
email = db.Column(db.String(255))
website = db.Column(db.String(255))
active = db.Column(db.Boolean)
created_on = db.Column(db.DateTime)
created_by = db.Column(db.Integer)
def __init__(self):
super().__init__()
Store_Base.__init__(self)
@classmethod
def from_DB_supplier(cls, query_row):
supplier = cls()
supplier.id_supplier = query_row[0]
supplier.id_address = query_row[1]
supplier.id_currency = query_row[2]
supplier.name_company = query_row[3]
supplier.name_contact = query_row[4]
supplier.department_contact = query_row[5]
supplier.phone_number = query_row[6]
supplier.fax = query_row[7]
supplier.email = query_row[8]
supplier.website = query_row[9]
supplier.active = query_row[10]
return supplier
def __repr__(self):
return f'''
id: {self.id_supplier},
id_address: {self.id_address},
id_currency: {self.id_currency},
name_company: {self.name_company},
name_contact: {self.name_contact},
department_contact: {self.department_contact},
phone_number: {self.phone_number},
fax: {self.fax},
email: {self.email},
website: {self.website},
active: {self.active},
'''
def to_json(self):
return {
**self.get_shared_json_attributes(self),
self.ATTR_ID_SUPPLIER: self.id_supplier,
self.ATTR_ID_ADDRESS: self.id_address,
self.ATTR_ID_CURRENCY: self.id_currency,
self.FLAG_NAME_COMPANY: self.name_company,
self.FLAG_NAME_CONTACT: self.name_contact,
self.FLAG_DEPARTMENT_CONTACT: self.department_contact,
self.FLAG_PHONE_NUMBER: self.phone_number,
self.FLAG_FAX: self.fax,
self.FLAG_EMAIL: self.email,
self.FLAG_WEBSITE: self.website,
self.FLAG_ACTIVE: av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json')
}
def to_json_option(self):
return {
'value': self.id_supplier,
'text': self.name_company
}
@classmethod
def from_json(cls, json):
print(f'{cls.__name__}.from_json: {json}')
supplier = cls()
supplier.id_supplier = json[cls.ATTR_ID_SUPPLIER]
supplier.id_address = json[cls.ATTR_ID_ADDRESS]
supplier.id_currency = json[cls.ATTR_ID_CURRENCY]
supplier.name_company = json[cls.FLAG_NAME_COMPANY]
supplier.name_contact = json[cls.FLAG_NAME_CONTACT]
supplier.department_contact = json[cls.FLAG_DEPARTMENT_CONTACT]
supplier.phone_number = json[cls.FLAG_PHONE_NUMBER]
supplier.fax = json[cls.FLAG_FAX]
supplier.email = json[cls.FLAG_EMAIL]
supplier.website = json[cls.FLAG_WEBSITE]
supplier.active = json[cls.FLAG_ACTIVE]
return supplier

View File

@@ -18,7 +18,6 @@ from typing import ClassVar
class User(db.Model, Base):
KEY_USER: ClassVar[str] = 'authorisedUser' # 'user' already used
NAME_ATTR_OPTION_VALUE: ClassVar[str] = Base.ATTR_ID_USER
NAME_ATTR_OPTION_TEXT: ClassVar[str] = 'email'
@@ -57,6 +56,7 @@ class User(db.Model, Base):
user.is_super_user = av.input_bool(query_row[9], 'is_super_user', _m)
user.can_admin_store = av.input_bool(query_row[10], 'can_admin_store', _m)
user.can_admin_user = av.input_bool(query_row[11], 'can_admin_user', _m)
user.is_logged_in = (user.id_user is not None and user.id_user > 0)
return user
@staticmethod
@@ -101,6 +101,7 @@ class User(db.Model, Base):
user.is_included_VAT_default = None
user.can_admin_store = None
user.can_admin_user = None
user.is_logged_in = (user.id_user_auth0 is not None and user.id_user_auth0 != '')
print(f'user: {user}')
return user