diff --git a/SL/BackgroundJob/SetNumberRange.pm b/SL/BackgroundJob/SetNumberRange.pm index ac6428848c..bd90a81291 100644 --- a/SL/BackgroundJob/SetNumberRange.pm +++ b/SL/BackgroundJob/SetNumberRange.pm @@ -29,7 +29,7 @@ sub run { my $defaults = SL::DB::Default->get; - foreach (qw(invnumber cnnumber soinumber pqinumber sonumber ponumber sqnumber rfqnumber sdonumber pdonumber)) { + foreach (qw(invnumber cnnumber soinumber pqinumber sonumber ponumber pocnumber sqnumber rfqnumber sdonumber pdonumber)) { my $current_number = SL::PrefixedNumber->new(number => $defaults->{$_}); $current_number->set_to($next_year * $multiplier); $defaults->{$_} = $current_number->get_current; diff --git a/SL/Controller/File.pm b/SL/Controller/File.pm index ee2f77fdc6..da6a2799db 100644 --- a/SL/Controller/File.pm +++ b/SL/Controller/File.pm @@ -55,33 +55,34 @@ __PACKAGE__->run_before('check_object_params', only => [ qw(list ajax_delete aja # model: base name of the rose model # right: access right used for import my %file_types = ( - 'sales_quotation' => { gen => 1, gltype => '', dir =>'SalesQuotation', model => 'Order', right => 'import_ar' }, - 'sales_order_intake' => { gen => 5, gltype => '', dir =>'SalesOrderIntake', model => 'Order', right => 'import_ar' }, - 'sales_order' => { gen => 5, gltype => '', dir =>'SalesOrder', model => 'Order', right => 'import_ar' }, - 'sales_delivery_order' => { gen => 1, gltype => '', dir =>'SalesDeliveryOrder', model => 'DeliveryOrder', right => 'import_ar' }, - 'sales_reclamation' => { gen => 5, gltype => '', dir =>'SalesReclamation', model => 'Reclamation', right => 'import_ar' }, - 'invoice' => { gen => 1, gltype => 'ar', dir =>'SalesInvoice', model => 'Invoice', right => 'import_ar' }, - 'invoice_for_advance_payment' => { gen => 1, gltype => 'ar', dir =>'SalesInvoice', model => 'Invoice', right => 'import_ar' }, - 'final_invoice' => { gen => 1, gltype => 'ar', dir =>'SalesInvoice', model => 'Invoice', right => 'import_ar' }, - 'credit_note' => { gen => 1, gltype => '', dir =>'CreditNote', model => 'Invoice', right => 'import_ar' }, - 'request_quotation' => { gen => 7, gltype => '', dir =>'RequestForQuotation', model => 'Order', right => 'import_ap' }, - 'purchase_quotation_intake' => { gen => 7, gltype => '', dir =>'PurchaseQuotationIntake', model => 'Order', right => 'import_ap' }, - 'purchase_order' => { gen => 7, gltype => '', dir =>'PurchaseOrder', model => 'Order', right => 'import_ap' }, - 'purchase_delivery_order' => { gen => 7, gltype => '', dir =>'PurchaseDeliveryOrder', model => 'DeliveryOrder', right => 'import_ap' }, - 'purchase_reclamation' => { gen => 7, gltype => '', dir =>'PurchaseReclamation', model => 'Reclamation', right => 'import_ap' }, - 'purchase_invoice' => { gen => 6, gltype => 'ap', dir =>'PurchaseInvoice', model => 'PurchaseInvoice',right => 'import_ap' }, - 'supplier_delivery_order' => { gen => 7, gltype => '', dir =>'SupplierDeliveryOrder', model => 'DeliveryOrder', right => 'import_ap' }, - 'rma_delivery_order' => { gen => 7, gltype => '', dir =>'RMADeliveryOrder', model => 'DeliveryOrder', right => 'import_ar' }, - 'vendor' => { gen => 0, gltype => '', dir =>'Vendor', model => 'Vendor', right => 'xx' }, - 'customer' => { gen => 1, gltype => '', dir =>'Customer', model => 'Customer', right => 'xx' }, - 'project' => { gen => 0, gltype => '', dir =>'Project', model => 'Project', right => 'xx' }, - 'part' => { gen => 0, gltype => '', dir =>'Part', model => 'Part', right => 'xx' }, - 'gl_transaction' => { gen => 6, gltype => 'gl', dir =>'GeneralLedger', model => 'GLTransaction', right => 'import_ap' }, - 'draft' => { gen => 0, gltype => '', dir =>'Draft', model => 'Draft', right => 'xx' }, - 'csv_customer' => { gen => 1, gltype => '', dir =>'Reports', model => 'Customer', right => 'xx' }, - 'csv_vendor' => { gen => 1, gltype => '', dir =>'Reports', model => 'Vendor', right => 'xx' }, - 'shop_image' => { gen => 0, gltype => '', dir =>'ShopImages', model => 'Part', right => 'xx' }, - 'letter' => { gen => 7, gltype => '', dir =>'Letter', model => 'Letter', right => 'sales_letter_edit | purchase_letter_edit' }, + 'sales_quotation' => { gen => 1, gltype => '', dir =>'SalesQuotation', model => 'Order', right => 'import_ar' }, + 'sales_order_intake' => { gen => 5, gltype => '', dir =>'SalesOrderIntake', model => 'Order', right => 'import_ar' }, + 'sales_order' => { gen => 5, gltype => '', dir =>'SalesOrder', model => 'Order', right => 'import_ar' }, + 'sales_delivery_order' => { gen => 1, gltype => '', dir =>'SalesDeliveryOrder', model => 'DeliveryOrder', right => 'import_ar' }, + 'sales_reclamation' => { gen => 5, gltype => '', dir =>'SalesReclamation', model => 'Reclamation', right => 'import_ar' }, + 'invoice' => { gen => 1, gltype => 'ar', dir =>'SalesInvoice', model => 'Invoice', right => 'import_ar' }, + 'invoice_for_advance_payment' => { gen => 1, gltype => 'ar', dir =>'SalesInvoice', model => 'Invoice', right => 'import_ar' }, + 'final_invoice' => { gen => 1, gltype => 'ar', dir =>'SalesInvoice', model => 'Invoice', right => 'import_ar' }, + 'credit_note' => { gen => 1, gltype => '', dir =>'CreditNote', model => 'Invoice', right => 'import_ar' }, + 'request_quotation' => { gen => 7, gltype => '', dir =>'RequestForQuotation', model => 'Order', right => 'import_ap' }, + 'purchase_quotation_intake' => { gen => 7, gltype => '', dir =>'PurchaseQuotationIntake', model => 'Order', right => 'import_ap' }, + 'purchase_order' => { gen => 7, gltype => '', dir =>'PurchaseOrder', model => 'Order', right => 'import_ap' }, + 'purchase_order_confirmation' => { gen => 7, gltype => '', dir =>'PurchaseOrderConfirmation', model => 'Order', right => 'import_ap' }, + 'purchase_delivery_order' => { gen => 7, gltype => '', dir =>'PurchaseDeliveryOrder', model => 'DeliveryOrder', right => 'import_ap' }, + 'purchase_reclamation' => { gen => 7, gltype => '', dir =>'PurchaseReclamation', model => 'Reclamation', right => 'import_ap' }, + 'purchase_invoice' => { gen => 6, gltype => 'ap', dir =>'PurchaseInvoice', model => 'PurchaseInvoice',right => 'import_ap' }, + 'supplier_delivery_order' => { gen => 7, gltype => '', dir =>'SupplierDeliveryOrder', model => 'DeliveryOrder', right => 'import_ap' }, + 'rma_delivery_order' => { gen => 7, gltype => '', dir =>'RMADeliveryOrder', model => 'DeliveryOrder', right => 'import_ar' }, + 'vendor' => { gen => 0, gltype => '', dir =>'Vendor', model => 'Vendor', right => 'xx' }, + 'customer' => { gen => 1, gltype => '', dir =>'Customer', model => 'Customer', right => 'xx' }, + 'project' => { gen => 0, gltype => '', dir =>'Project', model => 'Project', right => 'xx' }, + 'part' => { gen => 0, gltype => '', dir =>'Part', model => 'Part', right => 'xx' }, + 'gl_transaction' => { gen => 6, gltype => 'gl', dir =>'GeneralLedger', model => 'GLTransaction', right => 'import_ap' }, + 'draft' => { gen => 0, gltype => '', dir =>'Draft', model => 'Draft', right => 'xx' }, + 'csv_customer' => { gen => 1, gltype => '', dir =>'Reports', model => 'Customer', right => 'xx' }, + 'csv_vendor' => { gen => 1, gltype => '', dir =>'Reports', model => 'Vendor', right => 'xx' }, + 'shop_image' => { gen => 0, gltype => '', dir =>'ShopImages', model => 'Part', right => 'xx' }, + 'letter' => { gen => 7, gltype => '', dir =>'Letter', model => 'Letter', right => 'sales_letter_edit | purchase_letter_edit' }, ); #--- 4 locale ---# diff --git a/SL/Controller/Order.pm b/SL/Controller/Order.pm index bbc369c6d2..4feaf2d45f 100644 --- a/SL/Controller/Order.pm +++ b/SL/Controller/Order.pm @@ -246,6 +246,7 @@ sub action_delete { my $text = $self->type eq SALES_ORDER_INTAKE_TYPE() ? $::locale->text('The order intake has been deleted') : $self->type eq SALES_ORDER_TYPE() ? $::locale->text('The order confirmation has been deleted') : $self->type eq PURCHASE_ORDER_TYPE() ? $::locale->text('The order has been deleted') + : $self->type eq PURCHASE_ORDER_CONFIRMATION_TYPE() ? $::locale->text('The order confirmation has been deleted') : $self->type eq SALES_QUOTATION_TYPE() ? $::locale->text('The quotation has been deleted') : $self->type eq REQUEST_QUOTATION_TYPE() ? $::locale->text('The rfq has been deleted') : $self->type eq PURCHASE_QUOTATION_INTAKE_TYPE() ? $::locale->text('The quotation intake has been deleted') @@ -2109,7 +2110,8 @@ sub save { id => \@converted_from_oe_ids, or => [ record_type => SALES_QUOTATION_TYPE(), record_type => REQUEST_QUOTATION_TYPE(), - (record_type => PURCHASE_QUOTATION_INTAKE_TYPE()) x $self->order->is_type(PURCHASE_ORDER_TYPE()) ] + (record_type => PURCHASE_QUOTATION_INTAKE_TYPE()) x $self->order->is_type(PURCHASE_ORDER_TYPE()), + (record_type => PURCHASE_ORDER_TYPE()) x $self->order->is_type(PURCHASE_ORDER_CONFIRMATION_TYPE()) ] ]) : undef; @@ -2178,7 +2180,7 @@ sub pre_render { $item->active_discount_source($price_source->discount_from_source($item->active_discount_source)); } - if (any { $self->type eq $_ } (SALES_ORDER_INTAKE_TYPE(), SALES_ORDER_TYPE(), PURCHASE_ORDER_TYPE())) { + if (any { $self->type eq $_ } (SALES_ORDER_INTAKE_TYPE(), SALES_ORDER_TYPE(), PURCHASE_ORDER_TYPE(), PURCHASE_ORDER_CONFIRMATION_TYPE())) { # Calculate shipped qtys here to prevent calling calculate for every item via the items method. # Do not use write_to_objects to prevent order->delivered to be set, because this should be # the value from db, which can be set manually or is set when linked delivery orders are saved. @@ -2340,6 +2342,13 @@ sub setup_edit_action_bar { only_if => $self->type_data->show_menu('save_and_purchase_order'), disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef, ], + action => [ + t8('Save and Purchase Order Confirmation'), + call => [ 'kivi.Order.purchase_check_for_direct_delivery', { to_type => PURCHASE_ORDER_CONFIRMATION_TYPE() } ], + checks => [ @valid, @req_trans_cost_art, @req_cusordnumber ], + only_if => $self->type_data->show_menu('save_and_purchase_order_confirmation'), + disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef, + ], action => [ t8('Save and Sales Delivery Order'), call => [ 'kivi.Order.save', { @@ -2384,7 +2393,7 @@ sub setup_edit_action_bar { ], }], checks => [ @req_trans_cost_art, @req_cusordnumber ], - only_if => (any { $self->type eq $_ } (PURCHASE_ORDER_TYPE())), + only_if => $self->type_data->show_menu('save_and_purchase_delivery_order'), disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef, ], action => [ @@ -2485,6 +2494,7 @@ sub setup_edit_action_bar { checks => [ @req_trans_cost_art, @req_cusordnumber ], disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : $is_final_version ? t8('This record is the final version. Please create a new sub-version') : undef, + only_if => $self->type_data->show_menu('save_and_print'), ], action => [ t8('Save and print'), @@ -2494,6 +2504,7 @@ sub setup_edit_action_bar { checks => [ @req_trans_cost_art, @req_cusordnumber ], disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : $is_final_version ? t8('This record is the final version. Please create a new sub-version') : undef, + only_if => $self->type_data->show_menu('save_and_print'), ], action => [ ($is_final_version ? t8('E-mail') : t8('Save and E-mail')), @@ -2506,6 +2517,7 @@ sub setup_edit_action_bar { disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : !$self->order->id ? t8('This object has not been saved yet.') : undef, + only_if => $self->type_data->show_menu('save_and_email'), ], action => [ t8('Download attachments of all parts'), diff --git a/SL/Controller/RecordLinks.pm b/SL/Controller/RecordLinks.pm index 16300f2c51..ea7fbfed17 100644 --- a/SL/Controller/RecordLinks.pm +++ b/SL/Controller/RecordLinks.pm @@ -39,28 +39,29 @@ my %link_type_defaults = ( ); my @link_type_specifics = ( - { title => t8('Requirement spec'), type => 'requirement_spec', model => 'RequirementSpec', number => 'id', project => 'project', description => 'title', date => undef, filter => 'working_copy_filter', }, - { title => t8('Shop Order'), type => 'shop_order', model => 'ShopOrder', number => 'shop_ordernumber', date => 'order_date', project => undef, description => undef, }, - { title => t8('Sales quotation'), type => 'sales_quotation', model => 'Order', number => 'quonumber', }, - { title => t8('Sales Order Intake'), type => 'sales_order_intake', model => 'Order', number => 'ordnumber', }, - { title => t8('Sales Order'), type => 'sales_order', model => 'Order', number => 'ordnumber', }, - { title => t8('Sales delivery order'), type => 'sales_delivery_order', model => 'DeliveryOrder', number => 'donumber', }, - { title => t8('RMA delivery order'), type => 'rma_delivery_order', model => 'DeliveryOrder', number => 'rdonumber', }, - { title => t8('Sales Reclamation'), type => 'sales_reclamation', model => 'Reclamation', number => 'record_number', }, - { title => t8('Sales Invoice'), type => 'invoice', model => 'Invoice', number => 'invnumber', }, - { title => t8('Request for Quotation'), type => 'request_quotation', model => 'Order', number => 'quonumber', }, - { title => t8('Purchase Quotation Intake'), type => 'purchase_quotation_intake', model => 'Order', number => 'quonumber', }, - { title => t8('Purchase Order'), type => 'purchase_order', model => 'Order', number => 'ordnumber', }, - { title => t8('Purchase delivery order'), type => 'purchase_delivery_order', model => 'DeliveryOrder', number => 'donumber', }, - { title => t8('Supplier delivery order'), type => 'supplier_delivery_order', model => 'DeliveryOrder', number => 'sdonumber', }, - { title => t8('Purchase Reclamation'), type => 'purchase_reclamation', model => 'Reclamation', number => 'record_number', }, - { title => t8('Purchase Invoice'), type => 'purchase_invoice', model => 'PurchaseInvoice', number => 'invnumber', }, - { title => t8('Letter'), type => 'letter', model => 'Letter', number => 'letternumber', description => 'subject', description_title => t8('Subject'), date => 'date', project => undef }, - { title => t8('Email'), type => 'email_journal', model => 'EmailJournal', number => 'id', description => 'subject', description_title => t8('Subject'), project => undef, date => 'sent_on', }, - { title => t8('AR Transaction'), type => 'ar_transaction', model => 'Invoice', number => 'invnumber', }, - { title => t8('AP Transaction'), type => 'ap_transaction', model => 'PurchaseInvoice', number => 'invnumber', }, - { title => t8('Dunning'), type => 'dunning', model => 'Dunning', number => 'dunning_id', project => undef, description => undef, }, - { title => t8('GL Transaction'), type => 'gl_transaction', model => 'GLTransaction', number => 'reference', project => undef }, + { title => t8('Requirement spec'), type => 'requirement_spec', model => 'RequirementSpec', number => 'id', project => 'project', description => 'title', date => undef, filter => 'working_copy_filter', }, + { title => t8('Shop Order'), type => 'shop_order', model => 'ShopOrder', number => 'shop_ordernumber', date => 'order_date', project => undef, description => undef, }, + { title => t8('Sales quotation'), type => 'sales_quotation', model => 'Order', number => 'quonumber', }, + { title => t8('Sales Order Intake'), type => 'sales_order_intake', model => 'Order', number => 'ordnumber', }, + { title => t8('Sales Order'), type => 'sales_order', model => 'Order', number => 'ordnumber', }, + { title => t8('Sales delivery order'), type => 'sales_delivery_order', model => 'DeliveryOrder', number => 'donumber', }, + { title => t8('RMA delivery order'), type => 'rma_delivery_order', model => 'DeliveryOrder', number => 'rdonumber', }, + { title => t8('Sales Reclamation'), type => 'sales_reclamation', model => 'Reclamation', number => 'record_number', }, + { title => t8('Sales Invoice'), type => 'invoice', model => 'Invoice', number => 'invnumber', }, + { title => t8('Request for Quotation'), type => 'request_quotation', model => 'Order', number => 'quonumber', }, + { title => t8('Purchase Quotation Intake'), type => 'purchase_quotation_intake', model => 'Order', number => 'quonumber', }, + { title => t8('Purchase Order'), type => 'purchase_order', model => 'Order', number => 'ordnumber', }, + { title => t8('Purchase Order Confirmation'), type => 'purchase_order_confirmation', model => 'Order', number => 'ordnumber', }, + { title => t8('Purchase delivery order'), type => 'purchase_delivery_order', model => 'DeliveryOrder', number => 'donumber', }, + { title => t8('Supplier delivery order'), type => 'supplier_delivery_order', model => 'DeliveryOrder', number => 'sdonumber', }, + { title => t8('Purchase Reclamation'), type => 'purchase_reclamation', model => 'Reclamation', number => 'record_number', }, + { title => t8('Purchase Invoice'), type => 'purchase_invoice', model => 'PurchaseInvoice', number => 'invnumber', }, + { title => t8('Letter'), type => 'letter', model => 'Letter', number => 'letternumber', description => 'subject', description_title => t8('Subject'), date => 'date', project => undef }, + { title => t8('Email'), type => 'email_journal', model => 'EmailJournal', number => 'id', description => 'subject', description_title => t8('Subject'), project => undef, date => 'sent_on', }, + { title => t8('AR Transaction'), type => 'ar_transaction', model => 'Invoice', number => 'invnumber', }, + { title => t8('AP Transaction'), type => 'ap_transaction', model => 'PurchaseInvoice', number => 'invnumber', }, + { title => t8('Dunning'), type => 'dunning', model => 'Dunning', number => 'dunning_id', project => undef, description => undef, }, + { title => t8('GL Transaction'), type => 'gl_transaction', model => 'GLTransaction', number => 'reference', project => undef }, ); my @link_types = map { +{ %link_type_defaults, %{ $_ } } } @link_type_specifics; diff --git a/SL/Controller/TopQuickSearch.pm b/SL/Controller/TopQuickSearch.pm index 5ff0054bd5..80536ee26b 100644 --- a/SL/Controller/TopQuickSearch.pm +++ b/SL/Controller/TopQuickSearch.pm @@ -26,6 +26,7 @@ my @available_modules = ( 'SL::Controller::TopQuickSearch::RequestForQuotation', 'SL::Controller::TopQuickSearch::PurchaseQuotationIntake', 'SL::Controller::TopQuickSearch::PurchaseOrder', + 'SL::Controller::TopQuickSearch::PurchaseOrderConfirmation', 'SL::Controller::TopQuickSearch::PurchaseDeliveryOrder', 'SL::Controller::TopQuickSearch::GLTransaction', 'SL::Controller::TopQuickSearch::Customer', diff --git a/SL/Controller/TopQuickSearch/PurchaseOrderConfirmation.pm b/SL/Controller/TopQuickSearch/PurchaseOrderConfirmation.pm new file mode 100644 index 0000000000..ba3c0d07f2 --- /dev/null +++ b/SL/Controller/TopQuickSearch/PurchaseOrderConfirmation.pm @@ -0,0 +1,20 @@ +package SL::Controller::TopQuickSearch::PurchaseOrderConfirmation; + +use strict; +use parent qw(SL::Controller::TopQuickSearch::OERecord); + +use SL::Locale::String qw(t8); + +sub auth { 'purchase_order_edit | purchase_order_view' } + +sub name { 'purchase_order_confirmation' } + +sub description_config { t8('Purchase Order Confirmations') } + +sub description_field { t8('Purchase Order Confirmations') } + +sub type { 'purchase_order_confirmation' } + +sub vc { 'vendor' } + +1; diff --git a/SL/DB/DeliveryOrder.pm b/SL/DB/DeliveryOrder.pm index 8a62ce2022..ec67d6c3bb 100644 --- a/SL/DB/DeliveryOrder.pm +++ b/SL/DB/DeliveryOrder.pm @@ -17,6 +17,7 @@ use SL::DB::Helper::TransNumberGenerator; use SL::DB::Helper::RecordLink qw(RECORD_ID RECORD_TYPE_REF); use SL::DB::DeliveryOrder::TypeData qw(:types); +use SL::DB::Order::TypeData qw(:types); use SL::DB::Reclamation::TypeData qw(:types); use SL::Helper::Number qw(_format_total _round_total); @@ -129,6 +130,22 @@ sub number { goto &donumber; } +sub preceding_purchase_order_confirmations { + my ($self) = @_; + + my @lrs = (); + if ($self->id) { + @lrs = grep { $_->record_type eq PURCHASE_ORDER_CONFIRMATION_TYPE() } @{$self->linked_records(from => 'SL::DB::Order')}; + } else { + if ('SL::DB::Order' eq $self->{RECORD_TYPE_REF()}) { + my $order = SL::DB::Order->load_cached($self->{RECORD_ID()}); + push @lrs, $order if $order->record_type eq PURCHASE_ORDER_CONFIRMATION_TYPE(); + } + } + + return \@lrs; +} + sub _clone_orderitem_cvar { my ($cvar) = @_; @@ -183,7 +200,6 @@ sub new_from { intnotes language_id notes - ordnumber payment_id reqdate salesman_id @@ -192,8 +208,10 @@ sub new_from { taxincluded taxzone_id transaction_description + vendor_confirmation_number vendor_id ); + $record_args{ordnumber} = $source->ordnumber if $source->record_type ne PURCHASE_ORDER_CONFIRMATION_TYPE(); # }}} for vim folds } elsif ( ref($source) eq 'SL::DB::Reclamation' ) { map{ ( $record_args{$_} = $source->$_ ) } # {{{ for vim folds diff --git a/SL/DB/Helper/LinkedRecords.pm b/SL/DB/Helper/LinkedRecords.pm index 4b4c52b25c..206d40f48e 100644 --- a/SL/DB/Helper/LinkedRecords.pm +++ b/SL/DB/Helper/LinkedRecords.pm @@ -331,26 +331,27 @@ sub sort_linked_records { }; my %scores; - %scores = ( 'SL::DB::SalesProcess' => 10, - 'SL::DB::RequirementSpec' => 15, - 'SL::DB::Order' => sub { $scores{ $_[0]->type } }, - sales_quotation => 20, - sales_order_intake => 25, - sales_order => 30, - sales_delivery_order => 40, - 'SL::DB::DeliveryOrder' => sub { $scores{ $_[0]->type } }, - 'SL::DB::Invoice' => 50, - request_quotation => 120, - purchase_quotation_intake => 125, - purchase_order => 130, - purchase_delivery_order => 140, - 'SL::DB::PurchaseInvoice' => 150, - 'SL::DB::GLTransaction' => 170, - 'SL::DB::Letter' => 200, - 'SL::DB::ShopOrder' => 250, - 'SL::DB::EmailJournal' => 300, - 'SL::DB::Dunning' => 350, - UNKNOWN => 999, + %scores = ( 'SL::DB::SalesProcess' => 10, + 'SL::DB::RequirementSpec' => 15, + 'SL::DB::Order' => sub { $scores{ $_[0]->type } }, + sales_quotation => 20, + sales_order_intake => 25, + sales_order => 30, + sales_delivery_order => 40, + 'SL::DB::DeliveryOrder' => sub { $scores{ $_[0]->type } }, + 'SL::DB::Invoice' => 50, + request_quotation => 120, + purchase_quotation_intake => 125, + purchase_order => 130, + purchase_order_confirmation => 135, + purchase_delivery_order => 140, + 'SL::DB::PurchaseInvoice' => 150, + 'SL::DB::GLTransaction' => 170, + 'SL::DB::Letter' => 200, + 'SL::DB::ShopOrder' => 250, + 'SL::DB::EmailJournal' => 300, + 'SL::DB::Dunning' => 350, + UNKNOWN => 999, ); my $score_xtor = sub { my $score = $scores{ ref($_[0]) }; diff --git a/SL/DB/Helper/TransNumberGenerator.pm b/SL/DB/Helper/TransNumberGenerator.pm index ab4f09a903..f5694ec1b5 100644 --- a/SL/DB/Helper/TransNumberGenerator.pm +++ b/SL/DB/Helper/TransNumberGenerator.pm @@ -27,25 +27,26 @@ sub parts_scoping { # SL::DB::Manager::Part->type_filter($_[0]); } -my %specs = ( ar => { number_column => 'invnumber', }, - sales_quotation => { number_column => 'quonumber', number_range_column => 'sqnumber', scoping => \&oe_scoping, }, - sales_order_intake => { number_column => 'ordnumber', number_range_column => 'soinumber', scoping => \&oe_scoping, }, - sales_order => { number_column => 'ordnumber', number_range_column => 'sonumber', scoping => \&oe_scoping, }, - request_quotation => { number_column => 'quonumber', number_range_column => 'rfqnumber', scoping => \&oe_scoping, }, - purchase_quotation_intake => { number_column => 'quonumber', number_range_column => 'pqinumber', scoping => \&oe_scoping, }, - purchase_order => { number_column => 'ordnumber', number_range_column => 'ponumber', scoping => \&oe_scoping, }, - sales_delivery_order => { number_column => 'donumber', number_range_column => 'sdonumber', scoping => \&do_scoping, }, - purchase_delivery_order => { number_column => 'donumber', number_range_column => 'pdonumber', scoping => \&do_scoping, }, - supplier_delivery_order => { number_column => 'donumber', number_range_column => 'sudonumber', scoping => \&do_scoping, }, - rma_delivery_order => { number_column => 'donumber', number_range_column => 'rdonumber', scoping => \&do_scoping, }, - sales_reclamation => { number_column => 'record_number', number_range_column => 's_reclamation_record_number',scoping => \&rec_scoping, }, - purchase_reclamation => { number_column => 'record_number', number_range_column => 'p_reclamation_record_number',scoping => \&rec_scoping, }, - customer => { number_column => 'customernumber', number_range_column => 'customernumber', }, - vendor => { number_column => 'vendornumber', number_range_column => 'vendornumber', }, - part => { number_column => 'partnumber', number_range_column => 'articlenumber', }, - service => { number_column => 'partnumber', number_range_column => 'servicenumber', }, - assembly => { number_column => 'partnumber', number_range_column => 'assemblynumber', }, - assortment => { number_column => 'partnumber', number_range_column => 'assortmentnumber', }, +my %specs = ( ar => { number_column => 'invnumber', }, + sales_quotation => { number_column => 'quonumber', number_range_column => 'sqnumber', scoping => \&oe_scoping, }, + sales_order_intake => { number_column => 'ordnumber', number_range_column => 'soinumber', scoping => \&oe_scoping, }, + sales_order => { number_column => 'ordnumber', number_range_column => 'sonumber', scoping => \&oe_scoping, }, + request_quotation => { number_column => 'quonumber', number_range_column => 'rfqnumber', scoping => \&oe_scoping, }, + purchase_quotation_intake => { number_column => 'quonumber', number_range_column => 'pqinumber', scoping => \&oe_scoping, }, + purchase_order => { number_column => 'ordnumber', number_range_column => 'ponumber', scoping => \&oe_scoping, }, + purchase_order_confirmation => { number_column => 'ordnumber', number_range_column => 'pocnumber', scoping => \&oe_scoping, }, + sales_delivery_order => { number_column => 'donumber', number_range_column => 'sdonumber', scoping => \&do_scoping, }, + purchase_delivery_order => { number_column => 'donumber', number_range_column => 'pdonumber', scoping => \&do_scoping, }, + supplier_delivery_order => { number_column => 'donumber', number_range_column => 'sudonumber', scoping => \&do_scoping, }, + rma_delivery_order => { number_column => 'donumber', number_range_column => 'rdonumber', scoping => \&do_scoping, }, + sales_reclamation => { number_column => 'record_number', number_range_column => 's_reclamation_record_number',scoping => \&rec_scoping, }, + purchase_reclamation => { number_column => 'record_number', number_range_column => 'p_reclamation_record_number',scoping => \&rec_scoping, }, + customer => { number_column => 'customernumber', number_range_column => 'customernumber', }, + vendor => { number_column => 'vendornumber', number_range_column => 'vendornumber', }, + part => { number_column => 'partnumber', number_range_column => 'articlenumber', }, + service => { number_column => 'partnumber', number_range_column => 'servicenumber', }, + assembly => { number_column => 'partnumber', number_range_column => 'assemblynumber', }, + assortment => { number_column => 'partnumber', number_range_column => 'assortmentnumber', }, ); sub get_next_trans_number { diff --git a/SL/DB/Manager/Order.pm b/SL/DB/Manager/Order.pm index fa611da896..378b96b8d7 100644 --- a/SL/DB/Manager/Order.pm +++ b/SL/DB/Manager/Order.pm @@ -36,6 +36,7 @@ sub type_filter { SALES_ORDER_TYPE(), SALES_QUOTATION_TYPE(), PURCHASE_ORDER_TYPE(), + PURCHASE_ORDER_CONFIRMATION_TYPE(), REQUEST_QUOTATION_TYPE(), PURCHASE_QUOTATION_INTAKE_TYPE(), )); diff --git a/SL/DB/MetaSetup/Default.pm b/SL/DB/MetaSetup/Default.pm index 6289f577c7..77aa0b4c6d 100644 --- a/SL/DB/MetaSetup/Default.pm +++ b/SL/DB/MetaSetup/Default.pm @@ -151,6 +151,7 @@ __PACKAGE__->meta->columns( partsgroup_required => { type => 'boolean', default => 'false', not_null => 1 }, payments_changeable => { type => 'integer', default => '0', not_null => 1 }, pdonumber => { type => 'text' }, + pocnumber => { type => 'text' }, ponumber => { type => 'text' }, pqinumber => { type => 'text' }, precision => { type => 'numeric', default => '0.01', not_null => 1, precision => 15, scale => 5 }, diff --git a/SL/DB/MetaSetup/DeliveryOrder.pm b/SL/DB/MetaSetup/DeliveryOrder.pm index c80c5336a2..2ab10c3623 100644 --- a/SL/DB/MetaSetup/DeliveryOrder.pm +++ b/SL/DB/MetaSetup/DeliveryOrder.pm @@ -9,39 +9,40 @@ use parent qw(SL::DB::Object); __PACKAGE__->meta->table('delivery_orders'); __PACKAGE__->meta->columns( - billing_address_id => { type => 'integer' }, - closed => { type => 'boolean', default => 'false' }, - cp_id => { type => 'integer' }, - currency_id => { type => 'integer', not_null => 1 }, - cusordnumber => { type => 'text' }, - customer_id => { type => 'integer' }, - delivered => { type => 'boolean', default => 'false' }, - delivery_term_id => { type => 'integer' }, - department_id => { type => 'integer' }, - donumber => { type => 'text', not_null => 1 }, - employee_id => { type => 'integer' }, - globalproject_id => { type => 'integer' }, - id => { type => 'integer', not_null => 1, sequence => 'id' }, - intnotes => { type => 'text' }, - itime => { type => 'timestamp', default => 'now()' }, - language_id => { type => 'integer' }, - mtime => { type => 'timestamp' }, - notes => { type => 'text' }, - ordnumber => { type => 'text' }, - oreqnumber => { type => 'text' }, - payment_id => { type => 'integer' }, - record_type => { type => 'enum', check_in => [ 'sales_delivery_order', 'purchase_delivery_order', 'supplier_delivery_order', 'rma_delivery_order' ], db_type => 'delivery_order_types', not_null => 1 }, - reqdate => { type => 'date' }, - salesman_id => { type => 'integer' }, - shippingpoint => { type => 'text' }, - shipto_id => { type => 'integer' }, - shipvia => { type => 'text' }, - tax_point => { type => 'date' }, - taxincluded => { type => 'boolean' }, - taxzone_id => { type => 'integer', not_null => 1 }, - transaction_description => { type => 'text' }, - transdate => { type => 'date', default => 'now()' }, - vendor_id => { type => 'integer' }, + billing_address_id => { type => 'integer' }, + closed => { type => 'boolean', default => 'false' }, + cp_id => { type => 'integer' }, + currency_id => { type => 'integer', not_null => 1 }, + cusordnumber => { type => 'text' }, + customer_id => { type => 'integer' }, + delivered => { type => 'boolean', default => 'false' }, + delivery_term_id => { type => 'integer' }, + department_id => { type => 'integer' }, + donumber => { type => 'text', not_null => 1 }, + employee_id => { type => 'integer' }, + globalproject_id => { type => 'integer' }, + id => { type => 'integer', not_null => 1, sequence => 'id' }, + intnotes => { type => 'text' }, + itime => { type => 'timestamp', default => 'now()' }, + language_id => { type => 'integer' }, + mtime => { type => 'timestamp' }, + notes => { type => 'text' }, + ordnumber => { type => 'text' }, + oreqnumber => { type => 'text' }, + payment_id => { type => 'integer' }, + record_type => { type => 'enum', check_in => [ 'sales_delivery_order', 'purchase_delivery_order', 'supplier_delivery_order', 'rma_delivery_order' ], db_type => 'delivery_order_types', not_null => 1 }, + reqdate => { type => 'date' }, + salesman_id => { type => 'integer' }, + shippingpoint => { type => 'text' }, + shipto_id => { type => 'integer' }, + shipvia => { type => 'text' }, + tax_point => { type => 'date' }, + taxincluded => { type => 'boolean' }, + taxzone_id => { type => 'integer', not_null => 1 }, + transaction_description => { type => 'text' }, + transdate => { type => 'date', default => 'now()' }, + vendor_confirmation_number => { type => 'text' }, + vendor_id => { type => 'integer' }, ); __PACKAGE__->meta->primary_key_columns([ 'id' ]); diff --git a/SL/DB/MetaSetup/Order.pm b/SL/DB/MetaSetup/Order.pm index 9e0657c2b2..ba136e1036 100644 --- a/SL/DB/MetaSetup/Order.pm +++ b/SL/DB/MetaSetup/Order.pm @@ -9,49 +9,50 @@ use parent qw(SL::DB::Object); __PACKAGE__->meta->table('oe'); __PACKAGE__->meta->columns( - amount => { type => 'numeric', precision => 15, scale => 5 }, - billing_address_id => { type => 'integer' }, - closed => { type => 'boolean', default => 'false' }, - cp_id => { type => 'integer' }, - currency_id => { type => 'integer', not_null => 1 }, - cusordnumber => { type => 'text' }, - customer_id => { type => 'integer' }, - delivered => { type => 'boolean', default => 'false' }, - delivery_customer_id => { type => 'integer' }, - delivery_term_id => { type => 'integer' }, - delivery_vendor_id => { type => 'integer' }, - department_id => { type => 'integer' }, - employee_id => { type => 'integer' }, - exchangerate => { type => 'numeric', precision => 15, scale => 5 }, - expected_billing_date => { type => 'date' }, - globalproject_id => { type => 'integer' }, - id => { type => 'integer', not_null => 1, sequence => 'id' }, - intnotes => { type => 'text' }, - itime => { type => 'timestamp', default => 'now()' }, - language_id => { type => 'integer' }, - marge_percent => { type => 'numeric', precision => 15, scale => 5 }, - marge_total => { type => 'numeric', precision => 15, scale => 5 }, - mtime => { type => 'timestamp' }, - netamount => { type => 'numeric', precision => 15, scale => 5 }, - notes => { type => 'text' }, - order_probability => { type => 'integer', default => '0', not_null => 1 }, - order_status_id => { type => 'integer' }, - ordnumber => { type => 'text', not_null => 1 }, - payment_id => { type => 'integer' }, - proforma => { type => 'boolean', default => 'false' }, - quonumber => { type => 'text' }, - record_type => { type => 'enum', check_in => [ 'request_quotation', 'sales_quotation', 'purchase_quotation_intake', 'purchase_order', 'sales_order_intake', 'sales_order' ], db_type => 'order_types', not_null => 1 }, - reqdate => { type => 'date' }, - salesman_id => { type => 'integer' }, - shippingpoint => { type => 'text' }, - shipto_id => { type => 'integer' }, - shipvia => { type => 'text' }, - tax_point => { type => 'date' }, - taxincluded => { type => 'boolean' }, - taxzone_id => { type => 'integer', not_null => 1 }, - transaction_description => { type => 'text' }, - transdate => { type => 'date', default => 'now' }, - vendor_id => { type => 'integer' }, + amount => { type => 'numeric', precision => 15, scale => 5 }, + billing_address_id => { type => 'integer' }, + closed => { type => 'boolean', default => 'false' }, + cp_id => { type => 'integer' }, + currency_id => { type => 'integer', not_null => 1 }, + cusordnumber => { type => 'text' }, + customer_id => { type => 'integer' }, + delivered => { type => 'boolean', default => 'false' }, + delivery_customer_id => { type => 'integer' }, + delivery_term_id => { type => 'integer' }, + delivery_vendor_id => { type => 'integer' }, + department_id => { type => 'integer' }, + employee_id => { type => 'integer' }, + exchangerate => { type => 'numeric', precision => 15, scale => 5 }, + expected_billing_date => { type => 'date' }, + globalproject_id => { type => 'integer' }, + id => { type => 'integer', not_null => 1, sequence => 'id' }, + intnotes => { type => 'text' }, + itime => { type => 'timestamp', default => 'now()' }, + language_id => { type => 'integer' }, + marge_percent => { type => 'numeric', precision => 15, scale => 5 }, + marge_total => { type => 'numeric', precision => 15, scale => 5 }, + mtime => { type => 'timestamp' }, + netamount => { type => 'numeric', precision => 15, scale => 5 }, + notes => { type => 'text' }, + order_probability => { type => 'integer', default => '0', not_null => 1 }, + order_status_id => { type => 'integer' }, + ordnumber => { type => 'text', not_null => 1 }, + payment_id => { type => 'integer' }, + proforma => { type => 'boolean', default => 'false' }, + quonumber => { type => 'text' }, + record_type => { type => 'enum', check_in => [ 'request_quotation', 'sales_quotation', 'purchase_quotation_intake', 'purchase_order', 'sales_order_intake', 'sales_order', 'purchase_order_confirmation' ], db_type => 'order_types', not_null => 1 }, + reqdate => { type => 'date' }, + salesman_id => { type => 'integer' }, + shippingpoint => { type => 'text' }, + shipto_id => { type => 'integer' }, + shipvia => { type => 'text' }, + tax_point => { type => 'date' }, + taxincluded => { type => 'boolean' }, + taxzone_id => { type => 'integer', not_null => 1 }, + transaction_description => { type => 'text' }, + transdate => { type => 'date', default => 'now' }, + vendor_confirmation_number => { type => 'text' }, + vendor_id => { type => 'integer' }, ); __PACKAGE__->meta->primary_key_columns([ 'id' ]); diff --git a/SL/DB/Order.pm b/SL/DB/Order.pm index 68dbd0bee1..1d3a6ed212 100644 --- a/SL/DB/Order.pm +++ b/SL/DB/Order.pm @@ -479,33 +479,38 @@ sub new_from { my $destination_type = delete $params{destination_type}; my @from_tos = ( - { from => SALES_QUOTATION_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'sqso' }, - { from => REQUEST_QUOTATION_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'rqpo' }, - { from => SALES_QUOTATION_TYPE(), to => SALES_QUOTATION_TYPE(), abbr => 'sqsq' }, - { from => SALES_ORDER_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'soso' }, - { from => REQUEST_QUOTATION_TYPE(), to => REQUEST_QUOTATION_TYPE(), abbr => 'rqrq' }, - { from => PURCHASE_ORDER_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'popo' }, - { from => SALES_ORDER_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'sopo' }, - { from => PURCHASE_ORDER_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'poso' }, - { from => SALES_ORDER_TYPE(), to => SALES_QUOTATION_TYPE(), abbr => 'sosq' }, - { from => PURCHASE_ORDER_TYPE(), to => REQUEST_QUOTATION_TYPE(), abbr => 'porq' }, - { from => REQUEST_QUOTATION_TYPE(), to => SALES_QUOTATION_TYPE(), abbr => 'rqsq' }, - { from => REQUEST_QUOTATION_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'rqso' }, - { from => SALES_QUOTATION_TYPE(), to => REQUEST_QUOTATION_TYPE(), abbr => 'sqrq' }, - { from => SALES_ORDER_TYPE(), to => REQUEST_QUOTATION_TYPE(), abbr => 'sorq' }, - { from => SALES_RECLAMATION_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'srso' }, - { from => PURCHASE_RECLAMATION_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'prpo' }, - { from => SALES_ORDER_INTAKE_TYPE(), to => SALES_ORDER_INTAKE_TYPE(), abbr => 'soisoi' }, - { from => SALES_ORDER_INTAKE_TYPE(), to => SALES_QUOTATION_TYPE(), abbr => 'soisq' }, - { from => SALES_ORDER_INTAKE_TYPE(), to => REQUEST_QUOTATION_TYPE(), abbr => 'soirq' }, - { from => SALES_ORDER_INTAKE_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'soiso' }, - { from => SALES_ORDER_INTAKE_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'soipo' }, - { from => SALES_QUOTATION_TYPE(), to => SALES_ORDER_INTAKE_TYPE(), abbr => 'sqsoi' }, - { from => PURCHASE_QUOTATION_INTAKE_TYPE(), to => PURCHASE_QUOTATION_INTAKE_TYPE(), abbr => 'pqipqi' }, - { from => PURCHASE_QUOTATION_INTAKE_TYPE(), to => SALES_QUOTATION_TYPE(), abbr => 'pqisq' }, - { from => PURCHASE_QUOTATION_INTAKE_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'pqiso' }, - { from => PURCHASE_QUOTATION_INTAKE_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'pqipo' }, - { from => REQUEST_QUOTATION_TYPE(), to => PURCHASE_QUOTATION_INTAKE_TYPE(), abbr => 'rqpqi' }, + { from => SALES_QUOTATION_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'sqso' }, + { from => REQUEST_QUOTATION_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'rqpo' }, + { from => SALES_QUOTATION_TYPE(), to => SALES_QUOTATION_TYPE(), abbr => 'sqsq' }, + { from => SALES_ORDER_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'soso' }, + { from => REQUEST_QUOTATION_TYPE(), to => REQUEST_QUOTATION_TYPE(), abbr => 'rqrq' }, + { from => PURCHASE_ORDER_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'popo' }, + { from => SALES_ORDER_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'sopo' }, + { from => PURCHASE_ORDER_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'poso' }, + { from => SALES_ORDER_TYPE(), to => SALES_QUOTATION_TYPE(), abbr => 'sosq' }, + { from => PURCHASE_ORDER_TYPE(), to => REQUEST_QUOTATION_TYPE(), abbr => 'porq' }, + { from => REQUEST_QUOTATION_TYPE(), to => SALES_QUOTATION_TYPE(), abbr => 'rqsq' }, + { from => REQUEST_QUOTATION_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'rqso' }, + { from => SALES_QUOTATION_TYPE(), to => REQUEST_QUOTATION_TYPE(), abbr => 'sqrq' }, + { from => SALES_ORDER_TYPE(), to => REQUEST_QUOTATION_TYPE(), abbr => 'sorq' }, + { from => SALES_RECLAMATION_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'srso' }, + { from => PURCHASE_RECLAMATION_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'prpo' }, + { from => SALES_ORDER_INTAKE_TYPE(), to => SALES_ORDER_INTAKE_TYPE(), abbr => 'soisoi' }, + { from => SALES_ORDER_INTAKE_TYPE(), to => SALES_QUOTATION_TYPE(), abbr => 'soisq' }, + { from => SALES_ORDER_INTAKE_TYPE(), to => REQUEST_QUOTATION_TYPE(), abbr => 'soirq' }, + { from => SALES_ORDER_INTAKE_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'soiso' }, + { from => SALES_ORDER_INTAKE_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'soipo' }, + { from => SALES_QUOTATION_TYPE(), to => SALES_ORDER_INTAKE_TYPE(), abbr => 'sqsoi' }, + { from => PURCHASE_QUOTATION_INTAKE_TYPE(), to => PURCHASE_QUOTATION_INTAKE_TYPE(), abbr => 'pqipqi' }, + { from => PURCHASE_QUOTATION_INTAKE_TYPE(), to => SALES_QUOTATION_TYPE(), abbr => 'pqisq' }, + { from => PURCHASE_QUOTATION_INTAKE_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'pqiso' }, + { from => PURCHASE_QUOTATION_INTAKE_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'pqipo' }, + { from => REQUEST_QUOTATION_TYPE(), to => PURCHASE_QUOTATION_INTAKE_TYPE(), abbr => 'rqpqi' }, + { from => PURCHASE_ORDER_CONFIRMATION_TYPE(), to => PURCHASE_ORDER_CONFIRMATION_TYPE(), abbr => 'pocpoc' }, + { from => PURCHASE_ORDER_CONFIRMATION_TYPE(), to => SALES_QUOTATION_TYPE(), abbr => 'pocsq' }, + { from => PURCHASE_ORDER_CONFIRMATION_TYPE(), to => SALES_ORDER_TYPE(), abbr => 'pocso' }, + { from => PURCHASE_ORDER_CONFIRMATION_TYPE(), to => PURCHASE_ORDER_TYPE(), abbr => 'pocpo' }, + { from => PURCHASE_ORDER_TYPE(), to => PURCHASE_ORDER_CONFIRMATION_TYPE(), abbr => 'popoc' }, ); my $from_to = (grep { $_->{from} eq $source->record_type && $_->{to} eq $destination_type} @from_tos)[0]; croak("Cannot convert from '" . $source->record_type . "' to '" . $destination_type . "'") if !$from_to; @@ -561,6 +566,8 @@ sub new_from { ? undef : $from_to->{to} =~ m/^purchase_quotation_intake$/ ? $source->reqdate + : $from_to->{to} =~ m/^purchase_order_confirmation$/ + ? $source->reqdate : die "Wrong state for reqdate"; } elsif ( ref($source) eq 'SL::DB::Reclamation') { %args = ( map({ ( $_ => $source->$_ ) } qw( @@ -577,7 +584,7 @@ sub new_from { ); } - if ( $is_abbr_any->(qw(soipo sopo poso rqso soisq sosq porq rqsq sqrq soirq sorq pqisq pqiso)) ) { + if ( $is_abbr_any->(qw(soipo sopo poso rqso soisq sosq porq rqsq sqrq soirq sorq pqisq pqiso pocsq pocso)) ) { $args{ordnumber} = undef; $args{quonumber} = undef; } @@ -587,7 +594,7 @@ sub new_from { $args{payment_id} = undef; $args{delivery_term_id} = undef; } - if ( $is_abbr_any->(qw(poso rqsq pqisq pqiso)) ) { + if ( $is_abbr_any->(qw(poso rqsq pqisq pqiso pocsq pocso)) ) { $args{vendor_id} = undef; } if ( $is_abbr_any->(qw(soso)) ) { @@ -596,7 +603,7 @@ sub new_from { if ( $is_abbr_any->(qw(sqrq soirq sorq)) ) { $args{cusordnumber} = undef; } - if ( $is_abbr_any->(qw(soiso)) ) { + if ( $is_abbr_any->(qw(soiso pocpoc pocpo popoc)) ) { $args{ordnumber} = undef; } if ( $is_abbr_any->(qw(rqpqi pqisq)) ) { @@ -657,7 +664,7 @@ sub new_from { $current_oe_item->sellprice($source_item->lastcost); $current_oe_item->discount(0); } - if ( $is_abbr_any->(qw(poso rqsq rqso pqisq pqiso)) ) { + if ( $is_abbr_any->(qw(poso rqsq rqso pqisq pqiso pocsq pocso)) ) { $current_oe_item->lastcost($source_item->sellprice); } unless ($params{no_linked_records}) { @@ -674,7 +681,7 @@ sub new_from { $order->items(\@items); unless ($params{no_linked_records}) { - $order->{ RECORD_ID() } = $source->{id}; + $order->{ RECORD_ID() } = $source->{id}; $order->{ RECORD_TYPE_REF() } = ref($source); } @@ -829,6 +836,22 @@ sub netamount_base_currency { } } +sub preceding_purchase_orders { + my ($self) = @_; + + my @lrs = (); + if ($self->id) { + @lrs = grep { $_->record_type eq PURCHASE_ORDER_TYPE() } @{$self->linked_records(from => 'SL::DB::Order')}; + } else { + if ('SL::DB::Order' eq $self->{RECORD_TYPE_REF()}) { + my $order = SL::DB::Order->load_cached($self->{RECORD_ID()}); + push @lrs, $order if $order->record_type eq PURCHASE_ORDER_TYPE(); + } + } + + return \@lrs; +} + sub type_data { SL::DB::Helper::TypeDataProxy->new(ref $_[0], $_[0]->type); } diff --git a/SL/DB/Order/TypeData.pm b/SL/DB/Order/TypeData.pm index e9654d630e..8501e63a06 100644 --- a/SL/DB/Order/TypeData.pm +++ b/SL/DB/Order/TypeData.pm @@ -6,16 +6,17 @@ use Exporter qw(import); use SL::Locale::String qw(t8); use constant { - SALES_ORDER_TYPE => 'sales_order', - PURCHASE_ORDER_TYPE => 'purchase_order', - SALES_QUOTATION_TYPE => 'sales_quotation', - REQUEST_QUOTATION_TYPE => 'request_quotation', - PURCHASE_QUOTATION_INTAKE_TYPE => 'purchase_quotation_intake', - SALES_ORDER_INTAKE_TYPE => 'sales_order_intake', + SALES_ORDER_TYPE => 'sales_order', + PURCHASE_ORDER_TYPE => 'purchase_order', + SALES_QUOTATION_TYPE => 'sales_quotation', + REQUEST_QUOTATION_TYPE => 'request_quotation', + PURCHASE_QUOTATION_INTAKE_TYPE => 'purchase_quotation_intake', + SALES_ORDER_INTAKE_TYPE => 'sales_order_intake', + PURCHASE_ORDER_CONFIRMATION_TYPE => 'purchase_order_confirmation', }; my @export_types = qw(SALES_ORDER_TYPE PURCHASE_ORDER_TYPE REQUEST_QUOTATION_TYPE SALES_QUOTATION_TYPE - PURCHASE_QUOTATION_INTAKE_TYPE SALES_ORDER_INTAKE_TYPE); + PURCHASE_QUOTATION_INTAKE_TYPE SALES_ORDER_INTAKE_TYPE PURCHASE_ORDER_CONFIRMATION_TYPE); my @export_subs = qw(valid_types validate_type is_valid_type get get3); our @EXPORT_OK = (@export_types, @export_subs); @@ -38,6 +39,7 @@ my %type_data = ( save_and_sales_order_intake => 0, save_and_sales_order => 0, save_and_purchase_order => 1, + save_and_purchase_order_confirmation => 0, save_and_sales_delivery_order => 1, save_and_purchase_delivery_order => 0, save_and_supplier_delivery_order => 0, @@ -46,6 +48,8 @@ my %type_data = ( save_and_final_invoice => 1, save_and_ap_transaction => 0, save_and_invoice => 1, + save_and_print => 1, + save_and_email => 1, delete => sub { $::instance_conf->get_sales_order_show_delete }, }, properties => { @@ -90,6 +94,7 @@ my %type_data = ( save_and_sales_order_intake => 0, save_and_sales_order => 1, save_and_purchase_order => 0, + save_and_purchase_order_confirmation => 1, save_and_sales_delivery_order => 0, save_and_purchase_delivery_order => 1, save_and_supplier_delivery_order => 1, @@ -98,6 +103,8 @@ my %type_data = ( save_and_final_invoice => 0, save_and_ap_transaction => 1, save_and_invoice => 1, + save_and_print => 1, + save_and_email => 1, delete => sub { $::instance_conf->get_purchase_order_show_delete }, }, properties => { @@ -135,6 +142,7 @@ my %type_data = ( save_and_sales_order_intake => 1, save_and_sales_order => 1, save_and_purchase_order => 0, + save_and_purchase_order_confirmation => 0, save_and_sales_delivery_order => 0, save_and_purchase_delivery_order => 0, save_and_supplier_delivery_order => 0, @@ -143,6 +151,8 @@ my %type_data = ( save_and_final_invoice => 0, save_and_ap_transaction => 0, save_and_invoice => 1, + save_and_print => 1, + save_and_email => 1, delete => 1, }, properties => { @@ -187,6 +197,7 @@ my %type_data = ( save_and_sales_order_intake => 0, save_and_sales_order => 1, save_and_purchase_order => 1, + save_and_purchase_order_confirmation => 0, save_and_sales_delivery_order => 0, save_and_purchase_delivery_order => 0, save_and_supplier_delivery_order => 0, @@ -195,6 +206,8 @@ my %type_data = ( save_and_final_invoice => 0, save_and_ap_transaction => 0, save_and_invoice => 1, + save_and_print => 1, + save_and_email => 1, delete => 1, }, properties => { @@ -232,6 +245,7 @@ my %type_data = ( save_and_sales_order_intake => 0, save_and_sales_order => 1, save_and_purchase_order => 1, + save_and_purchase_order_confirmation => 0, save_and_sales_delivery_order => 0, save_and_purchase_delivery_order => 0, save_and_supplier_delivery_order => 0, @@ -240,6 +254,8 @@ my %type_data = ( save_and_final_invoice => 0, save_and_ap_transaction => 0, save_and_invoice => 0, + save_and_print => 1, + save_and_email => 1, delete => 1, }, properties => { @@ -277,6 +293,7 @@ my %type_data = ( save_and_sales_order_intake => 0, save_and_sales_order => 1, save_and_purchase_order => 1, + save_and_purchase_order_confirmation => 0, save_and_sales_delivery_order => 0, save_and_purchase_delivery_order => 0, save_and_supplier_delivery_order => 0, @@ -285,6 +302,8 @@ my %type_data = ( save_and_final_invoice => 0, save_and_ap_transaction => 0, save_and_invoice => 0, + save_and_print => 1, + save_and_email => 1, delete => sub { $::instance_conf->get_sales_order_show_delete }, }, properties => { @@ -313,6 +332,54 @@ my %type_data = ( subversions => sub { $::instance_conf->get_lock_oe_subversions }, }, }, + PURCHASE_ORDER_CONFIRMATION_TYPE() => { + text => { + delete => t8('The order confirmation has been deleted'), + saved => t8('The order confirmation has been saved'), + add => t8("Add Purchase Order Confirmation"), + edit => t8("Edit Purchase Order Confirmation"), + list => t8("Purchase Order Confirmations"), + attachment => t8("purchase_order_confirmation_list"), + }, + show_menu => { + save_and_quotation => 1, + save_and_rfq => 0, + save_and_purchase_quotation_intake => 0, + save_and_sales_order_intake => 0, + save_and_sales_order => 1, + save_and_purchase_order => 1, + save_and_purchase_order_confirmation => 0, + save_and_sales_delivery_order => 0, + save_and_purchase_delivery_order => 1, + save_and_supplier_delivery_order => 1, + save_and_reclamation => 1, + save_and_invoice_for_advance_payment => 0, + save_and_final_invoice => 0, + save_and_ap_transaction => 1, + save_and_invoice => 1, + save_and_print => 0, + save_and_email => 0, + delete => sub { $::instance_conf->get_purchase_order_show_delete }, + }, + properties => { + customervendor => "vendor", + is_customer => 0, + nr_key => "ordnumber", + }, + defaults => { + reqdate => sub { return; }, + }, + part_classification_query => [ "used_for_purchase" => 1 ], + rights => { + edit => "purchase_order_edit", + view => "purchase_order_edit | sales_order_view", + }, + features => { + price_tax => 1, + stock => 0, + subversions => sub { $::instance_conf->get_lock_oe_subversions }, + }, + }, ); my @valid_types = ( @@ -322,6 +389,7 @@ my @valid_types = ( REQUEST_QUOTATION_TYPE, PURCHASE_QUOTATION_INTAKE_TYPE, SALES_ORDER_INTAKE_TYPE, + PURCHASE_ORDER_CONFIRMATION_TYPE, ); my %valid_types = map { $_ => $_ } @valid_types; diff --git a/SL/DO.pm b/SL/DO.pm index 6bdacf28df..97cd8c6e9e 100644 --- a/SL/DO.pm +++ b/SL/DO.pm @@ -68,13 +68,16 @@ sub transactions { # connect to database my $dbh = $form->get_standard_dbh($myconfig); - my (@where, @values, $where); + my (@where, @values); my $vc = $form->{vc} eq "customer" ? "customer" : "vendor"; + $form->{l_order_confirmation_number} = 'Y' if $form->{order_confirmation_number}; + my $query = qq|SELECT dord.id, dord.donumber, dord.ordnumber, dord.cusordnumber, dord.transdate, dord.reqdate, + dord.vendor_confirmation_number, ct.${vc}number, ct.name, ct.business_id, dord.${vc}_id, dord.globalproject_id, dord.closed, dord.delivered, dord.shippingpoint, dord.shipvia, @@ -141,12 +144,25 @@ sub transactions { push @values, $::myconfig{login}; } - foreach my $item (qw(donumber ordnumber cusordnumber transaction_description)) { + foreach my $item (qw(donumber ordnumber cusordnumber transaction_description vendor_confirmation_number)) { next unless ($form->{$item}); push @where, qq|dord.$item ILIKE ?|; push @values, like($form->{$item}); } + if ($form->{order_confirmation_number}) { + push @where, qq|(EXISTS (SELECT id FROM oe + WHERE ordnumber ILIKE ? + AND record_type = 'purchase_order_confirmation' + AND id IN + (SELECT from_id FROM record_links + WHERE to_id = dord.id + AND to_table = 'delivery_orders' + AND from_table = 'oe') + ))|; + push @values, like($form->{order_confirmation_number}); + } + if (($form->{open} || $form->{closed}) && ($form->{open} ne $form->{closed})) { push @where, ($form->{open} ? "NOT " : "") . "COALESCE(dord.closed, FALSE)"; @@ -203,7 +219,9 @@ sub transactions { dord.ordnumber dord.cusordnumber dord.oreqnumber - ); + dord.vendor_confirmation_number + oe.ordnumber + ); my $tmp_where = ''; $tmp_where .= join ' OR ', map {"$_ ILIKE ?"} @fulltext_fields; push(@values, like($form->{fulltext})) for 1 .. (scalar @fulltext_fields); @@ -289,6 +307,7 @@ SQL "transaction_description" => "dord.transaction_description", "department" => "lower(dep.description)", "insertdate" => "dord.itime", + "vendor_confirmation_number" => "dord.vendor_confirmation_number", ); my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; @@ -323,6 +342,20 @@ SQL $items_sth = prepare_query($form, $dbh, $items_query); } + my ($order_confirmation_query, $order_confirmation_sth); + if ($form->{l_order_confirmation_number}) { + $order_confirmation_query = + qq|SELECT id, ordnumber FROM oe + WHERE id IN + (SELECT from_id FROM record_links + WHERE from_table = 'oe' + AND to_table = 'delivery_orders' + AND to_id = ?) + AND record_type = 'purchase_order_confirmation' ORDER BY ordnumber|; + + $order_confirmation_sth = prepare_query($form, $dbh, $order_confirmation_query); + } + foreach my $dord (@{ $form->{DO} }) { if ($form->{l_items}) { do_statement($form, $items_sth, $items_query, $dord->{id}); @@ -330,13 +363,20 @@ SQL $dord->{item_ids} = undef if !@{$dord->{item_ids}}; } + if ($form->{l_order_confirmation_number}) { + do_statement($form, $order_confirmation_sth, $order_confirmation_query, $dord->{id}); + my @r = @{$order_confirmation_sth->fetchall_arrayref()}; + push @{$dord->{order_confirmation_numbers}}, { id => $_->[0], number => $_->[1] } for @r; + } + next unless ($dord->{ordnumber}); do_statement($form, $sth, $query, $dord->{ordnumber}); ($dord->{oe_id}) = $sth->fetchrow_array(); } $sth->finish(); - $items_sth->finish() if $form->{l_items}; + $items_sth->finish() if $form->{l_items}; + $order_confirmation_sth->finish() if $form->{l_order_confirmation_number}; } $main::lxdebug->leave_sub(); diff --git a/SL/File/Backend/Webdav.pm b/SL/File/Backend/Webdav.pm index b049a1468a..28ab679ad0 100644 --- a/SL/File/Backend/Webdav.pm +++ b/SL/File/Backend/Webdav.pm @@ -120,6 +120,7 @@ my %type_to_path = ( request_quotation => 'anfragen', purchase_quotation_intake => 'angebotseingaenge', purchase_order => 'lieferantenbestellungen', + purchase_order_confirmation => 'lieferantenauftragsbestaetigungen', sales_delivery_order => 'verkaufslieferscheine', purchase_delivery_order => 'einkaufslieferscheine', purchase_reclamation => 'einkaufsreklamation', diff --git a/SL/Form.pm b/SL/Form.pm index 62084b1bf6..e9461aa9a3 100644 --- a/SL/Form.pm +++ b/SL/Form.pm @@ -1102,6 +1102,7 @@ sub get_formname_translation { pick_list => $main::locale->text('Pick List'), proforma => $main::locale->text('Proforma Invoice'), purchase_order => $main::locale->text('Purchase Order'), + purchase_order_confirmation => $main::locale->text('Purchase Order Confirmation'), request_quotation => $main::locale->text('RFQ'), purchase_quotation_intake => $main::locale->text('Purchase Quotation Intake'), sales_order_intake => $main::locale->text('Sales Order Intake'), @@ -2926,6 +2927,7 @@ sub save_status { # $main::locale->text('sales_order') # $main::locale->text('pick_list') # $main::locale->text('purchase_order') +# $main::locale->text('purchase_order_confirmation') # $main::locale->text('bin_list') # $main::locale->text('sales_quotation') # $main::locale->text('request_quotation') diff --git a/SL/Helper/PrintOptions.pm b/SL/Helper/PrintOptions.pm index 67233913a0..d519d6e8ae 100644 --- a/SL/Helper/PrintOptions.pm +++ b/SL/Helper/PrintOptions.pm @@ -50,6 +50,9 @@ sub get_print_options { opthash("purchase_order", $form->{PD}{purchase_order}, $locale->text('Purchase Order')), opthash("bin_list", $form->{PD}{bin_list}, $locale->text('Bin List')) ) : undef, + ($form->{type} eq 'purchase_order_confirmation') ? ( + opthash("purchase_order_confirmation", $form->{PD}{purchase_order}, $locale->text('Purchase Order Confirmation')), + ) : undef, ($form->{type} eq 'credit_note') ? opthash("credit_note", $form->{PD}{credit_note}, $locale->text('Credit Note')) : undef, ($form->{type} eq 'sales_order_intake') ? ( diff --git a/SL/OE.pm b/SL/OE.pm index 69c45cc525..bf3125e925 100644 --- a/SL/OE.pm +++ b/SL/OE.pm @@ -136,6 +136,7 @@ SQL qq| o.exchangerate, | . qq| o.itime::DATE AS insertdate, | . qq| o.intnotes,| . + qq| o.vendor_confirmation_number,| . qq| department.description as department, | . qq| ex.$rate AS daily_exchangerate, | . qq| pt.description AS payment_terms, | . @@ -250,6 +251,11 @@ SQL push(@values, like($form->{cusordnumber})); } + if ($form->{vendor_confirmation_number}) { + $query .= qq| AND o.vendor_confirmation_number ILIKE ?|; + push(@values, like($form->{vendor_confirmation_number})); + } + if($form->{transdatefrom}) { $query .= qq| AND o.transdate >= ?|; push(@values, conv_date($form->{transdatefrom})); @@ -344,7 +350,8 @@ SQL o.transaction_description o.quonumber o.ordnumber - o.cusordnumber); + o.cusordnumber + o.vendor_confirmation_number); $query .= ' AND ('; $query .= join ' ILIKE ? OR ', @fulltext_fields; $query .= ' ILIKE ?'; @@ -476,6 +483,7 @@ SQL "department" => "department.description", "intnotes" => "o.intnotes", "order_status" => "order_statuses.name", + "vendor_confirmation_number" => "o.vendor_confirmation_number", ); if ($form->{sort} && grep($form->{sort}, keys(%allowed_sort_columns))) { $sortorder = $allowed_sort_columns{$form->{sort}} . " ${sortdir}" . ", o.itime ${sortdir}"; diff --git a/SL/Presenter/Order.pm b/SL/Presenter/Order.pm index f7d90c8e83..a7ba3675d9 100644 --- a/SL/Presenter/Order.pm +++ b/SL/Presenter/Order.pm @@ -6,7 +6,7 @@ use SL::Presenter::EscapedText qw(escape is_escaped); use SL::Presenter::Tag qw(link_tag); use Exporter qw(import); -our @EXPORT_OK = qw(sales_quotation sales_order request_quotation purchase_order); +our @EXPORT_OK = qw(sales_quotation sales_order request_quotation purchase_order purchase_order_confirmation); use Carp; @@ -46,6 +46,12 @@ sub purchase_order { return _oe_record($order, 'purchase_order', %params); } +sub purchase_order_confirmation { + my ($order, %params) = @_; + + return _oe_record($order, 'purchase_order_confirmation', %params); +} + sub _oe_record { my ($order, $type, %params) = @_; @@ -80,7 +86,8 @@ __END__ SL::Presenter::Order - Presenter module for Rose::DB objects for sales quotations, sales order_intakes, sales orders, -requests for quotations, purchase_quotation_intakes and purchase orders +requests for quotations, purchase_quotation_intakes, +purchase orders and purchase order confirmations =head1 SYNOPSIS diff --git a/SL/Presenter/Record.pm b/SL/Presenter/Record.pm index 7f672adb9f..53742827ef 100644 --- a/SL/Presenter/Record.pm +++ b/SL/Presenter/Record.pm @@ -43,39 +43,40 @@ sub grouped_record_list { my %groups = _sort_grouped_lists(_group_records($list)); my $output = ''; - $output .= _requirement_spec_list( $groups{requirement_specs}, %params) if $groups{requirement_specs}; - $output .= _shop_order_list( $groups{shop_orders}, %params) if $groups{shop_orders}; - $output .= _sales_quotation_list( $groups{sales_quotations}, %params) if $groups{sales_quotations}; - $output .= _sales_order_intake_list( $groups{sales_order_intakes}, %params) if $groups{sales_order_intakes}; - $output .= _sales_order_list( $groups{sales_orders}, %params) if $groups{sales_orders}; - $output .= _sales_delivery_order_list( $groups{sales_delivery_orders}, %params) if $groups{sales_delivery_orders}; - $output .= _rma_delivery_order_list( $groups{rma_delivery_orders}, %params) if $groups{rma_delivery_orders}; - $output .= _sales_reclamation_list( $groups{sales_reclamation}, %params) if $groups{sales_reclamation}; - $output .= _sales_invoice_list( $groups{sales_invoices}, %params) if $groups{sales_invoices}; - $output .= _ar_transaction_list( $groups{ar_transactions}, %params) if $groups{ar_transactions}; + $output .= _requirement_spec_list( $groups{requirement_specs}, %params) if $groups{requirement_specs}; + $output .= _shop_order_list( $groups{shop_orders}, %params) if $groups{shop_orders}; + $output .= _sales_quotation_list( $groups{sales_quotations}, %params) if $groups{sales_quotations}; + $output .= _sales_order_intake_list( $groups{sales_order_intakes}, %params) if $groups{sales_order_intakes}; + $output .= _sales_order_list( $groups{sales_orders}, %params) if $groups{sales_orders}; + $output .= _sales_delivery_order_list( $groups{sales_delivery_orders}, %params) if $groups{sales_delivery_orders}; + $output .= _rma_delivery_order_list( $groups{rma_delivery_orders}, %params) if $groups{rma_delivery_orders}; + $output .= _sales_reclamation_list( $groups{sales_reclamation}, %params) if $groups{sales_reclamation}; + $output .= _sales_invoice_list( $groups{sales_invoices}, %params) if $groups{sales_invoices}; + $output .= _ar_transaction_list( $groups{ar_transactions}, %params) if $groups{ar_transactions}; - $output .= _request_quotation_list( $groups{purchase_quotations}, %params) if $groups{purchase_quotations}; - $output .= _purchase_quotation_intake_list( $groups{purchase_quotation_intakes}, %params) if $groups{purchase_quotation_intakes}; - $output .= _purchase_order_list( $groups{purchase_orders}, %params) if $groups{purchase_orders}; - $output .= _purchase_delivery_order_list( $groups{purchase_delivery_orders}, %params) if $groups{purchase_delivery_orders}; - $output .= _supplier_delivery_order_list( $groups{supplier_delivery_orders}, %params) if $groups{supplier_delivery_orders}; - $output .= _purchase_reclamation_list( $groups{purchase_reclamation}, %params) if $groups{purchase_reclamation}; - $output .= _purchase_invoice_list( $groups{purchase_invoices}, %params) if $groups{purchase_invoices}; - $output .= _ap_transaction_list( $groups{ap_transactions}, %params) if $groups{ap_transactions}; + $output .= _request_quotation_list( $groups{purchase_quotations}, %params) if $groups{purchase_quotations}; + $output .= _purchase_quotation_intake_list( $groups{purchase_quotation_intakes}, %params) if $groups{purchase_quotation_intakes}; + $output .= _purchase_order_list( $groups{purchase_orders}, %params) if $groups{purchase_orders}; + $output .= _purchase_order_confirmation_list($groups{purchase_order_confirmations}, %params) if $groups{purchase_order_confirmations}; + $output .= _purchase_delivery_order_list( $groups{purchase_delivery_orders}, %params) if $groups{purchase_delivery_orders}; + $output .= _supplier_delivery_order_list( $groups{supplier_delivery_orders}, %params) if $groups{supplier_delivery_orders}; + $output .= _purchase_reclamation_list( $groups{purchase_reclamation}, %params) if $groups{purchase_reclamation}; + $output .= _purchase_invoice_list( $groups{purchase_invoices}, %params) if $groups{purchase_invoices}; + $output .= _ap_transaction_list( $groups{ap_transactions}, %params) if $groups{ap_transactions}; - $output .= _gl_transaction_list( $groups{gl_transactions}, %params) if $groups{gl_transactions}; + $output .= _gl_transaction_list( $groups{gl_transactions}, %params) if $groups{gl_transactions}; - $output .= _bank_transactions( $groups{bank_transactions}, %params) if $groups{bank_transactions}; + $output .= _bank_transactions( $groups{bank_transactions}, %params) if $groups{bank_transactions}; - $output .= _sepa_collection_list( $groups{sepa_collections}, %params) if $groups{sepa_collections}; - $output .= _sepa_transfer_list( $groups{sepa_transfers}, %params) if $groups{sepa_transfers}; + $output .= _sepa_collection_list( $groups{sepa_collections}, %params) if $groups{sepa_collections}; + $output .= _sepa_transfer_list( $groups{sepa_transfers}, %params) if $groups{sepa_transfers}; - $output .= _letter_list( $groups{letters}, %params) if $groups{letters}; - $output .= _email_journal_list( $groups{email_journals}, %params) if $groups{email_journals}; + $output .= _letter_list( $groups{letters}, %params) if $groups{letters}; + $output .= _email_journal_list( $groups{email_journals}, %params) if $groups{email_journals}; - $output .= _dunning_list( $groups{dunnings}, %params) if $groups{dunnings}; + $output .= _dunning_list( $groups{dunnings}, %params) if $groups{dunnings}; - $output = SL::Presenter->get->render('presenter/record/grouped_record_list', %params, output => $output); + $output = SL::Presenter->get->render('presenter/record/grouped_record_list', %params, output => $output); return $output; } @@ -187,31 +188,32 @@ sub list { goto &record_list } sub _group_records { my ($list) = @_; my %matchers = ( - requirement_specs => sub { (ref($_[0]) eq 'SL::DB::RequirementSpec') }, - shop_orders => sub { (ref($_[0]) eq 'SL::DB::ShopOrder') && $_[0]->id }, - sales_quotations => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('sales_quotation') }, - sales_order_intakes => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('sales_order_intake') }, - sales_orders => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('sales_order') }, - sales_delivery_orders => sub { (ref($_[0]) eq 'SL::DB::DeliveryOrder') && $_[0]->is_type('sales_delivery_order') }, - rma_delivery_orders => sub { (ref($_[0]) eq 'SL::DB::DeliveryOrder') && $_[0]->is_type('rma_delivery_order') }, - sales_reclamation => sub { (ref($_[0]) eq 'SL::DB::Reclamation') && $_[0]->is_type('sales_reclamation') }, - sales_invoices => sub { (ref($_[0]) eq 'SL::DB::Invoice') && $_[0]->invoice }, - ar_transactions => sub { (ref($_[0]) eq 'SL::DB::Invoice') && !$_[0]->invoice }, - purchase_quotations => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('request_quotation') }, - purchase_quotation_intakes => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('purchase_quotation_intake') }, - purchase_orders => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('purchase_order') }, - purchase_delivery_orders => sub { (ref($_[0]) eq 'SL::DB::DeliveryOrder') && $_[0]->is_type('purchase_delivery_order') }, - supplier_delivery_orders => sub { (ref($_[0]) eq 'SL::DB::DeliveryOrder') && $_[0]->is_type('supplier_delivery_order') }, - purchase_reclamation => sub { (ref($_[0]) eq 'SL::DB::Reclamation') && $_[0]->is_type('purchase_reclamation')}, - purchase_invoices => sub { (ref($_[0]) eq 'SL::DB::PurchaseInvoice') && $_[0]->invoice }, - ap_transactions => sub { (ref($_[0]) eq 'SL::DB::PurchaseInvoice') && !$_[0]->invoice }, - sepa_collections => sub { (ref($_[0]) eq 'SL::DB::SepaExportItem') && $_[0]->ar_id }, - sepa_transfers => sub { (ref($_[0]) eq 'SL::DB::SepaExportItem') && $_[0]->ap_id }, - gl_transactions => sub { (ref($_[0]) eq 'SL::DB::GLTransaction') }, - bank_transactions => sub { (ref($_[0]) eq 'SL::DB::BankTransaction') && $_[0]->id }, - letters => sub { (ref($_[0]) eq 'SL::DB::Letter') && $_[0]->id }, - email_journals => sub { (ref($_[0]) eq 'SL::DB::EmailJournal') && $_[0]->id }, - dunnings => sub { (ref($_[0]) eq 'SL::DB::Dunning') }, + requirement_specs => sub { (ref($_[0]) eq 'SL::DB::RequirementSpec') }, + shop_orders => sub { (ref($_[0]) eq 'SL::DB::ShopOrder') && $_[0]->id }, + sales_quotations => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('sales_quotation') }, + sales_order_intakes => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('sales_order_intake') }, + sales_orders => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('sales_order') }, + sales_delivery_orders => sub { (ref($_[0]) eq 'SL::DB::DeliveryOrder') && $_[0]->is_type('sales_delivery_order') }, + rma_delivery_orders => sub { (ref($_[0]) eq 'SL::DB::DeliveryOrder') && $_[0]->is_type('rma_delivery_order') }, + sales_reclamation => sub { (ref($_[0]) eq 'SL::DB::Reclamation') && $_[0]->is_type('sales_reclamation') }, + sales_invoices => sub { (ref($_[0]) eq 'SL::DB::Invoice') && $_[0]->invoice }, + ar_transactions => sub { (ref($_[0]) eq 'SL::DB::Invoice') && !$_[0]->invoice }, + purchase_quotations => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('request_quotation') }, + purchase_quotation_intakes => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('purchase_quotation_intake') }, + purchase_orders => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('purchase_order') }, + purchase_order_confirmations => sub { (ref($_[0]) eq 'SL::DB::Order') && $_[0]->is_type('purchase_order_confirmation') }, + purchase_delivery_orders => sub { (ref($_[0]) eq 'SL::DB::DeliveryOrder') && $_[0]->is_type('purchase_delivery_order') }, + supplier_delivery_orders => sub { (ref($_[0]) eq 'SL::DB::DeliveryOrder') && $_[0]->is_type('supplier_delivery_order') }, + purchase_reclamation => sub { (ref($_[0]) eq 'SL::DB::Reclamation') && $_[0]->is_type('purchase_reclamation') }, + purchase_invoices => sub { (ref($_[0]) eq 'SL::DB::PurchaseInvoice') && $_[0]->invoice }, + ap_transactions => sub { (ref($_[0]) eq 'SL::DB::PurchaseInvoice') && !$_[0]->invoice }, + sepa_collections => sub { (ref($_[0]) eq 'SL::DB::SepaExportItem') && $_[0]->ar_id }, + sepa_transfers => sub { (ref($_[0]) eq 'SL::DB::SepaExportItem') && $_[0]->ap_id }, + gl_transactions => sub { (ref($_[0]) eq 'SL::DB::GLTransaction') }, + bank_transactions => sub { (ref($_[0]) eq 'SL::DB::BankTransaction') && $_[0]->id }, + letters => sub { (ref($_[0]) eq 'SL::DB::Letter') && $_[0]->id }, + email_journals => sub { (ref($_[0]) eq 'SL::DB::EmailJournal') && $_[0]->id }, + dunnings => sub { (ref($_[0]) eq 'SL::DB::Dunning') }, ); my %groups; @@ -249,10 +251,10 @@ sub _requirement_spec_list { type => 'requirement_spec', columns => [ [ $::locale->text('Requirement spec number'), sub { $_[0]->presenter->requirement_spec(display => 'table-cell') } ], - [ $::locale->text('Customer'), 'customer' ], - [ $::locale->text('Title'), 'title' ], - [ $::locale->text('Project'), 'project', ], - [ $::locale->text('Status'), sub { $_[0]->status->description } ], + [ $::locale->text('Customer'), 'customer' ], + [ $::locale->text('Title'), 'title' ], + [ $::locale->text('Project'), 'project', ], + [ $::locale->text('Status'), sub { $_[0]->status->description } ], ], %params, ); @@ -266,10 +268,10 @@ sub _shop_order_list { title => $::locale->text('Shop Orders'), type => 'shop_order', columns => [ - [ $::locale->text('Shop Order Date'), sub { $_[0]->order_date->to_kivitendo } ], - [ $::locale->text('Shop Order Number'), sub { $_[0]->presenter->shop_order(display => 'table-cell') } ], - [ $::locale->text('Transfer Date'), 'transfer_date' ], - [ $::locale->text('Amount'), 'amount' ], + [ $::locale->text('Shop Order Date'), sub { $_[0]->order_date->to_kivitendo } ], + [ $::locale->text('Shop Order Number'), sub { $_[0]->presenter->shop_order(display => 'table-cell') } ], + [ $::locale->text('Transfer Date'), 'transfer_date' ], + [ $::locale->text('Amount'), 'amount' ], ], %params, ); @@ -283,13 +285,13 @@ sub _sales_quotation_list { title => $::locale->text('Sales Quotations'), type => 'sales_quotation', columns => [ - [ $::locale->text('Quotation Date'), 'transdate' ], - [ $::locale->text('Quotation Number'), sub { $_[0]->presenter->sales_quotation(display => 'table-cell') } ], - [ $::locale->text('Customer'), 'customer' ], - [ $::locale->text('Net amount'), 'netamount' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], - [ $::locale->text('Project'), 'globalproject', ], - [ $::locale->text('Closed'), 'closed' ], + [ $::locale->text('Quotation Date'), 'transdate' ], + [ $::locale->text('Quotation Number'), sub { $_[0]->presenter->sales_quotation(display => 'table-cell') } ], + [ $::locale->text('Customer'), 'customer' ], + [ $::locale->text('Net amount'), 'netamount' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Project'), 'globalproject', ], + [ $::locale->text('Closed'), 'closed' ], ], %params, ); @@ -303,13 +305,13 @@ sub _request_quotation_list { title => $::locale->text('Request Quotations'), type => 'request_quotation', columns => [ - [ $::locale->text('Quotation Date'), 'transdate' ], - [ $::locale->text('Quotation Number'), sub { $_[0]->presenter->request_quotation(display => 'table-cell') } ], - [ $::locale->text('Vendor'), 'vendor' ], - [ $::locale->text('Net amount'), 'netamount' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], - [ $::locale->text('Project'), 'globalproject', ], - [ $::locale->text('Closed'), 'closed' ], + [ $::locale->text('Quotation Date'), 'transdate' ], + [ $::locale->text('Quotation Number'), sub { $_[0]->presenter->request_quotation(display => 'table-cell') } ], + [ $::locale->text('Vendor'), 'vendor' ], + [ $::locale->text('Net amount'), 'netamount' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Project'), 'globalproject', ], + [ $::locale->text('Closed'), 'closed' ], ], %params, ); @@ -323,13 +325,13 @@ sub _purchase_quotation_intake_list { title => $::locale->text('Purchase Quotation Intakes'), type => 'purchase_quotation_intake', columns => [ - [ $::locale->text('Quotation Date'), 'transdate' ], + [ $::locale->text('Quotation Date'), 'transdate' ], [ $::locale->text('Quotation Number'), sub { $_[0]->presenter->purchase_quotation_intake(display => 'table-cell') } ], - [ $::locale->text('Vendor'), 'vendor' ], - [ $::locale->text('Net amount'), 'netamount' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], - [ $::locale->text('Project'), 'globalproject', ], - [ $::locale->text('Closed'), 'closed' ], + [ $::locale->text('Vendor'), 'vendor' ], + [ $::locale->text('Net amount'), 'netamount' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Project'), 'globalproject', ], + [ $::locale->text('Closed'), 'closed' ], ], %params, ); @@ -343,14 +345,14 @@ sub _sales_order_intake_list { title => $::locale->text('Sales Order Intakes'), type => 'sales_order_intake', columns => [ - [ $::locale->text('Order Date'), 'transdate' ], - [ $::locale->text('Order Number'), sub { $_[0]->presenter->sales_order_intake(display => 'table-cell') } ], - [ $::locale->text('Quotation'), 'quonumber' ], - [ $::locale->text('Customer'), 'customer' ], - [ $::locale->text('Net amount'), 'netamount' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], - [ $::locale->text('Project'), 'globalproject', ], - [ $::locale->text('Closed'), 'closed' ], + [ $::locale->text('Order Date'), 'transdate' ], + [ $::locale->text('Order Number'), sub { $_[0]->presenter->sales_order_intake(display => 'table-cell') } ], + [ $::locale->text('Quotation'), 'quonumber' ], + [ $::locale->text('Customer'), 'customer' ], + [ $::locale->text('Net amount'), 'netamount' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Project'), 'globalproject', ], + [ $::locale->text('Closed'), 'closed' ], ], %params, ); @@ -364,14 +366,14 @@ sub _sales_order_list { title => $::locale->text('Sales Orders'), type => 'sales_order', columns => [ - [ $::locale->text('Order Date'), 'transdate' ], - [ $::locale->text('Order Number'), sub { $_[0]->presenter->sales_order(display => 'table-cell') } ], - [ $::locale->text('Quotation'), 'quonumber' ], - [ $::locale->text('Customer'), 'customer' ], - [ $::locale->text('Net amount'), 'netamount' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], - [ $::locale->text('Project'), 'globalproject', ], - [ $::locale->text('Closed'), 'closed' ], + [ $::locale->text('Order Date'), 'transdate' ], + [ $::locale->text('Order Number'), sub { $_[0]->presenter->sales_order(display => 'table-cell') } ], + [ $::locale->text('Quotation'), 'quonumber' ], + [ $::locale->text('Customer'), 'customer' ], + [ $::locale->text('Net amount'), 'netamount' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Project'), 'globalproject', ], + [ $::locale->text('Closed'), 'closed' ], ], %params, ); @@ -385,14 +387,34 @@ sub _purchase_order_list { title => $::locale->text('Purchase Orders'), type => 'purchase_order', columns => [ - [ $::locale->text('Order Date'), 'transdate' ], - [ $::locale->text('Order Number'), sub { $_[0]->presenter->purchase_order(display => 'table-cell') } ], - [ $::locale->text('Request for Quotation'), 'quonumber' ], - [ $::locale->text('Vendor'), 'vendor' ], - [ $::locale->text('Net amount'), 'netamount' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], - [ $::locale->text('Project'), 'globalproject', ], - [ $::locale->text('Closed'), 'closed' ], + [ $::locale->text('Order Date'), 'transdate' ], + [ $::locale->text('Order Number'), sub { $_[0]->presenter->purchase_order(display => 'table-cell') } ], + [ $::locale->text('Request for Quotation'), 'quonumber' ], + [ $::locale->text('Vendor'), 'vendor' ], + [ $::locale->text('Net amount'), 'netamount' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Project'), 'globalproject', ], + [ $::locale->text('Closed'), 'closed' ], + ], + %params, + ); +} + +sub _purchase_order_confirmation_list { + my ($list, %params) = @_; + + return record_list( + $list, + title => $::locale->text('Purchase Order Confirmations'), + type => 'purchase_order_confirmation', + columns => [ + [ $::locale->text('Confirmation Date'), 'transdate' ], + [ $::locale->text('Confirmation Number'), sub { $_[0]->presenter->purchase_order_confirmation(display => 'table-cell') } ], + [ $::locale->text('Vendor'), 'vendor' ], + [ $::locale->text('Net amount'), 'netamount' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Project'), 'globalproject', ], + [ $::locale->text('Closed'), 'closed' ], ], %params, ); @@ -406,14 +428,14 @@ sub _sales_delivery_order_list { title => $::locale->text('Sales Delivery Orders'), type => 'sales_delivery_order', columns => [ - [ $::locale->text('Delivery Order Date'), 'transdate' ], - [ $::locale->text('Delivery Order Number'), sub { $_[0]->presenter->sales_delivery_order(display => 'table-cell') } ], - [ $::locale->text('Order Number'), 'ordnumber' ], - [ $::locale->text('Customer'), 'customer' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], - [ $::locale->text('Project'), 'globalproject', ], - [ $::locale->text('Delivered'), 'delivered' ], - [ $::locale->text('Closed'), 'closed' ], + [ $::locale->text('Delivery Order Date'), 'transdate' ], + [ $::locale->text('Delivery Order Number'), sub { $_[0]->presenter->sales_delivery_order(display => 'table-cell') } ], + [ $::locale->text('Order Number'), 'ordnumber' ], + [ $::locale->text('Customer'), 'customer' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Project'), 'globalproject', ], + [ $::locale->text('Delivered'), 'delivered' ], + [ $::locale->text('Closed'), 'closed' ], ], %params, ); @@ -427,14 +449,14 @@ sub _rma_delivery_order_list { title => $::locale->text('RMA Delivery Orders'), type => 'rma_delivery_order', columns => [ - [ $::locale->text('Delivery Order Date'), 'transdate' ], - [ $::locale->text('Delivery Order Number'), sub { $_[0]->presenter->rma_delivery_order(display => 'table-cell') } ], - [ $::locale->text('Order Number'), 'ordnumber' ], - [ $::locale->text('Customer'), 'customer' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], - [ $::locale->text('Project'), 'globalproject', ], - [ $::locale->text('Delivered'), 'delivered' ], - [ $::locale->text('Closed'), 'closed' ], + [ $::locale->text('Delivery Order Date'), 'transdate' ], + [ $::locale->text('Delivery Order Number'), sub { $_[0]->presenter->rma_delivery_order(display => 'table-cell') } ], + [ $::locale->text('Order Number'), 'ordnumber' ], + [ $::locale->text('Customer'), 'customer' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Project'), 'globalproject', ], + [ $::locale->text('Delivered'), 'delivered' ], + [ $::locale->text('Closed'), 'closed' ], ], %params, ); @@ -450,10 +472,10 @@ sub _purchase_delivery_order_list { columns => [ [ $::locale->text('Delivery Order Date'), 'transdate' ], [ $::locale->text('Delivery Order Number'), sub { $_[0]->presenter->purchase_delivery_order(display => 'table-cell') } ], - [ $::locale->text('Order Number'), 'ordnumber' ], - [ $::locale->text('Vendor'), 'vendor' ], + [ $::locale->text('Order Number'), 'ordnumber' ], + [ $::locale->text('Vendor'), 'vendor' ], [ $::locale->text('Transaction description'), 'transaction_description' ], - [ $::locale->text('Project'), 'globalproject', ], + [ $::locale->text('Project'), 'globalproject', ], [ $::locale->text('Delivered'), 'delivered' ], [ $::locale->text('Closed'), 'closed' ], ], @@ -471,10 +493,10 @@ sub _supplier_delivery_order_list { columns => [ [ $::locale->text('Delivery Order Date'), 'transdate' ], [ $::locale->text('Delivery Order Number'), sub { $_[0]->presenter->supplier_delivery_order(display => 'table-cell') } ], - [ $::locale->text('Order Number'), 'ordnumber' ], - [ $::locale->text('Vendor'), 'vendor' ], + [ $::locale->text('Order Number'), 'ordnumber' ], + [ $::locale->text('Vendor'), 'vendor' ], [ $::locale->text('Transaction description'), 'transaction_description' ], - [ $::locale->text('Project'), 'globalproject', ], + [ $::locale->text('Project'), 'globalproject', ], [ $::locale->text('Delivered'), 'delivered' ], [ $::locale->text('Closed'), 'closed' ], ], @@ -510,13 +532,13 @@ sub _purchase_reclamation_list { title => $::locale->text('Purchase Reclamation'), type => 'purchase_reclamation', columns => [ - [ $::locale->text('Reclamation Date'), 'transdate' ], + [ $::locale->text('Reclamation Date'), 'transdate' ], [ $::locale->text('Reclamation Number'), sub { $_[0]->presenter->purchase_reclamation(display => 'table-cell') } ], - [ $::locale->text('Vendor'), 'vendor' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], - [ $::locale->text('Project'), 'globalproject', ], - [ $::locale->text('Delivered'), 'delivered' ], - [ $::locale->text('Closed'), 'closed' ], + [ $::locale->text('Vendor'), 'vendor' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Project'), 'globalproject', ], + [ $::locale->text('Delivered'), 'delivered' ], + [ $::locale->text('Closed'), 'closed' ], ], %params, ); @@ -530,15 +552,15 @@ sub _sales_invoice_list { title => $::locale->text('Sales Invoices'), type => 'sales_invoice', columns => [ - [ $::locale->text('Invoice Date'), 'transdate' ], - [ $::locale->text('Type'), sub { $_[0]->displayable_type } ], + [ $::locale->text('Invoice Date'), 'transdate' ], + [ $::locale->text('Type'), sub { $_[0]->displayable_type } ], [ $::locale->text('Invoice Number'), sub { $_[0]->presenter->sales_invoice(display => 'table-cell') } ], - [ $::locale->text('Quotation Number'), 'quonumber' ], - [ $::locale->text('Order Number'), 'ordnumber' ], - [ $::locale->text('Customer'), 'customer' ], - [ $::locale->text('Net amount'), 'netamount' ], - [ $::locale->text('Paid'), 'paid' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Quotation Number'), 'quonumber' ], + [ $::locale->text('Order Number'), 'ordnumber' ], + [ $::locale->text('Customer'), 'customer' ], + [ $::locale->text('Net amount'), 'netamount' ], + [ $::locale->text('Paid'), 'paid' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], ], %params, ); @@ -552,14 +574,14 @@ sub _purchase_invoice_list { title => $::locale->text('Purchase Invoices'), type => 'purchase_invoice', columns => [ - [ $::locale->text('Invoice Date'), 'transdate' ], + [ $::locale->text('Invoice Date'), 'transdate' ], [ $::locale->text('Invoice Number'), sub { $_[0]->presenter->purchase_invoice(display => 'table-cell') } ], - [ $::locale->text('Request for Quotation Number'), 'quonumber' ], - [ $::locale->text('Order Number'), 'ordnumber' ], - [ $::locale->text('Vendor'), 'vendor' ], - [ $::locale->text('Net amount'), 'netamount' ], - [ $::locale->text('Paid'), 'paid' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Request for Quotation Number'), 'quonumber' ], + [ $::locale->text('Order Number'), 'ordnumber' ], + [ $::locale->text('Vendor'), 'vendor' ], + [ $::locale->text('Net amount'), 'netamount' ], + [ $::locale->text('Paid'), 'paid' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], ], %params, ); @@ -573,13 +595,13 @@ sub _ar_transaction_list { title => $::locale->text('AR Transactions'), type => 'ar_transaction', columns => [ - [ $::locale->text('Invoice Date'), 'transdate' ], - [ $::locale->text('Type'), sub { $_[0]->displayable_type } ], + [ $::locale->text('Invoice Date'), 'transdate' ], + [ $::locale->text('Type'), sub { $_[0]->displayable_type } ], [ $::locale->text('Invoice Number'), sub { $_[0]->presenter->ar_transaction(display => 'table-cell') } ], - [ $::locale->text('Customer'), 'customer' ], - [ $::locale->text('Net amount'), 'netamount' ], - [ $::locale->text('Paid'), 'paid' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Customer'), 'customer' ], + [ $::locale->text('Net amount'), 'netamount' ], + [ $::locale->text('Paid'), 'paid' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], ], %params, ); @@ -593,12 +615,12 @@ sub _ap_transaction_list { title => $::locale->text('AP Transactions'), type => 'ap_transaction', columns => [ - [ $::locale->text('Invoice Date'), 'transdate' ], + [ $::locale->text('Invoice Date'), 'transdate' ], [ $::locale->text('Invoice Number'), sub { $_[0]->presenter->ap_transaction(display => 'table-cell') } ], - [ $::locale->text('Vendor'), 'vendor' ], - [ $::locale->text('Net amount'), 'netamount' ], - [ $::locale->text('Paid'), 'paid' ], - [ $::locale->text('Transaction description'), 'transaction_description' ], + [ $::locale->text('Vendor'), 'vendor' ], + [ $::locale->text('Net amount'), 'netamount' ], + [ $::locale->text('Paid'), 'paid' ], + [ $::locale->text('Transaction description'), 'transaction_description' ], ], %params, ); @@ -612,8 +634,8 @@ sub _gl_transaction_list { title => $::locale->text('GL Transactions'), type => 'gl_transaction', columns => [ - [ $::locale->text('Transdate'), 'transdate' ], - [ $::locale->text('Reference'), 'reference' ], + [ $::locale->text('Transdate'), 'transdate' ], + [ $::locale->text('Reference'), 'reference' ], [ $::locale->text('Description'), sub { $_[0]->presenter->gl_transaction(display => 'table-cell') } ], ], %params, @@ -628,16 +650,16 @@ sub _bank_transactions { title => $::locale->text('Bank transactions'), type => 'bank_transactions', columns => [ - [ $::locale->text('Transdate'), 'transdate' ], - [ $::locale->text('Local Bank Code'), sub { $_[0]->local_bank_account->presenter->bank_code } ], + [ $::locale->text('Transdate'), 'transdate' ], + [ $::locale->text('Local Bank Code'), sub { $_[0]->local_bank_account->presenter->bank_code } ], [ $::locale->text('Local account number'), sub { $_[0]->local_bank_account->presenter->account_number } ], - [ $::locale->text('Remote Bank Code'), 'remote_bank_code' ], - [ $::locale->text('Remote account number'),'remote_account_number' ], - [ $::locale->text('Valutadate'), 'valutadate' ], - [ $::locale->text('Amount'), 'amount' ], - [ $::locale->text('Currency'), sub { $_[0]->currency->name } ], - [ $::locale->text('Remote name'), 'remote_name' ], - [ $::locale->text('Purpose'), 'purpose' ], + [ $::locale->text('Remote Bank Code'), 'remote_bank_code' ], + [ $::locale->text('Remote account number'),'remote_account_number' ], + [ $::locale->text('Valutadate'), 'valutadate' ], + [ $::locale->text('Amount'), 'amount' ], + [ $::locale->text('Currency'), sub { $_[0]->currency->name } ], + [ $::locale->text('Remote name'), 'remote_name' ], + [ $::locale->text('Purpose'), 'purpose' ], ], %params, ); @@ -686,11 +708,11 @@ sub _letter_list { title => $::locale->text('Letters'), type => 'letter', columns => [ - [ $::locale->text('Date'), 'date' ], + [ $::locale->text('Date'), 'date' ], [ $::locale->text('Letternumber'), sub { $_[0]->presenter->letter(display => 'table-cell') } ], - [ $::locale->text('Customer'), 'customer' ], - [ $::locale->text('Reference'), 'reference' ], - [ $::locale->text('Subject'), 'subject' ], + [ $::locale->text('Customer'), 'customer' ], + [ $::locale->text('Reference'), 'reference' ], + [ $::locale->text('Subject'), 'subject' ], ], %params, ); @@ -704,11 +726,11 @@ sub _email_journal_list { title => $::locale->text('Email'), type => 'email_journal', columns => [ - [ $::locale->text('Sent on'), sub { $_[0]->sent_on->to_kivitendo(precision => 'seconds') } ], + [ $::locale->text('Sent on'), sub { $_[0]->sent_on->to_kivitendo(precision => 'seconds') } ], [ $::locale->text('Subject'), sub { $_[0]->presenter->email_journal(display => 'table-cell') } ], - [ $::locale->text('Status'), 'status' ], - [ $::locale->text('From'), 'from' ], - [ $::locale->text('To'), 'recipients' ], + [ $::locale->text('Status'), 'status' ], + [ $::locale->text('From'), 'from' ], + [ $::locale->text('To'), 'recipients' ], ], %params, ); diff --git a/SL/TransNumber.pm b/SL/TransNumber.pm index 165acd0be3..e19c111ec4 100644 --- a/SL/TransNumber.pm +++ b/SL/TransNumber.pm @@ -17,7 +17,7 @@ use Rose::Object::MakeMethods::Generic ); my @SUPPORTED_TYPES = ( - qw(invoice invoice_for_advance_payment final_invoice credit_note customer vendor sales_delivery_order purchase_delivery_order sales_order_intake sales_order purchase_order sales_quotation request_quotation purchase_quotation_intake part service assembly assortment letter), + qw(invoice invoice_for_advance_payment final_invoice credit_note customer vendor sales_delivery_order purchase_delivery_order sales_order_intake sales_order purchase_order purchase_order_confirmation sales_quotation request_quotation purchase_quotation_intake part service assembly assortment letter), @{ SL::DB::DeliveryOrder::TypeData::valid_types() }, ); @@ -72,6 +72,13 @@ sub _get_filters { $filters{where} = 'NOT COALESCE(quotation, FALSE)'; $filters{where} .= $type =~ /^sales/ ? ' AND (customer_id IS NOT NULL)' : ' AND (vendor_id IS NOT NULL)'; + } elsif ($type =~ /^purchase_order_confirmation$/) { + $filters{trans_number} = "ordnumber"; + $filters{numberfield} = "pocnumber"; + $filters{table} = "oe"; + $filters{where} = 'record_type = ?'; + $filters{values} = $type; + } elsif ($type =~ /_quotation$/) { $filters{trans_number} = "quonumber"; $filters{numberfield} = $type eq 'sales_quotation' ? "sqnumber" : "rfqnumber"; diff --git a/SL/Webdav.pm b/SL/Webdav.pm index df2e4b005c..3b4c314875 100644 --- a/SL/Webdav.pm +++ b/SL/Webdav.pm @@ -23,6 +23,7 @@ my %type_to_path = ( request_quotation => 'anfragen', purchase_quotation_intake => 'angebotseingaenge', purchase_order => 'lieferantenbestellungen', + purchase_order_confirmation => 'lieferantenauftragsbestaetigungen', sales_delivery_order => 'verkaufslieferscheine', purchase_delivery_order => 'einkaufslieferscheine', supplier_delivery_order => 'beistelllieferscheine', diff --git a/bin/mozilla/do.pl b/bin/mozilla/do.pl index d0be653968..031a76a091 100644 --- a/bin/mozilla/do.pl +++ b/bin/mozilla/do.pl @@ -778,7 +778,9 @@ sub orders { my @columns = qw( ids transdate reqdate id donumber - ordnumber customernumber cusordnumber + ordnumber order_confirmation_number + customernumber vendor_confirmation_number + cusordnumber name employee salesman shipvia globalprojectnumber transaction_description department @@ -799,7 +801,8 @@ sub orders { push @hidden_variables, $form->{vc}, qw(l_closed l_notdelivered open closed delivered notdelivered donumber ordnumber serialnumber cusordnumber transaction_description transdatefrom transdateto reqdatefrom reqdateto type vc employee_id salesman_id project_id parts_partnumber parts_description - insertdatefrom insertdateto business_id all department_id chargenumber full_text); + insertdatefrom insertdateto business_id all department_id chargenumber full_text + vendor_confirmation_number order_confirmation_number); my $href = build_std_url('action=orders', grep { $form->{$_} } @hidden_variables); @@ -823,9 +826,11 @@ sub orders { 'department' => { 'text' => $locale->text('Department'), }, 'insertdate' => { 'text' => $locale->text('Insert Date'), }, 'items' => { 'text' => $locale->text('Positions'), }, + 'vendor_confirmation_number' => { 'text' => $locale->text('Vendor Confirmation Number'), }, + 'order_confirmation_number' => { 'text' => $locale->text('Order Confirmation Number'), }, ); - foreach my $name (qw(id transdate reqdate donumber ordnumber name employee salesman shipvia transaction_description department insertdate)) { + foreach my $name (qw(id transdate reqdate donumber ordnumber name employee salesman shipvia transaction_description department insertdate vendor_confirmation_number)) { my $sortdir = $form->{sort} eq $name ? 1 - $form->{sortdir} : $form->{sortdir}; $column_defs{$name}->{link} = $href . "&sort=$name&sortdir=$sortdir"; } @@ -861,6 +866,12 @@ sub orders { if ($form->{ordnumber}) { push @options, $locale->text('Order Number') . " : $form->{ordnumber}"; } + if ($form->{order_confirmation_number}) { + push @options, $locale->text('Order Confirmation Number') . " : $form->{order_confirmation_number}"; + } + if ($form->{vendor_confirmation_number}) { + push @options, $locale->text('Vendor Confirmation Number') . " : $form->{vendor_confirmation_number}"; + } push @options, $locale->text('Serial Number') . " : $form->{serialnumber}" if $form->{serialnumber}; if ($form->{business_id}) { my $vc_type_label = $form->{vc} eq 'customer' ? $locale->text('Customer type') : $locale->text('Vendor type'); @@ -951,7 +962,7 @@ sub orders { $dord->{open} = $dord->{closed} ? $locale->text('No') : $locale->text('Yes'); $dord->{delivered} = $dord->{delivered} ? $locale->text('Yes') : $locale->text('No'); - my $row = { map { $_ => { 'data' => $dord->{$_} } } grep {$_ ne 'items'} @columns }; + my $row = { map { $_ => { 'data' => $dord->{$_} } } grep {$_ ne 'items' || $_ ne 'order_confirmation_numbers'} @columns }; my $ord_id = $dord->{id}; $row->{ids} = { @@ -964,6 +975,15 @@ sub orders { $row->{donumber}->{link} = SL::Controller::DeliveryOrder->url_for(action => "edit", id => $dord->{id}); $row->{ordnumber}->{link} = $edit_order_url . "&id=" . E($dord->{oe_id}) . "&callback=${callback}" if $dord->{oe_id}; + foreach my $order_confirmation (@{ $dord->{order_confirmation_numbers} }) { + if (lc($report->{options}->{output_format}) eq 'html') { + $row->{order_confirmation_number}->{raw_data} .= SL::Presenter::Tag::link_tag(build_std_url('script=controller.pl', 'action=Order/edit', 'id=' . $order_confirmation->{id}, 'type=' . 'purchase_order_confirmation'), $order_confirmation->{number} . '
'); + } elsif (lc($report->{options}->{output_format}) ne 'html') { + my $sep = $row->{order_confirmation_number}->{data} ? ' ' : ''; + $row->{order_confirmation_number}->{data} .= $sep . $order_confirmation->{number}; + } + } + if ($form->{l_items}) { my $items = SL::DB::Manager::DeliveryOrderItem->get_all_sorted(where => [id => $dord->{item_ids}]); $row->{items}->{raw_data} = SL::Presenter::ItemsList::items_list($items) if lc($report->{options}->{output_format}) eq 'html'; diff --git a/bin/mozilla/generictranslations.pl b/bin/mozilla/generictranslations.pl index d1fff87dcf..7d2545a73d 100644 --- a/bin/mozilla/generictranslations.pl +++ b/bin/mozilla/generictranslations.pl @@ -25,6 +25,7 @@ preset_text_request_quotation => t8('Preset email text for requests (rfq)'), preset_text_purchase_quotation_intake => t8('Preset email text for purchase quotation intakes'), preset_text_purchase_order => t8('Preset email text for purchase orders'), + preset_text_purchase_order_confirmation => t8('Preset email text for purchase orders confirmations'), preset_text_purchase_reclamation => t8('Preset email text for purchase reclamations'), preset_text_periodic_invoices_email_body => t8('Preset email body for periodic invoices'), preset_text_periodic_invoices_email_subject => t8('Preset email subject for periodic invoices'), diff --git a/bin/mozilla/oe.pl b/bin/mozilla/oe.pl index b71a58e0a6..2d3626da70 100644 --- a/bin/mozilla/oe.pl +++ b/bin/mozilla/oe.pl @@ -81,21 +81,23 @@ # $locale->text('Workflow sales_quotation'); my $oe_access_map = { - 'sales_order_intake' => 'sales_order_edit', - 'sales_order' => 'sales_order_edit', - 'purchase_order' => 'purchase_order_edit', - 'request_quotation' => 'request_quotation_edit', - 'sales_quotation' => 'sales_quotation_edit', - 'purchase_quotation_intake' => 'request_quotation_edit', + 'sales_order_intake' => 'sales_order_edit', + 'sales_order' => 'sales_order_edit', + 'purchase_order' => 'purchase_order_edit', + 'purchase_order_confirmation' => 'purchase_order_edit', + 'request_quotation' => 'request_quotation_edit', + 'sales_quotation' => 'sales_quotation_edit', + 'purchase_quotation_intake' => 'request_quotation_edit', }; my $oe_view_access_map = { - 'sales_order_intake' => 'sales_order_edit | sales_order_view', - 'sales_order' => 'sales_order_edit | sales_order_view', - 'purchase_order' => 'purchase_order_edit | purchase_order_view', - 'request_quotation' => 'request_quotation_edit | request_quotation_view', - 'sales_quotation' => 'sales_quotation_edit | sales_quotation_view', - 'purchase_quotation_intake' => 'request_quotation_edit | request_quotation_view', + 'sales_order_intake' => 'sales_order_edit | sales_order_view', + 'sales_order' => 'sales_order_edit | sales_order_view', + 'purchase_order' => 'purchase_order_edit | purchase_order_view', + 'purchase_order_confirmation' => 'purchase_order_edit | purchase_order_view', + 'request_quotation' => 'request_quotation_edit | request_quotation_view', + 'sales_quotation' => 'sales_quotation_edit | sales_quotation_view', + 'purchase_quotation_intake' => 'request_quotation_edit | request_quotation_view', }; sub check_oe_access { @@ -949,6 +951,12 @@ sub search { $form->{title} = $locale->text('Purchase Orders'); $form->{ordlabel} = $locale->text('Order Number'); + } elsif ($form->{type} eq 'purchase_order_confirmation') { + $form->{vc} = 'vendor'; + $form->{ordnrname} = 'ordnumber'; + $form->{title} = $locale->text('Purchase Order Confirmations'); + $form->{ordlabel} = $locale->text('Order Confirmation Number'); + } elsif ($form->{type} eq 'request_quotation') { $form->{vc} = 'vendor'; $form->{ordnrname} = 'quonumber'; @@ -1047,7 +1055,7 @@ sub orders { my %params = @_; check_oe_access(with_view => 1); - my $ordnumber = ($form->{type} =~ /_order_intake$|_order$/) ? "ordnumber" : "quonumber"; + my $ordnumber = ($form->{type} =~ /_order_intake$|_order$|purchase_order_confirmation/) ? "ordnumber" : "quonumber"; ($form->{ $form->{vc} }, $form->{"$form->{vc}_id"}) = split(/--/, $form->{ $form->{vc} }); report_generator_set_default_sort('transdate', 1); @@ -1058,7 +1066,8 @@ sub orders { my @columns = ( "transdate", "reqdate", "id", $ordnumber, - "cusordnumber", "customernumber", + "cusordnumber", "vendor_confirmation_number", + "customernumber", "name", "netamount", "tax", "amount", "remaining_netamount", "remaining_amount", @@ -1094,6 +1103,9 @@ sub orders { if ($form->{type} eq 'purchase_order') { $form->{title} = $locale->text('Purchase Orders'); $attachment_basename = $locale->text('purchase_order_list'); + } elsif ($form->{type} eq 'purchase_order_confirmation') { + $form->{title} = $locale->text('Purchase Order Confirmations'); + $attachment_basename = $locale->text('purchase_order_confirmation_list'); } elsif ($form->{type} eq 'purchase_quotation_intake') { $form->{title} = $locale->text('Purchase Quotation Intakes'); $attachment_basename = $locale->text('purchase_quotation_intake_list'); @@ -1136,6 +1148,7 @@ sub orders { parts_description all department_id intnotes phone_notes fulltext order_status_id shiptoname shiptodepartment_1 shiptodepartment_2 shiptostreet shiptozipcode shiptocity shiptocountry + vendor_confirmation_number ); push @hidden_variables, map { "cvar_$_->{name}" } @ct_searchable_custom_variables; @@ -1149,7 +1162,7 @@ sub orders { 'transdate' => { 'text' => $locale->text('Date'), }, 'reqdate' => { 'text' => $form->{type} =~ /_order/ ? $locale->text('Required by') : $locale->text('Valid until') }, 'id' => { 'text' => $locale->text('ID'), }, - 'ordnumber' => { 'text' => $locale->text('Order'), }, + 'ordnumber' => { 'text' => $form->{type} eq "purchase_order_confirmation" ? $locale->text('Confirmation'): $locale->text('Order'), }, 'quonumber' => { 'text' => $form->{type} eq "request_quotation" ? $locale->text('RFQ') : $locale->text('Quotation'), }, 'cusordnumber' => { 'text' => $locale->text('Customer Order Number'), }, 'name' => { 'text' => $form->{vc} eq 'customer' ? $locale->text('Customer') : $locale->text('Vendor'), }, @@ -1191,13 +1204,14 @@ sub orders { shiptozipcode => { 'text' => $locale->text('Zipcode (Shipping)'), }, shiptocity => { 'text' => $locale->text('City (Shipping)'), }, shiptocountry => { 'text' => $locale->text('Country (Shipping)'), }, + vendor_confirmation_number => { 'text' => $locale->text('Vendor Confirmation Number'), }, %column_defs_cvars, ); foreach my $name (qw(id transdate reqdate quonumber ordnumber cusordnumber name employee salesman shipvia transaction_description shippingpoint taxzone insertdate payment_terms department - intnotes order_status)) { + intnotes order_status vendor_confirmation_number)) { my $sortdir = $form->{sort} eq $name ? 1 - $form->{sortdir} : $form->{sortdir}; $column_defs{$name}->{link} = $href . "&sort=$name&sortdir=$sortdir"; } @@ -1231,6 +1245,7 @@ sub orders { push @options, $locale->text('Contact Person') . " : $form->{cp_name}" if $form->{cp_name}; push @options, $locale->text('Department') . " : $form->{department}" if $form->{department}; push @options, $locale->text('Order Number') . " : $form->{ordnumber}" if $form->{ordnumber}; + push @options, $locale->text('Vendor Confirmation Number') . " : $form->{vendor_confirmation_number}" if $form->{vendor_confirmation_number}; push @options, $locale->text('Customer Order Number') . " : $form->{cusordnumber}" if $form->{cusordnumber}; push @options, $locale->text('Notes') . " : $form->{notes}" if $form->{notes}; push @options, $locale->text('Internal Notes') . " : $form->{intnotes}" if $form->{intnotes}; @@ -1711,7 +1726,7 @@ sub invoice { $form->get_employee(); - if ($form->{type} =~ /_order$/) { + if ($form->{type} =~ /_order$|purchase_order_confirmation/) { # these checks only apply if the items don't bring their own ordnumbers/transdates. # The if clause ensures that by searching for empty ordnumber_#/transdate_# fields. @@ -1777,6 +1792,7 @@ sub invoice { my ($script); if ( $form->{type} eq 'purchase_order' + || $form->{type} eq 'purchase_order_confirmation' || $form->{type} eq 'request_quotation') { $form->{title} = $locale->text('Add Vendor Invoice'); $form->{script} = 'ir.pl'; diff --git a/doc/changelog b/doc/changelog index baea5fb4d7..abc0fee4ee 100644 --- a/doc/changelog +++ b/doc/changelog @@ -82,6 +82,8 @@ Mittelgroße neue Features: und Auftrag. - Neuer Workflow Angebots-Eingang auf der Einkaufsseite zwischen Preisanfrage und Lieferantenauftrag. + - Neuer Workflow Lieferantenauftragsbestätigung auf der Einkaufsseite nach + Lieferantenauftrag. - Scan Funktion für Schweizer QR-Rechnungen in mobilen templates. Die QR-Rechnung kann mittels eingebauter Kamera Funktion eingescannt werden. Anschließend wird die Rechnung einem Lieferanten zugeordnet und als Kreditorbuchung gespeichert. diff --git a/js/kivi.Order.js b/js/kivi.Order.js index fe0c3ec578..8fdffeafc0 100644 --- a/js/kivi.Order.js +++ b/js/kivi.Order.js @@ -835,7 +835,7 @@ namespace('kivi.Order', function(ns) { var type = $('#type').val(); var number_info = ''; - if ($('#type').val() == 'sales_order_intake' || $('#type').val() == 'sales_order' || $('#type').val() == 'purchase_order') { + if ($('#type').val() == 'sales_order_intake' || $('#type').val() == 'sales_order' || $('#type').val() == 'purchase_order' || $('#type').val() == 'purchase_order_confirmation') { number_info = $('#order_ordnumber').val(); } else if ($('#type').val() == 'sales_quotation' || $('#type').val() == 'request_quotation' || $('#type').val() == 'purchase_quotation_intake') { number_info = $('#order_quonumber').val(); @@ -844,7 +844,7 @@ namespace('kivi.Order', function(ns) { var name_info = ''; if ($('#type').val() == 'sales_order_intake' || $('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation') { name_info = $('#order_customer_id_name').val(); - } else if ($('#type').val() == 'purchase_order' || $('#type').val() == 'request_quotation' || $('#type').val() == 'purchase_quotation_intake') { + } else if ($('#type').val() == 'purchase_order' || $('#type').val() == 'purchase_order_confirmation' || $('#type').val() == 'request_quotation' || $('#type').val() == 'purchase_quotation_intake') { name_info = $('#order_vendor_id_name').val(); } diff --git a/locale/de/all b/locale/de/all index df7ad68cce..f7867f2bdb 100644 --- a/locale/de/all +++ b/locale/de/all @@ -207,6 +207,7 @@ $self->{texts} = { 'Add Project' => 'Projekt erfassen', 'Add Purchase Delivery Order' => 'Lieferschein (Einkauf) erfassen', 'Add Purchase Order' => 'Lieferantenauftrag erfassen', + 'Add Purchase Order Confirmation' => 'Lieferantenauftragsbestätigung erfassen', 'Add Purchase Quotation Intake' => 'Angebotseingang erfassen', 'Add Purchase Reclamation' => 'Einkaufsreklamation erfassen', 'Add Quotation' => 'Angebot erfassen', @@ -802,6 +803,8 @@ $self->{texts} = { 'Configure' => 'Konfigurieren', 'Confirm!' => 'Bestätigen Sie!', 'Confirmation' => 'Auftragsbestätigung', + 'Confirmation Date' => 'Bestätigungsdatum', + 'Confirmation Number' => 'Bestätigungsnummer', 'Consume average' => 'Durchschnittsverbrauch', 'Contact' => 'Kontakt', 'Contact Departments' => 'Abteilungen von Ansprechpersonen', @@ -1403,6 +1406,7 @@ $self->{texts} = { 'Edit Printer' => 'Drucker bearbeiten', 'Edit Purchase Delivery Order' => 'Lieferschein (Einkauf) bearbeiten', 'Edit Purchase Order' => 'Lieferantenauftrag bearbeiten', + 'Edit Purchase Order Confirmation' => 'Lieferantenauftragsbestätigung bearbeiten', 'Edit Purchase Quotation Intake' => 'Angebotseingang bearbeiten', 'Edit Purchase Reclamation' => 'Einkaufsreklamation bearbeiten', 'Edit Quotation' => 'Angebot bearbeiten', @@ -2168,6 +2172,7 @@ $ ./scripts/installation_check.pl', 'Last Invoice Number' => 'Letzte Rechnungsnummer', 'Last Numbers / Prefixes' => 'Letzte Nummern / Präfixe', 'Last Purchase Delivery Order Number' => 'Letzte Lieferscheinnummer (Einkauf)', + 'Last Purchase Order Confirmation Number' => 'Letzte Lieferantenauftragsbestätigungs-Nummer', 'Last Purchase Order Number' => 'Letzte Lieferantenauftragsnummer', 'Last Purchase Quotation Intake Number' => 'Letzte Angebotsseingangsnummer', 'Last Purchase Reclamation Number' => 'Letzte Einkaufsreklamationsnummer', @@ -2646,6 +2651,7 @@ $ ./scripts/installation_check.pl', 'Order' => 'Auftrag', 'Order & Articles' => 'Auftrag & Artikel', 'Order & Numbers' => 'Auftrag & Nummern', + 'Order Confirmation Number' => 'Auftragsbestätigungsnummer', 'Order Controller' => 'Auftrags-Controller', 'Order Date' => 'Auftragsdatum', 'Order Date missing!' => 'Auftragsdatum fehlt!', @@ -2914,6 +2920,7 @@ $ ./scripts/installation_check.pl', 'Preset email subject for periodic invoices' => 'Vorbelegter E-Mail-Betreff für wiederkehrende Rechnungen', 'Preset email text for credit notes' => 'Vorbelegter E-Mail-Text für Gutschriften', 'Preset email text for purchase orders' => 'Vorbelegter E-Mail-Text für Einkaufsaufträge', + 'Preset email text for purchase orders confirmations' => 'Vorbelegter E-Mail-Text für Lieferantenauftragsbestätigungen', 'Preset email text for purchase quotation intakes' => 'Vorbelegter E-Mail-Text für Angebotseingänge', 'Preset email text for purchase reclamations' => 'Vorbelegter E-Mail-Text für Einkaufsreklamation', 'Preset email text for requests (rfq)' => 'Vorbelegter E-Mail-Text für Anfragen', @@ -3037,6 +3044,8 @@ $ ./scripts/installation_check.pl', 'Purchase Invoice' => 'Einkaufsrechnung', 'Purchase Invoices' => 'Einkaufsrechnungen', 'Purchase Order' => 'Lieferantenauftrag', + 'Purchase Order Confirmation' => 'Lieferantenauftragsbestätigung', + 'Purchase Order Confirmations' => 'Lieferantenauftragsbestätigungen', 'Purchase Orders' => 'Lieferantenaufträge', 'Purchase Orders Services are deliverable' => 'Dienstleistungen im Einkaufsauftrag sind lieferbar', 'Purchase Orders deleteable' => 'Lieferantenaufträge löschbar', @@ -3373,6 +3382,7 @@ $ ./scripts/installation_check.pl', 'Save and Purchase Delivery Order' => 'Speichern und Lieferschein (Einkauf)', 'Save and Purchase Delivery Order with item selection' => 'Speichern und Lieferschein (Einkauf) mit Artikelauswahl', 'Save and Purchase Order' => 'Speichern und Lieferantenauftrag', + 'Save and Purchase Order Confirmation' => 'Speichern und Lieferantenauftragsbesätigung', 'Save and Purchase Quotation Intake' => 'Speichern und Angebotseingang', 'Save and Purchase Reclamation' => 'Speichern und Einkaufsreklamation', 'Save and Quotation' => 'Speichern und Angebot', @@ -4651,6 +4661,7 @@ $ ./scripts/installation_check.pl', 'Vendor & Transaction' => 'Lieferant & Buchung', 'Vendor (database ID)' => 'Lieferant (Datenbank-ID)', 'Vendor (name)' => 'Lieferant (Name)', + 'Vendor Confirmation Number' => 'Bestätigungsnummer des Lieferanten', 'Vendor Discount' => 'Lieferantenrabatt', 'Vendor GLN' => 'GLN des Lieferanten', 'Vendor Invoice' => 'Einkaufsrechnung', @@ -5065,6 +5076,8 @@ $ ./scripts/installation_check.pl', 'prospective' => 'zukünftig', 'purchase_delivery_order_list' => 'lieferscheinliste_einkauf', 'purchase_order' => 'Auftrag', + 'purchase_order_confirmation' => 'Lieferantenauftragsbestätigung', + 'purchase_order_confirmation_list' => 'lieferantenauftragsbestaetigungsliste', 'purchase_order_list' => 'lieferantenauftragsliste', 'purchase_quotation_intake' => 'Angebotseingang', 'purchase_quotation_intake_list' => 'angebotseingangsliste', diff --git a/locale/en/all b/locale/en/all index 4e0125611b..5fdb308604 100644 --- a/locale/en/all +++ b/locale/en/all @@ -207,6 +207,7 @@ $self->{texts} = { 'Add Project' => '', 'Add Purchase Delivery Order' => '', 'Add Purchase Order' => '', + 'Add Purchase Order Confirmation' => '', 'Add Purchase Quotation Intake' => '', 'Add Purchase Reclamation' => '', 'Add Quotation' => '', @@ -802,6 +803,8 @@ $self->{texts} = { 'Configure' => '', 'Confirm!' => '', 'Confirmation' => '', + 'Confirmation Date' => '', + 'Confirmation Number' => '', 'Consume average' => '', 'Contact' => '', 'Contact Departments' => '', @@ -1403,6 +1406,7 @@ $self->{texts} = { 'Edit Printer' => '', 'Edit Purchase Delivery Order' => '', 'Edit Purchase Order' => '', + 'Edit Purchase Order Confirmation' => '', 'Edit Purchase Quotation Intake' => '', 'Edit Purchase Reclamation' => '', 'Edit Quotation' => '', @@ -2167,6 +2171,7 @@ $self->{texts} = { 'Last Invoice Number' => '', 'Last Numbers / Prefixes' => '', 'Last Purchase Delivery Order Number' => '', + 'Last Purchase Order Confirmation Number' => '', 'Last Purchase Order Number' => '', 'Last Purchase Quotation Intake Number' => '', 'Last Purchase Reclamation Number' => '', @@ -2645,6 +2650,7 @@ $self->{texts} = { 'Order' => '', 'Order & Articles' => '', 'Order & Numbers' => '', + 'Order Confirmation Number' => '', 'Order Controller' => '', 'Order Date' => '', 'Order Date missing!' => '', @@ -2913,6 +2919,7 @@ $self->{texts} = { 'Preset email subject for periodic invoices' => '', 'Preset email text for credit notes' => '', 'Preset email text for purchase orders' => '', + 'Preset email text for purchase orders confirmations' => '', 'Preset email text for purchase quotation intakes' => '', 'Preset email text for purchase reclamations' => '', 'Preset email text for requests (rfq)' => '', @@ -3036,6 +3043,8 @@ $self->{texts} = { 'Purchase Invoice' => '', 'Purchase Invoices' => '', 'Purchase Order' => '', + 'Purchase Order Confirmation' => '', + 'Purchase Order Confirmations' => '', 'Purchase Orders' => '', 'Purchase Orders Services are deliverable' => '', 'Purchase Orders deleteable' => '', @@ -3372,6 +3381,7 @@ $self->{texts} = { 'Save and Purchase Delivery Order' => '', 'Save and Purchase Delivery Order with item selection' => '', 'Save and Purchase Order' => '', + 'Save and Purchase Order Confirmation' => '', 'Save and Purchase Quotation Intake' => '', 'Save and Purchase Reclamation' => '', 'Save and Quotation' => '', @@ -4649,6 +4659,7 @@ $self->{texts} = { 'Vendor & Transaction' => '', 'Vendor (database ID)' => '', 'Vendor (name)' => '', + 'Vendor Confirmation Number' => '', 'Vendor Discount' => '', 'Vendor GLN' => '', 'Vendor Invoice' => '', @@ -5063,6 +5074,8 @@ $self->{texts} = { 'prospective' => '', 'purchase_delivery_order_list' => '', 'purchase_order' => '', + 'purchase_order_confirmation' => '', + 'purchase_order_confirmation_list' => '', 'purchase_order_list' => '', 'purchase_quotation_intake' => '', 'purchase_quotation_intake_list' => '', diff --git a/menus/user/90-purchase-order-confirmation.yaml b/menus/user/90-purchase-order-confirmation.yaml new file mode 100644 index 0000000000..4c30e9c119 --- /dev/null +++ b/menus/user/90-purchase-order-confirmation.yaml @@ -0,0 +1,19 @@ +- parent: ap + id: ap_add_purchase_order_confirmation_experimental + name: Add Purchase Order Confirmation + icon: purchase_order_add + order: 250 + access: purchase_order_edit & client/feature_experimental_order + params: + action: Order/add + type: purchase_order_confirmation +- parent: ap_reports + id: ap_reports_purchase_order_confirmations + name: Purchase Order Confirmations + icon: purchase_order_report + order: 250 + access: purchase_order_edit | purchase_order_view + module: oe.pl + params: + action: search + type: purchase_order_confirmation diff --git a/sql/Pg-upgrade2/file_storage_purchase_order_confirmation.sql b/sql/Pg-upgrade2/file_storage_purchase_order_confirmation.sql new file mode 100644 index 0000000000..3bf73d1a6f --- /dev/null +++ b/sql/Pg-upgrade2/file_storage_purchase_order_confirmation.sql @@ -0,0 +1,22 @@ +-- @tag: file_storage_purchase_order_confirmation +-- @description: Dateispeicher auch für Lieferantenauftragsbestätigungen +-- @depends: file_storage_purchase_quotation_intake + +ALTER TABLE files + DROP CONSTRAINT valid_type; +ALTER TABLE files + ADD CONSTRAINT valid_type CHECK ( + (object_type = 'credit_note' ) OR (object_type = 'invoice' ) + OR (object_type = 'sales_order' ) OR (object_type = 'sales_order_intake' ) + OR (object_type = 'sales_quotation' ) OR (object_type = 'sales_delivery_order' ) + OR (object_type = 'request_quotation' ) OR (object_type = 'purchase_quotation_intake' ) + OR (object_type = 'purchase_order' ) OR (object_type = 'purchase_order_confirmation') + OR (object_type = 'purchase_delivery_order' ) OR (object_type = 'purchase_invoice' ) + OR (object_type = 'vendor' ) OR (object_type = 'customer' ) OR (object_type = 'part' ) + OR (object_type = 'gl_transaction' ) OR (object_type = 'dunning' ) OR (object_type = 'dunning1' ) + OR (object_type = 'dunning2' ) OR (object_type = 'dunning3' ) OR (object_type = 'dunning_orig_invoice' ) + OR (object_type = 'dunning_invoice' ) OR (object_type = 'draft' ) OR (object_type = 'statement' ) + OR (object_type = 'shop_image' ) OR (object_type = 'letter' ) OR (object_type = 'project' ) + OR (object_type = 'invoice_for_advance_payment') OR (object_type = 'final_invoice' ) OR (object_type = 'supplier_delivery_order') + OR (object_type = 'sales_reclamation' ) OR (object_type = 'purchase_reclamation' ) OR (object_type = 'rma_delivery_order' ) + ); diff --git a/sql/Pg-upgrade2/oe_delivery_orders_add_vendor_confirmation_number.sql b/sql/Pg-upgrade2/oe_delivery_orders_add_vendor_confirmation_number.sql new file mode 100644 index 0000000000..6f2b141986 --- /dev/null +++ b/sql/Pg-upgrade2/oe_delivery_orders_add_vendor_confirmation_number.sql @@ -0,0 +1,6 @@ +-- @tag: oe_delivery_orders_add_vendor_confirmation_number +-- @description: Auftragsbestätigungs-Nummer des Lieferanten für Aufträge und Lieferscheine +-- @depends: release_3_8_0 + +ALTER TABLE oe ADD COLUMN vendor_confirmation_number TEXT; +ALTER TABLE delivery_orders ADD COLUMN vendor_confirmation_number TEXT; diff --git a/sql/Pg-upgrade2/oe_purchase_order_confirmation.sql b/sql/Pg-upgrade2/oe_purchase_order_confirmation.sql new file mode 100644 index 0000000000..8bbb02221b --- /dev/null +++ b/sql/Pg-upgrade2/oe_purchase_order_confirmation.sql @@ -0,0 +1,5 @@ +-- @tag: oe_purchase_order_confirmation +-- @description: Neuer Einkaufsbeleg: Lieferantenauftragsbesätigung (purchase_order_confirmation) +-- @depends: release_3_8_0 + +ALTER TABLE defaults ADD pocnumber TEXT; diff --git a/sql/Pg-upgrade2/oe_purchase_order_confirmation_order_types.sql b/sql/Pg-upgrade2/oe_purchase_order_confirmation_order_types.sql new file mode 100644 index 0000000000..dd04ce99cc --- /dev/null +++ b/sql/Pg-upgrade2/oe_purchase_order_confirmation_order_types.sql @@ -0,0 +1,5 @@ +-- @tag: oe_purchase_order_confirmation_order_types +-- @description: order_types-Eintrag für Lieferantenauftragsbesätigung (purchase_order_confirmation) +-- @depends: order_type + +ALTER TYPE order_types ADD VALUE IF NOT EXISTS 'purchase_order_confirmation'; diff --git a/t/workflow/delivery_order_reclamation.t b/t/workflow/delivery_order_reclamation.t index 56951ca38a..f368668795 100644 --- a/t/workflow/delivery_order_reclamation.t +++ b/t/workflow/delivery_order_reclamation.t @@ -285,6 +285,7 @@ my @different_record_values = qw( cp_id contact_id cusordnumber cv_record_number donumber record_number + vendor_confirmation_number ); my @different_record_item_values = qw( id delivery_order_id reclamation_id itime mtime diff --git a/t/workflow/order_reclamation.t b/t/workflow/order_reclamation.t index eff758d7da..5aa1c99533 100644 --- a/t/workflow/order_reclamation.t +++ b/t/workflow/order_reclamation.t @@ -285,6 +285,7 @@ my @different_record_values = qw( cusordnumber cv_record_number ordnumber record_number intake + vendor_confirmation_number ); my @different_record_item_values = qw( id trans_id reclamation_id itime mtime diff --git a/templates/design40_webpages/client_config/_ranges_of_numbers.html b/templates/design40_webpages/client_config/_ranges_of_numbers.html index a35b68a070..0466ac0455 100644 --- a/templates/design40_webpages/client_config/_ranges_of_numbers.html +++ b/templates/design40_webpages/client_config/_ranges_of_numbers.html @@ -46,6 +46,10 @@ [% LxERP.t8('Purchase Order') %] [% L.input_tag("defaults.ponumber", SELF.defaults.ponumber, size="15", class="wi-normal") %] + + [% LxERP.t8('Purchase Order Confirmation') %] + [% L.input_tag("defaults.pocnumber", SELF.defaults.pocnumber, size="15", class="wi-normal") %] + [% LxERP.t8('Sales quotation') %] [% L.input_tag("defaults.sqnumber", SELF.defaults.sqnumber, size="15", class="wi-normal") %] diff --git a/templates/design40_webpages/delivery_order/tabs/basic_data.html b/templates/design40_webpages/delivery_order/tabs/basic_data.html index 56bc1f9622..0b58f08a0d 100644 --- a/templates/design40_webpages/delivery_order/tabs/basic_data.html +++ b/templates/design40_webpages/delivery_order/tabs/basic_data.html @@ -192,6 +192,24 @@ [% L.input_tag('order.ordnumber', SELF.order.ordnumber, class='wi-normal') %] + [%- IF SELF.type == 'purchase_delivery_order' %] + + [% 'Order Confirmation Number' | $T8 %] + [%- + numbers = []; + FOREACH p = SELF.order.preceding_purchase_order_confirmations(); + numbers.push(p.ordnumber); + END; + %] + [% numbers.join(', ') %] + + + + [% 'Vendor Confirmation Number' | $T8 %] + [% L.input_tag('order.vendor_confirmation_number', SELF.order.vendor_confirmation_number, class='wi-normal numeric') %] + + [%- END %] + [% IF SELF.type_data.properties('is_customer') %][% 'Customer Order Number' | $T8 %][% ELSE %][% 'Vendor Order Number' | $T8 %][% END %] [% L.input_tag('order.cusordnumber', SELF.order.cusordnumber, class='wi-normal numeric') %] diff --git a/templates/design40_webpages/do/search.html b/templates/design40_webpages/do/search.html index d70902e970..0c5b671d2f 100644 --- a/templates/design40_webpages/do/search.html +++ b/templates/design40_webpages/do/search.html @@ -82,6 +82,18 @@

[% title %]

+ [%- IF type == "purchase_delivery_order" %] + + [% 'Order Confirmation Number' | $T8 %] + + + + + [% 'Vendor Confirmation Number' | $T8 %] + + + + [%- END %] [% 'Customer Order Number' | $T8 %] @@ -171,6 +183,16 @@

[% 'Numbers & IDs' | $T8 %]

+ [%- IF type == "purchase_delivery_order" %] +
+ + +
+
+ + +
+ [% END %]
diff --git a/templates/design40_webpages/oe/search.html b/templates/design40_webpages/oe/search.html index 39d0b93ae7..e844d74f56 100644 --- a/templates/design40_webpages/oe/search.html +++ b/templates/design40_webpages/oe/search.html @@ -43,6 +43,12 @@

[% HTML.escape(title) %]

[% HTML.escape(ordlabel) %] [% L.input_tag(ordnrname, "", class="wi-lightwide") %] + [% IF type == "purchase_order_confirmation" %] + + [% LxERP.t8("Vendor Confirmation Number") %] + [% L.input_tag("vendor_confirmation_number", '', class="wi-lightwide") %] + + [% END %] [% IF is_order %] [% LxERP.t8("Customer Order Number") %] @@ -236,6 +242,12 @@

[% 'Numbers & IDs' | $T8 %]

+ [% IF type == "purchase_order_confirmation" %] +
+ + +
+ [% END %] [% IF is_order %]
diff --git a/templates/design40_webpages/order/tabs/_price_sources_dialog.html b/templates/design40_webpages/order/tabs/_price_sources_dialog.html index af3d520474..6b19dcc26a 100644 --- a/templates/design40_webpages/order/tabs/_price_sources_dialog.html +++ b/templates/design40_webpages/order/tabs/_price_sources_dialog.html @@ -8,7 +8,7 @@ [% IF (FORM.type == "sales_order" || FORM.type == "sales_order_intake" || FORM.type == "sales_quotation") %] [% SET price_editable = AUTH.assert('sales_edit_prices', 1) %] [% END %] -[% IF (FORM.type == "purchase_order" || FORM.type == "request_quotation" || FORM.type == "purchase_quotation_intake") %] +[% IF (FORM.type == "purchase_order" || FORM.type == "purchase_order_confirmation" || FORM.type == "request_quotation" || FORM.type == "purchase_quotation_intake") %] [% SET price_editable = AUTH.assert('purchase_edit_prices', 1) %] [% END %] [% SET exfactor = price_source.record.exchangerate ? 1 / price_source.record.exchangerate : 1 %] diff --git a/templates/design40_webpages/order/tabs/_row.html b/templates/design40_webpages/order/tabs/_row.html index e65ff06e65..7eb3768f83 100644 --- a/templates/design40_webpages/order/tabs/_row.html +++ b/templates/design40_webpages/order/tabs/_row.html @@ -55,7 +55,7 @@ [% L.hidden_tag("order.orderitems[].longdescription", ITEM.longdescription) %] [% L.button_tag("kivi.Order.show_longdescription_dialog(this)", LxERP.t8("L"), class="wi-tiny neutral") %] - [% IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") %] + [% IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation") %] [%- L.div_tag(LxERP.format_amount(ITEM.shipped_qty, 2, 0) _ ' ' _ ITEM.unit, name="shipped_qty", class="numeric") %] @@ -96,7 +96,7 @@ [% IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "sales_quotation") %] [% SET RIGHT_TO_EDIT_PRICES = AUTH.assert('sales_edit_prices', 1) %] [% END %] - [% IF (SELF.type == "purchase_order" || SELF.type == "request_quotation" || SELF.type == "purchase_quotation_intake") %] + [% IF (SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation" || SELF.type == "request_quotation" || SELF.type == "purchase_quotation_intake") %] [% SET RIGHT_TO_EDIT_PRICES = AUTH.assert('purchase_edit_prices', 1) %] [% END %] diff --git a/templates/design40_webpages/order/tabs/_second_row.html b/templates/design40_webpages/order/tabs/_second_row.html index fa5851622b..27fe7c32d6 100644 --- a/templates/design40_webpages/order/tabs/_second_row.html +++ b/templates/design40_webpages/order/tabs/_second_row.html @@ -7,11 +7,11 @@ [% END %] - [% IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") %] + [% IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation") %] - + [% END %] + + [% IF SELF.type == "purchase_order_confirmation" %] + + + [%- + numbers = []; + FOREACH p = SELF.order.preceding_purchase_orders(); + numbers.push(p.ordnumber); + END; + %] + + + [% END %] + [% IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "sales_quotation" || SELF.type == "purchase_quotation_intake") %] [% SET quo_nr_txt = 'Quotation Number' %] [% ELSE %] @@ -253,7 +267,7 @@ - [% IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") %] + [% IF (SELF.type == "purchase_order_confirmation") -%] + + + + + [%- END %] + [% IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation") %] @@ -273,6 +293,8 @@ [% END %] [% IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") %] [% SET transdate_txt = 'Order Date' %] + [% ELSIF SELF.type == "purchase_order_confirmation" -%] + [%- SET transdate_txt = 'Confirmation Date' -%] [% ELSIF (SELF.type == "sales_quotation" || SELF.type == "purchase_quotation_intake") %] [% SET transdate_txt = 'Quotation Date' %] [% ELSE %] @@ -286,7 +308,7 @@ - [% IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") %] + [% IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation") %] [% SET reqdate_txt = 'Reqdate'; SET reqdate_class = 'recalc' %] [% ELSIF SELF.type == "sales_quotation" %] [% SET reqdate_txt = 'Valid until'; SET reqdate_class = '' %] @@ -355,7 +377,7 @@ [%- END -%] - [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") -%] + [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation") -%] [%- END -%] diff --git a/templates/webpages/client_config/_ranges_of_numbers.html b/templates/webpages/client_config/_ranges_of_numbers.html index f186a5ee06..0b6a3f63c7 100644 --- a/templates/webpages/client_config/_ranges_of_numbers.html +++ b/templates/webpages/client_config/_ranges_of_numbers.html @@ -41,6 +41,11 @@ + + + + + diff --git a/templates/webpages/delivery_order/tabs/basic_data.html b/templates/webpages/delivery_order/tabs/basic_data.html index cc753b3db6..71a78584d8 100644 --- a/templates/webpages/delivery_order/tabs/basic_data.html +++ b/templates/webpages/delivery_order/tabs/basic_data.html @@ -129,6 +129,24 @@ + [%- IF SELF.type == 'purchase_delivery_order' %] + + + [%- + numbers = []; + FOREACH p = SELF.order.preceding_purchase_order_confirmations(); + numbers.push(p.ordnumber); + END; + %] + + + + + + + + [%- END %] + diff --git a/templates/webpages/do/search.html b/templates/webpages/do/search.html index 1c3794f6e5..f35d43a801 100644 --- a/templates/webpages/do/search.html +++ b/templates/webpages/do/search.html @@ -41,6 +41,18 @@

[% title %]

+ [%- IF type == "purchase_delivery_order" %] + + + + + + + + + + [%- END %] + @@ -177,6 +189,17 @@

[% title %]

+ [%- IF type == "purchase_delivery_order" %] + + + [%- END %] + +[% IF type == "purchase_order_confirmation" %] + + + + +[% END %] [% IF is_order %] @@ -161,7 +167,7 @@

[% HTML.escape(title) %]

@@ -242,6 +248,12 @@

[% HTML.escape(title) %]

[%- END %] +[% IF type == "purchase_order_confirmation" %] + +[% END %] - [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") -%] + [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation") -%] @@ -104,7 +104,7 @@ [% IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "sales_quotation") %] [% SET RIGHT_TO_EDIT_PRICES = AUTH.assert('sales_edit_prices', 1) %] [% END %] - [% IF (SELF.type == "purchase_order" || SELF.type == "request_quotation" || SELF.type == "purchase_quotation_intake") %] + [% IF (SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation" || SELF.type == "request_quotation" || SELF.type == "purchase_quotation_intake") %] [% SET RIGHT_TO_EDIT_PRICES = AUTH.assert('purchase_edit_prices', 1) %] [% END %] [% END %] - [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") -%] + [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation") -%] - + [%- END -%] + [% IF SELF.type == "purchase_order_confirmation" %] + + + [%- + numbers = []; + FOREACH p = SELF.order.preceding_purchase_orders(); + numbers.push(p.ordnumber); + END; + %] + + + [% END %] + [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "sales_quotation" || SELF.type == "purchase_quotation_intake") -%] [%- SET quo_nr_txt = 'Quotation Number' -%] [%- ELSE -%] @@ -200,7 +213,7 @@ - [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") -%] + [%- IF (SELF.type == "purchase_order_confirmation") -%] + + + + + [%- END -%] + + [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation") -%] @@ -222,6 +242,8 @@ [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") -%] [%- SET transdate_txt = 'Order Date' -%] + [%- ELSIF SELF.type == "purchase_order_confirmation" -%] + [%- SET transdate_txt = 'Confirmation Date' -%] [%- ELSIF (SELF.type == "sales_quotation" || SELF.type == "purchase_quotation_intake") -%] [%- SET transdate_txt = 'Quotation Date' -%] [%- ELSE -%] @@ -237,7 +259,7 @@ - [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") -%] + [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation") -%] [%- SET reqdate_txt = 'Reqdate'; SET reqdate_class = 'recalc' -%] [%- ELSIF SELF.type == "sales_quotation" -%] [%- SET reqdate_txt = 'Valid until'; SET reqdate_class = '' -%] @@ -312,7 +334,7 @@ [%- END -%] - [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") -%] + [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation") -%] [%- END -%]
- [% IF (TYPE == "sales_order_intake" || TYPE == "sales_order" || TYPE == "purchase_order") %] + [% IF (TYPE == "sales_order_intake" || TYPE == "sales_order" || TYPE == "purchase_order" || TYPE == "purchase_order_confirmation") %] [% 'Serial No.' | $T8 %] [% L.input_tag("order.orderitems[].serialnumber", ITEM.serialnumber, size = 15, "data-validate"="trimmed_whitespaces") %] [% END %] [% 'Project' | $T8 %] [% P.project.picker("order.orderitems[].project_id", ITEM.project_id, size = 15) %] - [% IF (TYPE == "sales_order_intake" || TYPE == "sales_order" || TYPE == "purchase_order") %] + [% IF (TYPE == "sales_order_intake" || TYPE == "sales_order" || TYPE == "purchase_order" || TYPE == "purchase_order_confirmation") %] [% 'Reqdate' | $T8 %] [% L.date_tag("order.orderitems[].reqdate_as_date", ITEM.reqdate_as_date) %] [% END %] [% 'Subtotal' | $T8 %] [% L.yes_no_tag("order.orderitems[].subtotal", ITEM.subtotal) %] diff --git a/templates/design40_webpages/order/tabs/basic_data.html b/templates/design40_webpages/order/tabs/basic_data.html index 9b2cf02cf1..3cd68c8c42 100644 --- a/templates/design40_webpages/order/tabs/basic_data.html +++ b/templates/design40_webpages/order/tabs/basic_data.html @@ -230,9 +230,9 @@ title_key='safe_name') %]
[% 'Order Number' | $T8 %][% IF SELF.type == "purchase_order_confirmation" %][% 'Order Confirmation Number' | $T8 %][% ELSE %][% 'Order Number' | $T8 %][% END %] [%- IF INSTANCE_CONF.get_sales_purchase_record_numbers_changeable %] [% L.input_tag('order.ordnumber', SELF.order.ordnumber, onchange='kivi.Order.set_number_in_title(this)', class='wi-normal') %] @@ -245,6 +245,20 @@
[% 'Order Number' | $T8 %][% numbers.join(', ') %]
[% quo_nr_txt | $T8 %] - [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") -%] + [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation") -%] [% L.input_tag('order.quonumber', SELF.order.quonumber, class='wi-normal') %] [%- ELSIF INSTANCE_CONF.get_sales_purchase_record_numbers_changeable %] [% L.input_tag('order.quonumber', SELF.order.quonumber, onchange='kivi.Order.set_number_in_title(this)', class='wi-normal') %] @@ -265,7 +279,13 @@ [%- END %]
[% 'Vendor Confirmation Number' | $T8 %][% L.input_tag('order.vendor_confirmation_number', SELF.order.vendor_confirmation_number, class='wi-normal') %]
[% 'Customer Order Number' | $T8 %] [% L.input_tag('order.cusordnumber', SELF.order.cusordnumber, class='wi-normal') %][% 'Tax point' | $T8 %] [% L.date_tag('order.tax_point_as_date', SELF.order.tax_point_as_date, class='wi-date recalc') %]
[% 'Type' | $T8 %] [% 'Description' | $T8 %][% 'Delivered' | $T8 %] [% 'Qty' | $T8 %][% L.input_tag("defaults.articlenumber", SELF.defaults.articlenumber, size="15") %]
[% LxERP.t8('Last Purchase Order Confirmation Number') %][% L.input_tag("defaults.pocnumber", SELF.defaults.pocnumber, size="15") %]
[% LxERP.t8('Last Sales Quotation Number') %] [% L.input_tag("defaults.sqnumber", SELF.defaults.sqnumber, size="15") %][% L.input_tag('order.ordnumber', SELF.order.ordnumber, size = 11) %]
[% 'Order Confirmation Number' | $T8 %][% numbers.join(', ') %]
[% 'Vendor Confirmation Number' | $T8 %][% L.input_tag('order.vendor_confirmation_number', SELF.order.vendor_confirmation_number, size = 11) %]
[% IF SELF.type_data.properties('is_customer') %][% 'Customer Order Number' | $T8 %][% ELSE %][% 'Vendor Order Number' | $T8 %][% END %] [% L.input_tag('order.cusordnumber', SELF.order.cusordnumber, size = 11) %]
[% 'Order Confirmation Number' | $T8 %]
[% 'Vendor Confirmation Number' | $T8 %]
[% 'Customer Order Number' | $T8 %] + + + + + + diff --git a/templates/webpages/oe/search.html b/templates/webpages/oe/search.html index 08d8a623c3..e5f32b1e9a 100644 --- a/templates/webpages/oe/search.html +++ b/templates/webpages/oe/search.html @@ -37,6 +37,12 @@

[% HTML.escape(title) %]

[% L.select_tag('order_status_id', ALL_ORDER_STATUSES, default = order_status_id, title_key = 'name', with_empty = 1, style=style) %]
[% LxERP.t8("Vendor Confirmation Number") %][% L.input_tag("vendor_confirmation_number", '', style=style) %]
[% LxERP.t8("Customer Order Number") %]
[% 'Order probability' | $T8 %] - [% L.select_tag('order_probability_op', [[ 'ge', '>=' ], [ 'le', '<=' ]]) %] + [% L.select_tag('order_probability_op', [[ 'ge', '>=' ], [ 'le', '<=' ]]) %] [%-# '> make emacs happy %] [% L.select_tag('order_probability_value', ORDER_PROBABILITIES, title='title', with_empty=1) %]
+ + +
diff --git a/templates/webpages/order/tabs/_price_sources_dialog.html b/templates/webpages/order/tabs/_price_sources_dialog.html index f3af001025..7f44c9351e 100644 --- a/templates/webpages/order/tabs/_price_sources_dialog.html +++ b/templates/webpages/order/tabs/_price_sources_dialog.html @@ -8,7 +8,7 @@ [% IF (FORM.type == "sales_order" || FORM.type == "sales_order_intake" || FORM.type == "sales_quotation") %] [% SET price_editable = AUTH.assert('sales_edit_prices', 1) %] [% END %] -[% IF (FORM.type == "purchase_order" || FORM.type == "request_quotation" || FORM.type == "purchase_quotation_intake") %] +[% IF (FORM.type == "purchase_order" || FORM.type == "purchase_order_confirmation" || FORM.type == "request_quotation" || FORM.type == "purchase_quotation_intake") %] [% SET price_editable = AUTH.assert('purchase_edit_prices', 1) %] [% END %] [% SET exfactor = price_source.record.exchangerate ? 1 / price_source.record.exchangerate : 1 %] diff --git a/templates/webpages/order/tabs/_row.html b/templates/webpages/order/tabs/_row.html index dc055671f6..4411f80574 100644 --- a/templates/webpages/order/tabs/_row.html +++ b/templates/webpages/order/tabs/_row.html @@ -64,7 +64,7 @@ [%- L.hidden_tag("order.orderitems[].longdescription", ITEM.longdescription) %] [%- L.button_tag("kivi.Order.show_longdescription_dialog(this)", LxERP.t8("L")) %] [%- L.div_tag(LxERP.format_amount(ITEM.shipped_qty, 2, 0) _ ' ' _ ITEM.unit, name="shipped_qty", class="numeric") %] diff --git a/templates/webpages/order/tabs/basic_data.html b/templates/webpages/order/tabs/basic_data.html index 0e6f0ebaeb..88027b7311 100644 --- a/templates/webpages/order/tabs/basic_data.html +++ b/templates/webpages/order/tabs/basic_data.html @@ -176,9 +176,9 @@
[% 'Order Number' | $T8 %][% IF SELF.type == "purchase_order_confirmation" %][% 'Order Confirmation Number' | $T8 %][% ELSE %][% 'Order Number' | $T8 %][% END %] [%- IF INSTANCE_CONF.get_sales_purchase_record_numbers_changeable %] [% L.input_tag('order.ordnumber', SELF.order.ordnumber, size = 11, onchange='kivi.Order.set_number_in_title(this)') %] @@ -192,6 +192,19 @@
[% 'Order Number' | $T8 %][% numbers.join(', ') %]
[% quo_nr_txt | $T8 %] - [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order") -%] + [%- IF (SELF.type == "sales_order_intake" || SELF.type == "sales_order" || SELF.type == "purchase_order" || SELF.type == "purchase_order_confirmation") -%] [% L.input_tag('order.quonumber', SELF.order.quonumber, size = 11) %] [%- ELSIF INSTANCE_CONF.get_sales_purchase_record_numbers_changeable %] [% L.input_tag('order.quonumber', SELF.order.quonumber, size = 11, onchange='kivi.Order.set_number_in_title(this)') %] @@ -213,7 +226,14 @@
[% 'Vendor Confirmation Number' | $T8 %][% L.input_tag('order.vendor_confirmation_number', SELF.order.vendor_confirmation_number, size = 11) %]
[% 'Customer Order Number' | $T8 %] [% L.input_tag('order.cusordnumber', SELF.order.cusordnumber, size = 11) %][% L.date_tag('order.tax_point_as_date', SELF.order.tax_point_as_date, class="recalc") %]
[%- 'Type' | $T8 %] [%- 'Description' | $T8 %][%- 'Delivered' | $T8 %] [%- 'Qty' | $T8 %]