X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fic.pl;h=f83d42a53b948127361e189caa5d076a5aeb6b3e;hb=74959706407d96a119832a3c807ee4d4d2c53639;hp=17d589f56e3660f0c00754875fd90236763dbcc2;hpb=d331a3d77f0b24a301412799d2e9cc5fa1bf27ba;p=kivitendo-erp.git diff --git a/bin/mozilla/ic.pl b/bin/mozilla/ic.pl index 17d589f56..f83d42a53 100644 --- a/bin/mozilla/ic.pl +++ b/bin/mozilla/ic.pl @@ -39,6 +39,7 @@ use SL::AM; use SL::CVar; use SL::IC; use SL::Helper::Flash; +use SL::HTML::Util; use SL::ReportGenerator; #use SL::PE; @@ -94,7 +95,7 @@ sub add { sub search { $lxdebug->enter_sub(); - $auth->assert('part_service_assembly_edit'); + $auth->assert('part_service_assembly_details'); $form->{revers} = 0; # switch for backward sorting $form->{lastsort} = ""; # memory for which table was sort at last time @@ -106,8 +107,6 @@ sub search { $form->{title} = $locale->text($form->{title}); $form->{title} = $locale->text('Assemblies') if ($is_xyz{is_assembly}); - $form->{jsscript} = 1; - $form->{CUSTOM_VARIABLES} = CVar->get_configs('module' => 'IC'); ($form->{CUSTOM_VARIABLES_FILTER_CODE}, $form->{CUSTOM_VARIABLES_INCLUSION_CODE}) = CVar->render_search_options('variables' => $form->{CUSTOM_VARIABLES}, @@ -289,12 +288,9 @@ sub update_prices { # $form->header; # # print qq| +#

| . $locale->text('choice part') . qq|

#
# -# -# -# -# # # # @@ -723,11 +719,9 @@ sub addtop100 { my $colspan = $#column_index + 1; print qq| +

$form->{title}

+
| . $locale->text('choice part') . qq|
 | . $locale->text('Part Number') . qq|
- - - - @@ -1011,7 +1005,7 @@ sub addtop100 { sub generate_report { $lxdebug->enter_sub(); - $auth->assert('part_service_assembly_edit'); + $auth->assert('part_service_assembly_details'); my ($revers, $lastsort, $description); @@ -1029,6 +1023,7 @@ sub generate_report { 'drawing' => { 'text' => $locale->text('Drawing'), }, 'ean' => { 'text' => $locale->text('EAN'), }, 'image' => { 'text' => $locale->text('Image'), }, + 'insertdate' => { 'text' => $locale->text('Insert Date'), }, 'invnumber' => { 'text' => $locale->text('Invoice Number'), }, 'lastcost' => { 'text' => $locale->text('Last Cost'), }, 'linetotallastcost' => { 'text' => $locale->text('Extended'), }, @@ -1047,9 +1042,11 @@ sub generate_report { 'sellprice' => { 'text' => $locale->text('Sell Price'), }, 'serialnumber' => { 'text' => $locale->text('Serial Number'), }, 'soldtotal' => { 'text' => $locale->text('Qty in Selected Records'), }, + 'name' => { 'text' => $locale->text('Name in Selected Records'), }, 'transdate' => { 'text' => $locale->text('Transdate'), }, 'unit' => { 'text' => $locale->text('Unit'), }, 'weight' => { 'text' => $locale->text('Weight'), }, + 'shop' => { 'text' => $locale->text('Shopartikel'), }, 'projectnumber' => { 'text' => $locale->text('Project Number'), }, 'projectdescription' => { 'text' => $locale->text('Project Description'), }, ); @@ -1134,11 +1131,13 @@ sub generate_report { microfiche => $locale->text('Microfiche') . ": '$form->{microfiche}'", l_soldtotal => $locale->text('Qty in Selected Records'), ean => $locale->text('EAN') . ": '$form->{ean}'", + insertdatefrom => $locale->text('Insert Date') . ": " . $locale->text('From') . " " . $locale->date(\%myconfig, $form->{insertdatefrom}, 1), + insertdateto => $locale->text('Insert Date') . ": " . $locale->text('To (time)') . " " . $locale->date(\%myconfig, $form->{insertdateto}, 1), ); my @itemstatus_keys = qw(active obsolete orphaned onhand short); my @callback_keys = qw(onorder ordered rfq quoted bought sold partnumber partsgroup partsgroup_id serialnumber description make model - drawing microfiche l_soldtotal l_deliverydate transdatefrom transdateto ean); + drawing microfiche l_soldtotal l_deliverydate transdatefrom transdateto insertdatefrom insertdateto ean shop); # calculate dependencies for (@itemstatus_keys, @callback_keys) { @@ -1196,15 +1195,27 @@ sub generate_report { # soldtotal doesn't make sense with more than one bsooqr option. # so reset it to sold (the most common option), and issue a warning + # ... + # also it doesn't make sense without bsooqr. disable and issue a warning too my @bsooqr = qw(sold bought onorder ordered rfq quoted); - if ($form->{l_subtotal} && 1 < grep { $form->{$_} } @bsooqr) { + my $bsooqr_mode = grep { $form->{$_} } @bsooqr; + if ($form->{l_subtotal} && 1 < $bsooqr_mode) { my $enabled = first { $form->{$_} } @bsooqr; $form->{$_} = '' for @bsooqr; $form->{$enabled} = 'Y'; push @options, $::locale->text('Subtotal cannot distinguish betweens record types. Only one of the selected record types will be displayed: #1', $optiontexts{$enabled}); } + if ($form->{l_soldtotal} && !$bsooqr_mode) { + delete $form->{l_soldtotal}; + + flash('warning', $::locale->text('Soldtotal does not make sense without any bsooqr options')); + } + if ($form->{l_name} && !$bsooqr_mode) { + delete $form->{l_name}; + flash('warning', $::locale->text('Name does not make sense without any bsooqr options')); + } IC->all_parts(\%myconfig, \%$form); my @columns = qw( @@ -1212,6 +1223,7 @@ sub generate_report { linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost priceupdate weight image drawing microfiche invnumber ordnumber quonumber transdate name serialnumber deliverydate ean projectnumber projectdescription + insertdate shop ); my $pricegroups = SL::DB::Manager::Pricegroup->get_all(sort => 'id'); @@ -1236,10 +1248,10 @@ sub generate_report { %column_defs = (%column_defs, %column_defs_cvars, %column_defs_pricegroups); map { $column_defs{$_}->{visible} ||= $form->{"l_$_"} ? 1 : 0 } @columns; - map { $column_defs{$_}->{align} = 'right' } qw(onhand sellprice listprice lastcost linetotalsellprice linetotallastcost linetotallistprice rop weight soldtotal), @pricegroup_columns; + map { $column_defs{$_}->{align} = 'right' } qw(onhand sellprice listprice lastcost linetotalsellprice linetotallastcost linetotallistprice rop weight soldtotal shop), @pricegroup_columns; my @hidden_variables = ( - qw(l_subtotal l_linetotal searchitems itemstatus bom l_pricegroups), + qw(l_subtotal l_linetotal searchitems itemstatus bom l_pricegroups insertdatefrom insertdateto), @itemstatus_keys, @callback_keys, map({ "cvar_$_->{name}" } @searchable_custom_variables), @@ -1249,7 +1261,7 @@ sub generate_report { my $callback = build_std_url('action=generate_report', grep { $form->{$_} } @hidden_variables); - my @sort_full = qw(partnumber description onhand soldtotal deliverydate); + my @sort_full = qw(partnumber description onhand soldtotal deliverydate insertdate shop); my @sort_no_revers = qw(partsgroup bin priceupdate invnumber ordnumber quonumber name image drawing serialnumber); foreach my $col (@sort_full) { @@ -1268,7 +1280,7 @@ sub generate_report { 'assembly' => $locale->text('assembly_list'), ); - $report->set_options('top_info_text' => $locale->text('Options') . ': ' . join(', ', grep $_, @options), + $report->set_options('raw_top_info_text' => $form->parse_html_template('ic/generate_report_top', { options => \@options }), 'raw_bottom_info_text' => $form->parse_html_template('ic/generate_report_bottom'), 'output_format' => 'HTML', 'title' => $form->{title}, @@ -1318,7 +1330,7 @@ sub generate_report { $ref->{lastcost} *= $ref->{exchangerate} / $ref->{price_factor}; # use this for assemblies - my $soldtotal = $ref->{soldtotal}; + my $soldtotal = $bsooqr_mode ? $ref->{soldtotal} : $ref->{onhand}; if ($ref->{assemblyitem}) { $row->{partnumber}{align} = 'right'; @@ -1343,6 +1355,11 @@ sub generate_report { $row->{weight}->{data} .= ' ' . $defaults->{weightunit}; + # 'yes' and 'no' for boolean value shop + if ($form->{l_shop}) { + $row->{shop}{data} = $row->{shop}{data}? $::locale->text('yes') : $::locale->text('no'); + } + if (!$ref->{assemblyitem}) { foreach my $col (@subtotal_columns) { $totals{$col} += $soldtotal * $ref->{$col}; @@ -1356,8 +1373,8 @@ sub generate_report { if ($ref->{module} eq 'oe') { # für oe gibt es vier fälle, jeweils nach kunde oder lieferant unterschiedlich: # - # | ist bestellt | Vom Kunde bestellt | -> edit_oe_ord_link - # | Anfrage | Angebot | -> edit_oe_quo_link + # | ist bestellt | Von Kunden bestellt | -> edit_oe_ord_link + # | Anfrage | Angebot | -> edit_oe_quo_link my $edit_oe_ord_link = build_std_url("script=oe.pl", 'action=edit', 'type=' . E($ref->{cv} eq 'vendor' ? 'purchase_order' : 'sales_order'), 'id=' . E($ref->{trans_id}), 'callback'); my $edit_oe_quo_link = build_std_url("script=oe.pl", 'action=edit', 'type=' . E($ref->{cv} eq 'vendor' ? 'request_quotation' : 'sales_quotation'), 'id=' . E($ref->{trans_id}), 'callback'); @@ -1376,6 +1393,8 @@ sub generate_report { } map { $row->{$_}{link} = $ref->{$_} } qw(drawing microfiche); + $row->{notes}{data} = SL::HTML::Util->strip($ref->{notes}); + $report->add_data($row); my $next_ref = $form->{parts}[$idx + 1]; @@ -1463,7 +1482,7 @@ sub parts_subtotal { sub edit { $lxdebug->enter_sub(); - $auth->assert('part_service_assembly_edit'); + $auth->assert('part_service_assembly_details'); # show history button $form->{javascript} = qq||; @@ -1484,7 +1503,7 @@ sub edit { sub link_part { $lxdebug->enter_sub(); - $auth->assert('part_service_assembly_edit'); + $auth->assert('part_service_assembly_details'); IC->create_links("IC", \%myconfig, \%$form); @@ -1574,7 +1593,7 @@ sub link_part { sub form_header { $lxdebug->enter_sub(); - $auth->assert('part_service_assembly_edit'); + $auth->assert('part_service_assembly_details'); $form->{pg_keys} = sub { "$_[0]->{partsgroup}--$_[0]->{id}" }; $form->{description_area} = ($form->{rows} = $form->numtextrows($form->{description}, 40)) > 1; @@ -1585,8 +1604,25 @@ sub form_header { $form->get_lists('price_factors' => 'ALL_PRICE_FACTORS', 'partsgroup' => 'all_partsgroup', - 'vendors' => 'ALL_VENDORS',); + 'vendors' => 'ALL_VENDORS', + 'warehouses' => { 'key' => 'WAREHOUSES', + 'bins' => 'BINS', }); + # leerer wert für Lager und Lagerplatz korrekt einstellt + # ID 0 sollte in Ordnung sein, da der Zähler sowieso höher ist + my $no_default_bin_entry = { 'id' => '0', description => '--', 'BINS' => [ { id => '0', description => ''} ] }; + push @ { $form->{WAREHOUSES} }, $no_default_bin_entry; + if (my $max = scalar @{ $form->{WAREHOUSES} }) { + my ($default_warehouse_id, $default_bin_id); + if ($form->{action} eq 'add') { # default only for new entries + $default_warehouse_id = $::instance_conf->get_warehouse_id; + $default_bin_id = $::instance_conf->get_bin_id; + } + $form->{warehouse_id} ||= $default_warehouse_id || $form->{WAREHOUSES}->[$max -1]->{id}; + $form->{bin_id} ||= $default_bin_id || $form->{WAREHOUSES}->[$max -1]->{BINS}->[0]->{id}; + } + $form->{LANGUAGES} = SL::DB::Manager::Language->get_all_sorted; + $form->{translations_map} = { map { ($_->{language_id} => $_) } @{ $form->{translations} || [] } }; IC->retrieve_buchungsgruppen(\%myconfig, $form); @{ $form->{BUCHUNGSGRUPPEN} } = grep { $_->{id} eq $form->{buchungsgruppen_id} || ($form->{id} && $form->{orphaned}) || !$form->{id} } @{ $form->{BUCHUNGSGRUPPEN} }; @@ -1595,27 +1631,29 @@ sub form_header { flash('info', $::locale->text('This partnumber is not unique. You should change it.')); } - # use JavaScript Calendar or not (yes!) - $form->{jsscript} = 1; - my $units = AM->retrieve_units(\%myconfig, $form); $form->{ALL_UNITS} = [ map +{ name => $_ }, sort { $units->{$a}{sortkey} <=> $units->{$b}{sortkey} } keys %$units ]; $form->{defaults} = AM->get_defaults(); - $::request->{layout}->focus("#partnumber"); - $form->{CUSTOM_VARIABLES} = CVar->get_custom_variables('module' => 'IC', 'trans_id' => $form->{id}); - CVar->render_inputs('variables' => $form->{CUSTOM_VARIABLES}, show_disabled_message => 1) + my ($null, $partsgroup_id) = split /--/, $form->{partsgroup}; + + CVar->render_inputs('variables' => $form->{CUSTOM_VARIABLES}, show_disabled_message => 1, partsgroup_id => $partsgroup_id) if (scalar @{ $form->{CUSTOM_VARIABLES} }); + $::request->layout->use_javascript("${_}.js") for qw(ckeditor/ckeditor ckeditor/adapters/jquery kivi.PriceRule); + $::request->layout->add_javascripts_inline("\$(function(){kivi.PriceRule.load_price_rules_for_part(@{[ $::form->{id} * 1 ]})})") if $::form->{id}; $form->header; #print $form->parse_html_template('ic/form_header', { ALL_PRICE_FACTORS => $form->{ALL_PRICE_FACTORS}, # ALL_UNITS => $form->{ALL_UNITS}, # BUCHUNGSGRUPPEN => $form->{BUCHUNGSGRUPPEN}, # payment_terms => $form->{payment_terms}, # all_partsgroup => $form->{all_partsgroup}}); + + $form->{show_edit_buttons} = $main::auth->check_right($::myconfig{login}, 'part_service_assembly_edit'); + print $form->parse_html_template('ic/form_header'); $lxdebug->leave_sub(); } @@ -1623,7 +1661,7 @@ sub form_header { sub form_footer { $lxdebug->enter_sub(); - $auth->assert('part_service_assembly_edit'); + $auth->assert('part_service_assembly_details'); print $form->parse_html_template('ic/form_footer'); @@ -1674,15 +1712,15 @@ sub assembly_row { } my %header = ( - runningnumber => { text => $locale->text('No.'), nowrap => 1, width => '5%' }, - qty => { text => $locale->text('Qty'), nowrap => 1, width => '10%' }, - unit => { text => $locale->text('Unit'), nowrap => 1, width => '5%' }, - partnumber => { text => $locale->text('Part Number'), nowrap => 1, width => '20%' }, - description => { text => $locale->text('Part Description'), nowrap => 1, width => '50%' }, - lastcost => { text => $locale->text('Purchase Prices'), nowrap => 1, width => '50%' }, - total => { text => $locale->text('Sale Prices'), nowrap => 1, }, - bom => { text => $locale->text('BOM'), }, - partsgroup => { text => $locale->text('Group'), }, + runningnumber => { text => $locale->text('No.'), nowrap => 1, width => '5%', align => 'left',}, + qty => { text => $locale->text('Qty'), nowrap => 1, width => '10%', align => 'left',}, + unit => { text => $locale->text('Unit'), nowrap => 1, width => '5%', align => 'left',}, + partnumber => { text => $locale->text('Part Number'), nowrap => 1, width => '20%', align => 'left',}, + description => { text => $locale->text('Part Description'), nowrap => 1, width => '50%', align => 'left',}, + lastcost => { text => $locale->text('Purchase Prices'), nowrap => 1, width => '50%', align => 'right',}, + total => { text => $locale->text('Sale Prices'), nowrap => 1, align => 'right',}, + bom => { text => $locale->text('BOM'), align => 'center',}, + partsgroup => { text => $locale->text('Group'), align => 'left',}, ); my @ROWS; @@ -1758,14 +1796,33 @@ sub assembly_row { sub update { $lxdebug->enter_sub(); + $auth->assert('part_service_assembly_edit'); + + # update checks whether pricegroups, makemodels or assembly items have been changed/added + # new items might have been added (and the original form might have been stored and restored) + # so at the end the ic form is run through check_form in io.pl + # The various combination of events can lead to problems with the order of parse_amount and format_amount + # Currently check_form parses some variables in assembly mode, but not in article or service mode + # This will only ever really be sanely resolved with a rewrite... + # parse pricegroups. and no, don't rely on check_form for this... map { $form->{"price_$_"} = $form->parse_amount(\%myconfig, $form->{"price_$_"}) } 1 .. $form->{price_rows}; + unless ($form->{item} eq 'assembly') { + # for assemblies check_form will parse sellprice and listprice, but not for parts or services + $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) for qw(sellprice listprice ve gv); + }; + + if ($form->{item} eq 'part') { + $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) for qw(weight rop); + } + # same for makemodel lastcosts # but parse_amount not necessary for assembly component lastcosts unless ($form->{item} eq "assembly") { map { $form->{"lastcost_$_"} = $form->parse_amount(\%myconfig, $form->{"lastcost_$_"}) } 1 .. $form->{"makemodel_rows"}; - }; + $form->{lastcost} = $form->parse_amount(\%myconfig, $form->{lastcost}); + } if ($form->{item} eq "assembly") { my $i = $form->{assembly_rows}; @@ -1774,13 +1831,16 @@ sub update { if ( ($form->{"partnumber_$i"} eq "") && ($form->{"description_$i"} eq "") && ($form->{"partsgroup_$i"} eq "")) { + # no new assembly item was added &check_form; } else { - + # search db for newly added assemblyitems, via partnumber or description IC->assembly_item(\%myconfig, \%$form); + # form->{item_list} contains the possible matches, next check whether the + # match is unique or we need to call the page to select the item my $rows = scalar @{ $form->{item_list} }; if ($rows) { @@ -1788,7 +1848,7 @@ sub update { if ($rows > 1) { $form->{makemodel_rows}--; - select_item(mode => 'IC'); + select_item(mode => 'IC', pre_entered_qty => $form->parse_amount(\%myconfig, $form->{"qty_$i"})); ::end_of_request(); } else { map { $form->{item_list}[$i]{$_} =~ s/\"/"/g } @@ -1844,6 +1904,11 @@ sub save { $form->error($locale->text('Description must not be empty!')) unless $form->{description}; $form->error($locale->text('Partnumber must not be set to empty!')) if $form->{id} && !$form->{partnumber}; + # undef warehouse_id if the empty value is selected + if ( ($form->{warehouse_id} == 0) && ($form->{bin_id} == 0) ) { + undef $form->{warehouse_id}; + undef $form->{bin_id}; + } # save part if (IC->save(\%myconfig, \%$form) == 3) { $form->error($locale->text('Partnumber not unique!')); @@ -1886,7 +1951,7 @@ sub save { } else { $i = $form->{assembly_rows}; } - $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"}); + $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"} > 0); $form->{sellprice} -= $form->{"sellprice_$i"} * $form->{"qty_$i"}; $form->{weight} -= $form->{"weight_$i"} * $form->{"qty_$i"}; @@ -1903,7 +1968,7 @@ sub save { # set values for last invoice/order item $i = $form->{rowcount}; - $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"}); + $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"} > 0); map { $form->{"${_}_$i"} = $newform{$_} } qw(partnumber description bin unit listprice inventory_accno income_accno expense_accno sellprice lastcost price_factor_id); map { $form->{"ic_${_}_$i"} = $newform{$_} } @ic_cvar_fields; @@ -2016,7 +2081,7 @@ sub delete { sub price_row { $lxdebug->enter_sub(); - $auth->assert('part_service_assembly_edit'); + $auth->assert('part_service_assembly_details'); my ($numrows) = @_; @@ -2031,50 +2096,6 @@ sub price_row { $lxdebug->leave_sub(); } -sub parts_language_selection { - $lxdebug->enter_sub(); - - $auth->assert('part_service_assembly_edit'); - - my $languages = IC->retrieve_languages(\%myconfig, $form); - - if ($form->{language_values} ne "") { - foreach my $item (split(/---\+\+\+---/, $form->{language_values})) { - my ($language_id, $translation, $longdescription) = split(/--\+\+--/, $item); - - foreach my $language (@{ $languages }) { - next unless ($language->{id} == $language_id); - - $language->{translation} = $translation; - $language->{longdescription} = $longdescription; - - $language->{translation_area} = ($language->{translation_rows} = $form->numtextrows($language->{translation}, 40)) > 1; - $language->{longdescription_rows} = max 4, $form->numtextrows($language->{longdescription}, 40); - - last; - } - } - } - - my @header_sort = qw(name longdescription); - my %header_title = ( "name" => $locale->text("Name"), - "longdescription" => $locale->text("Long Description"), - ); - - my @header = - map(+{ "column_title" => $header_title{$_}, - "column" => $_, - }, - @header_sort); - - $form->{"title"} = $locale->text("Language Values"); - $form->header(); - print $form->parse_html_template("ic/parts_language_selection", { "HEADER" => \@header, - "LANGUAGES" => $languages, }); - - $lxdebug->leave_sub(); -} - sub ajax_autocomplete { $main::lxdebug->enter_sub();
$form->{title}
$option