+
+sub _make_record {
+ my $class = {
+ sales_order => 'Order',
+ purchase_oder => 'Order',
+ sales_quotation => 'Order',
+ request_quotation => 'Order',
+ invoice => 'Invoice',
+ purchase_invoice => 'PurchaseInvoice',
+ purchase_delivery_order => 'DeliveryOrder',
+ sales_delivery_order => 'DeliveryOrder',
+ }->{$::form->{type}};
+
+ return unless $class;
+
+ $class = 'SL::DB::' . $class;
+
+ eval "require $class";
+
+ my $obj = $::form->{id}
+ ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{id})
+ : $class->new;
+
+ for my $method (keys %$::form) {
+ next unless $obj->can($method);
+ next unless $obj->meta->column($method);
+
+ if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) {
+ $obj->${\"$method\_as_date"}($::form->{$method});
+ } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) {
+ $obj->${\"$method\_as\_number"}($::form->{$method});
+ } else {
+ $obj->$method($::form->{$method});
+ }
+ }
+
+ my @items;
+ for my $i (1 .. $::form->{rowcount}) {
+ next unless $::form->{"id_$i"};
+ push @items, _make_record_item($i)
+ }
+
+ $obj->orderitems(@items);
+
+ return $obj;
+}
+