1
0

Added support for postage and packaging costs.

This commit is contained in:
Ben Smith 2009-09-30 11:42:17 +13:00
parent f920adfa66
commit b2c27dc34f
16 changed files with 485 additions and 22 deletions

View File

@ -0,0 +1,154 @@
<?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 Admin_Postage_Bands_Controller extends Controller
{
/**
* the index page of the user homes admin
*/
public function index()
{
$view = new Admin_View("admin.html");
$view->content = new View("admin_postage_bands.html");
$view->content->postage_bands = ORM::factory("postage_band")->orderby("name")->find_all();
print $view;
}
public function add_postage_band_form() {
print postage_band::get_add_form_admin();
}
public function add_postage_band() {
access::verify_csrf();
$form = postage_band::get_add_form_admin();
$valid = $form->validate();
$name = $form->add_postage->inputs["name"]->value;
$postage = ORM::factory("postage_band")->where("name", $name)->find();
if ($postage->loaded) {
$form->add_postage->inputs["name"]->add_error("in_use", 1);
$valid = false;
}
if ($valid) {
$postage = postage_band::create(
$name,
$form->add_postage->flat_rate->value,
$form->add_postage->per_item->value
);
$postage->save();
message::success(t("Created postage band %postage_name", array(
"postage_name" => html::clean($postage->name))));
print json_encode(array("result" => "success"));
} else {
print json_encode(array("result" => "error",
"form" => $form->__toString()));
}
}
public function delete_postage_band_form($id) {
$postage = ORM::factory("postage_band", $id);
if (!$postage->loaded) {
kohana::show_404();
}
print postage_band::get_delete_form_admin($postage);
}
public function delete_postage_band($id) {
access::verify_csrf();
if ($id == user::active()->id || $id == user::guest()->id) {
access::forbidden();
}
$postage = ORM::factory("postage_band", $id);
if (!$postage->loaded) {
kohana::show_404();
}
$form = postage_band::get_delete_form_admin($postage);
if($form->validate()) {
$name = $postage->name;
$postage->delete();
} else {
print json_encode(array("result" => "error",
"form" => $form->__toString()));
}
$message = t("Deleted user %postage_band", array("postage_band" => html::clean($name)));
log::success("user", $message);
message::success($message);
print json_encode(array("result" => "success"));
}
public function edit_postage_band($id) {
access::verify_csrf();
$postage = ORM::factory("postage_band", $id);
if (!$postage->loaded) {
kohana::show_404();
}
$form = postage_band::get_edit_form_admin($postage);
$valid = $form->validate();
if ($valid) {
$new_name = $form->edit_postage->inputs["name"]->value;
if ($new_name != $postage->name &&
ORM::factory("postage_band")
->where("name", $new_name)
->where("id !=", $postage->id)
->find()
->loaded) {
$form->edit_postage->inputs["name"]->add_error("in_use", 1);
$valid = false;
} else {
$postage->name = $new_name;
}
}
if ($valid) {
$postage->flat_rate = $form->edit_postage->flat_rate->value;
$postage->per_item = $form->edit_postage->per_item->value;
$postage->save();
message::success(t("Changed postage band %postage_name",
array("postage_name" => html::clean($postage->name))));
print json_encode(array("result" => "success"));
} else {
print json_encode(array("result" => "error",
"form" => $form->__toString()));
}
}
public function edit_postage_band_form($id) {
$postage = ORM::factory("postage_band", $id);
if (!$postage->loaded) {
kohana::show_404();
}
$form = postage_band::get_edit_form_admin($postage);
print $form;
}
}

View File

@ -51,7 +51,11 @@ class Admin_Product_Lines_Controller extends Controller
if ($valid) {
$product = product::create(
$name, $form->add_product->cost->value, $form->add_product->description->value);
$name,
$form->add_product->cost->value,
$form->add_product->description->value,
$form->add_product->postage_band->value
);
$product->save();
message::success(t("Created product %product_name", array(
@ -83,7 +87,7 @@ class Admin_Product_Lines_Controller extends Controller
kohana::show_404();
}
$form = user::get_delete_form_admin($product);
$form = product::get_delete_form_admin($product);
if($form->validate()) {
$name = $product->name;
$product->delete();
@ -126,6 +130,7 @@ class Admin_Product_Lines_Controller extends Controller
if ($valid) {
$product->cost = $form->edit_product->cost->value;
$product->description = $form->edit_product->description->value;
$product->postage_band_id = $form->edit_product->postage_band->value;
$product->save();
message::success(t("Changed product %product_name",

View File

@ -31,7 +31,7 @@ class Basket_Controller extends Controller {
print $template;
}
private function getCheckoutForm(){
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");
@ -110,6 +110,8 @@ class Basket_Controller extends Controller {
$basket = Session_Basket::get();
//$admin_address = basket::getEmailAddress();
$postage = $basket->postage_cost();
$product_cost = $basket->cost();
$admin_email = "Order for :
".$basket->name."
@ -121,7 +123,9 @@ class Basket_Controller extends Controller {
".$basket->email."
".$basket->phone."
Placed at ".date("d F Y - H:i" ,time())."
Total Owed ".$basket->cost()." in ".basket::getCurrency()."
Cost of Ordered Products = ".$product_cost."
Postage and Packaging Costs + ".$postage."
Total Owed ".($product_cost+$postage)." Total in ".basket::getCurrency()."
Items Ordered:

View File

@ -42,9 +42,9 @@ class basket_Core {
static $format= array(
"AUD" => "$",
"CAD" => "$",
"EUR" => "",
"GBP" => "£",
"JPY" => "¥",
"EUR" => "&euro;",
"GBP" => "&pound;",
"JPY" => "&yen;",
"USD" => "$",
"NZD" => "$",
"CHF" => "",
@ -114,7 +114,7 @@ class basket_Core {
}
static function formatMoney($money){
return self::$format[self::getCurrency()].number_format($money);
return self::$format[self::getCurrency()].number_format($money,2);
}
static function setEmailAddress($email){
@ -141,6 +141,12 @@ class basket_Core {
<input type=\"hidden\" name=\"currency_code\" value=\"".self::getCurrency()."\">
<input type=\"hidden\" name=\"business\" value=\"".self::getPaypalAccount()."\"/>";
$postage = $session_basket->postage_cost();
if ($postage > 0) {
$form = $form."
<input type=\"hidden\" name=\"shipping_1\" value=\"".$postage."\">";
}
$id = 1;
foreach ($session_basket->contents as $key => $basket_item){
$form = $form."
@ -149,6 +155,7 @@ class basket_Core {
<input type=\"hidden\" name=\"quantity_$id\" value=\"$basket_item->quantity\"/>";
$id++;
}
$form = $form."</form>";
return $form;

View File

@ -38,6 +38,11 @@ class basket_event_Core{
->id("product_line")
->label(t("Product Lines"))
->url(url::site("admin/product_lines")));
$basket_menu->append(
Menu::factory("link")
->id("postage_bands")
->label(t("Postage Bands"))
->url(url::site("admin/postage_bands")));
}

View File

@ -21,17 +21,15 @@
class basket_installer
{
static function install(){
module::set_version("basket", 1);
}
static function activate() {
$db = Database::instance();
$db->query("CREATE TABLE IF NOT EXISTS {products} (
`id` int(9) NOT NULL auto_increment,
`name` TEXT NOT NULL,
`cost` INTEGER(9) default 0,
`cost` DECIMAL(10,2) default 0,
`description` varchar(1024),
`postage_band_id` int(9) default 1,
PRIMARY KEY (`id`))
ENGINE=InnoDB DEFAULT CHARSET=utf8;");
@ -47,20 +45,57 @@ class basket_installer
`product_override_id` int(9) NOT NULL,
`product_id` int(9) NOT NULL,
`include` BOOLEAN default false,
`cost` INTEGER(9) default -1,
`cost` DECIMAL(10,2) default -1,
PRIMARY KEY (`id`))
ENGINE=InnoDB DEFAULT CHARSET=utf8;");
product::create("4x6",5,"4\"x6\" print");
product::create("8x10",25,"8\"x10\" print");
product::create("8x12",30,"8\"x12\" print");
$db->query("CREATE TABLE IF NOT EXISTS {postage_bands} (
`id` int(9) NOT NULL auto_increment,
`name` TEXT NOT NULL,
`flat_rate` DECIMAL(10,2) default 0,
`per_item` DECIMAL(10,2) default 0,
PRIMARY KEY (`id`))
ENGINE=InnoDB DEFAULT CHARSET=utf8;");
postage_band::create("No Postage",0,0);
product::create("4x6",5,"4\"x6\" print",1);
product::create("8x10",25,"8\"x10\" print",1);
product::create("8x12",30,"8\"x12\" print",1);
module::set_version("basket", 2);
}
static function deactivate(){
static function upgrade($version) {
$db = Database::instance();
if ($version == 1) {
// fix for allowing decimel place in money
$db->query("ALTER TABLE {products} CHANGE COLUMN `cost` `cost` DECIMAL(10,2) default 0;");
$db->query("ALTER TABLE {item_products} CHANGE COLUMN `cost` `cost` DECIMAL(10,2) default -1;");
// postage bands
$db->query("ALTER TABLE {products} ADD COLUMN `postage_band_id` int(9) default 1");
$db->query("CREATE TABLE IF NOT EXISTS {postage_bands} (
`id` int(9) NOT NULL auto_increment,
`name` TEXT NOT NULL,
`flat_rate` DECIMAL(10,2) default 0,
`per_item` DECIMAL(10,2) default 0,
PRIMARY KEY (`id`))
ENGINE=InnoDB DEFAULT CHARSET=utf8;");
postage_band::create("No Postage",0,0);
module::set_version("basket", $version = 2);
}
}
static function uninstall(){
$db = Database::instance();
$db->query("DROP TABLE IF EXISTS {products}");
$db->query("DROP TABLE IF EXISTS {product_overrides}");
$db->query("DROP TABLE IF EXISTS {item_products}");
$db->query("DROP TABLE IF EXISTS {postage_bands}");
}
}

View File

@ -0,0 +1,99 @@
<?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 postage_band_Core {
static function get_add_form_admin() {
$form = new Forge("admin/postage_bands/add_postage_band", "", "post", array("id" => "gAddPostageForm"));
$group = $form->group("add_postage")->label(t("Add Postage Band"));
$group->input("name")->label(t("Name"))->id("gPostageName")
->error_messages("in_use", t("There is already a postage band with that name"));
$group->input("flat_rate")->label(t("Flat Rate"))->id("gFlatRate");
$group->input("per_item")->label(t("Per Item"))->id("gPetItem");
$group->submit("")->value(t("Add Postage Band"));
$postage = ORM::factory("postage_band");
$form->add_rules_from($postage);
return $form;
}
static function get_edit_form_admin($postage) {
$form = new Forge("admin/postage_bands/edit_postage_band/$postage->id", "", "post",
array("id" => "gEditPostageForm"));
$group = $form->group("edit_postage")->label(t("Edit Postage Band"));
$group->input("name")->label(t("Name"))->id("gPostageName")->value($postage->name);
$group->inputs["name"]->error_messages(
"in_use", t("There is already a postage band with that name"));
$group->input("flat_rate")->label(t("Flat Rate"))->id("gFlatRate")->value($postage->flat_rate);
$group->input("per_item")->label(t("Per Item"))->id("gPetItem")->
value($postage->per_item);
$group->submit("")->value(t("Modify Postage Band"));
$form->add_rules_from($postage);
return $form;
}
static function get_delete_form_admin($postage) {
$form = new Forge("admin/postage_bands/delete_postage_band/$postage->id", "", "post",
array("id" => "gDeletePostageForm"));
$group = $form->group("delete_postage")->label(
t("Are you sure you want to delete postage band %name?", array("name" => $postage->name)));
$group->submit("")->value(t("Delete postage band %name", array("name" => $postage->name)));
return $form;
}
/**
* Create a new postage band
*
* @param string $name
* @param string $full_name
* @param string $password
* @return User_Model
*/
static function create($name, $flatrate, $peritemcost) {
$postage = ORM::factory("postage_band")->where("name", $name)->find();
if ($postage->loaded) {
throw new Exception("@todo postage already EXISTS $name");
}
$postage->name = $name;
$postage->flat_rate = $flatrate;
$postage->per_item = $peritemcost;
$postage->save();
return $postage;
}
/**
* returns the array of postage bands
* @return an array of postage bands
*/
static function getPostageArray(){
$postagea = array();
$postages = ORM::factory("postage_band")->find_all();
foreach ($postages as $postage){
$show = true;
$postagea[$postage->id] = $postage->name;
}
return $postagea;
}
}

View File

@ -26,6 +26,9 @@ class product_Core {
->error_messages("in_use", t("There is already a product with that name"));
$group->input("cost")->label(t("Cost"))->id("gCost");
$group->input("description")->label(t("Description"))->id("gDescription");
$group->dropdown("postage_band")
->label(t("Postage Band"))
->options(postage_band::getPostageArray());
$group->submit("")->value(t("Add Product"));
$product = ORM::factory("product");
$form->add_rules_from($product);
@ -42,6 +45,10 @@ class product_Core {
$group->input("cost")->label(t("Cost"))->id("gCost")->value($product->cost);
$group->input("description")->label(t("Description"))->id("gDescription")->
value($product->description);
$group->dropdown("postage_band")
->label(t("Postage Band"))
->options(postage_band::getPostageArray())
->selected($product->postage_band_id);
$group->submit("")->value(t("Modify Product"));
$form->add_rules_from($product);
@ -66,7 +73,7 @@ class product_Core {
* @param string $password
* @return User_Model
*/
static function create($name, $cost, $description) {
static function create($name, $cost, $description, $postage_band) {
$product = ORM::factory("product")->where("name", $name)->find();
if ($product->loaded) {
throw new Exception("@todo USER_ALREADY_EXISTS $name");
@ -75,7 +82,7 @@ class product_Core {
$product->name = $name;
$product->cost = $cost;
$product->description = $description;
$product->postage_band_id = $postage_band;
$product->save();
return $product;
}

View File

@ -64,6 +64,11 @@ class basket_item
return $prod->description;
}
public function getProduct(){
$prod = ORM::factory("product", $this->product);
return $prod;
}
public function getCode(){
$photo = ORM::factory("item", $this->item);
$prod = ORM::factory("product", $this->product);
@ -122,6 +127,32 @@ class Session_Basket_Core {
unset($this->contents[$key]);
}
public function postage_cost(){
$postage_cost = 0;
$postage_bands = array();
$postage_quantities = array();
if (isset($this->contents)){
// create array of postage bands
foreach ($this->contents as $product => $basket_item){
$postage_band = $basket_item->getProduct()->postage_band;
if (isset($postage_bands[$postage_band->id]))
{
$postage_quantities[$postage_band->id] += $basket_item->quantity;
}
else
{
$postage_quantities[$postage_band->id] = $basket_item->quantity;
$postage_bands[$postage_band->id] = $postage_band;
}
}
foreach ($postage_bands as $id => $postage_band){
$postage_cost += $postage_band->flat_rate + ($postage_band->per_item * $postage_quantities[$id]);
}
}
return $postage_cost;
}
public function cost(){
$cost = 0;
if (isset($this->contents)){

View File

@ -0,0 +1,26 @@
<?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 Postage_Band_Model extends ORM {
var $rules = array(
"name" => "length[1,32]");
protected $has_many=array('products');
}

View File

@ -21,4 +21,6 @@ class Product_Model extends ORM {
var $rules = array(
"name" => "length[1,32]",
"description" => "length[0,255]");
protected $belongs_to=array('postage_band');
}

View File

@ -1,3 +1,3 @@
name = "Shopping Basket"
description = "Provides a simple shopping basket and checkout with paypal integration"
version = 1
version = 2

View File

@ -0,0 +1,70 @@
<?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.
*/
?>
<div class="gBlock">
<a href="<?= url::site("admin/postage_bands/add_postage_band_form") ?>"
class="gDialogLink gButtonLink right ui-icon-left ui-state-default ui-corner-all"
title="<?= t("Create a new Postage Band") ?>">
<span class="ui-icon ui-icon-circle-plus"></span>
<?= t("Add a new Postage Band") ?>
</a>
<h2>
<?= t("Postage Bands") ?>
</h2>
<div class="gBlockContent">
<table id="gPostageAdminList">
<tr>
<th><?= t("Name") ?></th>
<th><?= t("Flat Rate") ?></th>
<th><?= t("Per Item") ?></th>
<th><?= t("Actions") ?></th>
</tr>
<? foreach ($postage_bands as $i => $postage_band): ?>
<tr id="gProduct-<?= $postage_band->id ?>" class="<?= text::alternate("gOddRow", "gEvenRow") ?>">
<td id="product-<?= $postage_band->id ?>" class="core-info ">
<?= html::clean($postage_band->name) ?>
</td>
<td>
<?= basket::formatMoney($postage_band->flat_rate) ?>
</td>
<td>
<?= basket::formatMoney($postage_band->per_item) ?>
</td>
<td class="gActions">
<a href="<?= url::site("admin/postage_bands/edit_postage_band_form/$postage_band->id") ?>"
open_text="<?= t("close") ?>"
class="gPanelLink gButtonLink ui-state-default ui-corner-all ui-icon-left">
<span class="ui-icon ui-icon-pencil"></span><span class="gButtonText"><?= t("edit") ?></span></a>
<a href="<?= url::site("admin/postage_bands/delete_postage_band_form/$postage_band->id") ?>"
class="gDialogLink gButtonLink ui-state-default ui-corner-all ui-icon-left">
<span class="ui-icon ui-icon-trash"></span><?= t("delete") ?></a>
</td>
</tr>
<? endforeach ?>
</table>
</div>
</div>

View File

@ -37,6 +37,7 @@
<th><?= t("Name") ?></th>
<th><?= t("Cost") ?></th>
<th><?= t("Description") ?></th>
<th><?= t("Postage Band") ?></th>
<th><?= t("Actions") ?></th>
</tr>
@ -51,6 +52,11 @@
<td>
<?= html::clean($product->description) ?>
</td>
<td>
<?= html::clean($product->postage_band->name) ?>
</td>
<td class="gActions">
<a href="<?= url::site("admin/product_lines/edit_product_form/$product->id") ?>"
open_text="<?= t("close") ?>"

View File

@ -52,8 +52,14 @@ function so(){document.confirm.submit();}
</td>
</tr>
<? endforeach ?>
<? $postage = $basket->postage_cost();?>
<? if ($postage > 0):?>
<tr id="" class="<?= text::alternate("gOddRow", "gEvenRow") ?>">
<td></td><td></td><td>Total Cost</td><td><?= html::clean($basket->cost())?></td>
<td></td><td></td><td>Postage and Packaging</td><td><?= html::clean(basket::formatMoney($postage))?></td><td></td>
</tr>
<? endif;?>
<tr id="" class="<?= text::alternate("gOddRow", "gEvenRow") ?>">
<td></td><td></td><td>Total Cost</td><td><?= html::clean(basket::formatMoney($basket->cost() + $postage))?></td>
</tr>
</table>

View File

@ -88,8 +88,14 @@
</td>
</tr>
<? endforeach ?>
<? $postage = $basket->postage_cost();?>
<? if ($postage > 0):?>
<tr id="" class="<?= text::alternate("gOddRow", "gEvenRow") ?>">
<td></td><td></td><td>Total Cost</td><td><?= html::clean(basket::formatMoney($total))?></td><td></td>
<td></td><td></td><td>Postage and Packaging</td><td><?= html::clean(basket::formatMoney($postage))?></td><td></td>
</tr>
<? endif;?>
<tr id="" class="<?= text::alternate("gOddRow", "gEvenRow") ?>">
<td></td><td></td><td>Total Cost</td><td><?= html::clean(basket::formatMoney($total + $postage))?></td><td></td>
</tr>
</table>