#!/core/perl/bin/perl -wT
#########
# Author: rmp@psyphi.net
# Maintainer: rmp@psyphi.net
# Created: 2004-01-10
# Last Modified: 2004-01-11
#
# Photographic Studio customer & order tracking system
#
use strict;
use lib qw(/core/tracker/modules);
use CGI qw(:cgi);
use DBI;
use tracker::util;
use tracker::product;
use tracker::customer;
use tracker::web;
use tracker::sessiontype;
use tracker::grouptype;

$|=1;
&main();
1;

sub main {
  my $util   = tracker::util->new();
  my $tw     = tracker::web->new({
				  "util"       => $util,
				  "title"      => "Customer Tracker",
				  "stylesheet" => "/css/whiteonblack.css",
#				  "stylesheet" => "/css/blackonwhite.css",
				 });
  my $cgi    = CGI->new();
  my @opts   = ();
  my $def    = {
		'util'    => $util,
		'opts'    => \@opts,
		'tw'      => $tw,
		'cgi'     => $cgi,
		'content' => "",
	       };

  #########
  # fixup action priorities
  #
  my @actions = $cgi->param('action');
  if(scalar @actions > 1) {
    #########
    # Oops. Tidy up..
    #
    if(grep { /search/ } @actions) {
      $cgi->delete('action');
      $cgi->param('action', "search");
    }
  }

  my $action      = $cgi->param('action')      || "home";
  my $stage       = $cgi->param('stage')       || "";
  my $q           = $cgi->param('q')           || "";
  my $customer_id = $cgi->param('customer_id') || "";

#  if($action eq "home") {
#    push @opts, qq([<span class="selected">Home</span>]);
#  } else {
#    push @opts, qq([<a href="$ENV{'SCRIPT_NAME'}?action=home">Home</a>]);
#  }

  if($action eq "customer" && $stage eq "new") {
    push @opts, qq([<span class="selected">New Customer</span>]);
  } else {
    push @opts, qq([<a href="$ENV{'SCRIPT_NAME'}?action=customer;stage=new">New Customer</a>]);
  }

#  if($action eq "sessions") {
#    push @opts, qq([<span class="selected">Sessions</span>]);
#  } else {
#    push @opts, qq([<a href="$ENV{'SCRIPT_NAME'}?action=sessions;customer_id=$customer_id">Sessions</a>]);
#  }

  if($action eq "products") {
    push @opts, qq([<span class="selected">Product Types</span>]);
  } else {
    push @opts, qq([<a href="$ENV{'SCRIPT_NAME'}?action=products">Product Types</a>]);
  }

  if($action eq "sesstypes") {
    push @opts, qq([<span class="selected">Session Types</span>]);
  } else {
    push @opts, qq([<a href="$ENV{'SCRIPT_NAME'}?action=sesstypes">Session Types</a>]);
  }

  if($action eq "grptypes") {
    push @opts, qq([<span class="selected">Group Types</span>]);
  } else {
    push @opts, qq([<a href="$ENV{'SCRIPT_NAME'}?action=grptypes">Group Types</a>]);
  }

  if($action eq "customer") {
    &customer($def);

  } elsif($action eq "sessions") {
    &sessions($def);

  } elsif($action eq "sales") {
    &sales($def);

  } elsif($action eq "products") {
    &products($def);

  } elsif($action eq "sesstypes") {
    &session_types($def);

  } elsif($action eq "grptypes") {
    &group_types($def);

  } elsif($action eq "search") {
    &search($def);

  } elsif($action eq "home") {
    &home($def);
  }

  print $tw->header();
  print qq(<form method="GET" action="$ENV{'SCRIPT_NAME'}">);
  print qq(<table border="0">
  <tr>
    <td width="80%">@opts</td>
    <td nowrap>
      <input name="q" type="text" value="$q" length="20" maxlength="40" />
      <input type="submit" name="action" value="search" />
    </td>
  </tr>
</table>);

  print qq(<br clear="all" />), $def->{'content'};
  print qq(</form>), $tw->footer();
}

sub home {
  my ($def) = @_;
  $def->{'tw'}->title("Home");
  $def->{'content'} = qq(<center><img src="/gfx/logo.png" alt="Tracker (c) 2004 PsyPhi Network Web Solutions" title="Tracker (c) 2004 PsyPhi Network Web Solutions" /></center>);

}

sub customer {
  my ($def) = @_;
  my $stage = $def->{'cgi'}->param('stage') || "";
  my $id    = $def->{'cgi'}->param('id')    || "";

  if($stage eq "new") {
    $def->{'tw'}->title("New Customer");
    &customer_form($def);

  } elsif($stage eq "edit") {
    $def->{'tw'}->title("Edit Customer");
    &customer_form($def);

  } elsif($stage eq "save") {
    my $customer = tracker::customer->new({
					   'id'   => $id,
					   'util' => $def->{'util'},
					  });
    $customer->load(); # ensure it's loaded before we overwrite data

    for my $f ($customer->fields()) {
      $customer->$f($def->{'cgi'}->param($f)||"");
    }

    $customer->save();
    $def->{'cgi'}->param('id', $customer->id());
    $def->{'tw'}->title("Edit Customer");
    &customer_report($def, $customer);

  } elsif($id) {
    my $customer  = tracker::customer->new({
					    'util' => $def->{'util'},
					    'id'   => $id},
					  );
    $def->{'tw'}->title("Report for customer ".uc($customer->surname()));
    &customer_report($def, $customer);
  }
}

sub customer_form {
  my ($def)     = @_;
  my $id        = $def->{'cgi'}->param('id') || "";
  my $fields    = {};
  my $customer  = tracker::customer->new({
					  'util' => $def->{'util'},
					  'id'   => $id},
					);

  my $printableid = sprintf("customer #%08s", $id);
  $printableid    = "new customer" unless($id);

  for my $f ($customer->fields()) {
    $fields->{$f} = $customer->$f() || $def->{'cgi'}->param($f) || "";
  }

  my $spacer = qq(  <tr valign="top">
    <td colspan="4"><img src="/gfx/blank.gif" height="10" alt="" /></td>
  </tr>\n);

  $def->{'content'} .= qq(
<input type="hidden" name="action" value="customer" />
<input type="hidden" name="id"     value="$id" />
<table width="75%" border="0" align="center">
  <tr valign="top">
    <th colspan="4" class="header">Properties for $printableid</td>
  </tr>
$spacer
  <tr valign="top">
    <th align="left">Name</th>
    <td align="left" colspan="3">
      <select name="title">
@{[map {
  my $title = $fields->{'title'} || "mr";
  my $sel   = "";
  $sel      = "selected" if($title eq $_);
  qq(<option value="$_" $sel>@{[ucfirst($_)]}</option>\n);
  } qw(mr mrs ms miss)]}
      </select>
      <input type="text" name="surname" value="$fields->{'surname'}" />
    </td>
  </tr>
  <tr valign="top">
    <th align="left">Address</th>
    <td colspan="3">
      <textarea name="address" cols="40" rows="3" wrap="virtual">$fields->{'address'}</textarea>
    </td>
  </tr>
  <tr valign="top">
    <th align="left">Postcode</th>
    <td colspan="3">
      <input type="text" name="postcode" value="$fields->{'postcode'}" />
    </td>
  </tr>
  <tr valign="top">
    <th align="left">Telephone</th>
    <td colspan="3">
      <input type="text" name="phone" value="$fields->{'phone'}" />
    </td>
  </tr>
$spacer
  <tr valign="top">
    <th align="left">Mother</th>
    <td>
      <input type="text" name="mother" value="$fields->{'mother'}" />
    </td>
    <th align="left">Father</th>
    <td>
      <input type="text" name="father" value="$fields->{'father'}" />
    </td>
  </tr>
  <tr valign="top">
    <th align="left" colspan="2">Children's Names</th>
    <th align="left" colspan="2">Children's Ages</th>
  </tr>
  <tr valign="top">
    <td colspan="2" align="center">
      <textarea name="children" cols="20" rows="3" wrap="virtual">$fields->{'children'}</textarea>
    </td>
    <td colspan="2" align="center">
      <textarea name="ages" cols="20" rows="3" wrap="virtual">$fields->{'ages'}</textarea>
    </td>
  </tr>
$spacer
  <tr valign="top">
    <th colspan="4" align="left">Notes</th>
  </tr>
  <tr valign="top">
    <td colspan="4">
      <textarea name="notes" cols="60" rows="5" wrap="virtual">$fields->{'notes'}</textarea>
    </td>
  </tr>
  <tr valign="top">
    <td colspan="4" align="center">
      <input type="reset" value="reset" />
      <input type="submit" name="stage" value="save" />
    </td>
  </tr>
</table>\n);
}

sub customer_report {
  my ($def, $customer) = @_;
  my $id        = $def->{'cgi'}->param('id') || "";
  my $fields    = {};
  unless($customer) {
    $customer  = tracker::customer->new({
					 'util' => $def->{'util'},
					 'id'   => $id},
				       );
  }

  my $printableid = sprintf("customer #%08s", $id);

  for my $f ($customer->fields()) {
    $fields->{$f} = $customer->$f() || "";
  }

  $fields->{'lastaccess'} = $def->{'util'}->nicedate($fields->{'lastaccess'});
  $fields->{'children'}   =~ s/[\r\n]+/<br \/>/g;
  $fields->{'ages'}       =~ s/[\r\n]+/<br \/>/g;
  $fields->{'address'}    =~ s/[\r\n]+/<br \/>/g;
  $fields->{'title'}      = ucfirst($fields->{'title'});
  $fields->{'surname'}    = ucfirst($fields->{'surname'});
  $fields->{'mother'}     = ucfirst($fields->{'mother'});
  $fields->{'father'}     = ucfirst($fields->{'father'});
  $fields->{'notes'}    ||= "N/A";
  $fields->{'ages'}     ||= "&nbsp;";
  $fields->{'children'} ||= "&nbsp;";

  my $spacer = qq(  <tr valign="top">
    <td width="25%"><img src="/gfx/blank.gif" height="10" alt="" /></td>
    <td width="25%"><img src="/gfx/blank.gif" height="10" alt="" /></td>
    <td width="25%"><img src="/gfx/blank.gif" height="10" alt="" /></td>
    <td width="25%"><img src="/gfx/blank.gif" height="10" alt="" /></td>
  </tr>\n);

  $def->{'content'} .= qq(
<input type="hidden" name="action" value="customer" />
<input type="hidden" name="id"     value="$id" />
<table width="75%" border="0" align="center">
  <tr valign="top">
    <th colspan="4" class="header">Properties for $printableid</td>
  </tr>
$spacer
  <tr valign="top">
    <th align="left">Name</th>
    <td align="left" colspan="3">
      $fields->{'title'} $fields->{'surname'}
    </td>
  </tr>
  <tr valign="top">
    <th align="left">Address</th>
    <td colspan="3">
      $fields->{'address'}
    </td>
  </tr>
  <tr valign="top">
    <th align="left">Postcode</th>
    <td colspan="3">
      $fields->{'postcode'}
    </td>
  </tr>
  <tr valign="top">
    <th align="left">Telephone</th>
    <td colspan="3">
      $fields->{'phone'}
    </td>
  </tr>
$spacer
  <tr valign="top">
    <th align="left">Mother</th>
    <td>
      $fields->{'mother'}
    </td>
    <th align="left">Father</th>
    <td>
      $fields->{'father'}
    </td>
  </tr>
  <tr valign="top">
    <th align="left" colspan="2">Children's Names</th>
    <th align="left" colspan="2">Children's Ages</th>
  </tr>
  <tr valign="top">
    <td colspan="2" align="left">
      $fields->{'children'}
    </td>
    <td colspan="2" align="left">
      $fields->{'ages'}
    </td>
  </tr>
$spacer
  <tr valign="top">
    <th colspan="4" align="left">Notes</th>
  </tr>
  <tr valign="top">
    <td colspan="4">
      $fields->{'notes'}
    </td>
  </tr>
  <tr valign="top">
    <th align="left">Last Updated</th>
    <td colspan="3">$fields->{'lastaccess'}</td>
  </tr>
  <tr valign="top">
    <td colspan="4" align="center">
      <input type="submit" name="stage" value="edit" />
    </td>
  </tr>
</table>\n);

  #########
  # so that sessions() isn't confused
  #
  $def->{'cgi'}->delete('stage');
  $def->{'cgi'}->param('customer_id', $id);
  &sessions($def);
}

sub search {
  my ($def) = @_;
  my $q     = $def->{'cgi'}->param('q') || "";

  #########
  # perform search
  #
  if($q) {
    my $sq = $q;
    $sq    =~ s/\*/\%/g;
    my @customer_ids = $def->{'util'}->search($sq);
    my $size = scalar @customer_ids;
    my $s    = ($size == 1)?"":"es";
    $def->{'tw'}->title("Search Results ($size match$s)");

    if($size == 1) {
      $def->{'cgi'}->param('id', $customer_ids[0]);
      return &customer($def);
    }

    $def->{'content'} .= qq(
<table border="0" align="center" width="75%">
  <tr valign="top" class="header">
    <th colspan="3">Search for '$q' found $size match$s</th></tr>);

    if($size > 0) {
      $def->{'content'} .= qq(
  <tr valign="top" class="header">
    <th align="left">&nbsp;Name</th>
    <th align="left">&nbsp;Last Update</th>
    <th align="left">&nbsp;Info</th>
  </tr>\n);
    }
    
    my $lit = 1;
    for my $id (@customer_ids) {
      my $customer = tracker::customer->new({
					     'util' => $def->{'util'},
					     'id'   => $id,
					    });
      my $title   = ucfirst($customer->title());
      my $surname = ucfirst($customer->surname());
      my $lastacc = $customer->lastaccess();

      $def->{'content'} .= qq(  <tr class="lit$lit">
    <td>&nbsp;<a href="$ENV{'SCRIPT_NAME'}?action=customer;id=$id">$title $surname</a></td>
    <td>&nbsp;<a href="$ENV{'SCRIPT_NAME'}?action=customer;id=$id">$lastacc</a></td>
    <td align="center"><a href="$ENV{'SCRIPT_NAME'}?action=customer;id=$id"><img src="/gfx/rightarrow.gif" alt="=&gt;" title="=&gt;" border="0"/></a></td>
  </tr>\n);
      $lit = 1+!($lit-1);
    }

    my $eq = $def->{'cgi'}->escape($q);
    $def->{'content'} .= qq(</table><br /><br />
Use <b>$q</b> and create a:<br />
[<a href="$ENV{'SCRIPT_NAME'}?action=customer;stage=new;surname=$eq">Customer</a>]
[<a href="$ENV{'SCRIPT_NAME'}?action=products;desc=$eq">Product Type</a>]
[<a href="$ENV{'SCRIPT_NAME'}?action=sesstypes;desc=$eq">Session Type</a>]
[<a href="$ENV{'SCRIPT_NAME'}?action=grptypes;desc=$eq">Group Type</a>]
?);
  }
}

sub products {
  my ($def) = @_;
  my $desc  = $def->{'cgi'}->param('desc') || "";
  my $stage = $def->{'cgi'}->param('stage');
  $def->{'tw'}->title("Product Types");

  if($stage eq "add") {
    my $desc = $def->{'cgi'}->param('description');
    if($desc) {
      my $product = tracker::product->new({
					   'util'        => $def->{'util'},
					   'description' => $desc,
					  });
      $product->save();
    }
  }

  $def->{'content'} .= qq(
<input type="hidden" name="action" value="products" />
<table border="0" align="center">
  <tr class="header">
    <th colspan="2">Description</th>
  </tr>\n);

  my $lit = 1;
  for my $product (tracker::product->all_products({
						   'util' => $def->{'util'},
						  })) {
    $def->{'content'} .= qq(<tr class="lit$lit">
    <td colspan="2">@{[$product->description()]}</td>
  </tr>\n);
    $lit = 1+!($lit-1);
  }

  $def->{'content'} .= qq(
  <tr>
    <td><input type="text" name="description" value="$desc" /></td>
    <td><input type="submit" name="stage" value="add" /></td>
  </tr>
</table>\n);
}

sub session_types {
  my ($def) = @_;
  my $desc  = $def->{'cgi'}->param('desc') || "";
  my $stage = $def->{'cgi'}->param('stage');
  $def->{'tw'}->title("Session Types");

  if($stage eq "add") {
    my $desc = $def->{'cgi'}->param('description');
    my $code = $def->{'cgi'}->param('code');
    if($desc && $code) {
      my $sessiontype = tracker::sessiontype->new({
						   'util'        => $def->{'util'},
						   'code'        => $code,
						   'description' => $desc,
						  });
      $sessiontype->save();
    }
  }

  $def->{'content'} .= qq(
<input type="hidden" name="action" value="sesstypes" />
<table border="0" align="center">
  <tr class="header">
    <th>Code</th>
    <th colspan="2">Description</th>
  </tr>\n);

  my $lit = 1;
  for my $sesstype (tracker::sessiontype->all_types({
						    'util' => $def->{'util'},
						    })) {
    $def->{'content'} .= qq(<tr class="lit$lit">
    <td>@{[$sesstype->code()]}</td>
    <td colspan="2">@{[$sesstype->description()]}</td>
  </tr>\n);
    $lit = 1+!($lit-1);
  }
  $def->{'content'} .= qq(
  <tr>
    <td><input type="text" name="code" size="4" maxlength="4"/></td>
    <td><input type="text" name="description" size="20" value="$desc" /></td>
    <td><input type="submit" name="stage" value="add" /></td>
  </tr>
</table>\n);
}

sub group_types {
  my ($def) = @_;
  my $desc  = $def->{'cgi'}->param('desc') || "";
  my $stage = $def->{'cgi'}->param('stage');
  $def->{'tw'}->title("Group Types");

  if($stage eq "add") {
    my $desc = $def->{'cgi'}->param('description');
    my $code = $def->{'cgi'}->param('code');
    if($desc && $code) {
      my $grouptype = tracker::grouptype->new({
						 'util'        => $def->{'util'},
						 'code'        => $code,
						 'description' => $desc,
						});
      $grouptype->save();
    }
  }

  $def->{'content'} .= qq(
<input type="hidden" name="action" value="grptypes" />
<table border="0" align="center">
  <tr class="header">
    <th>Code</th>
    <th colspan="2">Description</th>
  </tr>\n);

  my $lit = 1;
  for my $grptype (tracker::grouptype->all_types({
						 'util' => $def->{'util'},
						 })) {
    $def->{'content'} .= qq(<tr class="lit$lit">
    <td>@{[$grptype->code()]}</td>
    <td colspan="2">@{[$grptype->description()]}</td>
  </tr>\n);
    $lit = 1+!($lit-1);
  }
  $def->{'content'} .= qq(
  <tr>
    <td><input type="text" name="code" size="4" maxlength="4"/></td>
    <td><input type="text" name="description" size="30" value="$desc" /></td>
    <td><input type="submit" name="stage" value="add" /></td>
  </tr>
</table>\n);
}

sub sessions {
  my ($def, $customer) = @_;
  my $customer_id      = $def->{'cgi'}->param('customer_id');
  my $stage            = $def->{'cgi'}->param('stage')      || "";
  my $action           = $def->{'cgi'}->param('action')     || "";
  my $session_id       = $def->{'cgi'}->param('session_id') || "";

  $def->{'tw'}->title("Sessions") if($action eq "sessions");

  if(!$customer_id) {
    $def->{'content'} .= qq(Error: no customer id specified);
    return;
  }

  $customer ||= tracker::customer->new({
					'util' => $def->{'util'},
					'id'   => $customer_id,
				       });

  $def->{'tw'}->title("Sessions for customer ".uc($customer->surname())) if($action eq "sessions");

  if($stage eq "add" || $stage eq "update") {
    my $fields = {};
    for my $f (tracker::session->fields()) {
      $fields->{$f} = $def->{'cgi'}->param($f);
    }
    $fields->{"id"} = $session_id;

    if($fields->{'number'} && $fields->{'date'}) {
      $fields->{'util'} = $def->{'util'};
      my $session       = tracker::session->new($fields);
      $session->save();
      $customer->reset_sessions();
    }
  } elsif($stage eq "customer properties") {
    $def->{'cgi'}->delete('stage');
    $def->{'cgi'}->delete('session_id');
    $def->{'cgi'}->param('id', $customer_id);
    $def->{'cgi'}->param('action', "customer");
    return &customer($def);

  } elsif($stage eq "delete") {
    tracker::session->new({
			   'util' => $def->{'util'},
			   'id'   => $session_id,
			  })->delete();
    $def->{'cgi'}->delete('session_id');
  }

  $def->{'content'} .= qq(
</form>
<form method="GET" action="$ENV{'SCRIPT_NAME'}">
<input type="hidden" name="customer_id" value="$customer_id" />
<input type="hidden" name="action" value="sessions" />
<table border="0" width="95%" align="center">
  <tr class="header" valign="top">
    <th nowrap>&nbsp;Session #&nbsp;</th>
    <th nowrap>&nbsp;Session Type&nbsp;</th>
    <th nowrap>&nbsp;Group Type&nbsp;</th>
    <th>&nbsp;Date&nbsp;</th>
    <th>&nbsp;Photographer&nbsp;</th>
    <th>&nbsp;</th>
  </tr>\n);

  my $lit = 1;
  for my $session ($customer->sessions()) {
    $def->{'content'} .= qq(  <tr valign="top" class="lit$lit">
    <td nowrap>&nbsp;@{[$session->number()||""]}&nbsp;</td>
    <td nowrap>&nbsp;@{[$session->session_type()||""]}</td>
    <td nowrap>&nbsp;@{[$session->group_type()||""]}</td>
    <td nowrap>&nbsp;@{[$def->{'util'}->nicedate($session->date()||"")]}</td>
    <td nowrap>&nbsp;@{[ucfirst($session->photographer())||"N/A"]}</td>
    <td nowrap>
      [<a href="$ENV{'SCRIPT_NAME'}?action=sessions;stage=edit;customer_id=$customer_id;session_id=@{[$session->id()]}">edit</a>]
      [<a href="$ENV{'SCRIPT_NAME'}?action=sales;customer_id=$customer_id;session_id=@{[$session->id()]}">sales</a>]
      [<a href="$ENV{'SCRIPT_NAME'}?action=sessions;customer_id=$customer_id;session_id=@{[$session->id()]};stage=delete">delete</a>]</td>
  </tr>\n);
    $lit = 1+!($lit-1);
  }

  &session_form($def);

  if($action eq "sessions") {
    $def->{'content'} .= qq(  <tr>
    <td colspan="6" align="center">
      <input type="submit" name="stage" value="refresh" />
      <input type="submit" name="stage" value="customer properties" />
    </td>
  </tr>\n);
  }
  $def->{'content'} .= qq(</table>\n);
}

sub session_form {
  my ($def)      = @_;
  my @dparts     = localtime();
  my $date       = sprintf("%04d/%02d/%02d", $dparts[5]+1900, $dparts[4]+1, $dparts[3]);
  my $session_id = $def->{'cgi'}->param('session_id');
  my $fields     = {};
  my $session    = {};
  my $stage      = "add";

  if($session_id) {
    $session = tracker::session->new({
				      'util' => $def->{'util'},
				      'id'   => $session_id,
				     });
    $session->load();
    $def->{'content'} .= qq(<input type="hidden" name="session_id" value="$session_id" />\n);
    $stage = "update";
  }

  for my $f (tracker::session->fields()) {
    $fields->{$f} = $session->{$f} || "";
  }
  $fields->{'date'} ||= $date;

  $def->{'content'} .= qq(  <tr valign="top">
    <td colspan="6"><img src="/gfx/blank.gif" height="10" alt="" /></td>
  </tr>
  <tr valign="top">
    <td><input type="text" size="8" name="number" value="$fields->{'number'}" /></td>
    <td>
      <select name="sessiontype_id">
@{[map {
  my $id   = $_->id();
  my $desc = $_->code() . " " . $_->description();
  my $sel  = "";
  $sel     = "selected" if("$id" eq "$fields->{'sessiontype_id'}");
  qq(<option value="$id" $sel>$desc</option>)
} tracker::sessiontype->all_types({
                                   'util' => $def->{'util'},
                                  })]}
      </select>
    </td>
    <td>
      <select name="grouptype_id">
@{[map {
  my $id   = $_->id();
  my $desc = $_->code() . " " . $_->description();
  my $sel  = "";
  $sel     = "selected" if("$id" eq "$fields->{'grouptype_id'}");
  qq(<option value="$id" $sel>$desc</option>)
} tracker::grouptype->all_types({
                                 'util' => $def->{'util'},
                                })]}
      </select>
    </td>
    <td><input type="text"   name="date" size="10" maxlength="10" value="$fields->{'date'}" /></td>
    <td><input type="text"   name="photographer" size="10" maxlength="64" value="$fields->{'photographer'}" /></td>
    <td><input type="submit" name="stage" value="$stage" /></td>
  </tr>
  <tr valign="top">
    <td colspan="6"><img src="/gfx/blank.gif" height="10" alt="" /></td>
  </tr>\n);
}

sub sales {
  my ($def)       = @_;
  my $customer_id = $def->{'cgi'}->param('customer_id');
  my $session_id  = $def->{'cgi'}->param('session_id');
  my $stage       = $def->{'cgi'}->param('stage');
  my $sale_id     = $def->{'cgi'}->param('sale_id');

  if($stage eq "save") {
    my $ref = {};
    for my $f (tracker::sale->fields()) {
      $ref->{$f} = $def->{'cgi'}->param($f);
    }
    $ref->{'util'} = $def->{'util'};

    for my $p (tracker::product->all_products({
					       'util' => $def->{'util'},
					      })) {
      $ref->{'products'}->{$p->id()} = $def->{'cgi'}->param("quantity_".$p->id());
    }

    $ref->{'id'} = $sale_id if($sale_id);
    my $sale     = tracker::sale->new($ref);
    $sale->save();

  } elsif($stage eq "delete") {
    tracker::sale->new({
			'util' => $def->{'util'},
			'id'   => $sale_id,
			})->delete();
  }

  my $customer   = tracker::customer->new({
					   'util' => $def->{'util'},
					   'id'   => $customer_id,
					  });
  my $session    = tracker::session->new({
					  'util' => $def->{'util'},
					  'id'   => $session_id,
					 });
  $def->{'tw'}->title(qq(Orders for customer @{[uc($customer->surname())]} / @{[$session->number()]}));

  my @sales = $session->sales();

  if(@sales) {
    $def->{'content'} .= qq(<table border="0" width="90%" align="center">
  <tr valign="top" class="header">
    <th>Date Placed</th>
    <th>Date Collected</th>
    <th>Salesperson</th>
    <th>Notes</th>
    <th>Sale &pound;</th>
  </tr>);

    my $lit = 1;

    for my $sale (@sales) {
      $def->{'content'} .= qq(
  <tr valign="top" class="lit$lit">
    <td>@{[$def->{'util'}->nicedate($sale->date_placed())]}</td>
    <td>@{[$def->{'util'}->nicedate($sale->date_collected())]}</td>
    <td>@{[$sale->salesperson()||""]}</td>
    <td>@{[$sale->notes()||""]}</td>
    <td>@{[$sale->sale()||"0.00"]}</td>
    <td>
      [<a href="$ENV{'SCRIPT_NAME'}?action=sales;customer_id=$customer_id;session_id=$session_id;sale_id=@{[$sale->id()]}">edit</a>]
      [<a href="$ENV{'SCRIPT_NAME'}?action=sales;customer_id=$customer_id;session_id=$session_id;sale_id=@{[$sale->id()]};stage=delete">delete</a>]
    </td>
  </tr>\n);
    }
    $def->{'content'} .= qq(</table>\n);
  } else {
    $def->{'content'} .= qq(No orders have been placed yet for this session.<br /><br />);
  }
  &sale_form($def);
}

sub sale_form {
  my ($def)       = @_;
  my $customer_id = $def->{'cgi'}->param('customer_id');
  my $session_id  = $def->{'cgi'}->param('session_id');
  my $sale_id     = $def->{'cgi'}->param('sale_id') ||"";
  my $sale        = {};
  my $fields      = {};
  my @dparts      = localtime();
  my $date        = sprintf("%04d/%02d/%02d", $dparts[5]+1900, $dparts[4]+1, $dparts[3]);

  if($sale_id) {
    $sale = tracker::sale->new({
				'util' => $def->{'util'},
				'id'   => $sale_id,
			       });
    $sale->load();

    for my $p ($sale->products()) {
      my $pid = $p->id();
      $fields->{"quantity_$pid"} = $def->{'cgi'}->param("quantity_$pid") || $p->quantity();
    }
  }
  for my $f (tracker::sale->fields()) {
    $fields->{$f} = $def->{'cgi'}->param($f) || $sale->{$f} || "";
  }
  $fields->{'sale'}           ||= "0.00";
  $fields->{'date_collected'} ||= $date if($fields->{'date_placed'});
  $fields->{'date_placed'}    ||= $date;
  my @products    = tracker::product->all_products({
						    'util' => $def->{'util'},
						   });

  my $heading = "Place a new";
  $heading    = "Update an existing" if($sale_id);

  $def->{'content'} .= qq(
<input type="hidden" name="action"      value="sales" />
<input type="hidden" name="customer_id" value="$customer_id" />
<input type="hidden" name="session_id"  value="$session_id" />
<input type="hidden" name="sale_id"     value="$sale_id" />
<table border="0" align="center" width="50%">
  <tr class="header"><th colspan="2">$heading order</th></tr>
  <tr valign="top">
    <th align="left" nowrap>Date Placed</th>
    <td><input type="text" name="date_placed"    size="10" maxlength="10" value="$fields->{'date_placed'}" /></td>
  </tr>
  <tr valign="top">
    <th align="left" nowrap>Date Collected</th>
    <td><input type="text" name="date_collected" size="10" maxlength="10" value="$fields->{'date_collected'}" /></td>
  </tr>
  <tr valign="top">
    <th align="left">Salesperson</th>
    <td><input type="text" name="salesperson"    size="20" maxlength="64" value="$fields->{'salesperson'}" /></td>
  </tr>
  <tr valign="top">
    <th align="left">Notes</th>
    <td><textarea name="notes" cols="40" rows="4" wrap="virtual">$fields->{'notes'}</textarea></td>
  </tr>
  <tr valign="top"><td colspan="2"><img src="/gfx/blank.gif" height="10" alt="" /></td></tr>
</table>
<table border="0" align="center" width="50%">
  <tr class="header"><th align="left">Product</th><th align="left">Qtty</th></tr>\n);

  for my $product (@products) {
    $def->{'content'} .= qq(  <tr valign="top">
    <td>@{[$product->description()]}</td>
    <td><input type="text" size="5" name="quantity_@{[$product->id()]}" value="@{[$fields->{"quantity_".$product->id()}]}" /></td>
  </tr>\n);
  }

$def->{'content'} .= qq(
  <tr valign="top"><th align="right">Sale &pound;</th>   <td><input type="text" name="sale" size="10" maxlength="10" value="$fields->{'sale'}" /></td></tr>
  <tr valign="top"><td colspan="2" align="center"><input type="submit" name="stage" value="save" /></td></tr>
</table>\n);
}

1;
