Merge branch 'f-zugferd'
[kivitendo-erp.git] / templates / webpages / client_config / _features.html
index b38b66e..c868571 100644 (file)
   <tr>
     <td align="right">[% LxERP.t8('Storage Type for generated/imported PDF Documents') %]</td>
     <td>[% L.select_tag('defaults.doc_storage_for_documents',
-         [ [ 'Filesystem', LxERP.t8('Files') ],[ 'Webdav', LxERP.t8('WebDAV') ],[ 'ExtDMS', LxERP.t8('ext.DMS') ],[ 'DB', LxERP.t8('Database') ]  ],
-                               default = SELF.defaults.doc_storage_for_documents) %]</td> 
+         [ [ 'None', LxERP.t8('None') ],[ 'Filesystem', LxERP.t8('Files') ],[ 'Webdav', LxERP.t8('WebDAV') ] ],
+                               default = SELF.defaults.doc_storage_for_documents,
+                               onchange="return checkavailable_filebackend(this);") %]</td>
     <td>[% LxERP.t8('Use this storage backend for all generated PDF-Files') %]</td>
   </tr>
   <tr>
     <td align="right">[% LxERP.t8('Storage Type for Attachments') %]</td>
     <td>[% L.select_tag('defaults.doc_storage_for_attachments',
-         [ [ 'Filesystem', LxERP.t8('Files') ],[ 'Webdav', LxERP.t8('WebDAV') ],[ 'ExtDMS', LxERP.t8('ext.DMS') ],[ 'DB', LxERP.t8('Database') ]  ],
-                               default = SELF.defaults.doc_storage_for_attachments) %]</td> 
+         [ [ 'None', LxERP.t8('None') ], [ 'Filesystem', LxERP.t8('Files') ],[ 'Webdav', LxERP.t8('WebDAV') ] ],
+                               default = SELF.defaults.doc_storage_for_attachments,
+                               onchange="return checkavailable_filebackend(this);") %]</td>
     <td>[% LxERP.t8('Use this storage backend for all uploaded attachments') %]</td>
   </tr>
   <tr>
     <td align="right">[% LxERP.t8('Storage Type for images') %]</td>
     <td>[% L.select_tag('defaults.doc_storage_for_images',
-         [ [ 'Filesystem', LxERP.t8('Files') ],[ 'Webdav', LxERP.t8('WebDAV') ],[ 'ExtDMS', LxERP.t8('ext.DMS') ],[ 'DB', LxERP.t8('Database') ]  ],
-                               default = SELF.defaults.doc_storage_for_images) %]</td> 
+         [ [ 'None', LxERP.t8('None') ], [ 'Filesystem', LxERP.t8('Files') ],[ 'Webdav', LxERP.t8('WebDAV') ] ],
+                               default = SELF.defaults.doc_storage_for_images,
+                               onchange="return checkavailable_filebackend(this);") %]</td>
+    <td>[% LxERP.t8('Use this storage backend for uploaded images') %]</td>
+  </tr>
+  <tr>
+    <td align="right">[% LxERP.t8('Storage Type for shopimages') %]</td>
+    <td>[% L.select_tag('defaults.doc_storage_for_shopimages',
+         [ [ 'None', LxERP.t8('None') ], [ 'Filesystem', LxERP.t8('Files') ],[ 'Webdav', LxERP.t8('WebDAV') ] ],
+                               default = SELF.defaults.doc_storage_for_shopimages,
+                               onchange="return checkavailable_filebackend(this);") %]</td>
     <td>[% LxERP.t8('Use this storage backend for uploaded images') %]</td>
   </tr>
   <tr>
   </tr>
   <tr>
    <td align="right">[% LxERP.t8('max filesize') %]</td>
-   <td>[% L.input_tag('defaults.doc_max_filesize',SELF.defaults.doc_max_filesize, size=>10) %]</td>
-   <td>[% LxERP.t8('The maximum of uploadable filesize') %]</td>
+   <td>[% L.input_tag('doc_max_filesize_MB','', size=10, onchange="verifyMBSize(this);") %]
+       [% L.hidden_tag('defaults.doc_max_filesize',SELF.defaults.doc_max_filesize) %] MB</td>
+   <td>[% LxERP.t8('The maximum of uploadable filesize in Megabyte') %]</td>
+  </tr>
+  <tr>
+   <td align="right">[% LxERP.t8('Preselect Customer/Vendor documents as email attachments') %]</td>
+   <td>[% L.yes_no_tag('defaults.email_attachment_vc_files_checked', SELF.defaults.email_attachment_vc_files_checked) %]</td>
+   <td>[% LxERP.t8('Preselect all documents saved for the current customer/vendor as a mail attachment.') %]</td>
+  </tr>
+  <tr>
+   <td align="right">[% LxERP.t8('Preselect part documents as email attachments') %]</td>
+   <td>[% L.yes_no_tag('defaults.email_attachment_part_files_checked', SELF.defaults.email_attachment_part_files_checked) %]</td>
+   <td>[% LxERP.t8('Preselect all documents for the current selected parts in a record as a mail attachment.') %]</td>
+  </tr>
+  <tr>
+   <td align="right">[% LxERP.t8('Preselect record documents as email attachments') %]</td>
+   <td>[% L.yes_no_tag('defaults.email_attachment_record_files_checked', SELF.defaults.email_attachment_record_files_checked) %]</td>
+   <td>[% LxERP.t8('Preselect all documents saved for the current record as a mail attachment.') %]</td>
   </tr>
   <tr><td class="listheading" colspan="4">[% LxERP.t8("Storage Backends") %]</td></tr>
   <tr>
    <td>[% L.yes_no_tag('defaults.doc_files', SELF.defaults.doc_files) %]</td>
    <td>[% LxERP.t8('Use File Storage backend') %]</td>
   </tr>
-  <tr>
-   <td align="right">[% LxERP.t8('Root path for file storage') %]</td>
-   <td>[% L.input_tag('defaults.doc_files_rootpath',SELF.defaults.doc_files_rootpath, style=style) %]</td>
-   <td>[% LxERP.t8('This is the root directory for the File storage backend, must be writable for webserver') %]</td>
-  </tr>
   <tr>
    <td align="right">[% LxERP.t8('WebDAV') %]</td>
    <td>[% L.yes_no_tag('defaults.doc_webdav', SELF.defaults.doc_webdav) %]</td>
    <td>[% LxERP.t8('Use WebDAV Storage backend') %]</td>
   </tr>
-  <tr>
-   <td align="right">[% LxERP.t8('Database') %]</td>
-   <td>[% L.yes_no_tag('defaults.doc_database', SELF.defaults.doc_database) %]</td>
-   <td>[% LxERP.t8('Use Database Storage backend (not implemented yet!)') %]</td>
-  </tr>
 
   <tr><td class="listheading" colspan="4">[% LxERP.t8("Reports") %]</td></tr>
 
    <td align="right">[% LxERP.t8('Normalize part description and part notes') %]</td>
    <td>   [% L.yes_no_tag('defaults.normalize_part_descriptions', SELF.defaults.normalize_part_descriptions) %]</td>
    <td>[% LxERP.t8('Automatic deletion of leading, trailing and excessive (repetitive) spaces in part description and part notes. Affects the CSV import as well.') %]</td>
-  </tr>
-</tr>
+ </tr>
 
   <tr><td class="listheading" colspan="4">[% LxERP.t8("Purchasing & Sales") %]</td></tr>
 
    <td>[% L.yes_no_tag("defaults.order_warn_duplicate_parts", SELF.defaults.order_warn_duplicate_parts) %]</td>
    <td>[% LxERP.t8("If enabled a warning will be shown in sales and purchase orders if there are two or more positions of the same part (new controller only).") %]</td>
   </tr>
+  <tr>
+   <td align="right">[% LxERP.t8("Warn before saving orders without a delivery date") %]</td>
+   <td>[% L.yes_no_tag("defaults.order_warn_no_deliverydate", SELF.defaults.order_warn_no_deliverydate) %]</td>
+   <td>[% LxERP.t8("If enabled a warning will be shown in sales and purchase orders if there the delivery date is empty.") %]</td>
+  </tr>
+  <tr>
+   <td align="right">[% LxERP.t8("Create sales invoices with ZUGFeRD data") %]</td>
+   <td>[% L.select_tag("defaults.create_zugferd_invoices", [ [ 0, LxERP.t8('Do not create ZUGFeRD invoices') ], [ 1, LxERP.t8('Create ZUGFeRD invoices') ], [ 2, LxERP.t8('Create ZUGFeRD invoices in test mode') ] ],
+                       default=SELF.defaults.create_zugferd_invoices) %]</td>
+   <td>
+     [% LxERP.t8("If enabled ZUGFeRD-conformant sales invoice PDFs will be created.") %]
+     [% LxERP.t8("If the test mode is enabled, the ZUGFeRD invoices will be flagged so that they're only fit to be used for testing purposes.") %]
+   </td>
+  </tr>
 
   <tr><td class="listheading" colspan="4">[% LxERP.t8("E-mail") %]</td></tr>
 
    </td>
    <td>[% 'Sent emails can be optionally stored in the database with or without their attachments.' | $T8 %]</td>
   </tr>
+  <tr>
+   <td align="right">[% LxERP.t8('Invoice email settings') %]</td>
+   <td>
+     [% L.select_tag('defaults.invoice_mail_settings', [ [ 'cp', LxERP.t8('Contact Person') ],[ 'invoice_mail', LxERP.t8('Invoice email') ],[ 'invoice_mail_cc_cp', LxERP.t8('Invoice email and Contact Person') ]  ], default=SELF.defaults.invoice_mail_settings) %]
+   </td>
+   <td>[% 'The invoice recipient can either be a selected contact person (default) or the email adress set in the master data of the customer. Additionally a contact persons mail and the company\'s invoicing mail can be combined.' | $T8 %]</td>
+  </tr>
 
   <tr><td class="listheading" colspan="4">[% LxERP.t8("Requirement Specs") %]</td></tr>
-
   <tr>
    <td align="right">[% LxERP.t8('Default article for converting into quotations and orders') %]</td>
    <td>
     [% IF SELF.h_unit_name %]
-     [% P.part_picker('defaults.requirement_spec_section_order_part_id', SELF.defaults.requirement_spec_section_order_part_id, convertible_unit=SELF.h_unit_name, style=style) %]
+     [% P.part.picker('defaults.requirement_spec_section_order_part_id', SELF.defaults.requirement_spec_section_order_part_id, convertible_unit=SELF.h_unit_name, style=style) %]
     [% ELSE %]
      [% LxERP.t8("Error: this feature requires that articles with a time-based unit (e.g. 'h' or 'min') exist.") %]
     [% END %]
   <tr><td class="listheading" colspan="4">[% LxERP.t8('Transport and service costs reminder') %]</td></tr>
  <tr>
   <td align="right">[% LxERP.t8('Default transport article number') %]</td>
-  <td>[% L.part_picker('defaults.transport_cost_reminder_article_number_id', SELF.defaults.transport_cost_reminder_article_number_id, style=style) %]</td>
+  <td>[% P.part.picker('defaults.transport_cost_reminder_article_number_id', SELF.defaults.transport_cost_reminder_article_number_id, style=style) %]</td>
    <td>[% LxERP.t8('Before saving a sales order, this article will be checked and a warning is generated.') %]</td>
  </tr>
 
    <td align="right">[% LxERP.t8('Project type') %]</td>
    <td>[% L.select_tag('defaults.project_type_id', SELF.all_project_types, default=SELF.defaults.project_type_id, title_key='description', with_empty=0, style="width: 200px") %]</td>
   </tr>
+  <tr>
    <td align="right">[% LxERP.t8('Project Status') %]</td>
    <td>[% L.select_tag('defaults.project_status_id', SELF.all_project_statuses, default=SELF.defaults.project_status_id, title_key='description', with_empty=0, style="width: 200px") %]</td>
   </tr>
    <td align="right">[% LxERP.t8('Add Customer/Vendor Number as a reference add-on for SEPA export.') %]</td>
    <td>[% L.yes_no_tag('defaults.sepa_reference_add_vc_vc_id', SELF.defaults.sepa_reference_add_vc_vc_id) %]</td>
   </tr>
- </table>
+  <tr>
+   <td align="right">[% LxERP.t8('Set the invoice duedate as the default execution date for SEPA export.') %]</td>
+   <td>[% L.yes_no_tag('defaults.sepa_set_duedate_as_default_exec_date', SELF.defaults.sepa_set_duedate_as_default_exec_date) %]</td>
+  </tr>
+  <tr>
+   <td align="right">[% LxERP.t8('Set the invoice skonto date (if exists) as the default execution date for SEPA export.') %]</td>
+   <td>[% L.yes_no_tag('defaults.sepa_set_skonto_date_as_default_exec_date', SELF.defaults.sepa_set_skonto_date_as_default_exec_date) %]</td>
+  </tr>
+  <tr>
+   <td align="right">[% LxERP.t8('In addition to the above date functions, subtract the following amount of days from the calculated date as a buffer.') %]</td>
+   <td>[% L.input_tag('defaults.sepa_set_skonto_date_buffer_in_days', LxERP.format_amount(SELF.defaults.sepa_set_skonto_date_buffer_in_days, 0), style=style) %]</td>
+  </tr>
+  <tr><td class="listheading" colspan="4">[% LxERP.t8("Experimental Features") %]</td></tr>
+  <tr>
+   <td align="right">[% LxERP.t8('new order controller') %]</td>
+   <td>[% L.yes_no_tag('defaults.feature_experimental_order', SELF.defaults.feature_experimental_order) %]</td>
+  </tr>
+  <tr>
+   <td align="right">[% LxERP.t8('Assortment') %]</td>
+   <td>[% L.yes_no_tag('defaults.feature_experimental_assortment', SELF.defaults.feature_experimental_assortment) %]</td>
+  </tr>
+
+ <tr><td class="listheading" colspan="4">[% LxERP.t8("Shipped Quantity Algorithm") %]</td></tr>
+ <tr>
+  <td align="right">[% LxERP.t8('Require stock out to consider a delivery order position delivered?') %]</td>
+  <td>[% L.yes_no_tag('defaults.shipped_qty_require_stock_out', SELF.defaults.shipped_qty_require_stock_out) %]</td>
+  <td>[% LxERP.t8('If yes, delivery order positions are considered "delivered" only if they have been stocked out of the inventory. Otherwise saving the delivery order is considered delivered.') %]</td>
+ </tr>
+ <tr>
+  <td align="right">[% LxERP.t8('Use fill up when calculating shipped quantities?') %]</td>
+  <td>[% L.yes_no_tag('defaults.shipped_qty_fill_up', SELF.defaults.shipped_qty_fill_up) %]</td>
+  <td>[% LxERP.t8('Linked positions will always be reconciled first. If this is set to yes, unlinked positions will be reconciled in a second step. This is necessary in very old databases (with open delivery orders from before 3.4.0) and in businesses where delivery orders are frequently amended. Usually the direct links are faster and more accurate. Defaults to true for historical reasons only.') %]</td>
+ </tr>
+ <tr>
+  <td align="right">[% LxERP.t8('Position identity fields for fill up?') %]</td>
+  <td>
+    [% L.select_tag("defaults.shipped_qty_item_identity_fields[]", SELF.available_shipped_qty_item_identity_fields, id="defaults_shipped_qty_item_identity_fields", multiple=1, default=SELF.defaults.shipped_qty_item_identity_fields) %]
+    [% L.multiselect2side("defaults_shipped_qty_item_identity_fields", labelsx=LxERP.t8("Available identity fields"), labeldx=LxERP.t8("Selected identity fields")) %]</td>
+  <td>[% LxERP.t8('Only applies if the previous is set to true. When filling up unlinked positions, consider them matches if ALL of these fields match. For example, in a business with variants that are defined by a special description, description needs to be part of the identity. If delivering several similar order positions by delivery date is common, reqdate should be included in the identity. Serialnumber is useful when the serialnumber in the order and delivery order has to match.') %]</td>
+ </tr>
+
+ <tr><td class="listheading" colspan="4">[% 'Displayable Name Preferences' | $T8 %]</td></tr>
+ [% FOREACH module=SELF.displayable_name_specs_by_module.keys.sort %]
+ [%- SET spec=SELF.displayable_name_specs_by_module.$module -%]
+  <tr>
+    <td align="right">[% spec.specs.title %]</td>
+    <td>
+      <table>
+        <tr>
+          <th align="left" class="listheading">[% 'Option' | $T8 %]</th>
+          <th align="left" class="listheading">[% 'Name'   | $T8 %]</th>
+        </tr>
+        [% FOREACH option=spec.specs.options %]
+        <tr>
+          <td>[% option.title %]</td>
+          <td>[% option.name  %]</td>
+        </tr>
+        [% END %]
+        <tr>
+          <th align="left">[% 'Display' | $T8 %]:</th>
+          <td>
+            [% L.hidden_tag("displayable_name_specs[+].module", module) %]
+            [% L.input_tag("displayable_name_specs[].default", spec.prefs.get_default, size=50) %]
+          </td>
+        </tr>
+      </table>
+    </td>
+    [% IF loop.first %]
+    <td>[% 'The display of (mainly) picker results can be configured. To insert the value of one option use <%Name%>.' | $T8 %]<br>
+        [% 'E.g. "<%customernumber%> <%name%>"' | $T8 %]
+    </td>
+    [% END %]
+  </tr>
+  [% END %]
+
+
+</table>
 </div>