PageRenderTime 44ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/controllers/OffersController.php

http://github.com/masom/Chowly
PHP | 247 lines | 193 code | 48 blank | 6 comment | 23 complexity | 76080728e8d442dac4fa07d24d52f355 MD5 | raw file
Possible License(s): LGPL-3.0, GPL-3.0
  1. <?php
  2. /**
  3. * Chowly Pick. Eat. Save!
  4. *
  5. * @copyright Copyright 2011, Martin Samson <pyrolian@gmail.com>
  6. * @license http://opensource.org/licenses/bsd-license.php The BSD License
  7. */
  8. namespace chowly\controllers;
  9. use chowly\models\Offers;
  10. use chowly\models\OfferTemplates;
  11. use chowly\models\OfferLimitations;
  12. use chowly\models\Venues;
  13. use chowly\models\ViewAnalytics;
  14. use chowly\extensions\data\OfferException;
  15. use chowly\extensions\data\InventoryException;
  16. use lithium\analysis\Logger;
  17. use li3_flash_message\extensions\storage\FlashMessage;
  18. class OffersController extends \chowly\extensions\action\Controller{
  19. public function index(){
  20. $offers = Offers::current();
  21. $venues = array();
  22. $venues_id = array();
  23. foreach ($offers as $offer){
  24. $venues_id[(string) $offer->venue_id] = (string) $offer->venue_id;
  25. }
  26. if (!empty($venues_id)){
  27. $conditions = array('_id' => array_keys($venues_id));
  28. Venues::meta('title', 'logo');
  29. $venues = Venues::find('list', compact('conditions','fields'));
  30. }
  31. return compact('offers', 'venues');
  32. }
  33. public function view(){
  34. if (!$this->request->id && !$this->request->slug){
  35. FlashMessage::set("Missing data.");
  36. return $this->redirect(array("Offers::index"));
  37. }
  38. $conditions = array('state'=>'published');
  39. if ($this->request->id){
  40. $conditions['_id'] = $this->request->id;
  41. }else{
  42. $conditions['slug'] = $this->request->slug;
  43. }
  44. $offer = Offers::first(compact('conditions'));
  45. if (!$offer){
  46. FlashMessage::set("The specified offer does not exists.");
  47. return $this->redirect(array("Offers::index"));
  48. }
  49. ViewAnalytics::log($this->Cart->_id, $offer->_id, $this->request, $this->requestDate);
  50. $conditions = array('_id' => $offer->venue_id);
  51. $venue = Venues::first(compact('conditions'));
  52. return compact('offer','venue');
  53. }
  54. public function buy(){
  55. if (!$this->request->id){
  56. FlashMessage::set("Missing data.");
  57. return $this->redirect( array("Offers::index") );
  58. }
  59. if ($this->Cart->containItem($this->request->id)){
  60. return $this->redirect( array('Checkouts::confirm') );
  61. }
  62. if ($this->Cart->isReadOnly()){
  63. FlashMessage::set("There is currently a transaction in progress on your cart.");
  64. return $this->redirect( array('Checkouts::confirm') );
  65. }
  66. try{
  67. $reserved = Offers::reserve($this->request->id, $this->Cart->_id);
  68. }catch(InventoryException $e){
  69. Logger::write('error',
  70. "Could not add item to cart due to: " . $e->getMessage()
  71. );
  72. FlashMessage::set("Sorry, The item could not be added to your cart");
  73. return $this->redirect($this->request->referer());
  74. }catch(OfferException $e){
  75. $message = "Sorry, The item could not be added to your cart for the following reason:";
  76. $message .= $e->getMessage();
  77. FlashMessage::set($message);
  78. return $this->redirect($this->request->referer());
  79. }
  80. $this->Cart->addItem($this->request->id, $reserved);
  81. return $this->redirect(array('Checkouts::confirm'));
  82. }
  83. public function admin_index(){
  84. $limit = 20;
  85. $page = $this->request->page ?: 1;
  86. $order = array('created' => 'DESC');
  87. $total = Offers::count();
  88. $offers = Offers::all(compact('order','limit','page'));
  89. return compact('offers', 'total', 'page', 'limit');
  90. }
  91. public function admin_view(){
  92. $offer = Offers::first($this->request->id);
  93. if (!$offer){
  94. return $this->redirect(array('Offers::index','admin'=>true));
  95. }
  96. $conditions = array('_id'=> $offer->venue_id);
  97. $venue = Venues::first(compact('conditions'));
  98. return compact('venue','offer');
  99. }
  100. public function admin_publish(){
  101. $offer = Offers::first($this->request->id);
  102. if (!$offer){
  103. FlashMessage::set("Offer not found.");
  104. return $this->redirect($this->request->referer());
  105. }
  106. if ($offer->publish()){
  107. FlashMessage::set("Offer published.");
  108. }else{
  109. FlashMessage::set("The offer could not be published.");
  110. }
  111. return $this->redirect($this->request->referer());
  112. }
  113. public function admin_unpublish(){
  114. $offer = Offers::first($this->request->id);
  115. if (!$offer){
  116. FlashMessage::set("Offer not found");
  117. return $this->redirect($this->request->referer());
  118. }
  119. if ($offer->unpublish()){
  120. FlashMessage::set("Offer unpublished.");
  121. }else{
  122. FlashMessage::set("The offer could not be unpublished.");
  123. }
  124. return $this->redirect($this->request->referer());
  125. }
  126. public function admin_rebuild_inventory(){
  127. Offers::rebuildInventory();
  128. return $this->redirect($this->request->referer());
  129. }
  130. public function admin_select_template(){
  131. $templates = OfferTemplates::find('list');
  132. return compact('templates');
  133. }
  134. public function admin_add(){
  135. $offer = Offers::create();
  136. if ($this->request->data){
  137. if(!isset($this->request->data['limitations'])){
  138. $this->request->data['limitations'] = array();
  139. }
  140. $offer->set($this->request->data);
  141. if(!$offer->limitations){
  142. $offer->limitations = array();
  143. }
  144. $conditions = array('_id' => $offer->venue_id);
  145. $venue = Venues::first(compact('conditions'));
  146. $offer->slug = $offer->slug(array('prepend'=>$venue->name));
  147. $success = false;
  148. try{
  149. $success = $offer->createWithInventory();
  150. }catch(\Exception $e){
  151. FlashMessage::set($e->getMessage());
  152. return $this->redirect(array('Offers::index','admin'=>true));
  153. }
  154. if ($success){
  155. FlashMessage::set("Offer created.");
  156. return $this->redirect(array('Offers::view', 'id' => $offer->_id, 'admin'=>true));
  157. }
  158. }
  159. $venues = Venues::find('list');
  160. if (!count($venues)){
  161. FlashMessage::set("No venues in the system.");
  162. return $this->redirect(array('controller'=>'venues','action'=>'add', 'admin'=>true));
  163. }
  164. if($this->request->id){
  165. $conditions = array('_id' => $this->request->id);
  166. $template = OfferTemplates::first(compact('conditions'));
  167. }else{
  168. $template = null;
  169. }
  170. if ($template){
  171. $data = $offer->to('array');
  172. $template = $template->to('array');
  173. $offer->template_id = $template['_id'];
  174. unset($template['_id'], $template['created'], $template['modified']);
  175. $data += $template;
  176. $offer->set($data);
  177. }
  178. $limitations = OfferLimitations::find('list');
  179. $this->_render['template'] = 'admin_edit';
  180. return compact('venues', 'offer', 'limitations');
  181. }
  182. public function admin_edit(){
  183. $conditions = array(
  184. '_id' => $this->request->id
  185. );
  186. $offer = Offers::first(compact('conditions'));
  187. if (($this->request->data)){
  188. $success = $offer->save($this->request->data);
  189. if ($success){
  190. FlashMessage::set("Offer modified.");
  191. return $this->redirect(array('Offers::view', 'id' => $venue->_id));
  192. }
  193. }
  194. $limitations = OfferLimitations::find('list');
  195. $publishOptions = $offer->states();
  196. return compact('offer','publishOptions');
  197. }
  198. }
  199. ?>