X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FOE.pm;h=28e3975c3c1163991f8e79a2918815ea4d7ec81f;hb=89c9ff022d3f13e27ba6bda085df15707fcfb0eb;hp=f5f439fce4f37b31e5440d6e5ca1da8059408107;hpb=777d9b30c494c0a6dfd86e638c16ef8b27658ed9;p=kivitendo-erp.git diff --git a/SL/OE.pm b/SL/OE.pm index f5f439fce..28e3975c3 100644 --- a/SL/OE.pm +++ b/SL/OE.pm @@ -35,25 +35,16 @@ package OE; use List::Util qw(max first); +use YAML; + use SL::AM; use SL::Common; use SL::CVar; +use SL::DB::PeriodicInvoicesConfig; use SL::DBUtils; use SL::IC; -=head1 NAME - -OE.pm - Order entry module - -=head1 DESCRIPTION - -OE.pm is part of the OE module. OE is responsible for sales and purchase orders, as well as sales quotations and purchase requests. This file abstracts the database tables C and C. - -=head1 FUNCTIONS - -=over 4 - -=cut +use strict; sub transactions { $main::lxdebug->enter_sub(); @@ -70,11 +61,17 @@ sub transactions { my @values; my $where; + my ($periodic_invoices_columns, $periodic_invoices_joins); + my $rate = ($form->{vc} eq 'customer') ? 'buy' : 'sell'; if ($form->{type} =~ /_quotation$/) { $quotation = '1'; $ordnumber = 'quonumber'; + + } elsif ($form->{type} eq 'sales_order') { + $periodic_invoices_columns = qq| , COALESCE(pcfg.active, 'f') AS periodic_invoices |; + $periodic_invoices_joins = qq| LEFT JOIN periodic_invoices_configs pcfg ON (o.id = pcfg.oe_id) |; } my $vc = $form->{vc} eq "customer" ? "customer" : "vendor"; @@ -88,7 +85,8 @@ sub transactions { qq| ex.$rate AS exchangerate, | . qq| pr.projectnumber AS globalprojectnumber, | . qq| e.name AS employee, s.name AS salesman, | . - qq| ct.country, ct.ustid | . + qq| ct.${vc}number AS vcnumber, ct.country, ct.ustid | . + $periodic_invoices_columns . qq|FROM oe o | . qq|JOIN $vc ct ON (o.${vc}_id = ct.id) | . qq|LEFT JOIN employee e ON (o.employee_id = e.id) | . @@ -96,6 +94,7 @@ sub transactions { qq|LEFT JOIN exchangerate ex ON (ex.curr = o.curr | . qq| AND ex.transdate = o.transdate) | . qq|LEFT JOIN project pr ON (o.globalproject_id = pr.id) | . + qq|$periodic_invoices_joins | . qq|WHERE (o.quotation = ?) |; push(@values, $quotation); @@ -134,6 +133,10 @@ SQL push(@values, '%' . $form->{$vc} . '%'); } + if (!$main::auth->assert('sales_all_edit', 1)) { + $query .= " AND o.employee_id = (select id from employee where login= ?)"; + push @values, $form->{login}; + } if ($form->{employee_id}) { $query .= " AND o.employee_id = ?"; push @values, conv_i($form->{employee_id}); @@ -186,6 +189,11 @@ SQL push(@values, '%' . $form->{transaction_description} . '%'); } + if ($form->{periodic_invoices_active} ne $form->{periodic_invoices_inactive}) { + my $not = 'NOT' if ($form->{periodic_invoices_inactive}); + $query .= qq| AND ${not} COALESCE(pcfg.active, 'f')|; + } + my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; my $sortorder = join(', ', map { "${_} ${sortdir} " } ("o.id", $form->sort_columns("transdate", $ordnumber, "name"))); my %allowed_sort_columns = ( @@ -267,7 +275,7 @@ sub save { my ($self, $myconfig, $form) = @_; # connect to database, turn off autocommit - my $dbh = $form->dbconnect_noauto($myconfig); + my $dbh = $form->get_standard_dbh; my ($query, @values, $sth, $null); my $exchangerate = 0; @@ -345,8 +353,9 @@ sub save { my $baseqty = $form->{"qty_$i"} * $basefactor; $form->{"marge_percent_$i"} = $form->parse_amount($myconfig, $form->{"marge_percent_$i"}) * 1; - $form->{"marge_total_$i"} = $form->parse_amount($myconfig, $form->{"marge_total_$i"}) * 1; - $form->{"lastcost_$i"} = $form->{"lastcost_$i"} * 1; + $form->{"marge_absolut_$i"} = $form->parse_amount($myconfig, $form->{"marge_absolut_$i"}) * 1; + + $form->{"lastcost_$i"} = $form->parse_amount($myconfig, $form->{"lastcost_$i"}); # set values to 0 if nothing entered $form->{"discount_$i"} = $form->parse_amount($myconfig, $form->{"discount_$i"}) / 100; @@ -436,7 +445,7 @@ sub save { $form->{"serialnumber_$i"}, $form->{"ship_$i"}, conv_i($pricegroup_id), $form->{"ordnumber_$i"}, conv_date($form->{"transdate_$i"}), $form->{"cusordnumber_$i"}, $form->{"subtotal_$i"} ? 't' : 'f', - $form->{"marge_percent_$i"}, $form->{"marge_total_$i"}, + $form->{"marge_percent_$i"}, $form->{"marge_absolut_$i"}, $form->{"lastcost_$i"}, conv_i($form->{"price_factor_id_$i"}), conv_i($form->{"price_factor_id_$i"}), conv_i($form->{"marge_price_factor_$i"})); @@ -553,16 +562,50 @@ sub save { $form->{saved_xyznumber} = $form->{$form->{type} =~ /_quotation$/ ? "quonumber" : "ordnumber"}; - Common::webdav_folder($form) if ($main::webdav); + Common::webdav_folder($form); my $rc = $dbh->commit; - $dbh->disconnect; + + $self->save_periodic_invoices_config(dbh => $dbh, + oe_id => $form->{id}, + config_yaml => $form->{periodic_invoices_config}) + if ($form->{type} eq 'sales_order'); $main::lxdebug->leave_sub(); return $rc; } +sub save_periodic_invoices_config { + my ($self, %params) = @_; + + return if !$params{oe_id}; + + my $config = $params{config_yaml} ? YAML::Load($params{config_yaml}) : undef; + return if 'HASH' ne ref $config; + + my $obj = SL::DB::Manager::PeriodicInvoicesConfig->find_by(oe_id => $params{oe_id}) + || SL::DB::PeriodicInvoicesConfig->new(oe_id => $params{oe_id}); + $obj->update_attributes(%{ $config }); +} + +sub load_periodic_invoice_config { + my $self = shift; + my $form = shift; + + delete $form->{periodic_invoices_config}; + + if ($form->{id}) { + my $config_obj = SL::DB::Manager::PeriodicInvoicesConfig->find_by(oe_id => $form->{id}); + + if ($config_obj) { + my $config = { map { $_ => $config_obj->$_ } qw(active terminated periodicity start_date_as_date end_date_as_date extend_automatically_by ar_chart_id + print printer_id copies) }; + $form->{periodic_invoices_config} = YAML::Dump($config); + } + } +} + sub _close_quotations_rfqs { $main::lxdebug->enter_sub(); @@ -612,7 +655,7 @@ sub _close_quotations_rfqs { sub delete { $main::lxdebug->enter_sub(); - my ($self, $myconfig, $form, $spool) = @_; + my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect_noauto($myconfig); @@ -635,6 +678,10 @@ sub delete { # delete-values @values = (conv_i($form->{id})); + # periodic invoices and their configuration + do_query($form, $dbh, qq|DELETE FROM periodic_invoices WHERE config_id IN (SELECT id FROM periodic_invoices_configs WHERE oe_id = ?)|, @values); + do_query($form, $dbh, qq|DELETE FROM periodic_invoices_configs WHERE oe_id = ?|, @values); + # delete status entries $query = qq|DELETE FROM status | . qq|WHERE trans_id = ?|; @@ -658,6 +705,7 @@ sub delete { $dbh->disconnect; if ($rc) { + my $spool = $::lx_office_conf{paths}->{spool}; foreach $spoolfile (@spoolfiles) { unlink "$spool/$spoolfile" if $spoolfile; } @@ -674,7 +722,7 @@ sub retrieve { my ($self, $myconfig, $form) = @_; # connect to database - my $dbh = $form->dbconnect_noauto($myconfig); + my $dbh = $form->get_standard_dbh; my ($query, $query_add, @values, @ids, $sth); @@ -945,32 +993,17 @@ sub retrieve { $form->{exchangerate} = $form->get_exchangerate($dbh, $form->{currency}, $form->{transdate}, ($form->{vc} eq 'customer') ? "buy" : "sell"); - Common::webdav_folder($form) if ($main::webdav); + Common::webdav_folder($form); + + $self->load_periodic_invoice_config($form); my $rc = $dbh->commit; - $dbh->disconnect; $main::lxdebug->leave_sub(); return $rc; } -=item retrieve_simple PARAMS - -simple OE retrieval by id. does not look up customer, vendor, units or any other stuff. only oe and orderitems. - - my $order = retrieve_simple(id => 2); - - $order => { - %_OE_CONTENT, - orderitems => [ - %_ORDERITEM_ROW_1, - %_ORDERITEM_ROW_2, - ... - ] - } - -=cut sub retrieve_simple { $main::lxdebug->enter_sub(); @@ -1025,7 +1058,7 @@ sub order_details { my %oid = ('Pg' => 'oid', 'Oracle' => 'rowid'); - my (@project_ids, %projectnumbers); + my (@project_ids, %projectnumbers, %projectdescriptions); push(@project_ids, $form->{"globalproject_id"}) if ($form->{"globalproject_id"}); @@ -1057,16 +1090,18 @@ sub order_details { } if (@project_ids) { - $query = "SELECT id, projectnumber FROM project WHERE id IN (" . + $query = "SELECT id, projectnumber, description FROM project WHERE id IN (" . join(", ", map("?", @project_ids)) . ")"; $sth = prepare_execute_query($form, $dbh, $query, @project_ids); while (my $ref = $sth->fetchrow_hashref()) { $projectnumbers{$ref->{id}} = $ref->{projectnumber}; + $projectdescriptions{$ref->{id}} = $ref->{description}; } $sth->finish(); } $form->{"globalprojectnumber"} = $projectnumbers{$form->{"globalproject_id"}}; + $form->{"globalprojectdescription"} = $projectdescriptions{$form->{"globalproject_id"}}; $form->{discount} = []; @@ -1079,7 +1114,7 @@ sub order_details { qw(runningnumber number description longdescription qty ship unit bin partnotes serialnumber reqdate sellprice listprice netprice discount p_discount discount_sub nodiscount_sub - linetotal nodiscount_linetotal tax_rate projectnumber + linetotal nodiscount_linetotal tax_rate projectnumber projectdescription price_factor price_factor_name partsgroup); push @arrays, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs }; @@ -1187,6 +1222,7 @@ sub order_details { push @{ $form->{TEMPLATE_ARRAYS}->{nodiscount_linetotal} }, $form->format_amount($myconfig, $nodiscount_linetotal, 2); push(@{ $form->{TEMPLATE_ARRAYS}->{projectnumber} }, $projectnumbers{$form->{"project_id_$i"}}); + push(@{ $form->{TEMPLATE_ARRAYS}->{projectdescription} }, $projectdescriptions{$form->{"project_id_$i"}}); my ($taxamount, $taxbase); my $taxrate = 0; @@ -1225,13 +1261,13 @@ sub order_details { } $query = qq|SELECT p.partnumber, p.description, p.unit, a.qty, | . - qq|pg.partsgroup | . - qq|FROM assembly a | . - qq| JOIN parts p ON (a.parts_id = p.id) | . - qq| LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) | . - qq| WHERE a.bom = '1' | . - qq| AND a.id = ? | . $sortorder; - @values = ($form->{"id_$i"}); + qq|pg.partsgroup | . + qq|FROM assembly a | . + qq| JOIN parts p ON (a.parts_id = p.id) | . + qq| LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) | . + qq| WHERE a.bom = '1' | . + qq| AND a.id = ? | . $sortorder; + @values = ($form->{"id_$i"}); $sth = $dbh->prepare($query); $sth->execute(@values) || $form->dberror($query); @@ -1306,3 +1342,36 @@ sub project_description { } 1; + +__END__ + +=head1 NAME + +OE.pm - Order entry module + +=head1 DESCRIPTION + +OE.pm is part of the OE module. OE is responsible for sales and purchase orders, as well as sales quotations and purchase requests. This file abstracts the database tables C and C. + +=head1 FUNCTIONS + +=over 4 + +=item retrieve_simple PARAMS + +simple OE retrieval by id. does not look up customer, vendor, units or any other stuff. only oe and orderitems. + + my $order = retrieve_simple(id => 2); + + $order => { + %_OE_CONTENT, + orderitems => [ + %_ORDERITEM_ROW_1, + %_ORDERITEM_ROW_2, + ... + ] + } + +=back + +=cut