X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/ff159a4d47b9a2d10744dcfc23da2c63605c8a32..eeb5375ee7727c956cc357cc8f90b19d1bfe80b9:/SL/Dev/Record.pm diff --git a/SL/Dev/Record.pm b/SL/Dev/Record.pm index 73f06d0f5..5dbea2211 100644 --- a/SL/Dev/Record.pm +++ b/SL/Dev/Record.pm @@ -2,16 +2,28 @@ package SL::Dev::Record; use strict; use base qw(Exporter); -our @EXPORT_OK = qw(create_invoice_item - create_sales_invoice - create_credit_note +our @EXPORT_OK = qw( + create_project + create_department + create_order_item - create_sales_order - create_purchase_order create_delivery_order_item + create_invoice_item + create_reclamation_item + + create_sales_quotation + create_sales_order create_sales_delivery_order + create_sales_invoice + create_credit_note + create_sales_reclamation + + create_purchase_quotation + create_purchase_order create_purchase_delivery_order - create_project create_department + create_minimal_purchase_invoice + create_purchase_reclamation + create_ap_transaction create_ar_transaction create_gl_transaction @@ -20,7 +32,12 @@ our %EXPORT_TAGS = (ALL => \@EXPORT_OK); use SL::DB::Invoice; use SL::DB::InvoiceItem; +use SL::DB::Order; +use SL::DB::Order::TypeData qw(:types); +use SL::DB::DeliveryOrder; use SL::DB::DeliveryOrder::TypeData qw(:types); +use SL::DB::Reclamation; +use SL::DB::Reclamation::TypeData qw(:types); use SL::DB::Employee; use SL::Dev::Part qw(new_part); use SL::Dev::CustomerVendor qw(new_vendor new_customer); @@ -33,12 +50,19 @@ use List::Util qw(sum); use Data::Dumper; use SL::Locale::String qw(t8); use SL::DATEV; +use SL::Model::Record; my %record_type_to_item_type = ( sales_invoice => 'SL::DB::InvoiceItem', + purchase_invoice => 'SL::DB::InvoiceItem', credit_note => 'SL::DB::InvoiceItem', sales_order => 'SL::DB::OrderItem', + sales_quotation => 'SL::DB::OrderItem', + request_quotation => 'SL::DB::OrderItem', purchase_order => 'SL::DB::OrderItem', sales_delivery_order => 'SL::DB::DeliveryOrderItem', + purchase_delivery_order => 'SL::DB::DeliveryOrderItem', + sales_reclamation => 'SL::DB::ReclamationItem', + purchase_reclamation => 'SL::DB::ReclamationItem', ); sub create_sales_invoice { @@ -72,6 +96,39 @@ sub create_sales_invoice { return $invoice; } +sub create_minimal_purchase_invoice { + my (%params) = @_; + + my $record_type = 'purchase_invoice'; + my $invoiceitems = delete $params{invoiceitems} // _create_two_items($record_type); + _check_items($invoiceitems, $record_type); + + my $vendor = delete $params{vendor} // new_vendor(name => 'Testvendor')->save; + die "illegal vendor" unless defined $vendor && ref($vendor) eq 'SL::DB::Vendor'; + + my $invoice = SL::DB::PurchaseInvoice->new( + invoice => 1, + type => 'purchase_invoice', + vendor => $vendor->id, + taxzone_id => $vendor->taxzone->id, + invnumber => delete $params{invnumber} // undef, + currency_id => $params{currency_id} // $::instance_conf->get_currency_id, + taxincluded => $params{taxincluded} // 0, + employee_id => $params{employee_id} // SL::DB::Manager::Employee->current->id, + transdate => $params{transdate} // DateTime->today_local->to_kivitendo, + payment_id => $params{payment_id} // undef, + gldate => DateTime->today, + invoiceitems => $invoiceitems, + ); + $invoice->assign_attributes(%params) if %params; + + # TODO: PTC can't deal with purchase invoices, so for now just save via Rose, + # no amount/tax/acc_trans calculations. + + $invoice->save; + return $invoice; +} + sub create_credit_note { my (%params) = @_; @@ -117,7 +174,7 @@ sub create_sales_delivery_order { die "illegal customer" unless ref($customer) eq 'SL::DB::Customer'; my $delivery_order = SL::DB::DeliveryOrder->new( - order_type => SALES_DELIVERY_ORDER_TYPE, + record_type => SALES_DELIVERY_ORDER_TYPE, 'closed' => undef, customer_id => $customer->id, taxzone_id => $customer->taxzone_id, @@ -130,7 +187,7 @@ sub create_sales_delivery_order { orderitems => $orderitems, ); $delivery_order->assign_attributes(%params) if %params; - $delivery_order->save; + SL::Model::Record->save($delivery_order); return $delivery_order; } @@ -142,10 +199,10 @@ sub create_purchase_delivery_order { _check_items($orderitems, $record_type); my $vendor = $params{vendor} // new_vendor(name => 'Testvendor')->save; - die "illegal customer" unless ref($vendor) eq 'SL::DB::Vendor'; + die "illegal vendor" unless ref($vendor) eq 'SL::DB::Vendor'; my $delivery_order = SL::DB::DeliveryOrder->new( - order_type => PURCHASE_DELIVERY_ORDER_TYPE, + record_type => PURCHASE_DELIVERY_ORDER_TYPE, 'closed' => undef, vendor_id => $vendor->id, taxzone_id => $vendor->taxzone_id, @@ -158,70 +215,94 @@ sub create_purchase_delivery_order { orderitems => $orderitems, ); $delivery_order->assign_attributes(%params) if %params; - $delivery_order->save; + SL::Model::Record->save($delivery_order); return $delivery_order; } +sub create_sales_quotation { + my (%params) = @_; + $params{type} = SALES_QUOTATION_TYPE(); + _create_sales_order_or_quotation(%params); +} + sub create_sales_order { my (%params) = @_; + $params{type} = SALES_ORDER_TYPE(); + _create_sales_order_or_quotation(%params); +} - my $record_type = 'sales_order'; - my $orderitems = delete $params{orderitems} // _create_two_items($record_type); - _check_items($orderitems, $record_type); +sub create_purchase_quotation { + my (%params) = @_; + $params{type} = REQUEST_QUOTATION_TYPE(); + # TODO: set a with reqdate + _create_purchase_order_or_quotation(%params); +} + +sub create_purchase_order { + my (%params) = @_; + $params{type} = PURCHASE_ORDER_TYPE(); + _create_purchase_order_or_quotation(%params); +} + +sub create_sales_reclamation { + my (%params) = @_; + + my $record_type = SALES_RECLAMATION_TYPE(); + my $reclamation_items = delete $params{reclamation_items} // _create_two_items($record_type); + _check_items($reclamation_items, $record_type); my $save = delete $params{save} // 0; - my $customer = $params{customer} // new_customer(name => 'Testcustomer')->save; - die "illegal customer" unless ref($customer) eq 'SL::DB::Customer'; + my $customer = $params{customer} // new_customer(name => 'Test_Customer')->save; + die "'customer' is not of type SL::DB::Customer" unless ref($customer) eq 'SL::DB::Customer'; - my $order = SL::DB::Order->new( + my $reclamation = SL::DB::Reclamation->new( + record_type => $record_type, customer_id => delete $params{customer_id} // $customer->id, taxzone_id => delete $params{taxzone_id} // $customer->taxzone->id, currency_id => delete $params{currency_id} // $::instance_conf->get_currency_id, taxincluded => delete $params{taxincluded} // 0, - employee_id => delete $params{employee_id} // SL::DB::Manager::Employee->current->id, - salesman_id => delete $params{employee_id} // SL::DB::Manager::Employee->current->id, transdate => delete $params{transdate} // DateTime->today, - orderitems => $orderitems, + 'closed' => undef, + reclamation_items => $reclamation_items, ); - $order->assign_attributes(%params) if %params; + $reclamation->assign_attributes(%params) if %params; if ( $save ) { - $order->calculate_prices_and_taxes; - $order->save; + SL::Model::Record->save($reclamation); } - return $order; + return $reclamation; } -sub create_purchase_order { +sub create_purchase_reclamation { my (%params) = @_; - my $record_type = 'purchase_order'; - my $orderitems = delete $params{orderitems} // _create_two_items($record_type); - _check_items($orderitems, $record_type); + my $record_type = PURCHASE_RECLAMATION_TYPE(); + my $reclamation_items = delete $params{reclamation_items} // _create_two_items($record_type); + _check_items($reclamation_items, $record_type); my $save = delete $params{save} // 0; - my $vendor = $params{vendor} // new_vendor(name => 'Testvendor')->save; - die "illegal vendor" unless ref($vendor) eq 'SL::DB::Vendor'; + my $vendor = $params{vendor} // new_vendor(name => 'Test_Vendor')->save; + die "'vendor' is not of type SL::DB::Vendor" unless ref($vendor) eq 'SL::DB::Vendor'; - my $order = SL::DB::Order->new( + my $reclamation = SL::DB::Reclamation->new( + record_type => $record_type, vendor_id => delete $params{vendor_id} // $vendor->id, taxzone_id => delete $params{taxzone_id} // $vendor->taxzone->id, currency_id => delete $params{currency_id} // $::instance_conf->get_currency_id, taxincluded => delete $params{taxincluded} // 0, transdate => delete $params{transdate} // DateTime->today, 'closed' => undef, - orderitems => $orderitems, + reclamation_items => $reclamation_items, ); - $order->assign_attributes(%params) if %params; + $reclamation->assign_attributes(%params) if %params; if ( $save ) { - $order->calculate_prices_and_taxes; # not tested for purchase orders - $order->save; + SL::Model::Record->save($reclamation); } - return $order; -}; + return $reclamation; +} sub _check_items { my ($items, $record_type) = @_; @@ -249,6 +330,13 @@ sub create_delivery_order_item { return _create_item(record_type => 'sales_delivery_order', %params); } +sub create_reclamation_item { + my (%params) = @_; + + # record_type can be sales or purchase; make sure one is set + return _create_item(record_type => 'sales_reclamation', %params); +} + sub _create_item { my (%params) = @_; @@ -652,6 +740,70 @@ sub create_gl_transaction { return $gl_transaction; } +sub _create_sales_order_or_quotation { + my (%params) = @_; + + my $record_type = delete $params{type}; + die "illegal type" unless $record_type eq SALES_ORDER_TYPE() or $record_type eq SALES_QUOTATION_TYPE(); + + my $orderitems = delete $params{orderitems} // _create_two_items($record_type); + _check_items($orderitems, $record_type); + + my $save = delete $params{save} // 0; + + my $customer = $params{customer} // new_customer(name => 'Testcustomer')->save; + die "illegal customer" unless ref($customer) eq 'SL::DB::Customer'; + + my $record = SL::DB::Order->new( + record_type => $record_type, + customer_id => delete $params{customer_id} // $customer->id, + taxzone_id => delete $params{taxzone_id} // $customer->taxzone->id, + currency_id => delete $params{currency_id} // $::instance_conf->get_currency_id, + taxincluded => delete $params{taxincluded} // 0, + employee_id => delete $params{employee_id} // SL::DB::Manager::Employee->current->id, + salesman_id => delete $params{employee_id} // SL::DB::Manager::Employee->current->id, + transdate => delete $params{transdate} // DateTime->today, + orderitems => $orderitems, + ); + $record->assign_attributes(%params) if %params; + + if ( $save ) { + SL::Model::Record->save($record); + } + return $record; +} + +sub _create_purchase_order_or_quotation { + my (%params) = @_; + + my $record_type = delete $params{type}; + die "illegal type" unless $record_type eq PURCHASE_ORDER_TYPE() or $record_type eq REQUEST_QUOTATION_TYPE(); + my $orderitems = delete $params{orderitems} // _create_two_items($record_type); + _check_items($orderitems, $record_type); + + my $save = delete $params{save} // 0; + + my $vendor = $params{vendor} // new_vendor(name => 'Testvendor')->save; + die "illegal vendor" unless ref($vendor) eq 'SL::DB::Vendor'; + + my $record = SL::DB::Order->new( + record_type => $record_type, + vendor_id => delete $params{vendor_id} // $vendor->id, + taxzone_id => delete $params{taxzone_id} // $vendor->taxzone->id, + currency_id => delete $params{currency_id} // $::instance_conf->get_currency_id, + taxincluded => delete $params{taxincluded} // 0, + transdate => delete $params{transdate} // DateTime->today, + 'closed' => undef, + orderitems => $orderitems, + ); + $record->assign_attributes(%params) if %params; + + if ( $save ) { + SL::Model::Record->save($record); + } + return $record; +}; + sub _transaction_tax_helper { # checks for hash-entries with key tax, tax_id or taxkey # returns an SL::DB::Tax object @@ -740,6 +892,16 @@ Example with params: taxincluded => 1, ); +=head2 C + +Creates a new purchase invoice (table ap, invoice = 1), without any acc_trans +entries, amount or tax calculations! (PTC can't deal with purchase invoices yet) + +Should only be used for basic testing of conversions from one record_type to +another, and specifically for testing the individual items of conversions. + +For usage examples see C. + =head2 C Create a credit note (sales). Use positive quantities when adding items. @@ -791,6 +953,18 @@ Example: create 100 orders with the same part for 100 new customers: orderitems => [ SL::Dev::Record::create_order_item(part => $part1, qty => 1, sellprice => 9) ] ) for 1 .. 100; +=head2 C + +See C + +=head2 C + +See comments for C. + +Example: + + my $purchase_quotation = SL::Dev::Record::create_purchase_quotation(save => 1); + =head2 C See comments for C. @@ -799,7 +973,6 @@ Example: my $purchase_order = SL::Dev::Record::create_purchase_order(save => 1); - =head2 C Creates an item from a part object that can be added to a record.