- 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_contact_new($request)
- Saves contact info as a new line as per save_contact above.
- =cut
- sub save_contact_new{
- my ($request) = @_;
- delete $request->{old_contact};
- delete $request->{old_contact_class};
- save_contact($request);
- }
- =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;
|