From a2fe34ab7ed7d1f7dffc13d09d76a9b15e25abc8 Mon Sep 17 00:00:00 2001 From: einhverfr Date: Tue, 9 Sep 2008 22:17:46 +0000 Subject: Refactored code for customers and vendors for better maintenance and customizability git-svn-id: https://ledger-smb.svn.sourceforge.net/svnroot/ledger-smb/trunk@2318 4979c152-3d1c-0410-bac9-87ea11338e46 --- LedgerSMB/ScriptLib/Company.pm | 483 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 483 insertions(+) create mode 100644 LedgerSMB/ScriptLib/Company.pm (limited to 'LedgerSMB/ScriptLib') diff --git a/LedgerSMB/ScriptLib/Company.pm b/LedgerSMB/ScriptLib/Company.pm new file mode 100644 index 00000000..e888c283 --- /dev/null +++ b/LedgerSMB/ScriptLib/Company.pm @@ -0,0 +1,483 @@ +package LedgerSMB::ScriptLib::Company; +use LedgerSMB::Template; + +my $ec_labels = { + 1 => 'Vendor', + 2 => 'Customer', +}; + +=pod + +=head1 NAME + +LedgerSMB::ScriptLib::Company - LedgerSMB class defining the Controller +functions, template instantiation and rendering for vendor and customer editing +and display. This would also form the basis for other forms of company +contacts. + +=head1 SYOPSIS + +This module is the UI controller for the vendor DB access; it provides the +View interface, as well as defines the Save vendor. +Save vendor/customer will update or create as needed. + + +=head1 METHODS + +=over + +=item set_entity_class($request) returns int entity class + +Errors if not inherited. Inheriting classes MUST define this to set +$entity_class appropriately. + +=back + +=cut + +sub set_entity_class { + my ($request) = @_; + $request->{_script_handle}->set_entity_class(@_) || $request->error( + "Error: Cannot call LedgerSMB::ScriptLib::Company::set_entity_class " . + "directly!"); +} + +=pod + +=over + +=item new_company($request) + +returns object inheriting LedgerSMB::DBObject::Company + +This too must be defined in classes that inherit this class. + +=back + +=cut + +sub new_company { + my ($request) = @_; + $request->{_script_handle}->new_company(@_) || $request->error( + "Error: Cannot call LedgerSMB::ScriptLib::Company::new_company " . + "directly!"); +} + +=pod + +=over + +=item get($self, $request, $user) + +Requires form var: id + +Extracts a single company from the database, using its company ID as the primary +point of uniqueness. Shows (appropriate to user privileges) and allows editing +of the company informations. + +=back + +=cut + +sub get { + + my ($request) = @_; + my $company = new_company($request); + + set_entity_class($company); + $company->get(); + $company->get_credit_id(); + $company->get_metadata(); + _render_main_screen($company); +} + +=pod + +=over + +=item add_location + +Adds a location to the company as defined in the inherited object + +=back + +=cut + +sub add_location { + my ($request) = @_; + my $company = new_company($request); + set_entity_class($company); + $company->save_location(); + $company->get(); + + + $company->get_metadata(); + + _render_main_screen($company); + +} + +=pod + +=over + +=item generate_control_code + +Sets $company->{control_code} equal to the next in the series of entity_control +values + +=back + +=cut + +sub generate_control_code { + my ($request) = @_; + my $company = new_company($request); + + my ($ref) = $company->call_procedure( + procname => 'setting_increment', + args => ['entity_control'] + ); + ($company->{control_code}) = values %$ref; + $company->{dbh}->commit; + if ($company->{meta_number}){ + edit($company); + } else { + _render_main_screen($company); + } + +} + +=pod + +=over + +=item add + +This method creates a blank screen for entering a company's information. + +=back + +=cut + +sub add { + my ($request) = @_; + my $company = new_company($request); + set_entity_class($company); + _render_main_screen($company); +} + +=pod + +=over + +=item get_result($self, $request, $user) + +Requires form var: search_pattern + +Directly calls the database function search, and returns a set of all vendors +found that match the search parameters. Search parameters search over address +as well as vendor/Company name. + +=back + +=cut + +sub get_results { + my ($request) = @_; + + my $company = new_company($request); + set_entity_class($company); + $company->{contact_info} = + qq|{"%$request->{email}%","%$request->{phone}%"}|; + my $results = $company->search(); + if ($company->{order_by}){ + # TODO: Set ordering logic + }; + + # URL Setup + my $baseurl = "$request->{script}"; + my $search_url = "$base_url?action=get_results"; + my $get_url = "$base_url?action=get&account_class=$request->{account_class}"; + for (keys %$vendor){ + next if $_ eq 'order_by'; + $search_url .= "&$_=$form->{$_}"; + } + + # Column definitions for dynatable + @columns = qw(legal_name meta_number business_type curr); + my %column_heading; + $column_heading{legal_name} = { + text => $request->{_locale}->text('Name'), + href => "$search_url&order_by=legal_name", + }; + $column_heading{meta_number} = { + text => $request->{_locale}->text('Vendor Number'), + href => "$search_url&order_by=meta_number", + }; + $column_heading{business_type} = { + text => $request->{_locale}->text('Business Type'), + href => "$search_url&order_by=business_type", + }; + $column_heading{curr} = { + text => $request->{_locale}->text('Currency'), + href => "$search_url&order_by=curr", + }; + + my @rows; + for $ref (@{$company->{search_results}}){ + push @rows, + {legal_name => $ref->{legal_name}, + meta_number => {text => $ref->{meta_number}, + href => "$get_url&entity_id=$ref->{entity_id}" . "&meta_number=$ref->{meta_number}" + }, + business_type => $ref->{business_type}, + curr => $ref->{curr}, + }; + } +# CT: The CSV Report is broken. I get: +# Not an ARRAY reference at +# /usr/lib/perl5/site_perl/5.8.8/CGI/Simple.pm line 423 +# Disabling the button for now. + my @buttons = ( +# {name => 'action', +# value => 'csv_company_list', +# text => $company->{_locale}->text('CSV Report'), +# type => 'submit', +# class => 'submit', +# }, + {name => 'action', + value => 'add', + text => $company->{_locale}->text('Add Vendor'), + type => 'submit', + class => 'submit', + } + ); + + my $template = LedgerSMB::Template->new( + user => $user, + path => 'UI' , + template => 'form-dynatable', + locale => $company->{_locale}, + format => ($request->{FORMAT}) ? $request->{FORMAT} : 'HTML', + ); + + $template->render({ + form => $company, + columns => \@columns, + hiddens => $company, + buttons => \@buttons, + heading => \%column_heading, + rows => \@rows, + }); +} + +=pod + +=over + +=item csv_company_list($request) + +Generates CSV report (not working at present) + +=back + +=cut + +sub csv_company_list { + my ($request) = @_; + $request->{FORMAT} = 'CSV'; + get_results($request); +} + +=pod + +=over + +=item save($self, $request, $user) + +Saves a company to the database. The function will update or insert a new +company as needed, and will generate a new Company ID for the company if needed. + +=back + +=cut + +sub save { + + my ($request) = @_; + + my $company = new_company($request); + $company->save(); + _render_main_screen($company); +} + +=pod + +=over + +=item save_credit($request) + +This inserts or updates a credit account of the sort listed here. + +=back + +=cut + +sub save_credit { + + my ($request) = @_; + + my $company = new_company($request); + $company->save_credit(); + $company->get(); + _render_main_screen($company); +} + +=pod + +=over + +=item save_credit_new($request) + +This inserts a new credit account. + +=back + +=cut + + +sub save_credit_new { + my ($request) = @_; + $request->{credit_id} = undef; + save_credit($request); +} + +=pod + +=over + +=item edit($request) + +Displays a company for editing. Needs the following to be set: +entity_id, account_class, and meta_number. + +=back + +=cut + +sub edit{ + my $request = shift @_; + my $company = LedgerSMB::DBObject::Vendor->new({base => $request}); + $company->get(); + _render_main_screen($company); +} + +=pod + +=over + +=item PRIVATE _render_main_screen($company) + +Pulls relevant data from db and renders the data entry screen for it. + +=back + +=cut + +sub _render_main_screen{ + my $company = shift @_; + $company->get_metadata(); + + $company->{creditlimit} = "$company->{creditlimit}"; + $company->{discount} = "$company->{discount}"; + $company->{note_class_options} = [ + {label => 'Entity', value => 1}, + {label => $ec_labels->{"$company->{entity_class}"} . ' Account', + value => 3}, + ]; + $company->{threshold} = $company->format_amount(amount => $company->{threshold}); + + my $template = LedgerSMB::Template->new( + user => $company->{_user}, + template => 'contact', + locale => $company->{_locale}, + path => 'UI/Contact', + format => 'HTML' + ); + $template->render($company); +} + +=pod + +=over + +=item search($request) + +Renders the search criteria screen. + +=back + +=cut + +sub search { + my ($request) = @_; + set_entity_class($request); + my $template = LedgerSMB::Template->new( + user => $request->{_user}, + template => 'search', + locale => $request->{_locale}, + path => 'UI/Contact', + format => 'HTML' + ); + $template->render($request); +} + +=pod + +=over + +=item save_contact($request) + +Saves contact info as per LedgerSMB::DBObject::Company::save_contact. + +=back + +=cut + +sub save_contact { + my ($request) = @_; + my $company = new_company($request); + $company->save_contact(); + $company->get; + _render_main_screen($company ); +} + +=pod + +=over + +=item save_bank_account($request) + +Adds a bank account to a company and, if defined, an entity credit account. + +=back + +=cut + +sub save_bank_account { + my ($request) = @_; + my $company = new_company($request); + $company->save_bank_account(); + $company->get; + _render_main_screen($company ); +} + +sub save_notes { + my ($request) = @_; + my $company = new_company($company); + $company->save_notes(); + $company->get(); + _render_main_screen($company ); +} +1; -- cgit v1.2.3