]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Dev/Record.pm
kivitendo 3.9.2-0.2
[mfinanz.git] / SL / Dev / Record.pm
index 73f06d0f55a3de55067ee1780bb9b8f86464726a..5dbea221131f27c176837c3586d8b5efb59cf0d2 100644 (file)
@@ -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<create_minimal_purchase_invoice %PARAMS>
+
+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<create_sales_invoice>.
+
 =head2 C<create_credit_note %PARAMS>
 
 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<create_sales_quotation %PARAMS>
+
+See C<create_sales_order>
+
+=head2 C<create_purchase_quotation %PARAMS>
+
+See comments for C<create_sales_quotation>.
+
+Example:
+
+  my $purchase_quotation = SL::Dev::Record::create_purchase_quotation(save => 1);
+
 =head2 C<create_purchase_order %PARAMS>
 
 See comments for C<create_sales_order>.
@@ -799,7 +973,6 @@ Example:
 
   my $purchase_order = SL::Dev::Record::create_purchase_order(save => 1);
 
-
 =head2 C<create_item %PARAMS>
 
 Creates an item from a part object that can be added to a record.