[Flask] Simple ERP for a farm.
1
# -*- mode: python; -*-
2
3
4
from flask_sqlalchemy import SQLAlchemy
5
6
# from sqlalchemy.orm import declarative_base
7
8
from datetime import datetime
9
from flask_login import UserMixin
10
11
db = ()
12
# Base = declarative_base()
13
14
15
defdate_time_now():
16
return datetime.().("%Y-%m-%d %H:%M:%S")
17
18
19
# module_user = db.Table(
20
# "ModuleUser",
21
# Base.metadata,
22
# db.Column("ModuleId", db.String, db.ForeignKey("Module.Name"), primary_key=True),
23
# db.Column("UserId", db.Integer, db.ForeignKey("User.UserId"), primary_key=True),
24
# )
25
26
# association_table = db.Table('association', Base.metadata,
27
# db.Column('left_id', db.ForeignKey('left.id'), primary_key=True),
28
# db.Column('right_id', db.ForeignKey('right.id'), primary_key=True),
29
# )
30
31
# class Parent(Base):
32
# __tablename__ = 'left'
33
# id = db.Column(db.Integer, primary_key=True)
34
# children = db.relationship(
35
# "Child",
36
# secondary=association_table,
37
# back_populates="parents")
38
39
# class Child(Base):
40
# __tablename__ = 'right'
41
# id = db.Column(db.Integer, primary_key=True)
42
# parents = db.relationship(
43
# "Parent",
44
# secondary=association_table,
45
# back_populates="children")
46
47
48
classModule(db.Model):
49
__tablename__ = "Module"
50
name = db.("Name",.(20),nullable=False,primary_key=True)
51
description = db.("Description",.(50),nullable=False)
52
# users = db.relationship("User", secondary=module_user, backref="modules")
53
54
def__repr__(self):
55
return f"<Module {self.}>"
56
57
58
classUser(UserMixin,db.Model):
59
"""UserMixin inheritance required for features described here:
60
61
https://stackoverflow./questions/63231163/what-is-the-usermixin-in-flask"""
62
63
__tablename__ = "User"
64
65
defget_id(self):
66
return self.
67
68
primary_key = db.("UserId",.,primary_key=True)
69
username = db.("Username",.(20),nullable=False)
70
hashed_password = db.("HashedPassword",.(100),nullable=False)
71
name_first = db.("NameFirst",.(20),nullable=False)
72
name_last = db.("NameLast",.(20),nullable=False)
73
email = db.("Email",.(20),nullable=False)
74
phone_mobile = db.("PhoneMobile",.)
75
phone_alternative = db.("PhoneAlternative",.)
76
date_time_created = db.(
77
"DateTimeCreated",.,server_default=()
78
)
79
date_time_updated = db.(
80
"DateTimeUpdated",.,server_onupdate=()
81
)
82
# modules = db.relationship("Module", secondary=module_user, backref="users")
83
84
def__repr__(self):
85
return f"<User {self.} {self.}>"
86
87
88
classCustomer(db.Model):
89
"""One customer has many invoices and orders associated."""
90
91
__tablename__ = "Customer"
92
primary_key = db.("CustomerId",.,nullable=False,primary_key=True)
93
name = db.("Name",.(20),nullable=False)
94
name_alternative = db.("NameAlternative",.(20))
95
code_customer = db.("CodeCustomer",.(20),unique=True)
96
code_accounting = db.("CodeAccounting",.(20),unique=True)
97
address = db.("Address",.(20))
98
postal_code = db.("PostalCode",.)
99
city = db.("City",.(20))
100
country = db.("Country",.(20))
101
phone = db.("Phone",.(20))
102
website = db.("Website",.(20))
103
email = db.("Email",.(20))
104
professional_id_1 = db.("ProfessionalId1",.(20),unique=True)
105
professional_id_2 = db.("ProfessionalId2",.(20),unique=True)
106
tax_id = db.("TaxId",.(20),unique=True)
107
payment_terms = db.("PaymentTerms",.(20))
108
date_time_created = db.(
109
"DateTimeCreated",.,server_default=()
110
)
111
date_time_updated = db.(
112
"DateTimeUpdated",.,server_onupdate=()
113
)
114
invoices = db.("Invoice",back_populates="customer")
115
orders = db.("Order",back_populates="customer")
116
117
def__init__(
118
self,
119
name,
120
name_alternative,
121
code_customer,
122
code_accounting,
123
address,
124
postal_code,
125
city,
126
country,
127
phone,
128
website,
129
email,
130
professional_id_1,
131
professional_id_2,
132
tax_id,
133
payment_terms,
134
):
135
self. = name
136
self. = name_alternative
137
self. = code_customer
138
self. = code_accounting
139
self. = address
140
self. = postal_code
141
self. = city
142
self. = country
143
self. = phone
144
self. = website
145
self. = email
146
self. = professional_id_1
147
self. = professional_id_2
148
self. = tax_id
149
self. = payment_terms
150
151
def__repr__(self):
152
return f"<Customer {self.}>"
153
154
155
classInvoice(db.Model):
156
"""One invoice has many orders, one customer associated."""
157
158
__tablename__ = "Invoice"
159
primary_key = db.("InvoiceId",.,primary_key=True)
160
invoice_id_alt = db.("InvoiceIdAlt",.)
161
customer_reference = db.("CustomerReference",.)
162
date_billed = db.("DateBilled",.)
163
date_due = db.("DateDue",.)
164
amount_net = db.("AmountNet",.)
165
amount_gross = db.("AmountGross",.)
166
amount_tax = db.("AmountTax",.)
167
date_time_created = db.(
168
"DateTimeCreated",.,server_default=()
169
)
170
customer_id = db.(
171
"CustomerId",.,.("Customer.CustomerId")
172
)
173
customer = db.(
174
"Customer",back_populates="invoices",foreign_keys=[]
175
)
176
orders = db.("Order",back_populates="invoice")
177
178
def__init__(
179
self,
180
invoice_id_alt,
181
customer_id,
182
customer_reference,
183
date_billed,
184
date_due,
185
amount_net,
186
amount_gross,
187
amount_tax,
188
):
189
self. = invoice_id_alt
190
self. = customer_id
191
self. = customer_reference
192
self. = date_billed
193
self. = date_due
194
self. = amount_net
195
self. = amount_gross
196
self. = amount_tax
197
198
def__repr__(self):
199
return f"<Invoice for {self..} billed {self.}>"
200
201
202
classOrder(db.Model): # TODO
203
"""One order per line item in invoice."""
204
205
__tablename__ = "Order"
206
primary_key = db.("OrderId",.,primary_key=True)
207
order_id_alt = db.("OrderIdAlt",.)
208
delivery_date = db.("DateDelivery",.(20),nullable=False)
209
date_time_created = db.(
210
"DateTimeCreated",.,server_default=()
211
)
212
date_time_updated = db.(
213
"DateTimeUpdated",.,server_onupdate=()
214
)
215
customer_id = db.(
216
"CustomerId",
217
.,
218
.("Customer.CustomerId"),
219
nullable=False,
220
)
221
product_id = db.(
222
"ProductId",
223
.,
224
.("Product.ProductId"),
225
nullable=False,
226
)
227
invoice_id = db.(
228
"InvoiceId",
229
.,
230
.("Invoice.InvoiceId"),
231
nullable=True,
232
)
233
customer = db.("Customer",back_populates="orders")
234
product = db.("Product",back_populates="orders")
235
invoice = db.("Invoice",back_populates="orders")
236
237
def__repr__(self):
238
return f"<Order {self.} at {self.}>"
239
240
241
classProduct(db.Model):
242
__tablename__ = "Product"
243
primary_key = db.("ProductId",.,primary_key=True)
244
name = db.("Name",.(20),nullable=False,unique=True)
245
code_accounting = db.("CodeAccounting",.(20))
246
unit_weight = db.("UnitWeight",.)
247
price_net = db.("PriceNet",.)
248
price_gross = db.("PriceGross",.)
249
tax_rate = db.("TaxRate",.)
250
date_time_created = db.(
251
"DateTimeCreated",.,server_default=()
252
)
253
date_time_updated = db.(
254
"DateTimeUpdated",.,server_onupdate=()
255
)
256
# order_id = db.Column("ProductId", db.Integer, db.ForeignKey("Product.ProductId"))
257
orders = db.("Order",back_populates="product")
258
259
def__init__(
260
self,
261
name,
262
code_accounting,
263
unit_weight,
264
price_net,
265
price_gross,
266
tax_rate,
267
):
268
self. = name
269
self. = code_accounting
270
self. = unit_weight
271
self. = price_net
272
self. = price_gross
273
self. = tax_rate
274
275
def__repr__(self):
276
return f"<Product {self.}>"
277
278
279
classFertiLog(db.Model):
280
__tablename__ = "FertiLog"
281
primary_key = db.("FertiLogId",.,primary_key=True)
282
nno3 = db.("NNO3",.,default=0)
283
p = db.("P",.,default=0)
284
k = db.("K",.,default=0)
285
ca = db.("Ca",.,default=0)
286
mg = db.("Mg",.,default=0)
287
s = db.("S",.,default=0)
288
na = db.("Na",.,default=0)
289
cl = db.("Cl",.,default=0)
290
fe = db.("Fe",.,default=0)
291
zn = db.("Zn",.,default=0)
292
b = db.("B",.,default=0)
293
mn = db.("Mn",.,default=0)
294
cu = db.("Cu",.,default=0)
295
mo = db.("Mo",.,default=0)
296
si = db.("Si",.,default=0)
297
nnh4 = db.("NNH4",.,default=0)
298
date_time_created = db.(
299
"DateTimeCreated",.,server_default=()
300
)
301
date_time_updated = db.(
302
"DateTimeUpdated",.,server_onupdate=()
303
)
304
targets = db.("FertiTarget",back_populates="ferti_log")
305
306
def__init__(self,nno3,p,k,ca,mg,s,na,cl,fe,zn,b,mn,cu,mo,si,nnh4):
307
self. = nno3
308
self. = p
309
self. = k
310
self. = ca
311
self. = mg
312
self. = s
313
self. = na
314
self. = cl
315
self. = fe
316
self. = zn
317
self. = b
318
self. = mn
319
self. = cu
320
self. = mo
321
self. = si
322
self. = nnh4
323
324
def__repr__(self):
325
return f"<Log ID {self.}>"
326
327
328
classFertiTarget(FertiLog):
329
__tablename__ = "FertiTarget"
330
primary_key = db.("FertiTargetId",.,primary_key=True)
331
ferti_log_id = db.(
332
"FertiLogId",.,.("FertiLog.FertiLogId")
333
)
334
ferti_log = db.("FertiLog",back_populates="targets")
335
336
# def __init__(self):
337
# super(*args).__init__()
338
339
def__repr__(self):
340
return f"<Target ID {self.}>"
341