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
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);
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 {
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) = @_;
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,
orderitems => $orderitems,
);
$delivery_order->assign_attributes(%params) if %params;
- $delivery_order->save;
+ SL::Model::Record->save($delivery_order);
return $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,
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) = @_;
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) = @_;
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
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.
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>.
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.