Skip to content

Commit 33d1617

Browse files
committed
Support bulk coupons and generate codes
1 parent daccf55 commit 33d1617

File tree

8 files changed

+70
-3
lines changed

8 files changed

+70
-3
lines changed

Tests/Recurly/Coupon_Test.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,15 @@ public function testCreateUpdateXML() {
145145
$coupon->createUpdateXML()
146146
);
147147
}
148+
149+
public function testGenerate() {
150+
$this->client->addResponse('POST', '/coupons/fifteen-off/generate', 'unique_coupons/generate-201.xml');
151+
$this->client->addResponse('GET', 'https://api.recurly.com/v2/coupons/fifteen-off/unique_coupon_codes?cursor=1234566890&per_page=20', 'unique_coupons/index-200.xml');
152+
153+
$coupon = new Recurly_Coupon(null, $this->client);
154+
$coupon->coupon_code = 'fifteen-off';
155+
156+
$coupons = $coupon->generate(10);
157+
$this->assertEquals(count($coupons), 10);
158+
}
148159
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
HTTP/1.1 200 OK
2+
Content-Type: application/xml; charset=utf-8
3+
X-Records: 2
4+
Link: <https://api.recurly.com/v2/coupons/fifteen-off/unique_coupon_codes?cursor=1234566890&per_page=20>; rel="start", <https://api.recurly.com/v2/coupons/fifteen-off/unique_coupon_codes?cursor=1234566890&per_page=20>; rel="next"
5+
Location: https://api.recurly.com/v2/coupons/fifteen-off/unique_coupon_codes?cursor=1234566890&per_page=20
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
HTTP/1.1 200 OK
2+
Content-Type: application/xml; charset=utf-8
3+
X-Records: 2
4+
Link: <https://api.recurly.com/v2/coupons/fifteen-off/unique_coupon_codes?cursor=1234566890&per_page=20>; rel="start", <https://api.recurly.com/v2/coupons/fifteen-off/unique_coupon_codes?cursor=1234566890&per_page=20>; rel="next"
5+
6+
<?xml version="1.0" encoding="UTF-8"?>
7+
<unique_coupon_codes>
8+
<coupon href="https://api.recurly.com/v2/coupons/fifteen-off-aaaaaa">
9+
<coupon_code>fifteen-off-aaaaaa</coupon_code>
10+
<a name="redeem" href="https://api.recurly.com/v2/coupons//fifteen-off-aaaaaa/redeem" method="post"/>
11+
</coupon>
12+
<coupon href="https://api.recurly.com/v2/coupons/fifteen-off-bbbbbb">
13+
<coupon_code>fifteen-off-bbbbbb</coupon_code>
14+
<a name="redeem" href="https://api.recurly.com/v2/coupons//fifteen-off-bbbbbb/redeem" method="post"/>
15+
</coupon>
16+
</unique_coupon_codes>

lib/recurly.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
require_once(dirname(__FILE__) . '/recurly/billing_info.php');
2424
require_once(dirname(__FILE__) . '/recurly/coupon.php');
2525
require_once(dirname(__FILE__) . '/recurly/coupon_list.php');
26+
require_once(dirname(__FILE__) . '/recurly/unique_coupon_code_list.php');
2627
require_once(dirname(__FILE__) . '/recurly/invoice.php');
2728
require_once(dirname(__FILE__) . '/recurly/invoice_list.php');
2829
require_once(dirname(__FILE__) . '/recurly/note.php');

lib/recurly/base.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ public function getLinks() {
173173
'adjustment' => 'Recurly_Adjustment',
174174
'adjustments' => 'Recurly_AdjustmentList',
175175
'coupon' => 'Recurly_Coupon',
176+
'unique_coupon_codes' => 'Recurly_UniqueCouponCodeList',
176177
'currency' => 'Recurly_Currency',
177178
'details' => 'array',
178179
'discount_in_cents' => 'Recurly_CurrencyList',

lib/recurly/client.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class Recurly_Client
6161
const PATH_COUPON_REDEMPTION = '/redemption';
6262
const PATH_COUPON_REDEMPTIONS = '/redemptions';
6363
const PATH_COUPONS = '/coupons';
64+
const PATH_UNIQUE_COUPONS = '/unique_coupon_codes';
6465
const PATH_INVOICES = '/invoices';
6566
const PATH_NOTES = '/notes';
6667
const PATH_PLANS = '/plans';

lib/recurly/coupon.php

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ class Recurly_Coupon extends Recurly_Resource
66
protected static $_updatableAttributes;
77
protected $_redeemUrl;
88

9-
function __construct() {
10-
parent::__construct();
9+
function __construct($href = null, $client = null) {
10+
parent::__construct($href, $client);
1111
$this->discount_in_cents = new Recurly_CurrencyList('discount_in_cents');
1212
}
1313

@@ -18,7 +18,7 @@ public static function init()
1818
'duration', 'temporal_unit', 'temporal_amount',
1919
'max_redemptions','applies_to_all_plans','discount_percent','discount_in_cents','plan_codes',
2020
'hosted_description','invoice_description', 'applies_to_non_plan_charges', 'redemption_resource',
21-
'max_redemptions_per_account'
21+
'max_redemptions_per_account', 'coupon_type', 'unique_code_template', 'unique_coupon_codes'
2222
);
2323
Recurly_Coupon::$_updatableAttributes = array('name', 'max_redemptions',
2424
'max_redemptions_per_account', 'hosted_description', 'invoice_description', 'redeem_by_date'
@@ -86,6 +86,24 @@ public function createUpdateXML() {
8686
return $this->renderXML($doc);
8787
}
8888

89+
public function generate($number) {
90+
$doc = $this->createDocument();
91+
92+
$root = $doc->appendChild($doc->createElement($this->getNodeName()));
93+
$root->appendChild($doc->createElement('number_of_unique_codes', $number));
94+
95+
$response = $this->_client->request(Recurly_Client::POST, $this->uri() . '/generate', $this->renderXML($doc));
96+
$response->assertValidResponse();
97+
98+
$coupons = array();
99+
foreach (new Recurly_UniqueCouponCodeList($response->headers['Location'], $this->_client) as $coupon) {
100+
$coupons[] = $coupon;
101+
if (count($coupons) == $number) break;
102+
}
103+
104+
return $coupons;
105+
}
106+
89107
protected function uri() {
90108
if (!empty($this->_href))
91109
return $this->getHref();
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
class Recurly_UniqueCouponCodeList extends Recurly_Pager
4+
{
5+
6+
public static function get($params = null, $client = null) {
7+
$uri = self::_uriWithParams(Recurly_Client::PATH_UNIQUE_COUPONS, $params);
8+
return new self($uri, $client);
9+
}
10+
11+
protected function getNodeName() {
12+
return 'unique_coupon_codes';
13+
}
14+
}

0 commit comments

Comments
 (0)