Geen omschrijving

pos.py 28KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992
  1. from pos.models import MenuItem, Store, Setting, Table, BookingTable, Order, OrderItem, UIMenu, Ingredient, StoreFile, MenuFile, Post, PostFile, Customer, Code, Profile, PostCategory, Message
  2. from django.core.exceptions import ObjectDoesNotExist
  3. from django.contrib.auth import authenticate
  4. from django.contrib.auth.models import User
  5. from datetime import date
  6. from .admin import SettingAdminForm
  7. from .forms import formMap, OrderForm, OrderFilter, OrderItemFormSet, StoreFilter, StoreForm, MenuItemForm, \
  8. MenuItemFilter, TableForm, TableFilter, BookingForm, BookingFilter, PostForm, PostFilter, CustomerFilter, CustomerForm, CodeForm, UserFilter, MessageForm, MessageFilter, \
  9. UIMenuForm, UIMenuFilter
  10. from django.core.paginator import Paginator
  11. from django.forms import inlineformset_factory, JSONField, TextInput
  12. from django.contrib.auth.forms import UserCreationForm, UserChangeForm
  13. from django_json_widget.widgets import JSONEditorWidget
  14. from django_admin_hstore_widget.forms import HStoreFormField
  15. from django.contrib.postgres.fields import HStoreField, ArrayField
  16. class Kitchen:
  17. name = "kitchen"
  18. def __init__(self, store):
  19. self.store = store
  20. def acceptOrder(self, order):
  21. order.inProcess = Kitchen.name
  22. order.status = "process"
  23. order.save()
  24. for oi in order.orderitem_set.all():
  25. oi.status = "process"
  26. oi.save()
  27. def listItems(self, order):
  28. return order.orderitem_set.all().order_by('-created_at')
  29. def finishItem(self, orderItem):
  30. orderItem.status = "fn"
  31. orderItem.save()
  32. def createNote(self, order, text):
  33. order.note = text
  34. order.save()
  35. class BookingSys:
  36. name = "bookingSys"
  37. formClass = BookingForm
  38. #menuItemFormset = inlineformset_factory(MenuItem, Ingredient, fields=('name', 'qty', 'unit', 'comment',))
  39. modelClass = BookingTable
  40. displayList = {"table": "Table", "onDate": "Date", "onTime": "Time", "note": "Note" }
  41. filterClass = BookingFilter
  42. PS = 25
  43. def __init__(self, store):
  44. self.store = store
  45. def list(self):
  46. return self.store.bookingtable_set.all().order_by('-created_at')
  47. def filter(self, request):
  48. page = request.GET.get('page', 1)
  49. f = self.filterClass(request.GET, queryset=self.list())
  50. p = Paginator(f.qs, self.PS)
  51. #print(p)
  52. return (f, p.get_page(page))
  53. def delete(self, oid):
  54. return self.modelClass.objects.filter(store=self.store, pk=oid).delete()
  55. def create(self, code, nseats):
  56. table = self.modelClass(code=code, nSeats=nseats)
  57. table.store = self.store
  58. table.save()
  59. return table
  60. def get(self, code):
  61. return self.modelClass.objects.get(code = code, store=self.store)
  62. def form(self, oid=None, request=None):
  63. instance = None
  64. if oid:
  65. instance = self.modelClass.objects.get(pk=oid)
  66. #f = formMap.get(formId)
  67. f = self.formClass
  68. if request:
  69. return f(request.POST, request.FILES, instance=instance)
  70. else:
  71. return f(instance=instance)
  72. class PostSys:
  73. name = "postSys"
  74. formClass = PostForm
  75. #menuItemFormset = inlineformset_factory(MenuItem, Ingredient, fields=('name', 'qty', 'unit', 'comment',))
  76. fileFormset = inlineformset_factory(Post, PostFile, fields=('file', 'tags',))
  77. modelClass = Post
  78. displayList = {"title": "Title", "cats": "Category" }
  79. sideForms = ['category', 'relateMenus', 'tags', ]
  80. filterClass = PostFilter
  81. PS = 25
  82. def __init__(self, store):
  83. self.store = store
  84. def list(self, **kwargs):
  85. return self.store.post_set.filter(**kwargs).order_by("-created_at")
  86. def filter(self, request):
  87. page = request.GET.get('page', 1)
  88. f = self.filterClass(request.GET, queryset=self.list())
  89. p = Paginator(f.qs, self.PS)
  90. #print(p)
  91. return (f, p.get_page(page))
  92. def delete(self, oid):
  93. return self.modelClass.objects.filter(store=self.store, pk=oid).delete()
  94. def create(self, code, nseats):
  95. obj = self.modelClass(code=code, nSeats=nseats)
  96. obj.store = self.store
  97. obj.save()
  98. return obj
  99. def get(self, pid):
  100. return self.modelClass.objects.get(pk=pid, store=self.store)
  101. def form(self, oid=None, request=None):
  102. instance = None
  103. if oid:
  104. instance = self.modelClass.objects.get(pk=oid)
  105. #f = formMap.get(formId)
  106. f = self.formClass
  107. if request:
  108. return f(request.POST, request.FILES, instance=instance)
  109. else:
  110. f = f(instance=instance)
  111. f.fields['relateMenus'].queryset = self.store.menuitem_set.all()
  112. return f
  113. def sideFields(self, form):
  114. return [ form[f] for f in self.sideForms]
  115. def formset(self, oid=None, request=None):
  116. instance = None
  117. if oid:
  118. instance = self.modelClass.objects.get(pk=oid)
  119. #f = formMap.get(formId)
  120. f = self.fileFormset
  121. if request:
  122. return f(request.POST, request.FILES, instance=instance)
  123. else:
  124. #store = instance.store
  125. f0 = f(instance=instance)
  126. '''
  127. for f1 in f0.forms:
  128. f1.fields['item'].queryset = self.store.menuitem_set.all()
  129. '''
  130. return f0
  131. def getPosts(self, **kwargs):
  132. cat = kwargs.get('cat', None)
  133. try:
  134. if cat:
  135. pc = PostCategory.objects.get(name=cat)
  136. return pc.post_set.filter(store=self.store)
  137. except:
  138. return None
  139. @classmethod
  140. def gGetPosts(self, **kwargs):
  141. cat = kwargs.get('cat', None)
  142. if cat:
  143. pc = PostCategory.objects.get(name=cat)
  144. return pc.post_set.filter(store=self.store)
  145. return None
  146. class UserSys:
  147. name = "userSys"
  148. formClass = UserCreationForm
  149. profileFormset = inlineformset_factory(User, Profile, fields=('location', 'birthdate', 'role',))
  150. modelClass = User
  151. displayList = {"username": "User Name", "email":"Email", "first_name": "First Name", "last_name": "Last Name", "profile.role": "Role" }
  152. filterClass = UserFilter
  153. PS = 25
  154. sideForms = [ ]
  155. def __init__(self, store):
  156. self.store = store
  157. def list(self):
  158. return User.objects.filter(profile__store=self.store)
  159. def filter(self, request):
  160. page = request.GET.get('page', 1)
  161. if self.list():
  162. f = self.filterClass(request.GET, queryset=self.list())
  163. p = Paginator(f.qs, self.PS)
  164. #print(p)
  165. return (f, p.get_page(page))
  166. else:
  167. return (None, None)
  168. def delete(self, oid):
  169. return self.modelClass.objects.filter(store=self.store, pk=oid).delete()
  170. def form(self, oid=None, request=None):
  171. instance = None
  172. if oid:
  173. instance = self.modelClass.objects.get(pk=oid)
  174. #f = formMap.get(formId)
  175. f = self.formClass
  176. if request:
  177. return f(request.POST, request.FILES, instance=instance)
  178. else:
  179. return f(instance=instance)
  180. def form2(self, oid=None, request=None):
  181. instance = None
  182. if oid:
  183. instance = self.modelClass.objects.get(pk=oid)
  184. #f = formMap.get(formId)
  185. f = UserChangeForm
  186. if request:
  187. return f(request.POST, request.FILES, instance=instance)
  188. else:
  189. return f(instance=instance)
  190. def sideFields(self, form):
  191. return [ form[f] for f in self.sideForms]
  192. def formset(self, oid=None, request=None):
  193. instance = None
  194. if oid:
  195. instance = self.modelClass.objects.get(pk=oid)
  196. #f = formMap.get(formId)
  197. f = self.profileFormset
  198. if request:
  199. return f(request.POST, request.FILES, instance=instance)
  200. else:
  201. #store = instance.store
  202. f0 = f(instance=instance)
  203. '''
  204. for f1 in f0.forms:
  205. f1.fields['item'].queryset = self.store.menuitem_set.all()
  206. '''
  207. return f0
  208. class CustomerSys:
  209. name = "customerSys"
  210. formClass = CustomerForm
  211. #menuItemFormset = inlineformset_factory(MenuItem, Ingredient, fields=('name', 'qty', 'unit', 'comment',))
  212. modelClass = Customer
  213. displayList = {"fullName": "Full Name", "lineId": "LINE ID", "email": "Email", "store": "Store" }
  214. filterClass = CustomerFilter
  215. PS = 25
  216. sideForms = [ ]
  217. def __init__(self, store):
  218. self.store = store
  219. def list(self):
  220. return self.store.customer_set.all().order_by('-created_at')
  221. def filter(self, request):
  222. page = request.GET.get('page', 1)
  223. f = self.filterClass(request.GET, queryset=self.list())
  224. p = Paginator(f.qs, self.PS)
  225. #print(p)
  226. return (f, p.get_page(page))
  227. def delete(self, oid):
  228. return self.modelClass.objects.filter(store=self.store, pk=oid).delete()
  229. def form(self, oid=None, request=None):
  230. instance = None
  231. if oid:
  232. instance = self.modelClass.objects.get(pk=oid)
  233. #f = formMap.get(formId)
  234. f = self.formClass
  235. if request:
  236. return f(request.POST, request.FILES, instance=instance)
  237. else:
  238. return f(instance=instance)
  239. def sideFields(self, form):
  240. return [ form[f] for f in self.sideForms]
  241. def formset(self, oid=None, request=None):
  242. instance = None
  243. if oid:
  244. instance = self.modelClass.objects.get(pk=oid)
  245. #f = formMap.get(formId)
  246. f = self.fileFormset
  247. if request:
  248. return f(request.POST, request.FILES, instance=instance)
  249. else:
  250. #store = instance.store
  251. f0 = f(instance=instance)
  252. '''
  253. for f1 in f0.forms:
  254. f1.fields['item'].queryset = self.store.menuitem_set.all()
  255. '''
  256. return f0
  257. class MessageSys:
  258. name = "messageSys"
  259. formClass = MessageForm
  260. #menuItemFormset = inlineformset_factory(MenuItem, Ingredient, fields=('name', 'qty', 'unit', 'comment',))
  261. modelClass = Message
  262. displayList = {"subject": "Subject", "email": "Email", "tel": "Tel.", "body": "Body", "reply": "Reply", "parent": "Parent" }
  263. filterClass = MessageFilter
  264. PS = 25
  265. def __init__(self, store):
  266. self.store = store
  267. def list(self):
  268. return self.store.message_set.all().order_by("-created_at")
  269. def filter(self, request):
  270. page = request.GET.get('page', 1)
  271. f = self.filterClass(request.GET, queryset=self.list())
  272. p = Paginator(f.qs, self.PS)
  273. #print(p)
  274. return (f, p.get_page(page))
  275. def delete(self, oid):
  276. return self.modelClass.objects.filter(store=self.store, pk=oid).delete()
  277. def create(self, code, nseats):
  278. table = self.modelClass(code=code, nSeats=nseats)
  279. table.store = self.store
  280. table.save()
  281. return table
  282. def get(self, code):
  283. return self.modelClass.objects.get(code = code, store=self.store)
  284. def form(self, oid=None, request=None):
  285. instance = None
  286. if oid:
  287. instance = self.modelClass.objects.get(pk=oid)
  288. #f = formMap.get(formId)
  289. f = self.formClass
  290. if request:
  291. return f(request.POST, request.FILES, instance=instance)
  292. else:
  293. return f(instance=instance)
  294. class TableSys:
  295. name = "tableSys"
  296. formClass = TableForm
  297. #menuItemFormset = inlineformset_factory(MenuItem, Ingredient, fields=('name', 'qty', 'unit', 'comment',))
  298. modelClass = Table
  299. displayList = {"code": "Code", "nSeats": "Seats", "occupy": "Occupy" }
  300. filterClass = TableFilter
  301. PS = 25
  302. def __init__(self, store):
  303. self.store = store
  304. def list(self):
  305. return self.store.table_set.all().order_by("-created_at")
  306. def filter(self, request):
  307. page = request.GET.get('page', 1)
  308. f = self.filterClass(request.GET, queryset=self.list())
  309. p = Paginator(f.qs, self.PS)
  310. #print(p)
  311. return (f, p.get_page(page))
  312. def delete(self, oid):
  313. return self.modelClass.objects.filter(store=self.store, pk=oid).delete()
  314. def create(self, code, nseats):
  315. table = self.modelClass(code=code, nSeats=nseats)
  316. table.store = self.store
  317. table.save()
  318. return table
  319. def bookingTbl(self, code, onDate = date.today(), note=""):
  320. tbl = self.modelClass.objects.get(code=code)
  321. booking = BookingTable(table=tbl, onDate=onDate, note=note)
  322. booking.save()
  323. return booking
  324. def get(self, code):
  325. return self.modelClass.objects.get(code = code, store=self.store)
  326. def form(self, oid=None, request=None):
  327. instance = None
  328. if oid:
  329. instance = self.modelClass.objects.get(pk=oid)
  330. #f = formMap.get(formId)
  331. f = self.formClass
  332. if request:
  333. return f(request.POST, request.FILES, instance=instance)
  334. else:
  335. return f(instance=instance)
  336. class BaseSys:
  337. def __init__(self, store):
  338. self.store = store
  339. def list(self, **kwargs):
  340. return self.model.order_set.all().order_by('-created_at')
  341. def filter(self, request):
  342. page = request.GET.get('page', 1)
  343. f = self.filterClass(request.GET, queryset=self.list())
  344. p = Paginator(f.qs, self.PS)
  345. #print(p)
  346. return (f, p.get_page(page))
  347. def delete(self, oid):
  348. return self.model.objects.filter(store=self.store, pk=oid).delete()
  349. '''
  350. def create(self, tblCode, note=""):
  351. tbl = self.tableSys.get(code=tblCode)
  352. order = Order(table=tbl, note=note, store=self.store)
  353. order.save()
  354. return order
  355. '''
  356. class OrderSys:
  357. name = "orderSys"
  358. formClass = OrderForm
  359. orderItemFormset = inlineformset_factory(Order, OrderItem, fields=('item','qty', 'note', ))
  360. displayList = { "table": "Table", "note": "Note"}
  361. filterClass = OrderFilter
  362. PS = 25
  363. def __init__(self, store):
  364. self.store = store
  365. self.tableSys = TableSys(self.store)
  366. self.menuSys = MenuSys(self.store)
  367. def list(self, **kwargs):
  368. return self.store.order_set.all().order_by('-created_at')
  369. def filter(self, request):
  370. page = request.GET.get('page', 1)
  371. f = self.filterClass(request.GET, queryset=self.list())
  372. p = Paginator(f.qs, self.PS)
  373. #print(p)
  374. return (f, p.get_page(page))
  375. def delete(self, oid):
  376. return Order.objects.filter(store=self.store, pk=oid).delete()
  377. def create(self, tblCode, note=""):
  378. tbl = self.tableSys.get(code=tblCode)
  379. order = Order(table=tbl, note=note, store=self.store)
  380. order.save()
  381. return order
  382. def putItem(self, orderId, itemId, qty, note=""):
  383. order = Order.objects.get(pk=orderId)
  384. item = self.menuSys.get(itemId)
  385. oi = OrderItem.objects.create(order=order, item=item, qty=qty, note=note)
  386. return oi
  387. def cancelItem(self, itemId):
  388. return OrderItem.objects.get(pk=itemId).delete()
  389. def getStatus(self, orderId):
  390. order = Order.objects.get(pk=orderId)
  391. return {'owner': order.owner, 'inProcess': order.inProcess, 'status': order.status }
  392. def purchaseOrder(self, orderId):
  393. order = Order.objects.get(pk=orderId)
  394. order.status = Order.PURCHASE
  395. order.save()
  396. self.printReceipt(order)
  397. def printReceipt(order):
  398. print(f"Receipt {order.id}")
  399. def form(self, oid=None, request=None):
  400. instance = None
  401. if oid:
  402. instance = Order.objects.get(pk=oid)
  403. #f = formMap.get(formId)
  404. f = OrderSys.formClass
  405. if request:
  406. return f(request.POST, request.FILES, instance=instance)
  407. else:
  408. return f(instance=instance)
  409. def formset(self, oid=None, request=None):
  410. instance = None
  411. if oid:
  412. instance = Order.objects.get(pk=oid)
  413. #f = formMap.get(formId)
  414. f = self.orderItemFormset
  415. if request:
  416. return f(request.POST, request.FILES, instance=instance)
  417. else:
  418. #store = instance.store
  419. f0 = f(instance=instance)
  420. for f1 in f0.forms:
  421. f1.fields['item'].queryset = self.store.menuitem_set.all()
  422. return f0
  423. class MenuSys:
  424. name = "menuSys"
  425. formClass = MenuItemForm
  426. menuItemFormset = inlineformset_factory(MenuItem, Ingredient, fields=('name', 'qty', 'unit', 'comment',))
  427. menuFileFormset = inlineformset_factory(MenuItem, MenuFile, fields=('menuFile', 'tags',))
  428. modelClass = MenuItem
  429. displayList = {"name": "Name" }
  430. filterClass = MenuItemFilter
  431. PS = 25
  432. def __init__(self, store):
  433. self.store = store
  434. def list(self, **kwargs):
  435. return self.store.menuitem_set.filter(**kwargs).order_by('-created_at')
  436. def filter(self, request):
  437. page = request.GET.get('page', 1)
  438. f = self.filterClass(request.GET, queryset=self.list())
  439. p = Paginator(f.qs, self.PS)
  440. print(p)
  441. return (f, p.get_page(page))
  442. def naMenus(self):
  443. pass
  444. def avMenus(self):
  445. pass
  446. def search(self, kw):
  447. return MenuItem.objects.filter(name=kw)
  448. def get(self, objId):
  449. return MenuItem.objects.get(pk = objId)
  450. def create(self, name, tagline=""):
  451. return MenuItem.objects.create(name=name, tagline=tagline,store=self.store)
  452. def delete(self, oid):
  453. return self.modelClass.objects.filter(store=self.store, pk=oid).delete()
  454. def deleteMenu(self, pk):
  455. return MenuItem.objects.delete(pk=pk)
  456. def form(self, oid=None, request=None):
  457. instance = None
  458. if oid:
  459. instance = self.modelClass.objects.get(pk=oid)
  460. #f = formMap.get(formId)
  461. f = self.formClass
  462. if request:
  463. return f(request.POST, request.FILES, instance=instance)
  464. else:
  465. return f(instance=instance)
  466. def formset(self, oid=None, request=None):
  467. instance = None
  468. if oid:
  469. instance = self.modelClass.objects.get(pk=oid)
  470. #f = formMap.get(formId)
  471. f = self.menuItemFormset
  472. if request:
  473. return f(request.POST, request.FILES, instance=instance)
  474. else:
  475. #store = instance.store
  476. f0 = f(instance=instance)
  477. '''
  478. for f1 in f0.forms:
  479. f1.fields['item'].queryset = self.store.menuitem_set.all()
  480. '''
  481. return f0
  482. def formset2(self, oid=None, request=None):
  483. instance = None
  484. if oid:
  485. instance = self.modelClass.objects.get(pk=oid)
  486. #f = formMap.get(formId)
  487. f = self.menuFileFormset
  488. if request:
  489. return f(request.POST, request.FILES, instance=instance)
  490. else:
  491. #store = instance.store
  492. f0 = f(instance=instance)
  493. '''
  494. for f1 in f0.forms:
  495. f1.fields['item'].queryset = self.store.menuitem_set.all()
  496. '''
  497. return f0
  498. class MarketingSys:
  499. name = "marketingSys"
  500. def __init__(self, store):
  501. self.store = store
  502. def popMenu(self, period="today"):
  503. pass
  504. def createRating(self, menuId, rating):
  505. pass
  506. def createComment(self, menuId, comment, byWho):
  507. pass
  508. def createStoreRating(self, rating):
  509. pass
  510. def createStoreComment(self, comment):
  511. pass
  512. def getComments(self, obj):
  513. pass
  514. def getRatings(self, obj):
  515. pass
  516. class UISys:
  517. name = "uiSys"
  518. filterClass = UIMenuFilter
  519. formClass = UIMenuForm
  520. modelClass = UIMenu
  521. displayList = {"name": "Name", "parent": "Parent", "group": "Group", "url": "URL", "icon": "Icon", "nOrder": "Order"}
  522. PS = 25
  523. def __init__(self, store):
  524. self.store = store
  525. def list(self):
  526. return self.store.uimenu_set.all().order_by("-created_at")
  527. def filter(self, request):
  528. page = request.GET.get('page', 1)
  529. f = self.filterClass(request.GET, queryset=self.list())
  530. p = Paginator(f.qs, self.PS)
  531. #print(p)
  532. return (f, p.get_page(page))
  533. def menu(self, group):
  534. #return UIMenu.objects.filter(group=group, store=self.store).order_by('-nOrder')
  535. return UIMenu.objects.filter(group=group, store=self.store)
  536. def search(self, style):
  537. pass
  538. def form(self, oid=None, request=None):
  539. instance = None
  540. if oid:
  541. instance = self.modelClass.objects.get(pk=oid)
  542. #f = formMap.get(formId)
  543. f = self.formClass
  544. if request:
  545. return f(request.POST, request.FILES, instance=instance)
  546. else:
  547. return f(instance=instance)
  548. def delete(self, oid):
  549. return self.modelClass.objects.filter(store=self.store, pk=oid).delete()
  550. def createMenu(self, name, parentId, group, url):
  551. parent = UIMenu.objects.get(pk=parentId)
  552. return UIMenu.objects.create(name=name, parent=parent, group=group, url=url)
  553. def deleteMenu(self, menuId):
  554. return UIMenu.objects.delete(pk=menuId)
  555. def updateMenu(self, menuId, name, parentId, group, url):
  556. parent = UIMenu.objects.get(pk=parentId)
  557. menu = UIMenu.objects.get(pk=menuId)
  558. menu.name = name
  559. menu.parent = parent
  560. menu.group = group
  561. menu.url = url
  562. menu.save()
  563. def renderStoreInfo(self):
  564. return f"""
  565. <h1>{self.store.name}</h1>
  566. """
  567. class CodeSys:
  568. #model = Store
  569. name = "codeSys"
  570. formClass = CodeForm
  571. modelClass = Code
  572. def __init__(self, store):
  573. self.store = store
  574. def form(self, request=None):
  575. try:
  576. instance = self.store.code
  577. except Store.code.RelatedObjectDoesNotExist:
  578. c = Code(store = self.store)
  579. c.save()
  580. instance = self.store.code
  581. f = self.formClass
  582. if request:
  583. return f(request.POST, request.FILES, instance=instance)
  584. else:
  585. return f(instance=instance)
  586. #class StoreSys(BaseSys):
  587. class StoreSys:
  588. #model = Store
  589. name = "storeSys"
  590. filterClass = StoreFilter
  591. formClass = StoreForm
  592. modelClass = Store
  593. storeFileFormset = inlineformset_factory(Store, StoreFile, fields=('storeFile', 'tags',))
  594. settingFormset = inlineformset_factory(Store, Setting, fields=('data', 'note',), widgets = { HStoreField: {'widget': JSONEditorWidget} })
  595. #settingFormset = inlineformset_factory(Store, Setting, fields=('data', 'note',), form=SettingAdminForm)
  596. def __init__(self, store):
  597. self.store = store
  598. def form(self, request=None):
  599. instance = self.store
  600. f = self.formClass
  601. if request:
  602. return f(request.POST, request.FILES, instance=instance)
  603. else:
  604. return f(instance=instance)
  605. def formset(self, oid=None, request=None):
  606. instance = self.store
  607. f = self.storeFileFormset
  608. if request:
  609. return f(request.POST, request.FILES, instance=instance)
  610. else:
  611. #store = instance.store
  612. f0 = f(instance=instance)
  613. '''
  614. for f1 in f0.forms:
  615. f1.fields['item'].queryset = self.store.menuitem_set.all()
  616. '''
  617. return f0
  618. def formset2(self, oid=None, request=None):
  619. instance = self.store
  620. f = self.settingFormset
  621. if request:
  622. return f(request.POST, request.FILES, instance=instance)
  623. else:
  624. #store = instance.store
  625. f0 = f(instance=instance)
  626. '''
  627. for f1 in f0.forms:
  628. f1.fields['item'].queryset = self.store.menuitem_set.all()
  629. '''
  630. return f0
  631. class PosSys:
  632. def __init__(self, store):
  633. #self.restoreStore(store)
  634. self.store = store
  635. self.kitchen = Kitchen(self.store)
  636. self.settingSys = SettingSys(self.store)
  637. self.tableSys = TableSys(self.store)
  638. self.bookingSys = BookingSys(self.store)
  639. self.orderSys = OrderSys(self.store)
  640. self.menuSys = MenuSys(self.store)
  641. self.uiSys = UISys(self.store)
  642. self.storeSys = StoreSys(self.store)
  643. self.postSys = PostSys(self.store)
  644. self.customerSys = CustomerSys(self.store)
  645. self.codeSys = CodeSys(self.store)
  646. self.userSys = UserSys(self.store)
  647. self.messageSys = MessageSys(self.store)
  648. @classmethod
  649. def initStore(self, name, tags):
  650. s = Store(name=name, tagline=tags)
  651. s.save()
  652. @classmethod
  653. def initFromId(self, storeId):
  654. store = Store.objects.get(pk=storeId)
  655. return PosSys(store)
  656. @classmethod
  657. def restoreStore(cls, user):
  658. #self.store = store
  659. try:
  660. store = Store.objects.get(owner = user)
  661. except ObjectDoesNotExist:
  662. s = Store(owner=user)
  663. s.save()
  664. store = s
  665. posSys = PosSys(store)
  666. return posSys
  667. #self.kitchen = Kitchen(self.store)
  668. @classmethod
  669. def login(cls, username, password):
  670. user = authenticate(username=username, password=password)
  671. if user is not None:
  672. return cls.restoreStore(user)
  673. #store = Store.objects.get(owner = user)
  674. #return PosSys(store)
  675. else:
  676. return None
  677. @classmethod
  678. def regis(cls, username, email, password, confirmPassword):
  679. if password == confirmPassword:
  680. user = User.objects.create_user(username, email, password)
  681. return user
  682. else:
  683. return None
  684. def bookingTable(self, tbl, note, whenDt):
  685. if tbl.store == self.store:
  686. b = BookingTable(table=tbl, note=note, onDate=whenDt)
  687. return b.save()
  688. else:
  689. return None
  690. def listMenus(self):
  691. return self.store.menuitem_set.all()
  692. def printReciept(self, orderId):
  693. order = Order.get(pk=orderId)
  694. return order.orderitem_set.all()
  695. def addItemToOrder(self, order, item, qty):
  696. o = OrderItem(order=order, item=item, qty = qty)
  697. return o.save()
  698. def sentOrder(self, order):
  699. self.kitchen.acceptOrder(order)
  700. def viewOrderStatus(self, order):
  701. return order.currentStatus()
  702. def createOrder(self, tblId):
  703. o = Order(tbl=tbl)
  704. return o.save()
  705. def createSampleMenu(self):
  706. m = MenuItem(name='sample Menu', tagline='Wow', store=self.store)
  707. m.save()
  708. class SettingSys:
  709. def __init__(self, store):
  710. self.store = store
  711. if hasattr(self.store, 'setting'):
  712. #posSys.settingSys = SettingSys(store.setting)
  713. self.setting = self.store.setting
  714. else:
  715. setting = Setting(store = self.store, data={'firstTime': True})
  716. setting.save()
  717. self.setting = setting
  718. def get(self, key):
  719. return self.setting.data.get(key, None)
  720. def set(self,dicts):
  721. for k,v in dicts.items():
  722. self.setting.data[k] = v
  723. def commit(self):
  724. self.setting.save()
  725. if __name__ == "__main__":
  726. Pos.register(email="xxx", passwd="", confirmPasswd="")
  727. pos = Pos.login(email="xxx", passwd="")
  728. settings = pos.settings
  729. settings.name = ""
  730. settings.address = ""
  731. settings.currency = "USD"
  732. menus = pos.menus
  733. menus.add(MenuItem(name='xxx', cost=10, price=15))
  734. menus.add(MenuItem(name='xyy', cost=10, price=15))
  735. menus.add(MenuItem(name='kkk', cost=10, price=15))
  736. mi = menus.find(name='xxx')
  737. mi2 = menus.find(name='kkk')
  738. mi.active = False
  739. cust = Customer(name='xxx', email='xxx', line='xxx')
  740. orders = pos.orders
  741. order = orders.createOrder()
  742. order.items.add(OrderItem(menu = mi, qty=3, comment='ll'))
  743. order.items.add(OrderItem(menu = mi2, qty=1, comment='uuu'))
  744. order.comment = 'xxxxx'
  745. order.commit()
  746. pr = order.printReceipt()
  747. order.clear()
  748. cust.logOrders.add(order)
  749. cust.logOrders.add(order)
  750. cust.logOrders.add(order)
  751. reports = pos.reports
  752. daily = reports.daily
  753. daily.groupBy(category=True)
  754. daily.print()
  755. weekly = reports.weekly
  756. weekly.groupBy(day=True)
  757. weekly.print()
  758. pos.logout()