-
Notifications
You must be signed in to change notification settings - Fork 2
/
Purchase.php
100 lines (88 loc) · 2.72 KB
/
Purchase.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?php defined('SYSPATH') OR die('No direct script access.');
/**
* @package openbuildings\shipping
* @author Ivan Kerin <ikerin@gmail.com>
* @copyright (c) 2013 OpenBuildings Ltd.
* @license http://spdx.org/licenses/BSD-3-Clause
*/
class Kohana_Jam_Behavior_Shippable_Purchase extends Jam_Behavior {
/**
* @codeCoverageIgnore
*/
public function initialize(Jam_Meta $meta, $name)
{
parent::initialize($meta, $name);
$meta
->associations(array(
'shipping_address' => Jam::association('belongsto', array(
'foreign_model' => 'address',
'dependent' => Jam_Association::DELETE,
)),
))
->fields(array(
'shipping_same_as_billing' => Jam::field('boolean', array('default' => TRUE)),
'shipping_required' => Jam::field('boolean', array('in_db' => FALSE)),
))
->events()
->bind('model.add_item', array($this, 'add_item'));
}
public function model_before_check(Model_Purchase $purchase, Jam_Event_Data $data)
{
if ($purchase->shipping_required)
{
if ($purchase->shipping_same_as_billing AND ! $purchase->billing_address)
{
$purchase->errors()->add('billing_address', 'present');
}
elseif ( ! $purchase->shipping_same_as_billing AND ! $purchase->shipping_address)
{
$purchase->errors()->add('shipping_address', 'present');
}
else
{
$purchase->shipping_address()->fields_required = TRUE;
}
if ($purchase->items_count(array('can_ship' => FALSE)))
{
$purchase->errors()->add('brand_purchases', 'cannot_ship');
}
}
}
public function add_item(Model_Purchase $purchase, Jam_Event_Data $data, Model_Purchase_Item $purchase_item)
{
if (($brand_purchase = $purchase_item->brand_purchase) AND $purchase->shipping_country())
{
if ( ! $brand_purchase->shipping)
{
$brand_purchase->build('shipping');
}
$brand_purchase->shipping->build_item_from($purchase_item);
}
}
public function model_call_shipping_country(Model_Purchase $purchase, Jam_Event_Data $data, Model_Location $shipping_country = NULL)
{
if ($shipping_country !== NULL)
{
if ($purchase->shipping_same_as_billing)
{
$purchase->billing_address->country = $shipping_country;
$purchase->billing_address = $purchase->billing_address;
}
else
{
$purchase->shipping_address->country = $shipping_country;
$purchase->shipping_address = $purchase->shipping_address;
}
$data->return = $purchase;
}
$address = $purchase->shipping_address();
if ($address AND $address->country)
{
$data->return = $address->country;
}
}
public function model_call_shipping_address(Model_Purchase $purchase, Jam_Event_Data $data)
{
$data->return = $purchase->shipping_same_as_billing ? $purchase->billing_address : $purchase->shipping_address;
}
}