From eeafe944e26145fcf950125effd165c457322f98 Mon Sep 17 00:00:00 2001 From: Martin Kamerbeek Date: Mon, 29 Nov 2004 15:41:41 +0000 Subject: [PATCH] Committing the new Ecommerce system --- docs/upgrades/upgrade_6.2.9-6.3.0.sql | 80 ++++++++++++++++++++++ sbin/Hourly/ExpireSubscriptionCodes.pm | 12 ++++ sbin/Hourly/ProcessRecurringPayments.pm | 76 ++++++++++++++++++++ www/extras/adminConsole/commerce.gif | Bin 0 -> 2562 bytes www/extras/adminConsole/subscriptions.gif | Bin 0 -> 2562 bytes 5 files changed, 168 insertions(+) create mode 100644 sbin/Hourly/ExpireSubscriptionCodes.pm create mode 100644 sbin/Hourly/ProcessRecurringPayments.pm create mode 100644 www/extras/adminConsole/commerce.gif create mode 100644 www/extras/adminConsole/subscriptions.gif diff --git a/docs/upgrades/upgrade_6.2.9-6.3.0.sql b/docs/upgrades/upgrade_6.2.9-6.3.0.sql index 14ad93c5e..e2b7a8770 100644 --- a/docs/upgrades/upgrade_6.2.9-6.3.0.sql +++ b/docs/upgrades/upgrade_6.2.9-6.3.0.sql @@ -88,3 +88,83 @@ create table layout ( printableStyleTemplateId varchar(22) not null ); +INSERT INTO settings VALUES ('commerceCheckoutCanceledTemplateId','1'); +INSERT INTO settings VALUES ('commerceConfirmCheckoutTemplateId','1'); +INSERT INTO settings VALUES ('commercePaymentPlugin','PayFlowPro'); +INSERT INTO settings VALUES ('commerceSendDailyReportTo','martin@geefmegeld.nl'); +INSERT INTO settings VALUES ('commerceTransactionErrorTemplateId','1'); +INSERT INTO template VALUES ('1','Subscription code redemption','\r\nBatch: \r\n\r\n\r\n
\r\n','Operation/RedeemSubscription',1,1); +INSERT INTO template VALUES ('1','Subscriptionitem default template','

\r\n
\r\n
\r\n
\r\n$
\r\n\">Subscribe now
','Macro/SubscriptionItem',1,1); +INSERT INTO template VALUES ('1','Default transaction error template','\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n
Transaction descriptionPriceStatusError
()

\r\n
\r\n\r\n','Commerce/TransactionError',1,1); +INSERT INTO template VALUES ('1','Default checkout confirmation template','
\r\n
\r\n
    \r\n\r\n
  • \r\n
    \r\n
\r\n\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n
Subscription \"\" : $ every

\r\n
\r\n
\r\n','Commerce/ConfirmCheckout',1,1); +INSERT INTO template VALUES ('1','Default view purchase history template','\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n
$ \">Cancel
x $
','Commerce/ViewPurchaseHistory',1,1); +INSERT INTO template VALUES ('1','Default cancel checkout template','','Commerce/CheckoutCanceled',1,1); +CREATE TABLE shoppingCart ( + sessionId varchar(22) NOT NULL default '', + itemId varchar(64) NOT NULL default '', + itemType varchar(40) NOT NULL default '', + quantity int(4) NOT NULL default '0', + PRIMARY KEY (sessionId,itemId,itemType) +) TYPE=MyISAM; +CREATE TABLE subscription ( + subscriptionId varchar(22) NOT NULL default '', + name varchar(128) default NULL, + price float default '0', + description mediumtext, + subscriptionGroup varchar(22) NOT NULL default '', + duration varchar(12) NOT NULL default 'Monthly', + executeOnSubscription varchar(128) default NULL, + karma int(4) default '0', + deleted int(1) default '0', + PRIMARY KEY (subscriptionId) +) TYPE=MyISAM; +CREATE TABLE subscriptionCodeBatch ( + batchId varchar(22) NOT NULL default '', + name varchar(128) default NULL, + description mediumtext NOT NULL, + subscriptionId varchar(22) NOT NULL default '', + PRIMARY KEY (batchId) +) TYPE=MyISAM; +CREATE TABLE subscriptionCode ( + batchId varchar(22) NOT NULL default '', + code varchar(64) NOT NULL default '', + status varchar(10) NOT NULL default 'Unused', + dateCreated int(11) NOT NULL default '0', + dateUsed int(11) NOT NULL default '0', + expires int(11) NOT NULL default '0', + usedBy varchar(22) NOT NULL default '0', + PRIMARY KEY (code) +) TYPE=MyISAM; +CREATE TABLE subscriptionCodeSubscriptions ( + code varchar(64) NOT NULL default '', + subscriptionId varchar(22) NOT NULL default '', + UNIQUE KEY code (code,subscriptionId) +) TYPE=MyISAM; +CREATE TABLE transaction ( + transactionId varchar(22) NOT NULL default '', + userId varchar(22) NOT NULL default '', + amount float NOT NULL default '0', + gatewayId varchar(128) default NULL, + gateway varchar(64) NOT NULL default '', + recurring tinyint(1) NOT NULL default '0', + initDate int(11) NOT NULL default '0', + completionDate int(11) default '0', + status varchar(10) NOT NULL default 'Pending', + lastPayedTerm int(6) NOT NULL default '0', + PRIMARY KEY (transactionId) +) TYPE=MyISAM; +CREATE TABLE transactionItem ( + transactionId varchar(22) NOT NULL default '', + itemName varchar(64) NOT NULL default '', + amount float NOT NULL default '0', + quantity int(4) NOT NULL default '0', + itemId varchar(64) NOT NULL default '', + itemType varchar(40) NOT NULL default '' +) TYPE=MyISAM; +CREATE TABLE commerceSettings ( + fieldName varchar(64) NOT NULL default '', + fieldValue varchar(255) NOT NULL default '', + namespace varchar(64) NOT NULL default '', + type varchar(10) NOT NULL default '' +) TYPE=MyISAM; + diff --git a/sbin/Hourly/ExpireSubscriptionCodes.pm b/sbin/Hourly/ExpireSubscriptionCodes.pm new file mode 100644 index 000000000..017aaafac --- /dev/null +++ b/sbin/Hourly/ExpireSubscriptionCodes.pm @@ -0,0 +1,12 @@ +package Hourly::ExpireSubscriptionCodes; + +use strict; +use WebGUI::SQL; + +#------------------------------------------------------------------- +sub process { + WebGUI::SQL->write("update subscriptionCode set status='Expired' where status = 'Unused' and dateCreated + expires < ".time); +} + +1; + diff --git a/sbin/Hourly/ProcessRecurringPayments.pm b/sbin/Hourly/ProcessRecurringPayments.pm new file mode 100644 index 000000000..689ea7782 --- /dev/null +++ b/sbin/Hourly/ProcessRecurringPayments.pm @@ -0,0 +1,76 @@ +package Hourly::ProcessRecurringPayments; + +use strict; +use WebGUI::SQL; +use WebGUI::Commerce::Payment; +use WebGUI::Commerce::Transaction; +use WebGUI::Commerce::Item; +use WebGUI::DateTime; +use WebGUI::Session; + +sub _getDuration { + my $duration = shift; + + return addToDate(0,0,0,7) if $duration eq 'Weekly'; + return addToDate(0,0,0,14) if $duration eq 'BiWeekly'; + return addToDate(0,0,0,28) if $duration eq 'FourWeekly'; + return addToDate(0,0,1,0) if $duration eq 'Monthly'; + return addToDate(0,0,3,0) if $duration eq 'Quarterly'; + return addToDate(0,0,6,0) if $duration eq 'HalfYearly'; + return addToDate(0,1,0,0) if $duration eq 'Yearly'; +} + + + + +sub process { + my @recurringTransactions = WebGUI::SQL->buildArray("select transactionId from transaction where recurring=1 and status='Completed'"); + + my (@unprocessed, @ok, @failed, @fatal); + foreach (@recurringTransactions) { + my $transaction = WebGUI::Commerce::Transaction->new($_); + my $itemProperties = $transaction->getItems->[0]; + my $item = WebGUI::Commerce::Item->new($itemProperties->{itemId}, $itemProperties->{itemType}); + my $time = time; + $time -= $transaction->get('initDate'); + my $term = int($time / _getDuration($item->duration)) + 1; + + if ($term > $transaction->lastPayedTerm) { + my $payment = WebGUI::Commerce::Payment->load($transaction->gateway); + + $transaction->gatewayId; + my $status = $payment->getRecurringPaymentStatus($transaction->gatewayId, $term); + + my $output = $item->name." (tid: ".$transaction->get('transactionId').") "; + $output .= " by user ".WebGUI::User->new($transaction->get(userId))->username." (uid: ".$transaction->get(userId).") "; + $output .= " for term ". sprintf('% 6d', $term)." "; + $output .= " -> ".$transaction->gateway.": (".$transaction->gatewayId.")\t"; + unless ($payment->resultCode) { + unless (defined $status) { + $output .= "NOT PROCESSED YET"; + push (@unprocessed, $output); + } elsif ($status->{resultCode} eq '0') { + $output .= "OK"; + push (@ok, $output); + $item->apply unless ($term == 1); + $transaction->lastPayedTerm($term); + } else { + $output .= "PAYMENT FAILED: ".$status->{resultCode}; + push (@failed, $output); + } + } else { + $output .= "FATAL ERROR: ".$payment->resultMessage." (".$payment->errorCode.")"; + } + } + } + + my $message = "FAILED PAYMENTS:\n-----------------------------\n".join("\n", @failed)."\n\n\n"; + $message .= "UNPROCESSED PAYMENTS:\n-----------------------------\n".join("\n", @unprocessed)."\n\n\n"; + $message .= "FATAL ERRORS:\n-----------------------------\n".join("\n",@fatal)."\n\n\n"; + $message .= "SUCCESFUL PAYMENTS:\n-----------------------------\n".join("\n", @ok)."\n\n\n"; + + WebGUI::Mail::send($session{setting}{commerceSendDailyReportTo}, 'Daily recurring payments report', $message); +} + +1; + diff --git a/www/extras/adminConsole/commerce.gif b/www/extras/adminConsole/commerce.gif new file mode 100644 index 0000000000000000000000000000000000000000..b0f570e1002290f4eb68d302a474b57e745f1915 GIT binary patch literal 2562 zcmV+d3jOs*Nk%w1VK4wN0QUd@w6wQY#Q&q~|98|(lC{%LP*%Xe!8x`6YHG;Z+T@v; z#-gI5+S=SDtN(g>y{f9xiHXQ)%#bW+Rs%Vm0+#%gl$Zg8>YQ0&Z*P=k%Qa}R>8H!( zgWF@3mAuo_+sn-35lM~6{Qq-v!K0(j0d@iQ_V%;0%Z1$khS!CSq`K+p>04W6Y;0^` z$p4h%(?@8FnC6E8f&ofo$E~f$^78U}*8c{N(X`g$0dqqFY66kR(K%>wy1LE*L#L{$ zvM8+;e5=-(0s@Tl|)so`>Lc0Itskf0e0Iww;%28?fw1zOui6#{IY{M0eLv?@b-Y&|GvK2 zi9t~TeJMd;#Rpzkjo<&bx7Gn{(W~$O0ftw8lFI>H!T10FYQOJp&;K1qte4g96qWKd zo9|1#c~P$IC9A(Gqw`e5!!NM^Hn07Ppwywf(4FVJsN$cX>7?A`>f7Y?f}Dqri=P&x zsbY27VO@cn=j@V|sDYckg4X<#(D7w;y=tP@G_rbRzxgX+wr|AuOm)#xam{^zqK1vH z0cJvd*Wq8d@+eWEP>8=kxSoy4_lwZ)X@k?8%j0dB&6vjWe3#H>%-DmCvH_C;;^N~N zdBp;h761SLA^8LV00000EC2ui05AYB000R80RIUbNU$KmD^NoGI^x1bu_7&^fYW12 zjKPZ-GyWU)3XY3Tb|MTI5RVx-EKXQ)3J|WA#+MhNB$|f8nH?A?IB*z{Ap@2wResoL z)@nlum@qlIh!6nt*e*XTaOThC6PPPCC$TquSYK64CO0pJ6G zfiwx8Jn>)zcd6^8bf+LtPY+n|6xiU;BDoHNMpJu7KRRA}=QZA%YvG)@UOzs>Z-7 z5pn=v3=2RCBt{!#d{YF*HB@^77hKHKDJHh$9K}N-@KM@T zDJ#2fq7F+S#R@SCAXb+6_((@Y7UGy0s;#X|3d>{;{>2c7*Y}gxH?{g9=hmmtb%|g zRQO_iB}8PB$>MEGumdS|L|o7vz1ZW18@Eg8j^#lF@;mUvs)0ZZg;e58CBjG{g($l; zzrzdf)UiOk0?kmyA4nkK#xl5vp-88S03WfCZ~*a1f(YnSpD0ApgC0o0c`tZD4+?N5 zf*7F}jyOR6kiZGtZ3`FI8({tpungfnOnvKPU=Kh5!56@y3oJ-ZK{oM#4yfS(I7EUU zIu!&AY>_UMHY~TbY@V*yJVFCrH01XUs1qCR;56^hU0kjB@PWb_c z2XF@>2H}b+>|hp|SfC1fu*4-c!ig_jK^o{{kT#592@PmK7PH8WR6L^%+w+l;^yBA90{=5PxI95kWY6oCUqAPz!URGF=O1Sn!5 zh*w6Dpcr980%-672#g>BR!G7e7~qKqjKBd7fT$~6>Ixai;1L>)MJ#mD%mT0g08zWh zEj(Za8i?TvVxWN)RIt)Ew4oQSfGJF8+6D!Iid)0t6taLjhJ$0RyOjju|O~36fCM5{RJ$N@Xeo$l!<% z%s@B0ap^%9vDZFS000cI!i8SKgBc{@tTYJiT370U4wS(N*vXD$9kGZCWR?c>gGmDJ zFo)0Io>c`ZP$>f#-~r1dz(Ze9$7&a`fU!R2A7WTT8fu$_<|cuyyd{GP?qCHDWn&9l zaH#^ePylEiS0Elx?i|KD-rah@17tA58txDY>~>(T+g$+*VD(*rTmb-EFu`ukd)|4S zwgZj;3>zNc2<|>Jw#O}j0Wh$I8O#Q~{xyOTZqbX)bYKfB@TmceTi=23V*!ichB`WM z2NTTT#BBiZ7PygN7A$}Po9!?`O27{Q41onJSOJS!yw|-B0ka&Iu|dR;QU(~n2Mb8@ Y0u1nmB*0e4TtO;gr+ic>7bGA6I~OyNJpcdz literal 0 HcmV?d00001 diff --git a/www/extras/adminConsole/subscriptions.gif b/www/extras/adminConsole/subscriptions.gif new file mode 100644 index 0000000000000000000000000000000000000000..b0f570e1002290f4eb68d302a474b57e745f1915 GIT binary patch literal 2562 zcmV+d3jOs*Nk%w1VK4wN0QUd@w6wQY#Q&q~|98|(lC{%LP*%Xe!8x`6YHG;Z+T@v; z#-gI5+S=SDtN(g>y{f9xiHXQ)%#bW+Rs%Vm0+#%gl$Zg8>YQ0&Z*P=k%Qa}R>8H!( zgWF@3mAuo_+sn-35lM~6{Qq-v!K0(j0d@iQ_V%;0%Z1$khS!CSq`K+p>04W6Y;0^` z$p4h%(?@8FnC6E8f&ofo$E~f$^78U}*8c{N(X`g$0dqqFY66kR(K%>wy1LE*L#L{$ zvM8+;e5=-(0s@Tl|)so`>Lc0Itskf0e0Iww;%28?fw1zOui6#{IY{M0eLv?@b-Y&|GvK2 zi9t~TeJMd;#Rpzkjo<&bx7Gn{(W~$O0ftw8lFI>H!T10FYQOJp&;K1qte4g96qWKd zo9|1#c~P$IC9A(Gqw`e5!!NM^Hn07Ppwywf(4FVJsN$cX>7?A`>f7Y?f}Dqri=P&x zsbY27VO@cn=j@V|sDYckg4X<#(D7w;y=tP@G_rbRzxgX+wr|AuOm)#xam{^zqK1vH z0cJvd*Wq8d@+eWEP>8=kxSoy4_lwZ)X@k?8%j0dB&6vjWe3#H>%-DmCvH_C;;^N~N zdBp;h761SLA^8LV00000EC2ui05AYB000R80RIUbNU$KmD^NoGI^x1bu_7&^fYW12 zjKPZ-GyWU)3XY3Tb|MTI5RVx-EKXQ)3J|WA#+MhNB$|f8nH?A?IB*z{Ap@2wResoL z)@nlum@qlIh!6nt*e*XTaOThC6PPPCC$TquSYK64CO0pJ6G zfiwx8Jn>)zcd6^8bf+LtPY+n|6xiU;BDoHNMpJu7KRRA}=QZA%YvG)@UOzs>Z-7 z5pn=v3=2RCBt{!#d{YF*HB@^77hKHKDJHh$9K}N-@KM@T zDJ#2fq7F+S#R@SCAXb+6_((@Y7UGy0s;#X|3d>{;{>2c7*Y}gxH?{g9=hmmtb%|g zRQO_iB}8PB$>MEGumdS|L|o7vz1ZW18@Eg8j^#lF@;mUvs)0ZZg;e58CBjG{g($l; zzrzdf)UiOk0?kmyA4nkK#xl5vp-88S03WfCZ~*a1f(YnSpD0ApgC0o0c`tZD4+?N5 zf*7F}jyOR6kiZGtZ3`FI8({tpungfnOnvKPU=Kh5!56@y3oJ-ZK{oM#4yfS(I7EUU zIu!&AY>_UMHY~TbY@V*yJVFCrH01XUs1qCR;56^hU0kjB@PWb_c z2XF@>2H}b+>|hp|SfC1fu*4-c!ig_jK^o{{kT#592@PmK7PH8WR6L^%+w+l;^yBA90{=5PxI95kWY6oCUqAPz!URGF=O1Sn!5 zh*w6Dpcr980%-672#g>BR!G7e7~qKqjKBd7fT$~6>Ixai;1L>)MJ#mD%mT0g08zWh zEj(Za8i?TvVxWN)RIt)Ew4oQSfGJF8+6D!Iid)0t6taLjhJ$0RyOjju|O~36fCM5{RJ$N@Xeo$l!<% z%s@B0ap^%9vDZFS000cI!i8SKgBc{@tTYJiT370U4wS(N*vXD$9kGZCWR?c>gGmDJ zFo)0Io>c`ZP$>f#-~r1dz(Ze9$7&a`fU!R2A7WTT8fu$_<|cuyyd{GP?qCHDWn&9l zaH#^ePylEiS0Elx?i|KD-rah@17tA58txDY>~>(T+g$+*VD(*rTmb-EFu`ukd)|4S zwgZj;3>zNc2<|>Jw#O}j0Wh$I8O#Q~{xyOTZqbX)bYKfB@TmceTi=23V*!ichB`WM z2NTTT#BBiZ7PygN7A$}Po9!?`O27{Q41onJSOJS!yw|-B0ka&Iu|dR;QU(~n2Mb8@ Y0u1nmB*0e4TtO;gr+ic>7bGA6I~OyNJpcdz literal 0 HcmV?d00001