Palm-MaTirelire

 view release on metacpan or  search on metacpan

tools/M1toM2.pl  view on Meta::CPAN



    #
    # Organize
    if ($DBS[0]->isa('Palm::MaTirelire::AccountsV1'))
    {
	$ACCOUNTS_V1 = $DBS[0];

	if (@DBS > 1)
	{
	    if ($DBS[1]->isa('Palm::MaTirelire::SavedPreferences'))
	    {
		$PREFS = $DBS[1];
	    }
	    else
	    {
		die "Saved Preferences not found\n";
	    }
	}
    }
    elsif (@DBS > 1 and $DBS[1]->isa('Palm::MaTirelire::AccountsV1'))
    {
	$ACCOUNTS_V1 = $DBS[1];

	if ($DBS[0]->isa('Palm::MaTirelire::SavedPreferences'))
	{
	    $PREFS = $DBS[0];
	}
	else
	{
	    die "Saved Preferences not found\n";
	}
    }
    else
    {
	die "V1 accounts not found...\n";
    }
}


#
# Check and correct V1 Accounts contents before continuing
my($v1_deleted, $v1_corrected) = $ACCOUNTS_V1->validRecords;


#
# Prepare output PDBs
my $ACCOUNTS_V2 = Palm::MaTirelire::AccountsV2->new;

$ACCOUNTS_V2->{name} = 'MaTi=Accounts M1-2';

# One give us a preferences database
if (defined $PREFS)
{
    $DESC  = Palm::MaTirelire::Descriptions->new;
    $MODES = Palm::MaTirelire::Modes->new;
    $TYPES = Palm::MaTirelire::Types->new;

    #
    # Preferences...
    my($prefs_v1, $prefs_v2, $add_v2);
    foreach my $res (@{$PREFS->{resources}})
    {
	if ($res->{type} eq 'MaTi')
	{
	    $prefs_v1 = $res->{data};
	    last if defined $prefs_v2;
	}

	if ($res->{type} eq 'MaT2')
	{
	    $prefs_v2 = $res->{data};
	    last if defined $prefs_v1;
	}
    }

    die "V1 preferences not found\n" unless defined $prefs_v1;

    # No M2 preferences found
    unless (defined $prefs_v2)
    {
	$prefs_v2 = {};
	$add_v2 = 1;
    }

    $prefs_v2->{last_db} = $ACCOUNTS_V2->{name};
    $prefs_v2->{first_form} = 2; # Transactions list screen

    # Convert preferences
    foreach my $key (qw(replace_desc updown_action time_select3 left_handed
			timeout remove_type)) # access_code))
    {
	$prefs_v2->{$key} = $prefs_v1->{$key};
    }

    # M2 preferences don't exist, we have to add them...
    if ($add_v2)
    {
	my $new_res = $PREFS->new_Resource;

	$new_res->{type} = 'MaT2';
	$new_res->{data} = $prefs_v2;

	$PREFS->append_Resource($new_res);
    }

    # Descriptions
    foreach my $desc (@{$prefs_v1->{descriptions}})
    {
	my $rec = $DESC->new_Record;

	my($name, $macro, $sign, $amount, $mode, $type, $xfer)
	    = ($desc =~ /^(.*?)
			  (?:\ ?\((([-+]?)
			           (\d*\.?\d*)
			           (?:;([^;)]*)
			              (?:;([^;)]*)
				         (?:;([^;)]*))?
				         )?
			              )?
			          )\)\s*)?\z/sx);

	# A macro is present
	if (defined $macro and $macro ne '')
	{
	    # Amount sign
	    if ($sign eq '-')
	    { $rec->{sign} = 1 }
	    elsif ($sign eq '+')
	    { $rec->{sign} = 2 }

	    # Mode
	    if (defined $mode and $mode ne '')
	    {
		if ($mode =~ s/\*\z//)
		{
		    $rec->{cheque_num} = 1;
		}

		for (my $index = 0; $index < @{$prefs_v1->{modes}}; $index++)
		{
		    if ($prefs_v1->{modes}[$index] =~ /^$mode/i)
		    {
			$rec->{is_mode} = 1;
			$rec->{mode} = $index;
			last;
		    }
		}
	    }

	    # Type
	    if (defined $type and $type ne '')
	    {
		for (my $index = 0; $index < @{$prefs_v1->{types}}; $index++)
		{
		    if ($prefs_v1->{types}[$index] =~ /^$type/i)
		    {
			$rec->{is_type} = 1;
			$rec->{type} = $index;
			last;
		    }
		}
	    }

	    # Amount
	    if (defined $amount and $amount ne '')
	    {
		$rec->{amount} = $amount;
	    }

	    # Xfer account
	    if (defined $xfer and $xfer ne '')
	    {
		foreach my $ref_account(@{$ACCOUNTS_V1->{appinfo}{categories}})
		{
		    if ($ref_account->{name} =~ /^$xfer/i)
		    {
			$rec->{xfer} = $ref_account->{name};
			last;
		    }
		}
	    }
	}

	if ($name =~ s/\^(.)// or $name =~ s/\~(.)/$1/)
	{
	    $rec->{shortcut} = ord $1;
	}

	$rec->{name} = $name;

	$DESC->append_Record($rec);
	$num_desc++;
    }

    my $id;

    # Modes
    $id = 0;
    foreach my $mode (@{$prefs_v1->{modes}})
    {
	my $rec = $MODES->new_Record;

	my $name = $mode;

	$rec->{mode_id} = $id;

	if ($name =~ s/\s+\((?:\+(\d{1,2})|(\d{1,2})([-=])(\d{1,2}))\)\z//)
	{
	    # (+X)
	    if (defined $1)
	    {
		$rec->{value_date} = 3;

		$rec->{first_val} = $1;
	    }
	    # (XX-YY) ou (XX=YY)
	    else
	    {
		$rec->{value_date} = ($3 eq '-') ? 2 : 1;

		$rec->{first_val} = $2;
		$rec->{debit_date} = $4;
	    }
	}

	$rec->{cheque_auto} = 1 if $name =~ s/\s*\*\z//;

	$rec->{name} = $name;

	$MODES->append_Record($rec);
	$num_modes++;

	$id++;
    }

    # Types
    $id = 0;
    foreach my $type (@{$prefs_v1->{types}})
    {
	my $rec = $TYPES->new_Record;

	$rec->{type_id} = $id;
	$rec->{brother_id}= ($id == $#{$prefs_v1->{types}}) ? 0xff : ($id + 1);

	$rec->{name} = $type;

	$TYPES->append_Record($rec);
	$num_types++;

	$id++;
    }

    # Keep database preferences items
    foreach my $key (qw(cur_category
			remove_type check_locked repeat_startup
			repeat_days sum_date sum_todayplus))
    {
	$ACCOUNTS_V2->{appinfo}{$key} = $prefs_v1->{$key};
    }
}


#
# For each V1 account, create a V2 one with its properties
my $index = 0;
foreach my $ref_account (@{$ACCOUNTS_V1->{appinfo}{categories}})
{
    if (defined $ref_account->{name} and $ref_account->{name} ne '')
    {
	my $ref_v2 = $ACCOUNTS_V2->{appinfo}{categories}[$index];

	$ref_v2->{name} = $ref_account->{name};
	$ref_v2->{id} = $ref_account->{id};

	# Create account properties...
	my $account_prop = $ACCOUNTS_V2->new_AccountProperties;

	$account_prop->{category} = $index;

	$ACCOUNTS_V2->append_Record($account_prop);
	$num_accounts++;
    }

    $index++;
}


#
# For each V1 transaction, create a V2 one
{
    my %xfer_ids;
    foreach my $v1_rec (@{$ACCOUNTS_V1->{records}})
    {
	my $v2_rec = $ACCOUNTS_V2->new_Record;

	# Compute uniqueID now...
	$ACCOUNTS_V2->_setUniqueID($v2_rec);

	foreach my $key (qw(category
			    date_day date_month date_year
			    time_hour time_min
			    amount
			    checked marked alarm
			    check_num
			    ))
	{
	    $v2_rec->{$key} = $v1_rec->{$key};
	}

	# Description/note
	$v2_rec->{note} = $v1_rec->{description};

	# Mode...
	if ($v1_rec->{mode} == Palm::MaTirelire::AccountsV1::UNKNOWN_MODE)
	{
	    $v2_rec->{mode} = Palm::MaTirelire::AccountsV2::UNKNOWN_MODE;
	}
	else



( run in 1.400 second using v1.01-cache-2.11-cpan-5fbc6bb55f2 )