+sub _update_part_information {
+ $main::lxdebug->enter_sub();
+
+ my $form = $main::form;
+
+ my %part_information = IC->get_basic_part_info('id' => [ grep { $_ } map { $form->{"id_${_}"} } (1..$form->{rowcount}) ],
+ 'vendor_id' => $form->{vendor_id});
+
+ $form->{PART_INFORMATION} = \%part_information;
+
+ foreach my $i (1..$form->{rowcount}) {
+ next unless ($form->{"id_${i}"});
+
+ my $info = $form->{PART_INFORMATION}->{$form->{"id_${i}"}} || { };
+ $form->{"partunit_${i}"} = $info->{unit};
+ }
+
+ $main::lxdebug->leave_sub();
+}
+
+sub _update_ship {
+ $main::lxdebug->enter_sub();
+
+ my $form = $main::form;
+ my %myconfig = %main::myconfig;
+
+ if (!$form->{ordnumber} || !$form->{id}) {
+ map { $form->{"ship_$_"} = 0 } (1..$form->{rowcount});
+ $main::lxdebug->leave_sub();
+ return;
+ }
+
+ my $all_units = AM->retrieve_all_units();
+
+ my %ship = DO->get_shipped_qty('type' => ($form->{type} eq 'purchase_order') ? 'purchase' : 'sales',
+ 'oe_id' => $form->{id},);
+
+ foreach my $i (1..$form->{rowcount}) {
+ next unless ($form->{"id_${i}"});
+
+ $form->{"ship_$i"} = 0;
+
+ my $ship_entry = $ship{$form->{"id_$i"}};
+
+ next if (!$ship_entry || ($ship_entry->{qty} <= 0));
+
+ my $rowqty =
+ ($form->{simple_save} ? $form->{"qty_$i"} : $form->parse_amount(\%myconfig, $form->{"qty_$i"}))
+ * $all_units->{$form->{"unit_$i"}}->{factor}
+ / $all_units->{$form->{"partunit_$i"}}->{factor};
+
+ $form->{"ship_$i"} = min($rowqty, $ship_entry->{qty});
+ $ship_entry->{qty} -= $form->{"ship_$i"};
+ }
+
+ foreach my $i (1..$form->{rowcount}) {
+ next unless ($form->{"id_${i}"});
+
+ my $ship_entry = $ship{$form->{"id_$i"}};
+
+ next if (!$ship_entry || ($ship_entry->{qty} <= 0.01));
+
+ $form->{"ship_$i"} += $ship_entry->{qty};
+ $ship_entry->{qty} = 0;
+ }
+
+ $main::lxdebug->leave_sub();
+}
+
+sub _update_custom_variables {
+ $main::lxdebug->enter_sub();
+
+ my $form = $main::form;
+
+ $form->{CVAR_CONFIGS} = { } unless ref $form->{CVAR_CONFIGS} eq 'HASH';
+ $form->{CVAR_CONFIGS}->{IC} ||= CVar->get_configs(module => 'IC');
+
+ $main::lxdebug->leave_sub();
+}
+
+sub _render_custom_variables_inputs {
+ $main::lxdebug->enter_sub(2);
+
+ my $form = $main::form;
+
+ my %params = @_;
+
+ if (!$form->{CVAR_CONFIGS}->{IC}) {
+ $main::lxdebug->leave_sub();
+ return;
+ }
+
+ my $valid = CVar->custom_variables_validity_by_trans_id(trans_id => $params{part_id});
+
+ my $num_visible_cvars = 0;
+ foreach my $cvar (@{ $form->{CVAR_CONFIGS}->{IC} }) {
+ $cvar->{valid} = $params{part_id} && $valid->($cvar->{id});
+
+ my $description = '';
+ if ($cvar->{flag_editable} && $cvar->{valid}) {
+ $num_visible_cvars++;
+ $description = $cvar->{description} . ' ';
+ }
+
+ push @{ $params{ROW2} }, {
+ line_break => $num_visible_cvars == 1,
+ description => $description,
+ cvar => 1,
+ render_options => {
+ hide_non_editable => 1,
+ var => $cvar,
+ name_prefix => 'ic_',
+ name_postfix => "_$params{row}",
+ valid => $cvar->{valid},
+ value => $form->{"ic_cvar_" . $cvar->{name} . "_$params{row}"},
+ }
+ };
+ }
+
+ $main::lxdebug->leave_sub(2);
+}