1
0
This repository has been archived on 2021-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
gallery3-contrib/modules/basket/controllers/basket.php
Ben Smith 6dfad7e9cd - Paypal IPN and order tracking. There are 3 statuses for an order
1. Awaiting Payment (red) - this will stay awaiting payment until either the admin confirms payment or paypal sends it IPN message to confirm that CC payment was successfull.
2. Payment Confirmed (green) - this means payment has been received but the item hasn't been posted. To mark as completed you will need to view the order and click "confirm order delivery"
3. completed. These aren't shown on the view orders but the order can still be viewed by typing in the order number.

- Side bar integration, Basket contents appears on the sidebar.
2010-08-30 13:09:23 +12:00

444 lines
12 KiB
PHP

<?php defined("SYSPATH") or die("No direct script access.");
/**
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2009 Bharat Mediratta
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
class Basket_Controller extends Controller {
public function temp(){
$db = Database::instance();
$db->query("ALTER TABLE {orders} ADD COLUMN `method` int(9) DEFAULT 0;");
}
public function view_basket($pp="") {
$template = new Theme_View("page.html", "basket");
$basket = Session_Basket::get();
if (isset($pp)){
if ($pp=="nopp"){
$basket->disablepp();
}
elseif ($pp=="ppon"){
$basket->enablepp();
}
}
$view = new View("view_basket.html");
$view->basket = $basket;
$template->content = $view;
print $template;
}
public function preview($id) {
$item = ORM::factory("item", $id);
print "<img src='".$item->resize_url()."'></img>";
}
public function view_orders() {
self::check_view_orders();
$template = new Theme_View("page.html", "basket");
$incomplete_orders = ORM::factory("order")->where('status',"<",20)->find_all();
$view = new View("view_orders.html");
$view->orders = $incomplete_orders;
$template->content = $view;
print $template;
}
public function view_ipn($orderid){
self::check_view_orders();
$template = new Theme_View("page.html", "basket");
$order = ORM::factory("order")->where("id","=",$orderid)->find();
$ipn_messages = ORM::factory("ipn_message")->where("key","=",$orderid)->find_all();
//$ipn_messages = ORM::factory("ipn_message")->find_all();
$view = new View("view_ipn.html");
$view->order = $order;
$view->ipn_messages = $ipn_messages;
$template->content = $view;
print $template;
}
public function check_view_orders() {
if (!basket::can_view_orders()){
die("Invalid access.");
}
}
public function print_order($id){
access::verify_csrf();
self::check_view_orders();
$prefix = basket::getOrderPrefix();
$length = strlen($prefix);
if (strlen($id)>$length ){
if ($prefix === strtolower(substr($id,0,$length ))){
$id = substr($id,$length);
}
}
$order = ORM::factory("order", $id);
$view = new View("print_order.html");
if ($order->loaded()){
$view->order = str_replace(array("\r\n", "\n", "\r"),"<br/>",$order->text);
}else{
$view->order = "Order ".$id." not found.";
}
print $view;
}
public function show_order($id){
access::verify_csrf();
self::check_view_orders();
$prefix = basket::getOrderPrefix();
$length = strlen($prefix);
if (strlen($id)>$length ){
if ($prefix === strtolower(substr($id,0,$length ))){
$id = substr($id,$length);
}
}
$order = ORM::factory("order", $id);
if ($order->loaded()){
$view = new View("view_order.html");
$view->order = $order;
print $view;
}else{
print "Order ".$id." not found.";
}
}
public function show_ipn($id){
access::verify_csrf();
self::check_view_orders();
$ipn_message = ORM::factory("ipn_message", $id);
if ($ipn_message->loaded()){
print $ipn_message->text;
}else{
print "IPN Message ".$id." not found.";
}
}
public function confirm_order_delivery($id){
access::verify_csrf();
self::check_view_orders();
$order = ORM::factory("order", $id);
if ($order->loaded()){
if ($order->status == 2)
{
$order->status = 20;
$order->save();
}
}
url::redirect("basket/view_orders");
}
public function confirm_order_payment($id){
access::verify_csrf();
self::check_view_orders();
$order = ORM::factory("order", $id);
if ($order->loaded()){
if ($order->status == 1)
{
$order->status = 2;
$order->save();
}
}
url::redirect("basket/view_orders");
}
private function getCheckoutForm(){
$form = new Forge("basket/confirm", "", "post", array("id" => "checkout", "name" =>"checkout"));
$group = $form->group("contact")->label(t("Contact Details"));
$group->input("fullname")->label(t("Name"))->id("fullname");
$group->input("house")->label(t("House Number / Name"))->id("house");
$group->input("street")->label(t("Street"))->id("street");
$group->input("suburb")->label(t("Suburb"))->id("suburb");
$group->input("town")->label(t("Town or City"))->id("town");
$group->input("postcode")->label(t("Postcode"))->id("postcode");
$group->input("email")->label(t("E-Mail Address"))->id("email");
$group->input("phone")->label(t("Telephone Number"))->id("phone");
$group->hidden("paypal")->id("paypal");
return $form;
}
public function checkout () {
$template = new Theme_View("page.html", "basket");
$view = new View("checkout.html");
$basket = Session_Basket::get();
$form = self::getCheckoutForm();
$form->contact->fullname->value($basket->name);
$form->contact->house->value($basket->house);
$form->contact->street->value($basket->street);
$form->contact->suburb->value($basket->suburb);
$form->contact->town->value($basket->town);
$form->contact->postcode->value($basket->postcode);
$form->contact->email->value($basket->email);
$form->contact->phone->value($basket->phone);
$view->form = $form;
$template->content = $view;
print $template;
}
public function confirm () {
access::verify_csrf();
$form = $this->getCheckoutForm();
$valid = $form->validate();
if ($valid){
$basket = Session_Basket::get();
if (!isset($basket->contents ) || count($basket->contents) == 0) {
self::view_basket();
return;
}
$basket->name = $form->contact->fullname->value;
$basket->house = $form->contact->house->value;
$basket->street = $form->contact->street->value;
$basket->suburb = $form->contact->suburb->value;
$basket->town = $form->contact->town->value;
$basket->postcode = $form->contact->postcode->value;
$basket->email = $form->contact->email->value;
$basket->phone = $form->contact->phone->value;
$paypal=$form->contact->paypal->value=="true";
$template = new Theme_View("page.html", "basket");
if ($paypal){
// create a prelimary order
$order = basket::createOrder($basket, Order_Model::PAYMENT_PAYPAL);
$paypal = new Paypal();
// create the order first
$view = new View("paypal_redirect.html");
$view ->form = $paypal->process($basket,
url::site("basket/paypal_complete/$order->id", "http"),
url::site("basket/paypal_cancel/$order->id", "http"),
url::site("basket/paypal_ipn/$order->id", "http"));
$template->content = $view;
print $template;
// redirect to paypal
}else
{
$form = new Forge("basket/complete", "", "post", array("id" => "confirm", "name" =>"confirm"));
$view = new View("confirm_order.html");
$view->basket = $basket;
$template->content = $view;
$view->form = $form;
print $template;
}
}
else
{
die("Invalid confirmation!");
}
}
function paypal_ipn($id){
$order = ORM::factory("order")->where("id","=",$id)->find();
if ($order->loaded()){
$paypal = new Paypal();
if ($paypal->validate_ipn($id)){
if ($paypal->ipn_data['payment_status'] == "Completed"){
$order->status = Order_Model::PAYMENT_CONFIRMED;
// send e-mails
basket::send_order($order);
basket::send_invoice($order);
$order->save();
}
return;
}
print "invalid access. tut tut!";
}
return;
}
public function paypal_complete($id) {
$order = ORM::factory("order")->where("id","=",$id)->find();
$basket = Session_Basket::get();
$basket->clear();
$this->_complete($order);
}
public function paypal_cancel($id){
$order = ORM::factory("order")->where("id","=",$id)->find();
if ($order->loaded()){
$order->delete();
}
$this->checkout();
}
public function complete () {
access::verify_csrf();
$basket = Session_Basket::get();
if (!isset($basket->contents ) || count($basket->contents) == 0) {
self::view_basket();
return;
}
// create order
$order = basket::createOrder($basket, Order_Model::PAYMENT_OFFLINE);
$basket->clear();
// send e-mails
basket::send_order($order);
basket::send_invoice($order);
$this->_complete($order);
}
private function _complete($order){
$template = new Theme_View("page.html", "basket");
$view = new View("order_complete.html");
$ordernumber = basket::getOrderPrefix().$order->id;
$view->ordernumber = $ordernumber;
$view->order = $order;
$view->total_cost = $order->cost;
$template->content = $view;
print $template;
}
private function getAddToBasketForm($id){
$form = new Forge("basket/add_to_basket", "", "post", array("id" => "gAddToBasketForm"));
$group = $form->group("add_to_basket")->label(t("Add To Basket"));
$group->hidden("id");
$group->dropdown("product")
->label(t("Product"))
->options(product::getProductArray($id));
$group->input("quantity")->label(t("Quantity"))->id("gQuantity");
$group->submit("")->value(t("Add"));
//$group->submit("proceedToCheckout")->value(t("Proceed To Checkout"));
return $form;
}
public function add_to_basket(){
access::verify_csrf();
if (!isset($_POST['id']))
{
die("no id");
}
$form = self::getAddToBasketForm($_POST['id']);
$valid = $form->validate();
if ($valid){
$basket = Session_Basket::getOrCreate();
$basket->add(
$form->add_to_basket->id->value,
$form->add_to_basket->product->value,
$form->add_to_basket->quantity->value);
$item = ORM::factory("item", $form->add_to_basket->id->value);
Session::instance()->set("redirect_home", $item->parent_id);
print json::reply(array("result" => "success"));
}
else
{
log_error("invalid form!");
}
}
public function add_to_basket_ajax($id) {
$view = new View("add_to_basket_ajax.html");
// get the item to add
$item = ORM::factory("item", $id);
if (!$item->loaded())
{
//TODO
die("Not loaded id");
}
// get the basket to add to
$form = self::getAddToBasketForm($id);
$form->add_to_basket->id->value($id);
$form->add_to_basket->quantity->value(1);
$view->form = $form;
$view->item = $item;
print $view;
}
public function remove_item($key) {
$basket = Session_Basket::getOrCreate();
$basket->remove($key);
url::redirect("basket/view_basket");
}
}