1 # Copyright 2005-2009 Interchange Development Group and others
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version. See the LICENSE file for details.
8 # $Id: user_merge.tag,v 1.4 2009-05-20 23:37:27 pajamian Exp $
10 UserTag user-merge Order from to
11 UserTag user-merge addAttr
12 UserTag user-merge Description Merges users based on order number or username
13 UserTag user-merge Routine <<EOR
15 my ($from, $to, $opt) = @_;
17 #::logDebug("Called user merge");
18 use vars qw/$Tag $CGI/;
23 $Tag->error({ name => 'order merge', set => $msg });
27 unless($Vend::admin) {
28 return $err->("Only admin can merge records.");
31 unless($Vend::superuser) {
32 return $err->("Only admin can merge records.")
33 unless $Tag->if_mm('advanced', 'merge_users');
36 $from ||= $CGI->{item_id};
37 $to ||= $CGI->{item_radio};
38 my $table = $opt->{table} || $CGI->{mv_data_table};
41 if($opt->{from_user} or $opt->{from_order}) {
42 ## We are told what to do
44 elsif($table eq 'userdb') {
45 $opt->{from_user} = 1;
47 elsif ($table eq 'transactions') {
48 $opt->{from_order} = 1;
51 return $err->("Unable to determine what to do, no table or from_user...");
54 my $ufield = $opt->{user_field} || 'username';
55 my $ofield = $opt->{order_field} || 'order_number';
57 my $utab = $opt->{user_table} || $::Variable->{UI_USER_MERGE_USER_TABLE} || 'userdb';
58 my $ttabs = $opt->{merge_tables} || $::Variable->{UI_USER_MERGE_TABLES} || 'transactions orderline';
60 my @ttab = grep /\w/, split /[\s,\0]+/, $ttabs;
69 my ($t, $f) = split /[=:]+/, $_, 2;
71 $kfield{$t} = $f || $ufield;
74 my $tdb = dbref($ttab[0])
75 or return $err->("No %s table.", $ttab[0]);
76 my $udb = dbref($utab)
77 or return $err->("No %s table.", $utab);
80 my $db = $dbr{$_} = dbref($_)
81 or return $err->("Unable to open '%s' table for merge.", $_);
82 my $dbh = $dbh{$_} = $db->dbh();
83 $query{$_} = "update $_ set $kfield{$_} = ? where $kfield{$_} = ?";
84 $sth{$_} = $dbh->prepare($query{$_})
85 or return $err->("Unable to prepare statement '%s' for merge.", $query{$_});
90 if($opt->{from_order}) {
91 $to_user = $tdb->field($to, $ufield);
94 my $urec = $udb->row_hash($to_user)
95 or return $err->("%s does not exist, cannot merge to that user.", $to_user);
99 if(ref($from) eq 'ARRAY') {
103 @from = split /\0/, $from;
108 if($opt->{from_order}) {
111 my $okey = $tdb->foreign($_, $ofield);
112 my $user = $tdb->field($okey, $ufield);
119 next if $_ eq $to_user;
120 unless($from_user{$_} or $udb->field($_, 'username')) {
121 $err->("User '%s' does not exist.", $_);
127 my $cart_hash = string_to_ref($urec->{carts});
130 my @users = sort keys %from_user;
135 my $logfile = $opt->{logfile} || 'logs/merged_users.log';
139 for my $user (@users) {
140 $Tag->log({ type => 'text', file => $logfile, body => $Tag->time() . "\n" } )
143 my $from_urec = $udb->row_hash($user);
145 # If there's a user_merge specialsub run it here
146 if (my $subname = $Vend::Cfg->{SpecialSub}{user_merge}) {
147 my $sub = $Vend::Cfg->{Sub}{$subname} || $Global::GlobalSub->{$subname};
149 eval { $status = $sub->($user, $from_urec, $to_user, $urec, $udb, $tdb) };
151 ::logError("Error running %s subroutine %s: %s", 'user_merge', $subname, $@);
155 # Skip further processing of this user
165 $sth{$_}->execute($to_user, $user)
166 or $err->("%s update failed: %s", $_, $dbh{$_}->errstr);
168 $o =~ s/\?/$to_user/;
173 my $chash = string_to_ref($from_urec->{carts});
176 if($cart_hash->{$_}) {
177 $Tag->log({ type => 'text', file => $logfile, body => "unable to merge cart=$_ (already exists). Contents=$from_urec->{carts}\n"} );
180 $cart_hash->{$_} = $chash->{$_};
185 my $ustring = ::uneval($from_urec);
186 $Tag->log({ type => 'text', file => $logfile, body => "delete user $user=$ustring\n"} );
187 $udb->delete_record($user)
188 unless $opt->{no_delete};
189 push @record, "delete user $user" unless $opt->{no_delete};
194 $urec->{carts} = ::uneval($cart_hash);
198 $udb->set_field($to, 'carts', ::uneval($cart_hash));
203 delete $urec->{$udb->[$Vend::Table::DBI::KEY]};
204 $udb->set_slice($to, $urec);
209 $Tag->log({ type => 'text', file => $logfile, body => join("\n", @record)} );
210 ::logDebug(join("\n", @record)) if $opt->{debug};
211 return 1 unless $opt->{hide};