(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" authenticated?) (if (< 0 (# basket)) (templates.basket basket "/shop/order") "") (templates.address-block) (templates.contact-block)]) (HTML [:div {:class "content"} (if (not agreed-to-cookies?) (templates.cookies-agreement) "") [:div {:class "back"} [:a {:href "/shop"} "⟵ Обратно к списку"]] [:section {} [:h2 {:id "content" :class "mb-1"} "Оформление заказа"] [:section {:class "narrow"} [:p {:class "mb-0-5"} "После подтверждения заказа мы с вами свяжемся для уточнения подробностей и оплаты. Оплата по QR-коду."] [:p {} "Самовывоз из чайной. Доставка по Омску и России обговаривается после оформления заказа."]] (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 ". " "Список заказов")) ;; 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}