module_shop_act_order.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package modules
  2. import (
  3. "context"
  4. "golang-fave/engine/basket"
  5. "golang-fave/engine/consts"
  6. "golang-fave/engine/utils"
  7. "golang-fave/engine/wrapper"
  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 := utils.Trim(wrap.R.FormValue("client_last_name"))
  30. pf_client_first_name := utils.Trim(wrap.R.FormValue("client_first_name"))
  31. pf_client_middle_name := utils.Trim(wrap.R.FormValue("client_middle_name"))
  32. pf_client_phone := utils.Trim(wrap.R.FormValue("client_phone"))
  33. pf_client_email := utils.Trim(wrap.R.FormValue("client_email"))
  34. pf_client_delivery_comment := utils.Trim(wrap.R.FormValue("client_delivery_comment"))
  35. pf_client_order_comment := utils.Trim(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(wrap.R.Context(), func(ctx context.Context, tx *wrapper.Tx) error {
  95. // Insert row
  96. res, err := tx.Exec(
  97. ctx,
  98. `INSERT INTO fave_shop_orders SET
  99. create_datetime = ?,
  100. update_datetime = ?,
  101. currency_id = ?,
  102. currency_name = ?,
  103. currency_coefficient = ?,
  104. currency_code = ?,
  105. currency_symbol = ?,
  106. client_last_name = ?,
  107. client_first_name = ?,
  108. client_middle_name = ?,
  109. client_phone = ?,
  110. client_email = ?,
  111. client_delivery_comment = ?,
  112. client_order_comment = ?,
  113. status = ?
  114. ;`,
  115. utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
  116. utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
  117. bdata.Currency.Id,
  118. bdata.Currency.Name,
  119. bdata.Currency.Coefficient,
  120. bdata.Currency.Code,
  121. bdata.Currency.Symbol,
  122. pf_client_last_name,
  123. pf_client_first_name,
  124. pf_client_middle_name,
  125. pf_client_phone,
  126. pf_client_email,
  127. pf_client_delivery_comment,
  128. pf_client_order_comment,
  129. 0,
  130. )
  131. if err != nil {
  132. return err
  133. }
  134. // Get inserted order id
  135. lastID, err = res.LastInsertId()
  136. if err != nil {
  137. return err
  138. }
  139. // Insert order products
  140. for _, product := range *(*bdata).Products {
  141. if _, err = tx.Exec(
  142. ctx,
  143. `INSERT INTO fave_shop_order_products (id, order_id, product_id, price, quantity) VALUES (NULL, ?, ?, ?, ?);`,
  144. lastID, product.A_product_id, product.A_price, product.A_quantity,
  145. ); err != nil {
  146. return err
  147. }
  148. }
  149. // Send notify email to owner
  150. if (*wrap.Config).Shop.Orders.NotifyEmail != "" {
  151. if err := wrap.SendEmailTemplated(
  152. (*wrap.Config).Shop.Orders.NotifyEmail,
  153. (*wrap.Config).Shop.Orders.NewOrderEmailThemeCp+" #"+utils.Int64ToStr(lastID)+" ("+wrap.Host+":"+wrap.Port+")",
  154. "email-new-order-admin",
  155. consts.TmplEmailOrder{
  156. Basket: bdata,
  157. Client: consts.TmplOrderClient{
  158. LastName: pf_client_last_name,
  159. FirstName: pf_client_first_name,
  160. MiddleName: pf_client_middle_name,
  161. Phone: pf_client_phone,
  162. Email: pf_client_email,
  163. DeliveryComment: pf_client_delivery_comment,
  164. OrderComment: pf_client_order_comment,
  165. },
  166. Else: consts.TmplOrderElse{
  167. OrderId: lastID,
  168. Subject: (*wrap.Config).Shop.Orders.NewOrderEmailThemeCp + " #" + utils.Int64ToStr(lastID) + " (" + wrap.Host + ":" + wrap.Port + ")",
  169. CpOrderLink: "http://" + wrap.Host + ":" + wrap.Port + "/cp/shop/orders-modify/" + utils.Int64ToStr(lastID) + "/",
  170. },
  171. },
  172. ); err != nil {
  173. return err
  174. }
  175. }
  176. // Send notify email to client
  177. if pf_client_email != "" {
  178. if err := wrap.SendEmailTemplated(
  179. pf_client_email,
  180. (*wrap.Config).Shop.Orders.NewOrderEmailThemeUser+" #"+utils.Int64ToStr(lastID),
  181. "email-new-order-user",
  182. consts.TmplEmailOrder{
  183. Basket: bdata,
  184. Client: consts.TmplOrderClient{
  185. LastName: pf_client_last_name,
  186. FirstName: pf_client_first_name,
  187. MiddleName: pf_client_middle_name,
  188. Phone: pf_client_phone,
  189. Email: pf_client_email,
  190. DeliveryComment: pf_client_delivery_comment,
  191. OrderComment: pf_client_order_comment,
  192. },
  193. Else: consts.TmplOrderElse{
  194. OrderId: lastID,
  195. Subject: (*wrap.Config).Shop.Orders.NewOrderEmailThemeUser + " #" + utils.Int64ToStr(lastID),
  196. CpOrderLink: "http://" + wrap.Host + ":" + wrap.Port + "/cp/shop/orders-modify/" + utils.Int64ToStr(lastID) + "/",
  197. },
  198. },
  199. ); err != nil {
  200. return err
  201. }
  202. }
  203. return nil
  204. }); err != nil {
  205. wrap.Write(`{"error": true, "variable": "ShopOrderErrorSomethingWrong"}`)
  206. return
  207. }
  208. // Clear user basket
  209. wrap.ShopBasket.ClearBasket(&basket.SBParam{
  210. R: wrap.R,
  211. DB: wrap.DB,
  212. Host: wrap.CurrHost,
  213. Config: wrap.Config,
  214. SessionId: wrap.GetSessionId(),
  215. })
  216. wrap.Write(`{"error": false, "field": "", "variable": "ShopOrderSuccess"}`)
  217. return
  218. })
  219. }