module_shop_act_order.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. package modules
  2. import (
  3. "strings"
  4. "golang-fave/consts"
  5. "golang-fave/engine/basket"
  6. "golang-fave/engine/wrapper"
  7. "golang-fave/utils"
  8. )
  9. func (this *Modules) RegisterAction_ShopOrder() *Action {
  10. return this.newAction(AInfo{
  11. WantDB: true,
  12. Mount: "shop-order",
  13. WantAdmin: false,
  14. }, func(wrap *wrapper.Wrapper) {
  15. if (*wrap.Config).Shop.Orders.Enabled <= 0 {
  16. wrap.Write(`{"error": true, "variable": "ShopOrderErrorDisabled"}`)
  17. return
  18. }
  19. if wrap.ShopBasket.ProductsCount(&basket.SBParam{
  20. R: wrap.R,
  21. DB: wrap.DB,
  22. Host: wrap.CurrHost,
  23. Config: wrap.Config,
  24. SessionId: wrap.GetSessionId(),
  25. }) <= 0 {
  26. wrap.Write(`{"error": true, "variable": "ShopOrderErrorBasketEmpty"}`)
  27. return
  28. }
  29. pf_client_last_name := strings.TrimSpace(wrap.R.FormValue("client_last_name"))
  30. pf_client_first_name := strings.TrimSpace(wrap.R.FormValue("client_first_name"))
  31. pf_client_middle_name := strings.TrimSpace(wrap.R.FormValue("client_middle_name"))
  32. pf_client_phone := strings.TrimSpace(wrap.R.FormValue("client_phone"))
  33. pf_client_email := strings.TrimSpace(wrap.R.FormValue("client_email"))
  34. pf_client_delivery_comment := strings.TrimSpace(wrap.R.FormValue("client_delivery_comment"))
  35. pf_client_order_comment := strings.TrimSpace(wrap.R.FormValue("client_order_comment"))
  36. if (*wrap.Config).Shop.Orders.RequiredFields.LastName != 0 {
  37. if pf_client_last_name == "" {
  38. wrap.Write(`{"error": true, "field": "client_last_name", "variable": "ShopOrderEmptyLastName"}`)
  39. return
  40. }
  41. }
  42. if (*wrap.Config).Shop.Orders.RequiredFields.FirstName != 0 {
  43. if pf_client_first_name == "" {
  44. wrap.Write(`{"error": true, "field": "client_first_name", "variable": "ShopOrderEmptyFirstName"}`)
  45. return
  46. }
  47. }
  48. if (*wrap.Config).Shop.Orders.RequiredFields.MiddleName != 0 {
  49. if pf_client_middle_name == "" {
  50. wrap.Write(`{"error": true, "field": "client_middle_name", "variable": "ShopOrderEmptyMiddleName"}`)
  51. return
  52. }
  53. }
  54. if (*wrap.Config).Shop.Orders.RequiredFields.MobilePhone != 0 {
  55. if pf_client_phone == "" {
  56. wrap.Write(`{"error": true, "field": "client_phone", "variable": "ShopOrderEmptyMobilePhone"}`)
  57. return
  58. }
  59. if !utils.IsValidMobile(pf_client_phone) {
  60. wrap.Write(`{"error": true, "field": "client_phone", "variable": "ShopOrderNotCorrectMobilePhone"}`)
  61. return
  62. }
  63. }
  64. if (*wrap.Config).Shop.Orders.RequiredFields.EmailAddress != 0 {
  65. if pf_client_email == "" {
  66. wrap.Write(`{"error": true, "field": "client_email", "variable": "ShopOrderEmptyEmailAddress"}`)
  67. return
  68. }
  69. if !utils.IsValidEmail(pf_client_email) {
  70. wrap.Write(`{"error": true, "field": "client_email", "variable": "ShopOrderNotCorrectEmailAddress"}`)
  71. return
  72. }
  73. }
  74. if (*wrap.Config).Shop.Orders.RequiredFields.Delivery != 0 {
  75. if pf_client_delivery_comment == "" {
  76. wrap.Write(`{"error": true, "field": "client_delivery_comment", "variable": "ShopOrderEmptyDelivery"}`)
  77. return
  78. }
  79. }
  80. if (*wrap.Config).Shop.Orders.RequiredFields.Comment != 0 {
  81. if pf_client_order_comment == "" {
  82. wrap.Write(`{"error": true, "field": "client_order_comment", "variable": "ShopOrderEmptyComment"}`)
  83. return
  84. }
  85. }
  86. bdata := wrap.ShopBasket.GetAll(&basket.SBParam{
  87. R: wrap.R,
  88. DB: wrap.DB,
  89. Host: wrap.CurrHost,
  90. Config: wrap.Config,
  91. SessionId: wrap.GetSessionId(),
  92. })
  93. var lastID int64 = 0
  94. if err := wrap.DB.Transaction(func(tx *wrapper.Tx) error {
  95. // Insert row
  96. res, err := tx.Exec(
  97. `INSERT INTO shop_orders SET
  98. create_datetime = ?,
  99. update_datetime = ?,
  100. currency_id = ?,
  101. currency_name = ?,
  102. currency_coefficient = ?,
  103. currency_code = ?,
  104. currency_symbol = ?,
  105. client_last_name = ?,
  106. client_first_name = ?,
  107. client_middle_name = ?,
  108. client_phone = ?,
  109. client_email = ?,
  110. client_delivery_comment = ?,
  111. client_order_comment = ?,
  112. status = ?
  113. ;`,
  114. utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
  115. utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
  116. bdata.Currency.Id,
  117. bdata.Currency.Name,
  118. bdata.Currency.Coefficient,
  119. bdata.Currency.Code,
  120. bdata.Currency.Symbol,
  121. pf_client_last_name,
  122. pf_client_first_name,
  123. pf_client_middle_name,
  124. pf_client_phone,
  125. pf_client_email,
  126. pf_client_delivery_comment,
  127. pf_client_order_comment,
  128. 0,
  129. )
  130. if err != nil {
  131. return err
  132. }
  133. // Get inserted order id
  134. lastID, err = res.LastInsertId()
  135. if err != nil {
  136. return err
  137. }
  138. // Insert order products
  139. for _, product := range *(*bdata).Products {
  140. if _, err = tx.Exec(
  141. `INSERT INTO shop_order_products (id, order_id, product_id, price, quantity) VALUES (NULL, ?, ?, ?, ?);`,
  142. lastID, product.A_product_id, product.A_price, product.A_quantity,
  143. ); err != nil {
  144. return err
  145. }
  146. }
  147. // Send notify email to owner
  148. if (*wrap.Config).Shop.Orders.NotifyEmail != "" {
  149. if err := wrap.SendEmailTemplated(
  150. (*wrap.Config).Shop.Orders.NotifyEmail,
  151. (*wrap.Config).Shop.Orders.NewOrderEmailThemeCp+" #"+utils.Int64ToStr(lastID)+" ("+wrap.Host+":"+wrap.Port+")",
  152. "email-new-order-admin",
  153. consts.TmplEmailOrder{
  154. Basket: bdata,
  155. Client: consts.TmplOrderClient{
  156. LastName: pf_client_last_name,
  157. FirstName: pf_client_first_name,
  158. MiddleName: pf_client_middle_name,
  159. Phone: pf_client_phone,
  160. Email: pf_client_email,
  161. DeliveryComment: pf_client_delivery_comment,
  162. OrderComment: pf_client_order_comment,
  163. },
  164. Else: consts.TmplOrderElse{
  165. OrderId: lastID,
  166. Subject: (*wrap.Config).Shop.Orders.NewOrderEmailThemeCp + " #" + utils.Int64ToStr(lastID) + " (" + wrap.Host + ":" + wrap.Port + ")",
  167. CpOrderLink: "http://" + wrap.Host + ":" + wrap.Port + "/cp/shop/orders-modify/" + utils.Int64ToStr(lastID) + "/",
  168. },
  169. },
  170. ); err != nil {
  171. return err
  172. }
  173. }
  174. // Send notify email to client
  175. if pf_client_email != "" {
  176. if err := wrap.SendEmailTemplated(
  177. pf_client_email,
  178. (*wrap.Config).Shop.Orders.NewOrderEmailThemeUser+" #"+utils.Int64ToStr(lastID),
  179. "email-new-order-user",
  180. consts.TmplEmailOrder{
  181. Basket: bdata,
  182. Client: consts.TmplOrderClient{
  183. LastName: pf_client_last_name,
  184. FirstName: pf_client_first_name,
  185. MiddleName: pf_client_middle_name,
  186. Phone: pf_client_phone,
  187. Email: pf_client_email,
  188. DeliveryComment: pf_client_delivery_comment,
  189. OrderComment: pf_client_order_comment,
  190. },
  191. Else: consts.TmplOrderElse{
  192. OrderId: lastID,
  193. Subject: (*wrap.Config).Shop.Orders.NewOrderEmailThemeUser + " #" + utils.Int64ToStr(lastID),
  194. CpOrderLink: "http://" + wrap.Host + ":" + wrap.Port + "/cp/shop/orders-modify/" + utils.Int64ToStr(lastID) + "/",
  195. },
  196. },
  197. ); err != nil {
  198. return err
  199. }
  200. }
  201. return nil
  202. }); err != nil {
  203. wrap.Write(`{"error": true, "variable": "ShopOrderErrorSomethingWrong"}`)
  204. return
  205. }
  206. // Clear user basket
  207. wrap.ShopBasket.ClearBasket(&basket.SBParam{
  208. R: wrap.R,
  209. DB: wrap.DB,
  210. Host: wrap.CurrHost,
  211. Config: wrap.Config,
  212. SessionId: wrap.GetSessionId(),
  213. })
  214. wrap.Write(`{"error": false, "field": "", "variable": "ShopOrderSuccess"}`)
  215. return
  216. })
  217. }