Hi Peter,

I guess your script works for me... only you'd have to change        CustomerNo => $_->{'UserCustomerID'}, to CustomerID => $_->{'UserCustomerID'},

--
Michiel Beijen
R&D

OTRS AG
Norsk-Data-Str 1.
61352 Bad Homburg
Deutschland

T: +31 (0) 6457 42418
F: +49 (0) 9421 56818-18
I:  http://www.otrs.com/

Business Location: Bad Homburg, Country Court: Bad Homburg, Commercial register: 10751, Tax ID: 003 240
97505 Chairman of the Board: Burchard Steinbild, Managing Board: André Mindermann (CEO), Martin Edenhofer

CU@ IIR Service Desk Forum in Mainz (Germany) and get to know more about OTRS  at booth no. 12 from Nov 24-25, 2009!



On Fri, Oct 9, 2009 at 9:23 PM, Peter Beckman <beckman@angryox.com> wrote:
So I've worked some on a bulk script.  The tickets are being created, and
I'm even successfully associating the tickets to the Master!

Unfortunately, I'm missing something.  I sent an email to the Master
ticket, and no emails went out to the other Slave Tickets.

In the Web UI, the Master Ticket shows "MasterTicket: Master" and shows 3
linked children, as expected.  Looking at one of the slaves, it shows
"MasterTicket: Slave" and Linked Parent to the correct Master.

Free Fields correctly displays MasterTicket: Slave, and Link shows
correctly linked Parent.

Additionally, the correct Customer Info was displayed for the ticket, and
the fake Phone Article I created had the correct email for the customer.
Please note, this is using a config-based external Customer Database.  I'm
not sure if that has something to do with this, but I assume not.

Here's the history for one of Slave Tickets after an email was sent to the
Master Ticket:

10/09/2009 14:55:39     NewTicket               New Ticket [102082813683] created (Q=Raw;P=3 normal;S=new). 10/09/2009 14:55:39     CustomerUpdate          Updated: CustomerID=xxxx;CustomerUser=xxxxxxxx@xxxxxxxxxxxx; 10/09/2009 14:55:39     EmailCustomer           Created by BulkTicket Script 10/09/2009 14:55:39     TicketFreeTextUpdate    Updated: FreeKey12=MasterTicket;FreeText12=Slave; 10/09/2009 14:55:39     TicketLinkAdd           Added link to ticket "103395832887". 10/09/2009 14:57:13     Misc                    MasterTicket: no customer email found, send no master message to customer. 10/09/2009 14:57:13     StateUpdate             Old: "new" New: "closed successful"

I see the problem, no customer email found, but where am I not setting
that?  The %User object returns the customers email as UserID, and that is
used in both the Ticket and Article creation.

Any API hackers want to help?  The documentation is pretty sparse when it
comes to listing and explaining all possible values for Ticket Creation.
Even LinkAdd() didn't mention "Direction" nor why it was excluded, if
indeed that was on purpose.

The code:

===========================================================================


#!/usr/bin/perl -w
# --
# otrs.bulkSlaveTicketCreate
#
# Quickly Create multiple Slave tickets associated with a Master ticket #
# Written by Peter Beckman <beckman at angryox dot com>
# October 9, 2009
# --
# License: Creative Commons Attribution-Share Alike 3.0 United States License
# More Info: http://creativecommons.org/licenses/by-sa/3.0/us/
# This software comes with ABSOLUTELY NO WARRANTY.
# --

use File::Basename;
use FindBin qw($RealBin);
use lib dirname($RealBin);
use lib dirname($RealBin)."/Kernel/cpan-lib";
use Data::Dumper;

use Kernel::Config;
use Kernel::System::Encode;
use Kernel::System::Log;
use Kernel::System::Time;
use Kernel::System::Main;
use Kernel::System::DB;
use Kernel::System::Ticket;
use Kernel::System::CustomerUser;
use Kernel::System::User;

my $ConfigObject = Kernel::Config->new();

my $EncodeObject = Kernel::System::Encode->new(
   ConfigObject => $ConfigObject,
);

my $LogObject = Kernel::System::Log->new(
   ConfigObject => $ConfigObject,
   EncodeObject => $EncodeObject,
);

my $TimeObject    = Kernel::System::Time->new(
   LogObject => $LogObject,
   ConfigObject => $ConfigObject,
);

my $MainObject = Kernel::System::Main->new(
   LogObject => $LogObject,
   EncodeObject => $EncodeObject,
   ConfigObject => $ConfigObject,
);

my $DBObject = Kernel::System::DB->new(
   ConfigObject => $ConfigObject,
   EncodeObject => $EncodeObject,
   MainObject => $MainObject,
   LogObject => $LogObject,
);

my $UserObject = Kernel::System::User->new(
   ConfigObject => $ConfigObject,
   LogObject    => $LogObject,
   MainObject   => $MainObject,
   TimeObject   => $TimeObject,
   DBObject     => $DBObject,
   EncodeObject => $EncodeObject,
);

my $CustomerUserObject = Kernel::System::CustomerUser->new(
   ConfigObject => $ConfigObject,
   LogObject => $LogObject,
   DBObject => $DBObject,
   MainObject => $MainObject,
   EncodeObject => $EncodeObject,
   UserObject => $UserObject,
);

my $TicketObject = Kernel::System::Ticket->new(
   ConfigObject => $ConfigObject,
   LogObject => $LogObject,
   DBObject => $DBObject,
   MainObject => $MainObject,
   TimeObject => $TimeObject,
   EncodeObject => $EncodeObject,
   CustomerUserObject => $CustomerUserObject,
   UserObject => $UserObject,
);

my $LinkObject = Kernel::System::LinkObject->new(
   ConfigObject => $ConfigObject,
   LogObject    => $LogObject,
   DBObject     => $DBObject,
   TimeObject   => $TimeObject,
   MainObject   => $MainObject,
   EncodeObject => $EncodeObject,
   UserObject => $UserObject,
);

print "Enter Customer emails or IDs, separated by a comma.\n";
my $userlist = &promptUser("Customer Emails/IDs");

$userlist =~ s/\s+//g;
my @users = split(/,/, $userlist);

my @usergroup;
foreach(@users) {
   my %List = $CustomerUserObject->CustomerSearch(
       Search => "*$_*"
   );
   if (!%List) {
       print "Could not find user matching $_\n";
       next;
   }
   my @Foo = keys %List;
   my %User = $CustomerUserObject->CustomerUserDataGet(
       User => $Foo[0],
   );
   print "User: " . $User{'UserFirstname'} ." UID: ". $User{'UserCustomerID'} ."\n";
   push @usergroup, \%User;
}

my $MasterTicketID = &promptUser("Master Ticket ID");

my $UserID = &promptUser("Agent UserID (numeric)");

# remove spaces
# split into an array
# foreach over the motherfucker to see if they are valid.

#  Create multiple tickets
#  Send multiple articles

foreach(@usergroup) {
   print Dumper(\$_);
   print "User: " . $_->{'UserFirstname'} ." UID: ". $_->{'UserCustomerID'} ."\n";
   my $TicketID = $TicketObject->TicketCreate(
       TN => $TicketObject->TicketCreateNumber(),
       Queue => 'Raw',
       Lock => 'unlock',
       GroupID => 2,
       Priority => '3 normal',
       State => 'new',
       CustomerNo => $_->{'UserCustomerID'},
       CustomerUser => $_->{'UserID'},
       OwnerID => $UserID, # current owner
       UserID => $UserID,
   );

   if (!$TicketID) {
       print "Unable to create Ticket for " . $_->{'UserCustomerID'} ."\n";
       next;
   }

   print "Ticket (TicketID:$TicketID) created.\n";

   # Add an article here with the From set.

   my $ArticleID = $TicketObject->ArticleCreate(
       TicketID => $TicketID,
       ArticleType => 'phone', # email-external|email-internal|phone|fax|...
       SenderType => 'customer',         # agent|system|customer
       From => $_->{'UserFirstname'} . '<' . $_->{'UserID'} .'>', # not required but useful
       Subject => 'New Slave Ticket',        # required
       Body => 'New Bulk Slave Ticket',                 # required
       ContentType => 'text/plain; charset=UTF-8',
       HistoryType => 'EmailCustomer',  # EmailCustomer|Move|AddNote|PriorityUpdate|WebRequestCustomer|...
       HistoryComment => 'Created by BulkTicket Script',
       UserID => $UserID,
   );

   if (!$ArticleID) {
       print "Unable to create Article for " . $_->{'UserCustomerID'} ."\n";
       next;
   }

   print "Article (ArticleID:$ArticleID) aded to TicketID $TicketID.\n";

   # Set Free Text to Slave.  Not sure how to check if it worked.

   $TicketObject->TicketFreeTextSet(
       Counter => 12,          # This seems to be TicketFreeText12, so use 12 here
       Key => "MasterTicket",
       Value => "Slave",
       TicketID => $TicketID,  # The Slave TicketID
       UserID => $UserID,
   );

   # Link Ticket to Master as Slave. Even though the documentation on OTRS.org sucks anus,
   # The ParentChild type is what we want, and we want to set the Direction as Target from the master ticket.

   my $True = $LinkObject->LinkAdd(
       SourceObject => 'Ticket',
       SourceKey    => $MasterTicketID, # Master Ticket ID
       TargetObject => 'Ticket',
       TargetKey    => $TicketID,       # Slave Ticket ID
       Type         => 'ParentChild',
       Direction    => 'Target',
       State        => 'Valid',
       UserID       => $UserID,
   );

   if (!$True) {
       print "Link to master failed for " . $_->{'UserCustomerID'} ."\n";
       next;
   }

   # OK, at this point, we should have a new ticket with an article attached
   # so a Master Action will send email to all Slaves.
}

# Taken without permission from
# http://www.devdaily.com/perl/edu/articles/pl010005/pl010005.shtml
# on February 2, 2009
# modified to not be annoying about undefined values

sub promptUser {

  local($promptString,$defaultValue) = @_;

  if (defined($defaultValue)) {
     print $promptString, "[", $defaultValue, "]: ";
  } else {
     print $promptString, ": ";
  }

  $| = 1;               # force a flush after our print
  $_ = <STDIN>;         # get the input from STDIN (presumably the keyboard)

  chomp;

  if (defined($defaultValue) and "$defaultValue") {
     return $_ ? $_ : $defaultValue;    # return $_ if it has a value
  } else {
     return $_;
  }
}

exit (0);

=======================================================================



---------------------------------------------------------------------------
Peter Beckman                                                  Internet Guy
beckman@angryox.com                                 http://www.angryox.com/
---------------------------------------------------------------------------
---------------------------------------------------------------------
OTRS mailing list: otrs - Webpage: http://otrs.org/
Archive: http://lists.otrs.org/pipermail/otrs
To unsubscribe: http://lists.otrs.org/cgi-bin/listinfo/otrs

NEW! ENTERPRISE SUBSCRIPTION - Get more information NOW!
http://www.otrs.com/en/support/enterprise-subscription/