#===================================================================== # LedgerSMB Small Medium Business Accounting # http://www.ledgersmb.org/ # # Copyright (C) 2006 # This work contains copyrighted information from a number of sources all used # with permission. # # This file contains source code included with or based on SQL-Ledger which # is Copyright Dieter Simader and DWS Systems Inc. 2000-2005 and licensed # under the GNU General Public License version 2 or, at your option, any later # version. For a full list including contact information of contributors, # maintainers, and copyright holders, see the CONTRIBUTORS file. # # Original Copyright Notice from SQL-Ledger 2.6.17 (before the fork): # Copyright (c) 2001 # # Author: DWS Systems Inc. # Web: http://www.sql-ledger.org # # Contributors: Reed White # # # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #====================================================================== # # customer/vendor module # #====================================================================== use LedgerSMB::CT; use LedgerSMB::Template; 1; # end of main sub add { $form->{title} = "Add"; # $locale->text('Add Customer') # $locale->text('Add Vendor') $form->{callback} = "$form->{script}?action=add&db=$form->{db}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}" unless $form->{callback}; CT->create_links( \%myconfig, \%$form ); &form_header; &form_footer; } sub history { # $locale->text('Customer History') # $locale->text('Vendor History') my %hiddens; my @buttons; $history = 1; $label = ucfirst $form->{db}; $label .= " History"; if ( $form->{db} eq 'customer' ) { $form->{invlabel} = $locale->text('Sales Invoices'); $form->{ordlabel} = $locale->text('Sales Orders'); $form->{quolabel} = $locale->text('Quotations'); } else { $form->{invlabel} = $locale->text('Vendor Invoices'); $form->{ordlabel} = $locale->text('Purchase Orders'); $form->{quolabel} = $locale->text('Request for Quotations'); } $form->{title} = $locale->text($label); $form->{nextsub} = "list_history"; &search_name(\%hiddens, \@buttons); ##SC: Temporary removal ## if ( $form->{lynx} ) { ## require "bin/menu.pl"; ## &menubar; ## } my $template = LedgerSMB::Template->new_UI( user => \%myconfig, locale => $locale, template => 'ct-search', ); $template->render({ form => $form, user => \%myconfig, hiddens => \%hiddens, buttons => \@buttons, }); } sub transactions { if ( $form->{db} eq 'customer' ) { $form->{translabel} = $locale->text('AR Transactions'); $form->{invlabel} = $locale->text('Sales Invoices'); $form->{ordlabel} = $locale->text('Sales Orders'); $form->{quolabel} = $locale->text('Quotations'); } else { $form->{translabel} = $locale->text('AP Transactions'); $form->{invlabel} = $locale->text('Vendor Invoices'); $form->{ordlabel} = $locale->text('Purchase Orders'); $form->{quolabel} = $locale->text('Request for Quotations'); } } sub include_in_report { $label = ucfirst $form->{db}; my @fields = (); push @fields, { name => 'l_ndx', label => $locale->text('No.'), }; push @fields, { name => 'l_id', label => $locale->text('ID'), }; push @fields, { name => "l_$form->{db}number", label => $locale->text($label . ' Number'), }; push @fields, { name => 'l_name', label => $locale->text('Company Name'), $form->{l_name} => $form->{l_name}, }; push @fields, { name => 'l_contact', label => $locale->text('Contact'), $form->{l_contact} => $form->{l_contact}, }; push @fields, { name => 'l_email', label => $locale->text('E-mail'), $form->{l_email} => $form->{l_email}, }; push @fields, { name => 'l_address', label => $locale->text('Address'), }; push @fields, { name => 'l_city', label => $locale->text('City'), }; push @fields, { name => 'l_state', label => $locale->text('State/Province'), }; push @fields, { name => 'l_zipcode', label => $locale->text('Zip/Postal Code'), }; push @fields, { name => 'l_country', label => $locale->text('Country'), }; push @fields, { name => 'l_phone', label => $locale->text('Phone'), $form->{l_phone} => $form->{l_phone}, }; push @fields, { name => 'l_fax', label => $locale->text('Fax'), }; push @fields, { name => 'l_cc', label => $locale->text('Cc'), }; if ( $myconfig{role} =~ /(admin|manager)/ ) { push @fields, { name => 'l_bcc', label => $locale->text('Bcc'), }; } push @fields, { name => 'l_notes', label => $locale->text('Notes'), }; push @fields, { name => 'l_discount', label => $locale->text('Discount'), }; push @fields, { name => 'l_taxaccount', label => $locale->text('Tax Account'), }; push @fields, { name => 'l_taxnumber', label => $locale->text('Tax Number'), }; if ( $form->{db} eq 'customer' ) { push @fields, { name => 'l_employee', label => $locale->text('Salesperson'), }; push @fields, { name => 'l_manager', label => $locale->text('Manager'), }; push @fields, { name => 'l_pricegroup', label => $locale->text('Pricegroup'), }; } else { push @fields, { name => 'l_employee', label => $locale->text('Employee'), }; push @fields, { name => 'l_manager', label => $locale->text('Manager'), }; push @fields, { name => 'l_gifi_accno', label => $locale->text('GIFI'), }; } push @fields, { name => 'l_sic_code', label => $locale->text('SIC'), }; push @fields, { name => 'l_iban', label => $locale->text('IBAN'), }; push @fields, { name => 'l_bic', label => $locale->text('BIC'), }; push @fields, { name => 'l_business', label => $locale->text('Type of Business'), }; push @fields, { name => 'l_terms', label => $locale->text('Terms'), }; push @fields, { name => 'l_langauge', label => $locale->text('Language'), }; push @fields, { name => 'l_startdate', label => $locale->text('Startdate'), }; push @fields, { name => 'l_enddate', label => $locale->text('Enddate'), }; $form->{includes} = []; my $i = 0; while (@fields) { push @{$form->{includes}}, []; for ( 1 .. 5 ) { push @{$form->{includes}[$i]}, shift(@fields); if ($form->{includes}[$i][$_ - 1]) { $form->{includes}[$i][$_ - 1]{type} = 'checkbox'; $form->{includes}[$i][$_ - 1]{value} = 'Y'; } } $i++; } } sub search { # $locale->text('Customers') # $locale->text('Vendors') my %hiddens; my @buttons; $form->{title} = $locale->text('Search') unless $form->{title}; for (qw(name contact phone email)) { $form->{"l_$_"} = 'checked' } $form->{nextsub} = "list_names"; &transactions; &include_in_report; &search_name(\%hiddens, \@buttons); ##SC: Temporary removal ## if ( $form->{lynx} ) { ## require "bin/menu.pl"; ## &menubar; ## } my $template = LedgerSMB::Template->new_UI( user => \%myconfig, locale => $locale, template => 'ct-search', ); $template->render({ form => $form, user => \%myconfig, hiddens => \%hiddens, buttons => \@buttons, }); } sub search_name { my $hiddens = shift; my $buttons = shift; my $label = ucfirst $form->{db}; $form->{label} = $label; $hiddens->{$_} = $form->{$_} foreach qw(db nextsub path login sessionid); push @{$buttons}, { name => 'action', value => 'continue', text => $locale->text('Continue'), }; } sub list_names { my %hiddens; my @buttons; my @options; CT->search( \%myconfig, \%$form ); my $href = "$form->{script}?action=list_names&direction=$form->{direction}&oldsort=$form->{oldsort}&db=$form->{db}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&status=$form->{status}&l_subtotal=$form->{l_subtotal}"; $form->sort_order(); my $callback = "$form->{script}?action=list_names&direction=$form->{direction}&oldsort=$form->{oldsort}&db=$form->{db}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&status=$form->{status}&l_subtotal=$form->{l_subtotal}"; my @columns = $form->sort_columns( id, name, "$form->{db}number", address, city, state, zipcode, country, contact, phone, fax, email, cc, bcc, employee, manager, notes, discount, terms, taxaccount, taxnumber, gifi_accno, sic_code, business, pricegroup, language, iban, bic, startdate, enddate, invnumber, invamount, invtax, invtotal, ordnumber, ordamount, ordtax, ordtotal, quonumber, quoamount, quotax, quototal ); unshift @columns, "ndx"; $form->{l_invnumber} = "Y" if $form->{l_transnumber}; foreach my $item (qw(inv ord quo)) { if ( $form->{"l_${item}number"} ) { for (qw(amount tax total)) { $form->{"l_$item$_"} = $form->{"l_$_"}; } $removeemployee = 1; $openclosed = 1; } } $form->{open} = $form->{closed} = "" if !$openclosed; my @column_index; foreach my $item (@columns) { if ( $form->{"l_$item"} eq "Y" ) { push @column_index, $item; # add column to href and callback $callback .= "&l_$item=Y"; $href .= "&l_$item=Y"; } } foreach my $item (qw(amount tax total transnumber)) { if ( $form->{"l_$item"} eq "Y" ) { $callback .= "&l_$item=Y"; $href .= "&l_$item=Y"; } } if ( $form->{status} eq 'all' ) { push @options, $locale->text('All'); } elsif ( $form->{status} eq 'orphaned' ) { push @options, $locale->text('Orphaned'); } elsif ( $form->{status} eq 'active' ) { push @options, $locale->text('Active'); } elsif ( $form->{status} eq 'inactive' ) { push @options, $locale->text('Inactive'); } if ( $form->{name} ) { $callback .= "&name=" . $form->escape( $form->{name}, 1 ); $href .= "&name=" . $form->escape( $form->{name} ); push @options, $locale->text('Name: [_1]', $form->{name}); } if ( $form->{address} ) { $callback .= "&address=" . $form->escape( $form->{address}, 1 ); $href .= "&address=" . $form->escape( $form->{address} ); push @options, $locale->text('Address: [_1]', $form->{address}); } if ( $form->{city} ) { $callback .= "&city=" . $form->escape( $form->{city}, 1 ); $href .= "&city=" . $form->escape( $form->{city} ); push @options, $locale->text('City: [_1]', $form->{city}); } if ( $form->{state} ) { $callback .= "&state=" . $form->escape( $form->{state}, 1 ); $href .= "&state=" . $form->escape( $form->{state} ); push @options, $locale->text('State: [_1]', $form->{state}); } if ( $form->{zipcode} ) { $callback .= "&zipcode=" . $form->escape( $form->{zipcode}, 1 ); $href .= "&zipcode=" . $form->escape( $form->{zipcode} ); push @options, $locale->text('Zip/Postal Code: [_1]', $form->{zipcode}); } if ( $form->{country} ) { $callback .= "&country=" . $form->escape( $form->{country}, 1 ); $href .= "&country=" . $form->escape( $form->{country} ); push @options, $locale->text('Country: [_1]', $form->{country}); } if ( $form->{contact} ) { $callback .= "&contact=" . $form->escape( $form->{contact}, 1 ); $href .= "&contact=" . $form->escape( $form->{contact} ); push @options, $locale->text('Contact: [_1]', $form->{contact}); } if ( $form->{employee} ) { $callback .= "&employee=" . $form->escape( $form->{employee}, 1 ); $href .= "&employee=" . $form->escape( $form->{employee} ); if ( $form->{db} eq 'customer' ) { push @options, $locale->text('Salesperson: [_1]', $form->{employee}); } elsif ( $form->{db} eq 'vendor' ) { push @options, $locale->text('Employee: [_1]', $form->{employee}); } } my $fromdate = ""; my $todate = ""; if ( $form->{startdatefrom} ) { $callback .= "&startdatefrom=$form->{startdatefrom}"; $href .= "&startdatefrom=$form->{startdatefrom}"; $fromdate = $locale->date( \%myconfig, $form->{startdatefrom}, 1 ); } if ( $form->{startdateto} ) { $callback .= "&startdateto=$form->{startdateto}"; $href .= "&startdateto=$form->{startdateto}"; $todate = $locale->date( \%myconfig, $form->{startdateto}, 1 ); } if ( $fromdate || $todate ) { push @options, $locale->text('Startdate [_1] - [_2]', $fromdate, $todate); } if ( $form->{notes} ) { $callback .= "¬es=" . $form->escape( $form->{notes}, 1 ); $href .= "¬es=" . $form->escape( $form->{notes} ); push @options, $locale->text('Notes: [_1]', $form->{notes}); } if ( $form->{"$form->{db}number"} ) { $callback .= qq|&$form->{db}number=| . $form->escape( $form->{"$form->{db}number"}, 1 ); $href .= "&$form->{db}number=" . $form->escape( $form->{"$form->{db}number"} ); push @options, $locale->text('Number: [_1]', $form->{"$form->{db}number"}); } if ( $form->{phone} ) { $callback .= "&phone=" . $form->escape( $form->{phone}, 1 ); $href .= "&phone=" . $form->escape( $form->{phone} ); push @options, $locale->text('Phone: [_1]', $form->{phone}); } if ( $form->{email} ) { $callback .= "&email=" . $form->escape( $form->{email}, 1 ); $href .= "&email=" . $form->escape( $form->{email} ); push @options, $locale->text('E-mail: [_1]', $form->{email}); } if ( $form->{transdatefrom} ) { $callback .= "&transdatefrom=$form->{transdatefrom}"; $href .= "&transdatefrom=$form->{transdatefrom}"; push @options, $locale->text('From [_1]', $locale->date( \%myconfig, $form->{transdatefrom}, 1 )); } if ( $form->{transdateto} ) { $callback .= "&transdateto=$form->{transdateto}"; $href .= "&transdateto=$form->{transdateto}"; if ( $form->{transdatefrom} ) { pop @options; push @options, $locale->text('From [_1] To [_2]', $locale->date( \%myconfig, $form->{transdatefrom}, 1 ), $locale->date( \%myconfig, $form->{transdateto}, 1 )); } else { push @options, $locale->text('To [_1]', $locale->date( \%myconfig, $form->{transdateto}, 1 )); } } if ( $form->{open} ) { $callback .= "&open=$form->{open}"; $href .= "&open=$form->{open}"; push @options, $locale->text('Open'); } if ( $form->{closed} ) { $callback .= "&closed=$form->{closed}"; $href .= "&closed=$form->{closed}"; push @options, $locale->text('Closed'); } $form->{callback} = "$callback&sort=$form->{sort}"; $callback = $form->escape( $form->{callback} ); my %column_header; $column_header{ndx} = ' '; $column_header{id} = $locale->text('ID'); $column_header{"$form->{db}number"} = { href => "$href&sort=$form->{db}number", text => $locale->text('Number') }; $column_header{name} = { href => "$href&sort=name", text => $locale->text('Name') }; $column_header{address} = $locale->text('Address'); $column_header{city} = { href => "$href&sort=city", text => $locale->text('City') }; $column_header{state} = { href => "$href&sort=state", text => $locale->text('State/Province') }; $column_header{zipcode} = { href => "$href&sort=zipcode", text => $locale->text('Zip/Postal Code') }; $column_header{country} = { href => "$href&sort=country", text => $locale->text('Country') }; $column_header{contact} = { href => "$href&sort=contact", text => $locale->text('Contact'), }; $column_header{phone} = { href => "$href&sort=phone", text => $locale->text('Phone') }; $column_header{fax} = { href => "$href&sort=fax", text => $locale->text('Fax') }; $column_header{email} = { href => "$href&sort=email", text => $locale->text('E-mail') }; $column_header{cc} = { href => "$href&sort=cc", text => $locale->text('Cc') }; $column_header{bcc} = { href => "$href&sort=cc", text => $locale->text('Bcc') }; $column_header{notes} = { href => "$href&sort=notes", text => $locale->text('Notes') }; $column_header{discount} = '%'; $column_header{terms} = $locale->text('Terms'); $column_header{taxnumber} = { href => "$href&sort=taxnumber", text => $locale->text('Tax Number') }; $column_header{taxaccount} = $locale->text('Tax Account'); $column_header{gifi_accno} = { href => "$href&sort=gifi_accno", text => $locale->text('GIFI') }; $column_header{sic_code} = { href => "$href&sort=sic_code", text => $locale->text('SIC') }; $column_header{business} = { href => "$href&sort=business", text => $locale->text('Type of Business') }; $column_header{iban} = $locale->text('IBAN'); $column_header{bic} = $locale->text('BIC'); $column_header{startdate} = { href => "$href&sort=startdate", text => $locale->text('Startdate') }; $column_header{enddate} = { href => "$href&sort=enddate", text => $locale->text('Enddate') }; $column_header{invnumber} = { href => "$href&sort=invnumber", text => $locale->text('Invoice') }; $column_header{ordnumber} = { href => "$href&sort=ordnumber", text => $locale->text('Order') }; $column_header{quonumber} = { href => "$href&sort=quonumber", text => $locale->text('Quotation') }; if ( $form->{db} eq 'customer' ) { $column_header{employee} = { href => "$href&sort=employee", text => $locale->text('Salesperson') }; } else { $column_header{employee} = { href => "$href&sort=employee", text => $locale->text('Employee') }; } $column_header{manager} = { href => "$href&sort=manager", text => $locale->text('Manager') }; $column_header{pricegroup} = { href => "$href&sort=pricegroup", text => $locale->text('Pricegroup') }; $column_header{language} = { href => "$href&sort=language", text => $locale->text('Language') }; $amount = $locale->text('Amount'); $tax = $locale->text('Tax'); $total = $locale->text('Total'); $column_header{invamount} = $amount; $column_header{ordamount} = $amount; $column_header{quoamount} = $amount; $column_header{invtax} = $tax; $column_header{ordtax} = $tax; $column_header{quotax} = $tax; $column_header{invtotal} = $total; $column_header{ordtotal} = $total; $column_header{quototal} = $total; if ( $form->{status} ) { $label = ucfirst $form->{db} . "s"; $form->{title} = $locale->text($label); } else { $label = ucfirst $form->{db}; $form->{title} = $locale->text( $label . " Transactions" ); } my $ordertype = ( $form->{db} eq 'customer' ) ? 'sales_order' : 'purchase_order'; my $quotationtype = ( $form->{db} eq 'customer' ) ? 'sales_quotation' : 'request_quotation'; $subtotal = 0; my $i = 0; my @rows; foreach my $ref ( @{ $form->{CT} } ) { if ( $ref->{ $form->{sort} } ne $sameitem && $form->{l_subtotal} ) { # append subtotal if ($subtotal) { push @rows, &list_subtotal; } } my %column_data; if ( $ref->{id} eq $sameid ) { for (@column_index) { $column_data{$_} = ' ' } } else { $i++; $ref->{notes} =~ s/\r?\n/
/g; for (@column_index) { $column_data{$_} = $ref->{$_}; } $column_data{ndx} = $i; if ( $ref->{ $form->{sort} } eq $sameitem ) { $column_data{ $form->{sort} } = ' '; } $column_data{address} = "$ref->{address1} $ref->{address2}"; $column_data{name} = { text => $ref->{name}, href => "$form->{script}?action=edit&id=$ref->{id}&db=$form->{db}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&status=$form->{status}&callback=$callback", }; $email = ""; if ( $form->{sort} =~ /(email|cc)/ ) { if ( $ref->{ $form->{sort} } ne $sameitem ) { $email = 1; } } else { $email = 1; } if ($email) { foreach $item (qw(email cc bcc)) { if ( $ref->{$item} ) { $email = $ref->{$item}; $column_data{$item} = { href => "mailto:$ref->{$item}", text => $email, }; } } } } if ( $ref->{formtype} eq 'invoice' ) { $column_data{invnumber} = { href => "$ref->{module}.pl?action=edit&id=$ref->{invid}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&callback=$callback", text => $ref->{invnumber}, }; $column_data{invamount} = $form->format_amount( \%myconfig, $ref->{netamount}, 2, ' ' ); $column_data{invtax} = $form->format_amount( \%myconfig, $ref->{amount} - $ref->{netamount}, 2, ' ' ); $column_data{invtotal} = $form->format_amount( \%myconfig, $ref->{amount}, 2, ' ' ); $invamountsubtotal += $ref->{netamount}; $invtaxsubtotal += ( $ref->{amount} - $ref->{netamount} ); $invtotalsubtotal += $ref->{amount}; $subtotal = 1; } elsif ( $ref->{formtype} eq 'order' ) { $column_data{ordnumber} = { href => "$ref->{module}.pl?action=edit&id=$ref->{invid}&type=$ordertype&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&callback=$callback", text => $ref->{ordnumber}, }; $column_data{ordamount} = $form->format_amount( \%myconfig, $ref->{netamount}, 2, ' ' ); $column_data{ordtax} = $form->format_amount( \%myconfig, $ref->{amount} - $ref->{netamount}, 2, ' ' ); $column_data{ordtotal} = $form->format_amount( \%myconfig, $ref->{amount}, 2, ' ' ); $ordamountsubtotal += $ref->{netamount}; $ordtaxsubtotal += ( $ref->{amount} - $ref->{netamount} ); $ordtotalsubtotal += $ref->{amount}; $subtotal = 1; } elsif ( $ref->{formtype} eq 'quotation' ) { $column_data{quonumber} = { href => "$ref->{module}.pl?action=edit&id=$ref->{invid}&type=$quotationtype&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&callback=$callback", text => $ref->{quonumber}, }; $column_data{quoamount} = $form->format_amount( \%myconfig, $ref->{netamount}, 2, ' ' ); $column_data{quotax} = $form->format_amount( \%myconfig, $ref->{amount} - $ref->{netamount}, 2, ' ' ); $column_data{quototal} = $form->format_amount( \%myconfig, $ref->{amount}, 2, ' ' ); $quoamountsubtotal += $ref->{netamount}; $quotaxsubtotal += ( $ref->{amount} - $ref->{netamount} ); $quototalsubtotal += $ref->{amount}; $subtotal = 1; } if ( $sameid ne "$ref->{id}" ) { if ( $form->{l_discount} ) { $column_data{discount} = $form->format_amount( \%myconfig, $ref->{discount} * 100, "", ' ' ); } if ( $form->{l_terms} ) { $column_data{terms} = $form->format_amount( \%myconfig, $ref->{terms}, "", ' ' ); } } $j++; $j %= 2; $column_data{i} = $j; $sameitem = $ref->{$form->{sort}}; $sameid = $ref->{id}; push @rows, \%column_data; } if ( $form->{l_subtotal} && $subtotal ) { push @rows, &list_subtotal; } $i = 1; if ( $myconfig{acs} !~ /AR--AR/ ) { if ( $form->{db} eq 'customer' ) { $button{'AR--Customers--Add Customer'}{code} = { name => 'action', value => 'add_customer', text => $locale->text('Add Customer'), }; $button{'AR--Customers--Add Customer'}{order} = $i++; } } if ( $myconfig{acs} !~ /AP--AP/ ) { if ( $form->{db} eq 'vendor' ) { $button{'AP--Vendors--Add Vendor'}{code} = { name => 'action', value => 'add_vendor', text => $locale->text('Add Vendor'), }; $button{'AP--Vendors--Add Vendor'}{order} = $i++; } } foreach $item ( split /;/, $myconfig{acs} ) { delete $button{$item}; } $hiddens{$_} = $form->{$_} foreach qw(callback db path login sessionid); if ( $form->{status} ) { foreach $item ( sort { $a->{order} <=> $b->{order} } %button ) { push @buttons, $item->{code}; } } ##SC: Temporary removal ## if ( $form->{lynx} ) { ## require "bin/menu.pl"; ## &menubar; ## } my $template = LedgerSMB::Template->new_UI( user => \%myconfig, locale => $locale, template => 'form-dynatable', ); $template->render({ form => $form, user => \%myconfig, hiddens => \%hiddens, buttons => \@buttons, options => \@options, rows => \@rows, columns => \@column_index, heading => \%column_header, }); } sub list_subtotal { my %column_data; $column_data{invamount} = $form->format_amount( \%myconfig, $invamountsubtotal, 2, ' ' ); $column_data{invtax} = $form->format_amount( \%myconfig, $invtaxsubtotal, 2, ' ' ); $column_data{invtotal} = $form->format_amount( \%myconfig, $invtotalsubtotal, 2, ' ' ); $invamountsubtotal = 0; $invtaxsubtotal = 0; $invtotalsubtotal = 0; $column_data{ordamount} = $form->format_amount( \%myconfig, $ordamountsubtotal, 2, ' ' ); $column_data{ordtax} = $form->format_amount( \%myconfig, $ordtaxsubtotal, 2, ' ' ); $column_data{ordtotal} = $form->format_amount( \%myconfig, $ordtotalsubtotal, 2, ' ' ); $ordamountsubtotal = 0; $ordtaxsubtotal = 0; $ordtotalsubtotal = 0; $column_data{quoamount} = $form->format_amount( \%myconfig, $quoamountsubtotal, 2, ' ' ); $column_data{quotax} = $form->format_amount( \%myconfig, $quotaxsubtotal, 2, ' ' ); $column_data{quototal} = $form->format_amount( \%myconfig, $quototalsubtotal, 2, ' ' ); $quoamountsubtotal = 0; $quotaxsubtotal = 0; $quototalsubtotal = 0; $column_data{class} = 'subtotal'; \%column_data; } sub list_history { CT->get_history( \%myconfig, \%$form ); my %hiddens; my @buttons; my $href = "$form->{script}?action=list_history&direction=$form->{direction}&oldsort=$form->{oldsort}&db=$form->{db}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&type=$form->{type}&transdatefrom=$form->{transdatefrom}&transdateto=$form->{transdateto}&history=$form->{history}"; $form->sort_order(); my $callback = "$form->{script}?action=list_history&direction=$form->{direction}&oldsort=$form->{oldsort}&db=$form->{db}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&type=$form->{type}&transdatefrom=$form->{transdatefrom}&transdateto=$form->{transdateto}&history=$form->{history}"; $form->{l_fxsellprice} = $form->{l_curr}; my @columns = $form->sort_columns( partnumber, description, qty, unit, sellprice, fxsellprice, curr, discount, deliverydate, projectnumber, serialnumber ); if ( $form->{history} eq 'summary' ) { @columns = $form->sort_columns( partnumber, description, qty, unit, sellprice, curr ); } my @column_index; foreach $item (@columns) { if ( $form->{"l_$item"} eq "Y" ) { push @column_index, $item; # add column to href and callback $callback .= "&l_$item=Y"; $href .= "&l_$item=Y"; } } my @options; if ( $form->{history} eq 'detail' ) { push @options, $locale->text('Detail'); } elsif ( $form->{history} eq 'summary' ) { push @options, $locale->text('Summary'); } if ( $form->{name} ) { $callback .= "&name=" . $form->escape( $form->{name}, 1 ); $href .= "&name=" . $form->escape( $form->{name} ); push @options, $locale->text('Name: [_1]', $form->{name}); } if ( $form->{contact} ) { $callback .= "&contact=" . $form->escape( $form->{contact}, 1 ); $href .= "&contact=" . $form->escape( $form->{contact} ); push @options, $locale->text('Contact: [_1]', $form->{contact}); } if ( $form->{"$form->{db}number"} ) { $callback .= qq|&$form->{db}number=| . $form->escape( $form->{"$form->{db}number"}, 1 ); $href .= "&$form->{db}number=" . $form->escape( $form->{"$form->{db}number"} ); push @options, $locale->text('Number: [_1]', $form->{"$form->{db}number"}); } if ( $form->{email} ) { $callback .= "&email=" . $form->escape( $form->{email}, 1 ); $href .= "&email=" . $form->escape( $form->{email} ); push @options, $locale->text('E-mail: [_1]', $form->{email}); } if ( $form->{transdatefrom} ) { $callback .= "&transdatefrom=$form->{transdatefrom}"; $href .= "&transdatefrom=$form->{transdatefrom}"; push @options, $locale->text('From [_1]', $locale->date( \%myconfig, $form->{transdatefrom}, 1 )); } if ( $form->{transdateto} ) { $callback .= "&transdateto=$form->{transdateto}"; $href .= "&transdateto=$form->{transdateto}"; if ( $form->{transdatefrom} ) { pop @options; push @options, $locale->text('From [_1] To [_2]', $locale->date( \%myconfig, $form->{transdatefrom}, 1 ), $locale->date( \%myconfig, $form->{transdateto}, 1 )); } else { push @options, $locale->text('To [_1]', $locale->date( \%myconfig, $form->{transdateto}, 1 )); } } if ( $form->{open} ) { $callback .= "&open=$form->{open}"; $href .= "&open=$form->{open}"; push @options, $locale->text('Open'); } if ( $form->{closed} ) { $callback .= "&closed=$form->{closed}"; $href .= "&closed=$form->{closed}"; push @options, $locale->text('Closed'); } $form->{callback} = "$callback&sort=$form->{sort}"; $callback = $form->escape( $form->{callback} ); my %column_header; $column_header{partnumber} = { href => "$href&sort=partnumber", text => $locale->text('Part Number') }; $column_header{description} = { href => "$href&sort=description", text => $locale->text('Description') }; if ( $form->{history} eq 'summary' ) { $column_header{sellprice} = $locale->text('Total'); } else { $column_header{sellprice} = $locale->text('Sell Price'); } $column_header{fxsellprice} = ' '; $column_header{curr} = $locale->text('Curr'); $column_header{discount} = $locale->text('Discount'); $column_header{qty} = $locale->text('Qty'); $column_header{unit} = $locale->text('Unit'); $column_header{deliverydate} = { href => "$href&sort=deliverydate", text => $locale->text('Delivery Date') }; $column_header{projectnumber} = { href => "$href&sort=projectnumber", text => $locale->text('Project Number') }; $column_header{serialnumber} = { href => "$href&sort=serialnumber", text => $locale->text('Serial Number') }; # $locale->text('Customer History') # $locale->text('Vendor History') $label = ucfirst $form->{db}; $form->{title} = $locale->text( $label . " History" ); $module = 'oe'; if ( $form->{db} eq 'customer' ) { $invlabel = $locale->text('Sales Invoice'); $ordlabel = $locale->text('Sales Order'); $quolabel = $locale->text('Quotation'); $ordertype = 'sales_order'; $quotationtype = 'sales_quotation'; if ( $form->{type} eq 'invoice' ) { $module = 'is'; } } else { $invlabel = $locale->text('Vendor Invoice'); $ordlabel = $locale->text('Purchase Order'); $quolabel = $locale->text('RFQ'); $ordertype = 'purchase_order'; $quotationtype = 'request_quotation'; if ( $form->{type} eq 'invoice' ) { $module = 'ir'; } } $ml = ( $form->{db} eq 'vendor' ) ? -1 : 1; my @rows; foreach my $ref ( @{ $form->{CT} } ) { if ( $ref->{id} ne $sameid ) { # print the header push @rows, { class => 'divider', text => "$ref->{name} $ref->{address}" href => "$form->{script}?action=edit&id=$ref->{ctid}&db=$form->{db}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&callback=$callback", }; } if ( $form->{type} ne 'invoice' ) { $ref->{fxsellprice} = $ref->{sellprice}; $ref->{sellprice} *= $ref->{exchangerate}; } if ( $form->{history} eq 'detail' and $ref->{invid} ne $sameinvid ) { # print inv, ord, quo number $i++; $i %= 2; if ( $form->{type} eq 'invoice' ) { push @rows, { class => 'divider', href => "${module}.pl?action=edit&id=$ref->{invid}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&callback=$callback", text => "$invlabel $ref->{invnumber} / $ref->{employee}"; }; } elsif ( $form->{type} eq 'order' ) { push @rows, { class => 'divider', href => "${module}.pl?action=edit&id=$ref->{invid}&type=$ordertype&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&callback=$callback", text => "$ordlabel $ref->{ordnumber} / $ref->{employee}" }; } elsif ( $form->{type} eq 'quotation' ) { push @rows, { class => 'divider', href => "${module}.pl?action=edit&id=$ref->{invid}&type=$quotationtype&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&callback=$callback", text => "$quolabel $ref->{quonumber} / $ref->{employee}" }; } } my %column_data; for (@column_index) { $column_data{$_} = $ref->{$_} } if ( $form->{l_curr} ) { $column_data{fxsellprice} = $form->format_amount( \%myconfig, $ref->{fxsellprice}, 2 ); } $column_data{sellprice} = $form->format_amount( \%myconfig, $ref->{sellprice}, 2 ); $column_data{qty} = $form->format_amount( \%myconfig, $ref->{qty} * $ml ); $column_data{discount} = $form->format_amount( \%myconfig, $ref->{discount} * 100, "", ' ' ); $column_data{partnumber} = { href => "ic.pl?action=edit&id=$ref->{pid}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&callback=$callback" text => $ref->{partnumber} }; $i++; $i %= 2; $column_data{i} = $i; push @rows, \%column_data; $sameid = $ref->{id}; $sameinvid = $ref->{invid}; } ##SC: Temporary removal ## if ( $form->{lynx} ) { ## require "bin/menu.pl"; ## &menubar; ## } my $template = LedgerSMB::Template->new_UI( user => \%myconfig, locale => $locale, template => 'form-dynatable', ); $template->render({ form => $form, options => \@options, rows => \@rows, columns => \@column_index, heading => \%column_header, }); } sub edit { # $locale->text('Edit Customer') # $locale->text('Edit Vendor') CT->create_links( \%myconfig, \%$form ); for ( keys %$form ) { $form->{$_} = $form->quote( $form->{$_} ) } $form->{title} = "Edit"; # format discount $form->{discount} *= 100; &form_header; &form_footer; } sub form_header { $form->{taxincluded} = ( $form->{taxincluded} ) ? "checked" : ""; $form->{creditlimit} = $form->format_amount( \%myconfig, $form->{creditlimit}, 0 ); $form->{discount} = $form->format_amount( \%myconfig, $form->{discount}, "" ); $form->{terms} = $form->format_amount( \%myconfig, $form->{terms}, "" ); if ( $form->{currencies} ) { # currencies $form->{selectcurrency} = { name => 'curr', options => [], default_values => $form->{curr}, }; push @{$form->{selectcurrency}{options}}, { text => $_, value => $_, } foreach split /:/, $form->{currencies}; } $form->{taxable} = []; foreach my $item ( split / /, $form->{taxaccounts} ) { my $temp_tax = { name => "tax_$item", value => 1, type => 'checkbox', label => $form->{tax}{$item}{description} }; $temp_tax->{checked} = 'checked' if $form->{tax}{$item}{taxable}; push @{$form->{taxable}}, $temp_tax; } if (ref $form->{all_business} eq 'ARRAY') { $form->{selectbusiness} = { name => 'business', options => [{text => '', value => ''}], }; push @{$form->{selectbusiness}{options}}, { text => $_->{description}, value => "$_->{description}--$_->{id}", } foreach @{$form->{all_business}}; $form->{selectbusiness}{default_values} = "$form->{business}--$form->{business_id}"; } if (ref $form->{all_pricegroup} eq 'ARRAY' && $form->{db} eq 'customer') { $form->{selectpricegroup} = { name => 'pricegroup', options => [{text => '', value => ''}], }; push @{$form->{selectpricegroup}{options}}, { name => $_->{pricegroup}, value => "$_->{pricegroup}--$_->{id}", } foreach @{$form->{all_pricegroup}}; $form->{selectpricegroup}{default_values} = "$form->{pricegroup}--$form->{pricegroup_id}"; } if ( @{ $form->{all_language} } ) { $form->{selectlanguage} = { name => 'language', options => [{text => '', value => ''}], }; push @{$form->{selectlanguage}{options}}, { text => $_->{description}, value => "$_->{description}--$_->{code}", } foreach @{$form->{all_language}}; $form->{selectlangauge}{default_values} = "$form->{language}--$form->{language_code}"; } $form->{selectemployee} = { name => 'employee', options => [{text => '', value => ''}], default_values => "$form->{employee}--$form->{employee_id}", }; push @{$form->{selectemployee}{options}}, { text => $_->{name}, value => "$_->{name}--$_->{id}", } foreach @{$form->{all_employee}}; if (ref $form->{all_employee} eq 'ARRAY') { if ( $myconfig{role} eq 'user' && $form->{id} ) { $hiddens{employee} = "$form->{employee}--$form->{employee_id}"; } } # $locale->text('Customer Number') # $locale->text('Vendor Number') $label = ucfirst $form->{db}; $form->{label} = $label; $form->{title} = $locale->text("$form->{title} $label"); } sub form_footer { # type=submit $locale->text('Save') # type=submit $locale->text('Save as new') # type=submit $locale->text('AR Transaction') # type=submit $locale->text('Sales Invoice') # type=submit $locale->text('Sales Order') # type=submit $locale->text('Quotation') # type=submit $locale->text('AP Transaction') # type=submit $locale->text('Vendor Invoice') # type=submit $locale->text('Purchase Order') # type=submit $locale->text('RFQ') # type=submit $locale->text('Pricelist') # type=submit $locale->text('Delete') # type=submit $locale->text('POS') my %hiddens; my @buttons; %button = ( 'save' => { ndx => 1, key => 'S', value => $locale->text('Save') }, 'save_as_new' => { ndx => 2, key => 'N', value => $locale->text('Save as new') }, 'ar_transaction' => { ndx => 7, key => 'A', value => $locale->text('AR Transaction') }, 'ap_transaction' => { ndx => 8, key => 'A', value => $locale->text('AP Transaction') }, 'sales_invoice' => { ndx => 9, key => 'I', value => $locale->text('Sales Invoice') }, 'pos' => { ndx => 10, key => 'C', value => $locale->text('POS') }, 'sales_order' => { ndx => 11, key => 'O', value => $locale->text('Sales Order') }, 'quotation' => { ndx => 12, key => 'Q', value => $locale->text('Quotation') }, 'vendor_invoice' => { ndx => 13, key => 'I', value => $locale->text('Vendor Invoice') }, 'purchase_order' => { ndx => 14, key => 'O', value => $locale->text('Purchase Order') }, 'rfq' => { ndx => 15, key => 'Q', value => $locale->text('RFQ') }, 'pricelist' => { ndx => 16, key => 'P', value => $locale->text('Pricelist') }, 'delete' => { ndx => 17, key => 'D', value => $locale->text('Delete') }, ); my %blist = (); if ( $form->{db} eq 'customer' ) { if ( $myconfig{acs} !~ /AR--Customers--Add Customer/ ) { $blist{'save'} = 1; if ( $form->{id} ) { $blist{'save_as_new'} = 1; if ( $form->{status} eq 'orphaned' ) { $blist{'delete'} = 1; } } } if ( $myconfig{acs} !~ /AR--AR/ ) { if ( $myconfig{acs} !~ /AR--Add Transaction/ ) { $blist{'ar_transaction'} = 1; } if ( $myconfig{acs} !~ /AR--Sales Invoice/ ) { $blist{'sales_invoice'} = 1; } } if ( $myconfig{acs} !~ /POS--POS/ ) { if ( $myconfig{acs} !~ /POS--Sale/ ) { $blist{'pos'} = 1; } } if ( $myconfig{acs} !~ /Order Entry--Order Entry/ ) { if ( $myconfig{acs} !~ /Order Entry--Sales Order/ ) { $blist{'sales_order'} = 1; } } if ( $myconfig{acs} !~ /Quotations--Quotations/ ) { if ( $myconfig{acs} !~ /Quotations--Quotation/ ) { $blist{'quotation'} = 1; } } } if ( $form->{db} eq 'vendor' ) { if ( $myconfig{acs} !~ /AP--Vendors--Add Vendor/ ) { $blist{'save'} = 1; if ( $form->{id} ) { $blist{'save_as_new'} = 1; if ( $form->{status} eq 'orphaned' ) { $blist{'delete'} = 1; } } } if ( $myconfig{acs} !~ /AP--AP/ ) { if ( $myconfig{acs} !~ /AP--Add Transaction/ ) { $blist{'ap_transaction'} = 1; } if ( $myconfig{acs} !~ /AP--Vendor Invoice/ ) { $blist{'vendor_invoice'} = 1; } } if ( $myconfig{acs} !~ /Order Entry--Order Entry/ ) { if ( $myconfig{acs} !~ /Order Entry--Purchase Order/ ) { $blist{'purchase_order'} = 1; } } if ( $myconfig{acs} !~ /Quotations--Quotations/ ) { if ( $myconfig{acs} !~ /Quotations--RFQ/ ) { $blist{'rfq'} = 1; } } } if ( $myconfig{acs} !~ /Goods & Services--Goods & Services/ ) { $myconfig{acs} =~ s/(Goods & Services--)Add (Service|Assembly).*;/$1--Add Part/g; if ( $myconfig{acs} !~ /Goods & Services--Add Part/ ) { $blist{'pricelist'} = 1; } } $hiddens{$_} = $form->{$_} foreach qw(id taxaccounts path login sessionid callback db); for ( keys %button ) { delete $button{$_} if !$blist{$_} } for ( sort { $button{$a}->{ndx} <=> $button{$b}->{ndx} } keys %button ) { push @buttons, { name => 'action', value => $_, accesskey => $button{$_}{key}, title => "$button{$name}{value} [Alt-$button{$_}{key}]", text => $button{$_}{value}, }; } ##SC: Temporary removal ## if ( $form->{lynx} ) { ## require "bin/menu.pl"; ## &menubar; ## } $form->{dbnumber} = "$form->{db}number"; my $template = LedgerSMB::Template->new_UI( user => \%myconfig, locale => $locale, template => 'ct-form', ); $template->render({ form => $form, user => \%myconfig, hiddens => \%hiddens, buttons => \@buttons, options => \@options, }); } sub pricelist { $form->isblank( "name", $locale->text('Name missing!') ); $form->{display_form} ||= "display_pricelist"; CT->pricelist( \%myconfig, \%$form ); foreach $ref ( @{ $form->{"all_partspricelist"} } ) { $i++; for ( keys %$ref ) { $form->{"${_}_$i"} = $ref->{$_} } } $form->{rowcount} = $i; # currencies @curr = split /:/, $form->{currencies}; $form->{selectcurrency} = []; for (@curr) {push @{$form->{selectcurrency}}, {text => $_, value => $_}} if (ref $form->{all_partsgroup} eq 'ARRAY') { $form->{selectpartsgroup} = ""; foreach $ref ( @{ $form->{all_partsgroup} } ) { $form->{selectpartsgroup} .= qq|$ref->{partsgroup}--$ref->{id}\n|; } } for (qw(currencies all_partsgroup all_partspricelist)) { delete $form->{$_}; } foreach $i ( 1 .. $form->{rowcount} ) { if ( $form->{db} eq 'customer' ) { $form->{"pricebreak_$i"} = $form->format_amount( \%myconfig, $form->{"pricebreak_$i"} ); $form->{"sellprice_$i"} = $form->format_amount( \%myconfig, $form->{"sellprice_$i"}, 2 ); } if ( $form->{db} eq 'vendor' ) { $form->{"leadtime_$i"} = $form->format_amount( \%myconfig, $form->{"leadtime_$i"} ); $form->{"lastcost_$i"} = $form->format_amount( \%myconfig, $form->{"lastcost_$i"}, 2 ); } } $form->{rowcount}++; &{"$form->{db}_pricelist"}; } sub customer_pricelist { my @flds = qw(runningnumber id partnumber description sellprice unit partsgroup pricebreak curr validfrom validto); $form->{rowcount}--; # remove empty rows if ( $form->{rowcount} ) { foreach $i ( 1 .. $form->{rowcount} ) { for (qw(pricebreak sellprice)) { $form->{"${_}_$i"} = $form->parse_amount( \%myconfig, $form->{"${_}_$i"} ); } ( $a, $b ) = split /\./, $form->{"pricebreak_$i"}; $a = length $a; $b = length $b; $whole = ( $whole > $a ) ? $whole : $a; $dec = ( $dec > $b ) ? $dec : $b; } $pad1 = '0' x $whole; $pad2 = '0' x $dec; foreach $i ( 1 .. $form->{rowcount} ) { ( $a, $b ) = split /\./, $form->{"pricebreak_$i"}; $a = substr( "$pad1$a", -$whole ); $b = substr( "$b$pad2", 0, $dec ); $ndx{qq|$form->{"partnumber_$i"}_$form->{"id_$i"}_$a$b|} = $i; } $i = 1; for ( sort keys %ndx ) { $form->{"runningnumber_$ndx{$_}"} = $i++ } foreach $i ( 1 .. $form->{rowcount} ) { if ( $form->{"partnumber_$i"} && $form->{"sellprice_$i"} ) { if ( $form->{"id_$i"} eq $sameid ) { $j = $i + 1; next if ( $form->{"id_$j"} eq $sameid && !$form->{"pricebreak_$i"} ); } push @a, {}; $j = $#a; for (@flds) { $a[$j]->{$_} = $form->{"${_}_$i"} } $count++; } $sameid = $form->{"id_$i"}; } $form->redo_rows( \@flds, \@a, $count, $form->{rowcount} ); $form->{rowcount} = $count; } $form->{rowcount}++; if ( $form->{display_form} ) { &{"$form->{display_form}"}; } } sub vendor_pricelist { my @flds = qw(runningnumber id sku partnumber description lastcost unit partsgroup curr leadtime); $form->{rowcount}--; # remove empty rows if ( $form->{rowcount} ) { foreach $i ( 1 .. $form->{rowcount} ) { for (qw(leadtime lastcost)) { $form->{"${_}_$i"} = $form->parse_amount( \%myconfig, $form->{"${_}_$i"} ); } $var = ( $form->{"partnumber_$i"} ) ? $form->{"sku_$i"} : qq|_$form->{"sku_$i"}|; $ndx{$var} = $i; } $i = 1; for ( sort keys %ndx ) { $form->{"runningnumber_$ndx{$_}"} = $i++ } foreach $i ( 1 .. $form->{rowcount} ) { if ( $form->{"sku_$i"} ) { push @a, {}; $j = $#a; for (@flds) { $a[$j]->{$_} = $form->{"${_}_$i"} } $count++; } } $form->redo_rows( \@flds, \@a, $count, $form->{rowcount} ); $form->{rowcount} = $count; } $form->{rowcount}++; if ( $form->{display_form} ) { &{"$form->{display_form}"}; } } sub display_pricelist { my %hiddens; my $buttons = &pricelist_footer; delete $form->{action}; $hiddens{$_} = $form->{$_} foreach sort keys %$form; &pricelist_header(\%hiddens, $buttons); } sub pricelist_header { my $hiddens = shift; my $buttons = shift; $form->{title} = $form->{name}; my @column_index; my %column_header; if ( $form->{db} eq 'customer' ) { @column_index = qw(partnumber description); push @column_index, "partsgroup" if $form->{selectpartsgroup}; push @column_index, qw(pricebreak sellprice curr validfrom validto); $column_header{pricebreak} = $locale->text('Break'); $column_header{sellprice} = $locale->text('Sell Price'); $column_header{validfrom} = $locale->text('From'); $column_header{validto} = $locale->text('To'); } if ( $form->{db} eq 'vendor' ) { @column_index = qw(sku partnumber description); push @column_index, "partsgroup" if $form->{selectpartsgroup}; push @column_index, qw(lastcost curr leadtime); $column_header{sku} = $locale->text('SKU'); $column_header{leadtime} = $locale->text('Leadtime'); $column_header{lastcost} = $locale->text('Cost'); } $column_header{partnumber} = $locale->text('Number'); $column_header{description} = $locale->text('Description'); #80% width $column_header{partsgroup} = $locale->text('Group'); $column_header{curr} = $locale->text('Curr'); $sameid = ""; my @rows; foreach my $i ( 1 .. $form->{rowcount} ) { my %column_data; if ( $form->{selectpartsgroup} ) { if ( $i < $form->{rowcount} ) { ($partsgroup) = split /--/, $form->{"partsgroup_$i"}; $hiddens->{"partsgroup_$i"} = $form->{"partsgroup_$i"}; $column_data{partsgroup} = $partsgroup; } } if ( $i < $form->{rowcount} ) { if ( $form->{"id_$i"} eq $sameid ) { for (qw(partnumber description partsgroup)) { $hiddens->{"${_}_$i"} = $form->{"${_}_$i"}; $column_data{$_} = ' '; } } else { $column_data{sku} = {input => { name => "sku_$i", value => $form->{"sku_$i"} }}; $column_data{partnumber} = {input => { name => "partnumber_$i", value => $form->{"partnumber_$i"} }}; $column_data{description} =$form->{"description_$i"}; $hiddens->{"description_$i"} = $form->{"description_$i"}; } $hiddens->{"id_$i"} = $form->{"id_$i"}; } else { if ( $form->{db} eq 'customer' ) { $column_data{partnumber} = {input => { name => "partnumber_$i", value => $form->{"partnumber_$i"} }}; } else { $column_data{partnumber} = ' '; } $hiddens->{"id_$i"} = $form->{"id_$i"}; $column_data{sku} = {input => { name => "sku_$i", value => $form->{"sku_$i"} }}; $column_data{partnumber} = {input => { name => "partnumber_$i", value => $form->{"partnumber_$i"} }}; if ( $form->{selectpartsgroup} ) { @selectpartsgroup = ({text => '', value => ''}); foreach $line ( split /\n/, $form->{selectpartsgroup} ) { push @selectpartsgroup, { text => (split /--/, $line)[0], value => $line, }; } $column_data{partsgroup} = {'select' => { name => "partnumber_$i", options => \@selectpartsgroup, }}; } } if ( $form->{db} eq 'customer' ) { $column_data{pricebreak} = {input => { name => "pricebreak_$i", size => 5, value => $form->format_amount(\%myconfig, $form->{"pricebreak_$i"}) }}; $column_data{sellprice} = {input => { name => "sellprice_$i", size => 10, value => $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, 2) }}; $column_data{validfrom} = {input => { name => "validfrom_$i", size => 11, value => $form->{"validfrom_$i"}, }}; $column_data{validto} = {input => { name => "validto_$i", size => 11, value => $form->{"validto_$i"}, }}; } if ( $form->{db} eq 'vendor' ) { $column_data{leadtime} = {input => { name => "leadtime_$i", size => 5, value => $form->format_amount(\%myconfig, $form->{"leadtime_$i"}) }}; $column_data{lastcost} = {input => { name => "lastcost_$i", size => 10, value => $form->format_amount( \%myconfig, $form->{"lastcost_$i"}, 2 ) }}; } $column_data{curr} = {'select' => { name => "curr_$i", options => $form->{selectcurrency}, default_values => $form->{"curr_$i"}, }}; $sameid = $form->{"id_$i"}; push @rows, \%column_data; } # delete variables foreach $i ( 1 .. $form->{rowcount} ) { for ( @column_index, "id" ) { delete $form->{"${_}_$i"} } } for (qw(title titlebar script none)) { delete $form->{$_} } my $template = LedgerSMB::Template->new_UI( user => \%myconfig, locale => $locale, template => 'form-dynatable', ); $template->render({ form => $form, user => \%myconfig, hiddens => $hiddens, buttons => $buttons, options => \@options, rows => \@rows, columns => \@column_index, heading => \%column_header, }); } sub pricelist_footer { # type=submit $locale->text('Update') # type=submit $locale->text('Save Pricelist') %button = ( 'update' => { ndx => 1, key => 'U', value => $locale->text('Update') }, 'save_pricelist' => { ndx => 3, key => 'S', value => $locale->text('Save Pricelist') }, ); my @buttons; for ( sort { $button{$a}->{ndx} <=> $button{$b}->{ndx} } keys %button ) { push @buttons, { name => 'action', value => $_, accesskey => $button{$_}{key}, title => "$button{$name}{value} [Alt-$button{$_}{key}]", text => $button{$_}{value}, }; } \@buttons; } sub update { $i = $form->{rowcount}; $additem = 0; if ( $form->{db} eq 'customer' ) { $additem = 1 if !(( $form->{"partnumber_$i"} eq "" ) && ( $form->{"description_$i"} eq "" ) && ( $form->{"partsgroup_$i"} eq "" ) ); } if ( $form->{db} eq 'vendor' ) { if ( !( ( $form->{"sku_$i"} eq "" ) && ( $form->{"description_$i"} eq "" ) && ( $form->{"partsgroup_$i"} eq "" ) ) ) { $additem = 1; $form->{"partnumber_$i"} = $form->{"sku_$i"}; } } if ($additem) { CT->retrieve_item( \%myconfig, \%$form ); $rows = scalar @{ $form->{item_list} }; if ( $rows > 0 ) { if ( $rows > 1 ) { &select_item; exit; } else { $sellprice = $form->{"sellprice_$i"}; $pricebreak = $form->{"pricebreak_$i"}; $lastcost = $form->{"lastcost_$i"}; for (qw(partnumber description)) { $form->{item_list}[0]{$_} = $form->quote( $form->{item_list}[0]{$_} ); } for ( keys %{ $form->{item_list}[0] } ) { $form->{"${_}_$i"} = $form->{item_list}[0]{$_}; } if ( $form->{db} eq 'customer' ) { if ($sellprice) { $form->{"sellprice_$i"} = $sellprice; } $form->{"sellprice_$i"} = $form->format_amount( \%myconfig, $form->{"sellprice_$i"}, 2 ); $form->{"pricebreak_$i"} = $pricebreak; } else { foreach $j ( 1 .. $form->{rowcount} - 1 ) { if ( $form->{"sku_$j"} eq $form->{"partnumber_$i"} ) { $form->error( $locale->text('Item already on pricelist!') ); } } if ($lastcost) { $form->{"lastcost_$i"} = $lastcost; } $form->{"lastcost_$i"} = $form->format_amount( \%myconfig, $form->{"lastcost_$i"}, 2 ); $form->{"sku_$i"} = $form->{"partnumber_$i"}; # delete $form->{"partnumber_$i"}; } $form->{rowcount}++; } } else { $form->error( $locale->text('Item not on file!') ); } } &{"$form->{db}_pricelist"}; } sub select_item { my %hiddens; my @column_index = qw(ndx partnumber description partsgroup unit sellprice lastcost); my %column_data; $column_data{ndx} = ' '; $column_data{partnumber} = locale->text('Number'); $column_data{description} = $locale->text('Description'); $column_data{partsgroup} = $locale->text('Group'); $column_data{unit} = $locale->text('Unit'); $column_data{sellprice} = $locale->text('Sell Price'); $column_data{lastcost} = $locale->text('Cost'); $form->{title} = $locale->text('Select items'); my $i = 0; my @rows; foreach $ref ( @{ $form->{item_list} } ) { $i++; my %column_data; for (qw(partnumber description unit)) { $ref->{$_} = $form->quote( $ref->{$_} ); } $column_data{ndx} = {input => { name => "ndx_$i", type => 'checkbox', value => $i, }}; $column_data{$_} = $ref->{$_} foreach qw(partnumber description partsgroup unit); $column_data{sellprice} = $form->format_amount( \%myconfig, $ref->{sellprice}, 2, ' ' ); $column_data{lastcost} = $form->format_amount( \%myconfig, $ref->{lastcost}, 2, ' ' ); $j++; $j %= 2; $column_data{i} = $j; push @rows, \%column_data; $hiddens{"new_${_}_$i"} = $ref->{$_} foreach qw(partnumber description partsgroup partsgroup_id sellprice lastcost unit id); } # delete action variable for (qw(nextsub item_list)) { delete $form->{$_} } $form->{action} = "item_selected"; $hiddens{$_} = $form->{$_} foreach sort keys %$form; $hiddens{nextsub} = 'item_selected'; $hiddens{lastndx} = $i; my @buttons = ({ name => 'action', value => 'item_selected', text => $locale->text('Continue'), }); my $template = LedgerSMB::Template->new_UI( user => \%myconfig, locale => $locale, template => 'form-dynatable', ); $template->render({ form => $form, user => \%myconfig, hiddens => \%hiddens, buttons => \@buttons, options => \@options, rows => \@rows, columns => \@column_index, heading => \%column_header, }); } sub item_selected { # add rows $i = $form->{rowcount}; %id = (); for $i ( 1 .. $form->{rowcount} - 1 ) { $id{ $form->{"id_$i"} } = 1; } for $j ( 1 .. $form->{lastndx} ) { if ( $form->{"ndx_$j"} ) { if ( $id{ $form->{"new_id_$j"} } ) { next if $form->{db} eq 'vendor'; } for (qw(id partnumber description unit sellprice lastcost)) { $form->{"${_}_$i"} = $form->{"new_${_}_$j"}; } $form->{"partsgroup_$i"} = qq|$form->{"new_partsgroup_$j"}--$form->{"new_partsgroup_id_$j"}|; $form->{"sku_$i"} = $form->{"new_partnumber_$j"}; $i++; } } $form->{rowcount} = $i; # delete all the new_ variables for $i ( 1 .. $form->{lastndx} ) { for ( qw(id partnumber description unit sellprice lastcost partsgroup partsgroup_id) ) { delete $form->{"new_${_}_$i"}; } delete $form->{"ndx_$i"}; } for (qw(ndx lastndx nextsub)) { delete $form->{$_} } &{"$form->{db}_pricelist"}; } sub save_pricelist { &{"CT::save_$form->{db}"}( "", \%myconfig, \%$form ); $callback = $form->{callback}; $form->{callback} = "$form->{script}?action=edit"; for (qw(db id login path sessionid)) { $form->{callback} .= "&$_=$form->{$_}"; } $form->{callback} .= "&callback=" . $form->escape( $callback, 1 ); if ( CT->save_pricelist( \%myconfig, \%$form ) ) { $form->redirect; } else { $form->error( $locale->text('Could not save pricelist!') ); } } sub add_transaction { $form->isblank( "name", $locale->text("Name missing!") ); &{"CT::save_$form->{db}"}( "", \%myconfig, \%$form ); $form->{callback} = $form->escape( $form->{callback}, 1 ); $name = $form->escape( $form->{name}, 1 ); $form->{callback} = "$form->{script}?login=$form->{login}&path=$form->{path}&sessionid=$form->{sessionid}&action=add&vc=$form->{db}&$form->{db}_id=$form->{id}&$form->{db}=$name&type=$form->{type}&callback=$form->{callback}"; $form->redirect; } sub ap_transaction { $form->{script} = "ap.pl"; $form->{type} = "ap_transaction"; &add_transaction; } sub ar_transaction { $form->{script} = "ar.pl"; $form->{type} = "ar_transaction"; &add_transaction; } sub sales_invoice { $form->{script} = "is.pl"; $form->{type} = "invoice"; &add_transaction; } sub pos { $form->{script} = "ps.pl"; $form->{type} = "pos_invoice"; &add_transaction; } sub vendor_invoice { $form->{script} = "ir.pl"; $form->{type} = "invoice"; &add_transaction; } sub rfq { $form->{script} = "oe.pl"; $form->{type} = "request_quotation"; &add_transaction; } sub quotation { $form->{script} = "oe.pl"; $form->{type} = "sales_quotation"; &add_transaction; } sub sales_order { $form->{script} = "oe.pl"; $form->{type} = "sales_order"; &add_transaction; } sub purchase_order { $form->{script} = "oe.pl"; $form->{type} = "purchase_order"; &add_transaction; } sub save_as_new { delete $form->{id}; &save; } sub save { # $locale->text('Customer saved!') # $locale->text('Vendor saved!') $msg = ucfirst $form->{db}; $msg .= " saved!"; $form->isblank( "name", $locale->text("Name missing!") ); &{"CT::save_$form->{db}"}( "", \%myconfig, \%$form ); $form->redirect( $locale->text($msg) ); } sub delete { # $locale->text('Customer deleted!') # $locale->text('Cannot delete customer!') # $locale->text('Vendor deleted!') # $locale->text('Cannot delete vendor!') CT->delete( \%myconfig, \%$form ); $msg = ucfirst $form->{db}; $msg .= " deleted!"; $form->redirect( $locale->text($msg) ); } sub continue { &{ $form->{nextsub} } } sub add_customer { &add } sub add_vendor { &add }