home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Lighthouse Design Suite
/
LIGHTHOUSE.mdf
/
TaskMaster_1.8
/
Application
/
FilterServicer.service
/
mpx2tm
< prev
next >
Wrap
Text File
|
1995-05-02
|
14KB
|
560 lines
#
# mpx2tm
#
# This file when used as input to perl will take a file in the MPX file
# format as described in the Microsoft Project Reference book and translate
# it into TaskMaster format.
#
# Copyright (C) 1993 Lighthouse Design Ltd.
#
# You may freely copy, distribute, and reuse the code in
# this example provided this copyright legend and disclaimer
# are preserved in all copies and derivative work.
#
# Lighthouse Design disclaims any warranty of any kind,
# expressed or implied, as to this code's fitness
# for any particular use.
#
#
#
if($ARGV[0] eq "-t"){
require "timelocal.pl";
require "writetm.pl";
shift(@ARGV);
foreach $file (@ARGV) {
print "Trying $file...\n";
print STDERR "HELLOOOOO!\n\n";
sleep (1);
if (!open(TEXTFILE,"cat \"$ARGV[0]\" | tr \'\\015\' \'\\012\' |")) {
printf(STDERR "$ARGV[0] not readable. Skipping $ARGV[0]\n");
exit 0;
}
$dirName = ".";
if ($file =~ /\//) {
$dirName = $file;
$dirName =~ s/\/[^\/]$//;
}
$tmFilename = "/tmp/TEST.taskmaster";
$interfaceFilename = "";
&doFile();
close(TEXTFILE);
}
}else{
require "$ARGV[2]/timelocal.pl";
require "$ARGV[2]/writetm.pl";
if (!open(TEXTFILE,"cat \"$ARGV[0]\" | tr \'\\015\' \'\\012\' |")) {
printf(STDERR "$ARGV[0] not readable. Skipping $ARGV[0]\n");
exit 0;
}
$tmFilename = $ARGV[1];
$interfaceFilename = "$ARGV[2]/ObjectArchive.tmoa";
&doFile();
close(TEXTFILE);
}
sub doFile {
select((select(STDERR), $| = 0)[0]);
$| = 1;
$currentOutlineNumber = "0.";
$currentOutlineLevel = 1;
#
# Initialize variables
#
# calendar stuff
$currentCalendarName = "";
$firstLine = 0;
@currentCalendarWeek = (0,0,0,0,0,0,0);
while(<TEXTFILE>){
# firstLine
!$firstLine && do {
if(!/^MPX(.)/){
print STDERR "This isn't an MPX type file.\n\n";
sleep(1);
exit 0;
}
$fieldSeparator = $1;
$firstLine = 1;
};
# comments
/^0/ && do {
next;
};
# currency settings
/^10/ && do {
# doesn't have meaning in TM
next;
};
# Date and Time settings
/^12/ && do {
# PENDING
next;
};
# Base Calendar Definition
/^20/ && do {
if($inCalendar){
&addCalendar($currentCalendarName, @currentCalendarWeek, @currentCalendarHolidays);
if($currentCalendarName eq "Standard"){
&setDefaultCalendar($currentCalendarName);
}
print "Reading Base Calendar...\n\n" if !$baseCalendarNotified;
$baseCalendarNotified = 1;
}
($recordNum, $currentCalendarName, @currentCalendarWeek) = &breakUpLine($_);
@currentCalendarHolidays = ();
$inCalendar = 1;
next;
};
# Base Calendar Hours
/^25/ && do {
($recordNum, $dayOfWeek, @fromToArray) = &breakUpLine($_);
$dayOfWeek--;
if($currentCalendarWeek[$dayOfWeek]){
$currentCalendarWeek[$dayOfWeek] = &sumHours(@fromToArray);
}
next;
};
# Base Calendar Exeptions (Holidays?)
/^26/ && do {
($recordNum, $startDate, $endDate, $working) = &breakUpLine($_);
if(!$working || !$endDate){
if(!$endDate){
$endDate = $startDate;
}
@holidayDates = &daysBetween($startDate, $endDate);
@currentCalendarHolidays = (@currentCalendarHolidays, @holidayDates);
}
next;
};
# Project Header
/^30/ && do {
($recordNum, $projectName, $projectCompany, $projectManager, $projectCalendar, $projectStart, $projectEnd, $isEndOn) = &breakUpLine($_);
if($inCalendar){
&addCalendar($currentCalendarName, @currentCalendarWeek, @currentCalendarHolidays);
if($currentCalendarName eq "Standard"){
&setDefaultCalendar($currentCalendarName);
}
print "Reading Calendars...\n\n" if !$calendarsNotified;
$calendarsNotified = 1;
}
if($projectName){
&setProjectName($projectName);
}
if($projectManager){
$projectManager .= ":$projectCompany" unless !$projectCompany;
&setProjectManager($projectManager);
}
if($isEndOn){
&setProjectEndDate($projectEnd);
}else{
&setProjectStartDate($projectStart);
}
next;
};
# Text Resource Table Definition
/^40/ && do {
next;
};
# Numeric Resource Table Definition
/^41/ && do {
®isterColumnHeadings($_);
next;
};
# Resource
/^50/ && do {
®isterCurrentLine($_);
# 40 -> ID
# 1 -> Name
# 41 -> MaxUnits
# 42 -> StandardRate
# 44 -> Per Use Cost
# 48 -> Base Calendar
$resourceID = ¤tValue(40);
die "Lacking Resource ID" if ($resourceID eq "");
$resourceName = ¤tValue(1) || do {
$resourceName = "Resource $resourceID";
};
$resourceUnits = ¤tValue(41) || do {
$resourceUnits = 1;
};
$resourceRate = ¤tValue(42);
if($resourceRate){
if($resourceRate =~ /\$([\d\.]+)\/w/){
$resourceRate = $1/5;
}elsif($resourceRate =~ /\$([\d\.]+)\/d/){
$resourceRate = $1;
}elsif($resourceRate =~ /\$([\d\.]+)\/h/){
$resourceRate = $1 * 8;
}else{
$resourceRate = 0;
};
}else{
$resourceRate = 0;
}
$resourcePerUse = ¤tValue(44) || do {
$resourcePerUse = 0;
};
if($resourcePerUse =~ /\$([\d\.\,]+)/ ){
$resourcePerUse = $1;
$resourcePerUse =~ s/\,//g;
}
$resourceBaseCalendar = ¤tValue(48) || do{
$resourceBaseCalendar = "Standard";
};
$currentResourceCalendar = "CalendarOf:".$resourceID;
&addResource($resourceID, $resourceName, $resourceUnits, $resourceRate, $resourcePerUse, $currentResourceCalendar);
&addCalendarCopyOf($currentResourceCalendar, $resourceBaseCalendar);
print "Reading Resources...\n\n" if !$resourcesNotified;
$resourcesNotified = 1;
next;
};
# Resource Notes
/^51/ && do {
next;
};
# Resource Calendar Definition
/^55/ && do {
($recordNum, $baseCalendarName, @currentCalendarWeek) = &breakUpLine($_);
$ct = 1;
foreach $day (@currentCalendarWeek){
if($day == 0){
&setCalendarHoursForDay($currentResourceCalendar, $ct, 0);
}
$ct++;
}
next;
};
# Resource Calendar Hours
/^56/ && do {
($recordNum, $dayOfWeek, @fromToArray) = &breakUpLine($_);
&setCalendarHoursForDay($currentResourceCalendar, $dayOfWeek, &sumHours(@fromToArray));
next;
};
# Resource Calendar Exceptions
/^57/ && do {
($recordNum, $startDate, $endDate, $working) = &breakUpLine($_);
if(!$working || !$endDate){
if(!$endDate) {
$endDate = $startDate;
}
@holidayDates = &daysBetween($startDate, $endDate);
&addCalendarHolidays($currentResourceCalendar, @holidayDates);
}
next;
};
# Text Task Table Definition
/^60/ && do {
next;
};
# Numeric Task Tabel Definition
/^61/ && do {
®isterColumnHeadings($_);
next;
};
# Task
/^70/ && do {
®isterCurrentLine($_);
# 90 -> ID
# 1 -> Name
# Assume type task?
# 3 -> outline level (used to get outline #)
# 50 -> scheduledStart
# 20 -> planned work
# 91 -> constraint type
# 68 -> constraint date
# 0 expenses
# 95 -> priority
# 4 -> Text 1 = Subtitle
# 5 -> Text 2 = Notes
#
$taskID = ¤tValue(90);
die "Task ID Missing" if ($taskID eq "");
$currentTaskID = $taskID;
$taskName = ¤tValue(1) || do {
$taskName = "Task $taskID";
};
#figure type
$taskType = "Task";
if(¤tValue(80) eq "No" && ¤tValue(40) =~ /[0-9.]+e./){
$taskType = "Group";
}
# figure outline number
$outlineLevel = ¤tValue(3) || do {
$currentOutlineNumber = "";
$currentOutlineLevel = -30;
};
if($outlineLevel == $currentOutlineLevel){
$currentOutlineNumber = &nextSibling($currentOutlineNumber);
}elsif($outlineLevel == $currentOutlineLevel+1){
$currentOutlineLevel++;
$currentOutlineNumber = &firstChild($currentOutlineNumber);
}elsif($outlineLevel == $currentOutlineLevel-1){
$currentOutlineLevel--;
$currentOutlineNumber = &nextAunt($currentOutlineNumber);
}else{
$currentOutlineNumber = "";
$currentOutlineLevel = -30;
}
$taskStartDate = ¤tValue(50) || do {
$taskStartDate = "";
};
$taskDuration = ¤tValue(40) || do {
$taskDuration = "1d";
};
if($taskDuration =~ /([1-9.]+)e(.)/){
$taskDuration = "$1$2";
}
# figure constraint
$taskConstraint = ¤tValue(91) || do {
$taskConstraint = "As Soon As Possible";
};
if($taskConstraint eq "Must Start On"){
$taskConstraint = "StartOn";
}elsif($taskConstraint eq "Start No Earlier Than"){
$taskConstraint = "StartEarliestAfter";
}elsif($taskConstraint eq "Start No Later Than"){
$taskConstraint = "StartOn";
}elsif($taskConstraint eq "As Soon As Possible"){
$taskConstraint = "Earliest";
}elsif($taskConstraint eq "Must Finish On"){
$taskConstraint = "EndOn";
}elsif($taskConstraint eq "Finish No Earlier Than"){
$taskConstraint = "EndOn";
}elsif($taskConstraint eq "Finish No Later Than"){
$taskConstraint = "EndEarliestBefore";
}elsif($taskConstraint eq "As Late As Possible"){
$taskConstraint = "Latest";
}else{
$taskConstraint = "Earliest";
}
$taskConstraintDate = ¤tValue(68) || do {
$taskConstraintDate = "1/1/1970 0:00:00";
};
$taskExpenses = 0;
#figure priority
$taskPriority = ¤tValue(95) || do {
$taskPriority = "Medium";
};
if($taskPriority eq "Highest"){
$taskPriority = 10;
}elsif($taskPriority eq "High"){
$taskPriority = 20;
}elsif($taskPriority eq "Medium"){
$taskPriority = 30;
}elsif($taskPriority eq "Low"){
$taskPriority = 40;
}elsif($taskPriority eq "Lowest"){
$taskPriority = 50;
}else{
$taskPriority = 30;
}
$taskSubtitle = ¤tValue(4);
$taskNotes = ¤tValue(5);
&addTask($taskID, $taskName, $taskType, $currentOutlineNumber, $taskStartDate, $taskDuration, $taskConstraint, $taskConstraintDate, $taskExpenses, $taskPriority, $taskSubtitle, $taskNotes);
print "Reading Tasks...\n\n" if !$tasksNotified;
$tasksNotified = 1;
$taskPreds = ¤tValue(70);
if($taskPreds){
@predList = split(/\,/, $taskPreds);
foreach $pred (@predList){
$pred =~ s/^(\d+).*/$1/;
&addDependency($pred, $taskID);
}
};
next;
};
# Task Notes
/^71/ && do {
next;
};
# Resource Assignment
/^75/ && do {
($recordNum, $assignmentResID, $assignmentUnits, $assignmentWork) = &breakUpLine($_);
&addAssignment($currentTaskID, $assignmentResID, $assignmentWork, $assignmentUnits, 1.00);
next;
};
}
print "Writing...\n\n";
&outputToFile($tmFilename, $interfaceFilename);
print "Done.\n\n";
sleep 1;
`echo 'Done $ARGV[0] $tmFilename' >> /tmp/log`
}
sub breakUpLine { # oneLineFromInput -> array of fields
local(@tempArray) = split(/$fieldSeparator/, $_[0]);
local($element, $currentField);
@ret = ();
$inQuote = 0;
foreach $element (@tempArray){
$element =~ s/\n//;
if($inQuote){
$currentField .= ",".$element;
}else{
$currentField = $element;
}
$numQuotes = ($currentField =~ s/\"/\"/g);
if($numQuotes % 2 == 0){ # good field
if($inQuote && $currentField =~ /^\"(.*)\"$/){
$currentField = $1;
}
$currentField =~ s/\"\"/\\\"/g;
push(ret, $currentField);
$currentField = 0;
$inQuote = 0;
}else{
$inQuote = 1;
}
}
return @ret;
}
sub sumHours { #fromToArray of times
local(@fromTo) = @_;
local($ct, $total);
$total = 0;
for($ct = 0; $ct <= $#fromTo; $ct += 2){
$total += &hoursBetween($fromTo[$ct], $fromTo[$ct+1]);
}
return $total;
}
sub hoursBetween { # from to
local($from, $to) = @_;
return 0 unless $from && $to;
local(@fromSegs) = split(/:/,$from);
local(@toSegs) = split(/:/,$to);
# assumes HH:MM:SS
$from = ($from =~ /[\d:]+\s+pm/ && $fromSegs[0] < 12 ? $fromSegs[0]+12 : $fromSegs[0]);
$from += $fromSegs[1]/60;
$from += $fromSegs[2]/60;
$to = ($to =~ /[\d:]+\s+pm/ && $toSegs[0] < 12 ? $toSegs[0]+12 : $toSegs[0]);
$to += $toSegs[1]/60;
$to += $toSegs[2]/60;
return ($to-$from);
}
sub daysBetween { #startDate, endDate
local($sM,$sD,$sY) = split(/\//,$_[0]);
local($eM,$eD,$eY) = split(/\//,$_[1]);
local($fromTime) = &timelocal(0,0,0,$sD,$sM-1,$sY);
local($toTime) = &timelocal(0,0,0,$eD,$eM-1,$eY);
local(@returnList) = ();
while($fromTime <= $toTime){
($s, $m, $h, $sD, $sM, $sY) = localtime($fromTime);
$aDate = "$sM/$sD/$sY";
push(@returnList, $aDate);
$fromTime += 86400;
}
return @returnList;
}
#
# outline manipulation
#
sub nextSibling{
local($outlineNumber) = @_;
local(@temp);
if($outlineNumber){
@temp = split(/\./, $outlineNumber);
$temp[$#temp]++;
$ret = join('.',@temp);
$ret .= '.';
}else{
return ("");
}
}
sub firstChild{
local($outlineNumber) = @_;
if($outlineNumber){
$outlineNumber .= "1.";
}else{
return ("");
}
}
sub nextAunt{
local($outlineNumber) = @_;
local(@temp);
if($outlineNumber){
@temp = split(/\./, $outlineNumber);
pop(@temp);
$temp[$#temp]++;
$ret = join('.',@temp);
$ret .= '.';
}else{
return ("");
}
}
#
# line headings stuff
#
sub registerColumnHeadings{
local(@lineDefinition) = &breakUpLine($_[0]);
foreach $i (0..$#lineDefinition){
$column{$lineDefinition[$i]} = $i;
}
}
sub registerCurrentLine{
@currentLine = &breakUpLine($_[0]);
}
sub currentValue{
local($flag) = $_[0];
if($column{$flag}){
return $currentLine[$column{$flag}];
}else{
return "";
}
}