(import-macros {:compile-html HTML} :macros)
(local forms (require :forms))
(local lib (require :lib))
(local shop (require :shop))
(local templates (require :templates))
(local %page-title "Оформление заказ")
(local %order-form
[{:title ""
:fields [
(forms.text-input "name" "Как к вам обращаться?" true)
(forms.text-input "contact" "Telegram, Whatsapp или E-mail для связи" true)
(forms.checkbox-input "correct-order" "Данные заказа верны" true)
(forms.checkbox-input "consent"
(..
"Я согласен с условиями обработки персональных данных."
;;"а также с нашей публичной офертой."
)
true)]}])
(fn content [db basket data errors agreed-to-cookies? authenticated?]
[(HTML
[:aside {}
(templates.header "/shop/order")
(if (< 0 (# basket)) (templates.basket basket "/shop/order") "")
(templates.address-block)
(templates.conditions-block)
(templates.contact-block)])
(HTML
[:div {:class "content"}
(if (not agreed-to-cookies?) (templates.cookies-agreement) "")
[:div {:class "back"} [:a {:href "/shop"} "⟵ Обратно к списку"]]
[:section {}
[:h2 {} "Оформление заказа"]
(forms.render-form %order-form data errors)]])])
(fn check-stocks [db basket]
(var error nil)
(each [_ line (ipairs basket) &until error]
(local product
(. (_G.must
(luna.db.query-assoc
db "SELECT title, stock FROM products WHERE name = ?"
[line.name]))
1))
(when (< (- product.stock line.quantity) 0)
(set error (.. "К сожалению, товар «" product.title "» закончился."
" Пожалуйста, уберите его из корзины и попробуйте оформить заказ снова."))))
error)
(fn render [request db authenticated?]
(let [order-id request.cookies.order
agreed-to-cookies? request.cookies.agreed-to-cookies
basket (if order-id (shop.basket db order-id) [])]
(if (= request.method "POST")
(let [errors (forms.validate %order-form request.form)
has-errors? (not (lib.empty-table? errors))]
(if has-errors?
(values 400 {} (templates.base
(content db basket request.form errors
agreed-to-cookies? authenticated?)
%page-title))
(let [data (forms.html-form->data %order-form request.form)
stock-error (check-stocks db basket)]
(if (not stock-error)
(do
(shop.place-order db order-id data.name data.contact data.consent)
(lib.notify
(.. "Новый заказ "
""
order-id
" от " data.name ".\n\n"
"Список заказов"))
;; redirect and clear order cookie
(values 302 {:Location (.. "/shop/order/" order-id)
:Set-Cookie "order=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT"}
""))
(values 400 {}
(templates.base (content db basket data {:consent stock-error}
agreed-to-cookies? authenticated?))
%page-title)))))
(if (< 0 (# basket))
(values 200 {} (templates.base
(content db basket {} {} agreed-to-cookies?
authenticated?)
%page-title))
(values 302 {:Location "/shop"} "")))))
{: render}