From a454122e2be1fe521a61bc81bf603c479a13985d Mon Sep 17 00:00:00 2001 From: Jean-Paul Smets <jp@nexedi.com> Date: Mon, 12 Jul 2004 15:55:18 +0000 Subject: [PATCH] initial check in git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@1166 20353a03-c40f-0410-a6d1-a30d3c3de9de --- .../ERP5/Extensions/CheckAllPermissions.py | 24 + .../Account_countAccountingTransactions.py | 25 + .../Account_getTotalSourceCredit.py | 24 + .../Account_getTotalSourceDebit.py | 24 + .../erp5_accounting/Account_list_ui.form | 29 + .../skins/erp5_accounting/Account_search.py | 15 + .../skins/erp5_accounting/Account_stat.py | 12 + .../Account_viewTransactionList.form | 89 +++ .../BalanceTransactionLine_view.form | 213 ++++++ .../BalanceTransaction_view.form | 422 ++++++++++ .../PaySheetLine_quantityView.form | 389 ++++++++++ .../erp5_accounting/PaySheetLine_view.form | 367 +++++++++ .../PaySheetLinesPrintFormat.py | 61 ++ .../PaySheetTransactionLine_generate.py | 175 +++++ .../PaySheetTransactionLine_view.form | 283 +++++++ .../PaySheetTransaction_calcul_OLD.py | 538 +++++++++++++ .../PaySheetTransaction_checkParameters.py | 38 + .../PaySheetTransaction_getDetails.py | 139 ++++ .../PaySheetTransaction_getDetails_BACKUP.py | 118 +++ ...ySheetTransaction_getFormattedLines_OLD.py | 57 ++ .../PaySheetTransaction_getPreavis.py | 48 ++ .../PaySheetTransaction_initializePreview.py | 98 +++ .../PaySheetTransaction_pdf_template.pt | 163 ++++ .../PaySheetTransaction_postCalculation.py | 156 ++++ .../PaySheetTransaction_preCalculation.py | 356 +++++++++ .../PaySheetTransaction_previewForm.form | 218 ++++++ .../PaySheetTransaction_print.pt | 233 ++++++ .../PaySheetTransaction_print_old.pt | 233 ++++++ .../PaySheetTransaction_view.form | 351 +++++++++ .../PaySheet_getReportLines.py | 45 ++ .../PaySheet_printAnnualReport.pt | 49 ++ .../PaySheet_totalDestinationList.form | 80 ++ .../PaySheet_zGetDetailedTotal.zsql | 29 + .../PaySheet_zGetTotalDestinationList.zsql | 25 + .../PaymentTransaction_detail.form | 570 ++++++++++++++ .../PaymentTransaction_view.form | 607 +++++++++++++++ .../Resource_zGetInventory.zsql | 76 ++ .../account_template_view.form | 82 ++ .../erp5_accounting/accounting_report.form | 99 +++ .../accounting_transaction_detail.form | 562 ++++++++++++++ .../skins/erp5_accounting/calculPaySheet.py | 514 +++++++++++++ .../calculPaySheetTransaction.py | 514 +++++++++++++ ...opy_of_PaySheetTransaction_pdf_template.pt | 8 + .../copy_of_Resource_zGetInventory.zsql | 39 + .../erp5_accounting/getAccountPcgItemList.py | 18 + .../erp5_accounting/pay_sheet_line_view.form | 13 + .../skins/erp5_accounting/pay_sheet_list.form | 13 + .../skins/erp5_accounting/pay_sheet_print.pt | 114 +++ .../skins/erp5_accounting/pay_sheet_view.form | 13 + .../purchase_invoice_transaction_detail.form | 569 ++++++++++++++ .../sale_invoice_transaction_detail.form | 472 ++++++++++++ .../searchInvoiceTransaction.py | 33 + .../sql_stock_account_date.zsql | 26 + .../sql_stock_account_date_stat.zsql | 27 + .../sql_stock_account_parent.zsql | 25 + .../erp5_accounting/sql_stock_count.zsql | 16 + .../erp5_accounting/sql_stock_search.zsql | 17 + .../transaction_line_list.form | 62 ++ .../erp5_accounting/transaction_list_ui.form | 85 +++ .../ERP5/skins/erp5_crm/Assignment_view.form | 244 ++++++ .../skins/erp5_crm/Career_shiftDefault.py | 45 ++ product/ERP5/skins/erp5_crm/Career_view.form | 396 ++++++++++ .../erp5_crm/event_2_sale_opportunity.py | 31 + .../skins/erp5_crm/event_2_support_request.py | 31 + .../erp5_crm/person_assignment_view.form | 138 ++++ .../skins/erp5_crm/person_career_log_print.pt | 43 ++ .../skins/erp5_crm/person_career_view.form | 464 +++++++++++ .../skins/erp5_crm/person_viewDetails.form | 282 +++++++ .../skins/erp5_crm/project_line_view.form | 326 ++++++++ product/ERP5/skins/erp5_crm/project_list.form | 81 ++ .../erp5_crm/project_report_line_view.form | 394 ++++++++++ .../skins/erp5_crm/project_report_list.form | 81 ++ .../skins/erp5_crm/project_report_view.form | 353 +++++++++ product/ERP5/skins/erp5_crm/project_view.form | 377 +++++++++ .../skins/erp5_crm/support_request_list.form | 86 +++ .../skins/erp5_crm/support_request_view.form | 255 +++++++ .../skins/erp5_crm/z_person_career_log.zsql | 14 + ...untingTransaction_addPaymentTransaction.py | 25 + .../erp5_trade/DeliveryLine_asCellRange.py | 25 + .../erp5_trade/DeliveryLine_zGetTotal.zsql | 21 + .../skins/erp5_trade/Delivery_zGetTotal.zsql | 29 + .../erp5_trade/Invoice_addPurchaseInvoice.py | 28 + .../erp5_trade/Invoice_addSaleInvoice.py | 25 + .../Invoice_viewAccountingLineList.form | 565 ++++++++++++++ .../Invoice_viewInvoiceLineList.form | 721 ++++++++++++++++++ .../erp5_trade/Invoice_zGetDescription.py | 39 + .../skins/erp5_trade/Invoice_zGetDueDate.py | 43 ++ .../Invoice_zGetEscompteDescription.py | 25 + .../erp5_trade/Invoice_zGetPaymentTime.py | 31 + .../Invoice_zGetSourceSectionDescription.py | 31 + .../skins/erp5_trade/Invoice_zGetTotal.zsql | 13 + .../erp5_trade/Invoice_zGetTotalNetPrice.py | 23 + .../skins/erp5_trade/Invoice_zGetTotalVat.py | 21 + .../ERP5/skins/erp5_trade/SaleOrder_print.pt | 148 ++++ .../ERP5/skins/erp5_trade/discount_view.form | 229 ++++++ ...ngTransactionDestinationPaymentItemList.py | 24 + ...ountingTransactionSourcePaymentItemList.py | 24 + ...nceTransactionLineSourcePaymentItemList.py | 24 + .../erp5_trade/invoice_transaction_print.pt | 169 ++++ .../erp5_trade/order_line_matrix_item_list.py | 38 + .../erp5_trade/payment_condition_view.form | 286 +++++++ .../trade_condition_discount_view.form | 87 +++ .../trade_condition_payment_view.form | 221 ++++++ .../trade_condition_profile_view.form | 410 ++++++++++ 104 files changed, 16666 insertions(+) create mode 100755 product/ERP5/Extensions/CheckAllPermissions.py create mode 100755 product/ERP5/skins/erp5_accounting/Account_countAccountingTransactions.py create mode 100755 product/ERP5/skins/erp5_accounting/Account_getTotalSourceCredit.py create mode 100755 product/ERP5/skins/erp5_accounting/Account_getTotalSourceDebit.py create mode 100755 product/ERP5/skins/erp5_accounting/Account_list_ui.form create mode 100755 product/ERP5/skins/erp5_accounting/Account_search.py create mode 100755 product/ERP5/skins/erp5_accounting/Account_stat.py create mode 100755 product/ERP5/skins/erp5_accounting/Account_viewTransactionList.form create mode 100755 product/ERP5/skins/erp5_accounting/BalanceTransactionLine_view.form create mode 100755 product/ERP5/skins/erp5_accounting/BalanceTransaction_view.form create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetLine_quantityView.form create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetLine_view.form create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetLinesPrintFormat.py create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransactionLine_generate.py create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransactionLine_view.form create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_calcul_OLD.py create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_checkParameters.py create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_getDetails.py create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_getDetails_BACKUP.py create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_getFormattedLines_OLD.py create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_getPreavis.py create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_initializePreview.py create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_pdf_template.pt create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_postCalculation.py create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_preCalculation.py create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_previewForm.form create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_print.pt create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_print_old.pt create mode 100755 product/ERP5/skins/erp5_accounting/PaySheetTransaction_view.form create mode 100755 product/ERP5/skins/erp5_accounting/PaySheet_getReportLines.py create mode 100755 product/ERP5/skins/erp5_accounting/PaySheet_printAnnualReport.pt create mode 100755 product/ERP5/skins/erp5_accounting/PaySheet_totalDestinationList.form create mode 100755 product/ERP5/skins/erp5_accounting/PaySheet_zGetDetailedTotal.zsql create mode 100755 product/ERP5/skins/erp5_accounting/PaySheet_zGetTotalDestinationList.zsql create mode 100755 product/ERP5/skins/erp5_accounting/PaymentTransaction_detail.form create mode 100755 product/ERP5/skins/erp5_accounting/PaymentTransaction_view.form create mode 100755 product/ERP5/skins/erp5_accounting/Resource_zGetInventory.zsql create mode 100755 product/ERP5/skins/erp5_accounting/account_template_view.form create mode 100755 product/ERP5/skins/erp5_accounting/accounting_report.form create mode 100755 product/ERP5/skins/erp5_accounting/accounting_transaction_detail.form create mode 100755 product/ERP5/skins/erp5_accounting/calculPaySheet.py create mode 100755 product/ERP5/skins/erp5_accounting/calculPaySheetTransaction.py create mode 100755 product/ERP5/skins/erp5_accounting/copy_of_PaySheetTransaction_pdf_template.pt create mode 100755 product/ERP5/skins/erp5_accounting/copy_of_Resource_zGetInventory.zsql create mode 100755 product/ERP5/skins/erp5_accounting/getAccountPcgItemList.py create mode 100755 product/ERP5/skins/erp5_accounting/pay_sheet_line_view.form create mode 100755 product/ERP5/skins/erp5_accounting/pay_sheet_list.form create mode 100755 product/ERP5/skins/erp5_accounting/pay_sheet_print.pt create mode 100755 product/ERP5/skins/erp5_accounting/pay_sheet_view.form create mode 100755 product/ERP5/skins/erp5_accounting/purchase_invoice_transaction_detail.form create mode 100755 product/ERP5/skins/erp5_accounting/sale_invoice_transaction_detail.form create mode 100755 product/ERP5/skins/erp5_accounting/searchInvoiceTransaction.py create mode 100755 product/ERP5/skins/erp5_accounting/sql_stock_account_date.zsql create mode 100755 product/ERP5/skins/erp5_accounting/sql_stock_account_date_stat.zsql create mode 100755 product/ERP5/skins/erp5_accounting/sql_stock_account_parent.zsql create mode 100755 product/ERP5/skins/erp5_accounting/sql_stock_count.zsql create mode 100755 product/ERP5/skins/erp5_accounting/sql_stock_search.zsql create mode 100755 product/ERP5/skins/erp5_accounting/transaction_line_list.form create mode 100755 product/ERP5/skins/erp5_accounting/transaction_list_ui.form create mode 100755 product/ERP5/skins/erp5_crm/Assignment_view.form create mode 100755 product/ERP5/skins/erp5_crm/Career_shiftDefault.py create mode 100755 product/ERP5/skins/erp5_crm/Career_view.form create mode 100755 product/ERP5/skins/erp5_crm/event_2_sale_opportunity.py create mode 100755 product/ERP5/skins/erp5_crm/event_2_support_request.py create mode 100755 product/ERP5/skins/erp5_crm/person_assignment_view.form create mode 100755 product/ERP5/skins/erp5_crm/person_career_log_print.pt create mode 100755 product/ERP5/skins/erp5_crm/person_career_view.form create mode 100755 product/ERP5/skins/erp5_crm/person_viewDetails.form create mode 100755 product/ERP5/skins/erp5_crm/project_line_view.form create mode 100755 product/ERP5/skins/erp5_crm/project_list.form create mode 100755 product/ERP5/skins/erp5_crm/project_report_line_view.form create mode 100755 product/ERP5/skins/erp5_crm/project_report_list.form create mode 100755 product/ERP5/skins/erp5_crm/project_report_view.form create mode 100755 product/ERP5/skins/erp5_crm/project_view.form create mode 100755 product/ERP5/skins/erp5_crm/support_request_list.form create mode 100755 product/ERP5/skins/erp5_crm/support_request_view.form create mode 100755 product/ERP5/skins/erp5_crm/z_person_career_log.zsql create mode 100755 product/ERP5/skins/erp5_trade/AccountingTransaction_addPaymentTransaction.py create mode 100755 product/ERP5/skins/erp5_trade/DeliveryLine_asCellRange.py create mode 100755 product/ERP5/skins/erp5_trade/DeliveryLine_zGetTotal.zsql create mode 100755 product/ERP5/skins/erp5_trade/Delivery_zGetTotal.zsql create mode 100755 product/ERP5/skins/erp5_trade/Invoice_addPurchaseInvoice.py create mode 100755 product/ERP5/skins/erp5_trade/Invoice_addSaleInvoice.py create mode 100755 product/ERP5/skins/erp5_trade/Invoice_viewAccountingLineList.form create mode 100755 product/ERP5/skins/erp5_trade/Invoice_viewInvoiceLineList.form create mode 100755 product/ERP5/skins/erp5_trade/Invoice_zGetDescription.py create mode 100755 product/ERP5/skins/erp5_trade/Invoice_zGetDueDate.py create mode 100755 product/ERP5/skins/erp5_trade/Invoice_zGetEscompteDescription.py create mode 100755 product/ERP5/skins/erp5_trade/Invoice_zGetPaymentTime.py create mode 100755 product/ERP5/skins/erp5_trade/Invoice_zGetSourceSectionDescription.py create mode 100755 product/ERP5/skins/erp5_trade/Invoice_zGetTotal.zsql create mode 100755 product/ERP5/skins/erp5_trade/Invoice_zGetTotalNetPrice.py create mode 100755 product/ERP5/skins/erp5_trade/Invoice_zGetTotalVat.py create mode 100755 product/ERP5/skins/erp5_trade/SaleOrder_print.pt create mode 100755 product/ERP5/skins/erp5_trade/discount_view.form create mode 100755 product/ERP5/skins/erp5_trade/getAccountingTransactionDestinationPaymentItemList.py create mode 100755 product/ERP5/skins/erp5_trade/getAccountingTransactionSourcePaymentItemList.py create mode 100755 product/ERP5/skins/erp5_trade/getBalanceTransactionLineSourcePaymentItemList.py create mode 100755 product/ERP5/skins/erp5_trade/invoice_transaction_print.pt create mode 100755 product/ERP5/skins/erp5_trade/order_line_matrix_item_list.py create mode 100755 product/ERP5/skins/erp5_trade/payment_condition_view.form create mode 100755 product/ERP5/skins/erp5_trade/trade_condition_discount_view.form create mode 100755 product/ERP5/skins/erp5_trade/trade_condition_payment_view.form create mode 100755 product/ERP5/skins/erp5_trade/trade_condition_profile_view.form diff --git a/product/ERP5/Extensions/CheckAllPermissions.py b/product/ERP5/Extensions/CheckAllPermissions.py new file mode 100755 index 0000000000..208b7d994d --- /dev/null +++ b/product/ERP5/Extensions/CheckAllPermissions.py @@ -0,0 +1,24 @@ +def _checkPermission(folder): + msg='' + if hasattr(folder, 'objectValues'): + for child in folder.objectValues(): + msg += _checkPermission(child) + if hasattr(folder, 'valid_roles'): + valid_role_list = folder.valid_roles() + manager_index = list(valid_role_list).index('Manager') + permission_list = folder.permission_settings() + for permission in permission_list: + if permission['acquire'] == '': + for role in permission['roles']: + name = role['name'] + pos = name.find('r') + index = int(name[pos+1:]) + if manager_index == index: + if role['checked'] == '': + msg += '%s: %s does not contain Manager\n' % (folder.getUrl(), permission['name']) + break + return msg + +def ERP5Site_checkAllPermissions(self): + portal = self.portal_url.getPortalObject() + return _checkPermission(portal) diff --git a/product/ERP5/skins/erp5_accounting/Account_countAccountingTransactions.py b/product/ERP5/skins/erp5_accounting/Account_countAccountingTransactions.py new file mode 100755 index 0000000000..c765489ab3 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/Account_countAccountingTransactions.py @@ -0,0 +1,25 @@ +## Script (Python) "Account_countAccountingTransactions" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=self +##title= +## +currency = None + +if currency in (None, 'None'): + currency = context.currency.EUR + + +#inventory = context.Resource_zGetInventory(node_uid=context.getUid(), omit_simulation=1, +# resource_uid=(currency.getUid(),), +# simulation_state=('draft', 'planned', 'confirmed', 'stopped', 'delivered')) + +inventory = context.Resource_zGetInventory(node_uid=self.uid, omit_simulation=1, + resource_uid=(currency.getUid(),), + simulation_state=('draft', 'planned', 'confirmed', 'stopped', 'delivered')) + +inventory = inventory[0] +return str(inventory.stock_uid) diff --git a/product/ERP5/skins/erp5_accounting/Account_getTotalSourceCredit.py b/product/ERP5/skins/erp5_accounting/Account_getTotalSourceCredit.py new file mode 100755 index 0000000000..97225341ea --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/Account_getTotalSourceCredit.py @@ -0,0 +1,24 @@ +## Script (Python) "Account_getTotalSourceCredit" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=self +##title= +## +currency = None + +if currency in (None, 'None'): + currency = context.currency.EUR + +total = 0.0 +try: + inventory = context.Resource_zGetInventory(node_uid=context.getUid(), omit_output=1, omit_simulation=1, + resource_uid=(currency.getUid(),), + simulation_state=('draft', 'planned', 'confirmed', 'stopped', 'delivered')) + total = inventory[0].inventory or 0.0 +except: + pass + +return '%.02f' % total diff --git a/product/ERP5/skins/erp5_accounting/Account_getTotalSourceDebit.py b/product/ERP5/skins/erp5_accounting/Account_getTotalSourceDebit.py new file mode 100755 index 0000000000..e7d70b6ca2 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/Account_getTotalSourceDebit.py @@ -0,0 +1,24 @@ +## Script (Python) "Account_getTotalSourceDebit" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=self +##title= +## +currency = None + +if currency in (None, 'None'): + currency = context.currency.EUR + +total = 0.0 +try: + inventory = context.Resource_zGetInventory(node_uid=context.getUid(), omit_input=1, omit_simulation=1, + resource_uid=(currency.getUid(),), + simulation_state=('draft', 'planned', 'confirmed', 'stopped', 'delivered')) + total = - inventory[0].inventory or 0.0 +except: + pass + +return '%.02f' % total diff --git a/product/ERP5/skins/erp5_accounting/Account_list_ui.form b/product/ERP5/skins/erp5_accounting/Account_list_ui.form new file mode 100755 index 0000000000..3fcd321808 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/Account_list_ui.form @@ -0,0 +1,29 @@ +<?xml version="1.0"?> + +<form> + <title>Set List Settting</title> + <row_length>4</row_length> + <name>Account_list_ui</name> + <pt>form_list_ui</pt> + <action>base_list_ui</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/Account_search.py b/product/ERP5/skins/erp5_accounting/Account_search.py new file mode 100755 index 0000000000..d97f34d7bc --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/Account_search.py @@ -0,0 +1,15 @@ +## Script (Python) "Account_search" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=**kwd +##title= +## +for cname in kwd.keys(): + if kwd[cname] == '' or kwd[cname] is None: + del kwd[cname] + +kwd['select_expression'] = "'EUR' AS accounting_transaction_line_currency" +return context.portal_catalog(**kwd) diff --git a/product/ERP5/skins/erp5_accounting/Account_stat.py b/product/ERP5/skins/erp5_accounting/Account_stat.py new file mode 100755 index 0000000000..9fff15bb0f --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/Account_stat.py @@ -0,0 +1,12 @@ +## Script (Python) "Account_stat" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=**kwd +##title= +## +return 'toto' + +return repr(kwd) diff --git a/product/ERP5/skins/erp5_accounting/Account_viewTransactionList.form b/product/ERP5/skins/erp5_accounting/Account_viewTransactionList.form new file mode 100755 index 0000000000..42b7f3ceab --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/Account_viewTransactionList.form @@ -0,0 +1,89 @@ +<?xml version="1.0"?> + +<form> + <title>Account</title> + <row_length>4</row_length> + <name>Account_viewTransactionList</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('date', 'Date'), ('type', 'Type'), ('getReference', 'Reference'), ('quantity', 'Quantity')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[('portal_categories/group', 'Group'), ('portal_categories/region', 'Region')]</domain_root_list> + <domain_tree type="int">1</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[]</editable_columns> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">25</lines> + <list_action>list</list_action> + <list_method type="method">sql_stock_account_parent</list_method> + <meta_types type="list">[]</meta_types> + <not_viewable type="int">0</not_viewable> + <portal_types type="list">[('Accounting Transaction', 'Accounting Transaction'), ('Purchase Invoice Transaction', 'Purchase Invoice Transaction'), ('Sale Invoice Transaction', 'Sale Invoice Transaction')]</portal_types> + <read_only type="int">0</read_only> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">1</search> + <search_columns type="list">[]</search_columns> + <select type="int">1</select> + <selection_name>account_history_selection</selection_name> + <sort type="list">[]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Transactions concerned by this account</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/BalanceTransactionLine_view.form b/product/ERP5/skins/erp5_accounting/BalanceTransactionLine_view.form new file mode 100755 index 0000000000..7665ee50b0 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/BalanceTransactionLine_view.form @@ -0,0 +1,213 @@ +<?xml version="1.0"?> + +<form> + <title>Balance Transaction Line</title> + <row_length>4</row_length> + <name>BalanceTransactionLine_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_source</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Account</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:here.getInvoiceTransactionLineSourceItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_source_payment</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Bank Account</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python: here.getBalanceTransactionLineSourcePaymentItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_destination_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Person', 'Person'), ('Organisation', 'Organisation')]</portal_type> + <relation_setter_id></relation_setter_id> + <required type="int">0</required> + <title>Third Party</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_resource</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Currency</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:map(lambda x: (x.id,'currency/%s' % x.id),here.currency.objectValues())</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_source_credit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Credit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>my_source_debit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/BalanceTransaction_view.form b/product/ERP5/skins/erp5_accounting/BalanceTransaction_view.form new file mode 100755 index 0000000000..5aa5f31238 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/BalanceTransaction_view.form @@ -0,0 +1,422 @@ +<?xml version="1.0"?> + +<form> + <title>Balance Transaction</title> + <row_length>4</row_length> + <name>BalanceTransaction_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_source_section</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">1</required> + <size type="int">1</size> + <title>Section</title> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python: [['Nexedi', 'organisation/nexedi'], ]</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Operation Date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Description</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>simulation_state</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">1</read_only> + <required type="int">0</required> + <title>State</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>python: here.portal_workflow.getInfoFor(here, 'simulation_state')</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('source', 'Account'), ('source_payment', 'Bank Account'), ('destination_section_title', 'Third Party'), ('resource', 'Currency'), ('source_debit', 'Debit'), ('source_credit', 'Credit')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('source', 'Account'), ('source_payment', 'Bank Account'), ('resource', 'Currency'), ('source_debit', 'Debit'), ('source_credit', 'Credit')]</editable_columns> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[('source_section', 'source_section')]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>folder_contents</list_action> + <list_method type="method">searchInvoiceTransaction</list_method> + <meta_types type="list">[]</meta_types> + <not_viewable type="int">0</not_viewable> + <portal_types type="list">[]</portal_types> + <read_only type="int">0</read_only> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>balance_transaction_line_selection</selection_name> + <sort type="list">[('id', 'id')]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Balance Transaction Lines</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + <field><id>listbox_source_payment</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_source_payment</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python: cell.getObject().getBalanceTransactionLineSourcePaymentItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_resource</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_resource</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:[('','')]+map(lambda x:(x.id,'currency/%s' %x.id),cell.currency.objectValues())</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_source</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_source</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineSourceItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_source_debit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>listbox_source_credit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_credit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>listbox_destination_section_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>listbox_destination_section_title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/PaySheetLine_quantityView.form b/product/ERP5/skins/erp5_accounting/PaySheetLine_quantityView.form new file mode 100755 index 0000000000..ec5f4fc4aa --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetLine_quantityView.form @@ -0,0 +1,389 @@ +<?xml version="1.0"?> + +<form> + <title></title> + <row_length>4</row_length> + <name>pay_sheet_line_quantity_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">1</required> + <title>ID</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>matrixbox</id> <type>MatrixBox</type> + <values> + <all_editable_attributes type="list">[('quantity', 'quantity'), ('price', 'price'), ('predicate_value', 'predicate_value'), ('variation_category_list', 'variation_category_list')]</all_editable_attributes> + <alternate_name></alternate_name> + <cell_base_id>cell</cell_base_id> + <columns type="list">[('None', 'None')]</columns> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <editable_attributes type="list">[('quantity', 'quantity'), ('predicate_value', 'predicate_value'), ('price', 'price'), ('variation_category_list', 'variation_category_list')]</editable_attributes> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <getter_method></getter_method> + <global_attributes type="list">[('domain_base_category_list', 'domain_base_category_list'), ('mapped_value_property_list', 'mapped_value_property_list'), ('predicate_operator', 'predicate_operator')]</global_attributes> + <hidden type="int">0</hidden> + <lines type="list">[('None', 'None')]</lines> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <tabs type="list">[]</tabs> + <title>matrixbox</title> + <update_cell_range type="int">1</update_cell_range> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + </values> + <tales> + <columns>python:here.order_line_matrix_item_list(base_category_list = ('salary_range', 'taille',), base=1)</columns> + <lines>python:here.order_line_matrix_item_list(base_category_list = ('tax_category', 'coloris','variante'), base=1)</lines> + <tabs>python:here.order_line_matrix_item_list(base_category_list = ('salary_range','tax_category', 'taille','coloris','variante'), base=1, include=0)</tabs> + <update_cell_range>here/DeliveryLine_asCellRange</update_cell_range> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + <field><id>domain_base_category_list</id> <type>LinesField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default type="list">[]</default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">1</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Valid Domain</title> + <unicode type="int">0</unicode> + <view_separator><br /></view_separator> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + <default>here/getVariationBaseCategoryList</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>predicate_operator</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default>SUPERSET_OF</default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">1</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Operator</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>mapped_value_property_list</id> <type>LinesField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default type="list">["['target_quantity', 'quantity', 'price']"]</default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">1</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Modified categories</title> + <unicode type="int">0</unicode> + <view_separator><br /></view_separator> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + <field><id>matrixbox_predicate_value</id> <type>LinesField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default type="list">[]</default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">1</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>matrixbox_predicate_value</title> + <unicode type="int">0</unicode> + <view_separator><br /></view_separator> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + <default>python:cell_index</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>matrixbox_variation_category_list</id> <type>LinesField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default type="list">[]</default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">1</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>matrixbox_predicate_value</title> + <unicode type="int">0</unicode> + <view_separator><br /></view_separator> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + <default>python:cell_index</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>matrixbox_price</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">1</hidden> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>matrixbox_price</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>python:cell.getProperty('price')</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>matrixbox_quantity</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission></editable_permission> + <editable_role></editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>matrixbox_quantity</title> + <viewable_expression></viewable_expression> + <viewable_permission></viewable_permission> + <viewable_role></viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>python:cell.getProperty('quantity')</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/PaySheetLine_view.form b/product/ERP5/skins/erp5_accounting/PaySheetLine_view.form new file mode 100755 index 0000000000..a6ddec73ec --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetLine_view.form @@ -0,0 +1,367 @@ +<?xml version="1.0"?> + +<form> + <title></title> + <row_length>4</row_length> + <name>pay_sheet_line_edit</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">1</required> + <title>ID</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">2</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Description</title> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>my_resource_relative_url</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>resource</base_category> + <catalog_index>relative_url</catalog_index> + <css_class></css_class> + <default></default> + <default_module>product</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <portal_type type="list">[('Service', 'Service'), ('Product', 'Product')]</portal_type> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Produit</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_variation_base_category_list</id> <type>MultiListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default type="list">[]</default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <size type="int">3</size> + <title>Axes variation</title> + <unicode type="int">0</unicode> + <view_separator><br /></view_separator> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + </values> + <tales> + <items>here/getVariationRangeBaseCategoryList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_variation_category_list</id> <type>MultiListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default type="list">[]</default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <size type="int">8</size> + <title>Variantes</title> + <unicode type="int">0</unicode> + <view_separator><br /></view_separator> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + </values> + <tales> + <items>here/getVariationRangeCategoryItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + <field><id>my_quantity</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Default quantity</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>my_quantity_unit</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <size type="int">1</size> + <title>Quantity unit</title> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>here/portal_categories/quantity_unit/getCategoryChildTitleItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_price</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Default price</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>my_total_quantity</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">1</hidden> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Quantité facturée</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <title>python:'Quantité facturée : %.2f' % here.getTotalQuantity()</title> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/PaySheetLinesPrintFormat.py b/product/ERP5/skins/erp5_accounting/PaySheetLinesPrintFormat.py new file mode 100755 index 0000000000..0838d741ea --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetLinesPrintFormat.py @@ -0,0 +1,61 @@ +## Script (Python) "PaySheetLinesPrintFormat" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +True = 1 +False = 0 + +pay_sheet = context.getObject() +all = pay_sheet.objectValues() + +# this dictionnary contain all pay sheet details extracted from Pay Sheet Lines. +# these details are sorted and tidy for a clean print of the Pay Sheet +formated_lines = [] # id, title, pp, cs, ps +# todo: add: description assiette, montant assiette, pourcentage de la part salariale et patronale + +# get all PaySheetLines +for pay_sheet_line in all: + ID = pay_sheet_line.getId() + if ID[-3:] == '_pp' or ID[-3:] == '_cs': + # search an existing id without the suffix in the final table + i = 0 + id_exist = False + for line in formated_lines: + if line['id'] == ID[:-3]: + id_exist = True + break + i += 1 + # add a new line of contribution in pay sheet details + if id_exist == False: + new_formated_line = { 'id' : ID[:-3], + 'title' : None, + 'pp' : None, + 'cs' : None, + 'ps' : None, + 'ps_desc' : None, + 'pp_desc' : None} + formated_lines.append(new_formated_line) + # get the employer share ('pp' is the french acronym of 'part patronale') + if ID[-3:] == '_pp': + formated_lines[i]['pp'] = pay_sheet_line.getDestinationCredit() + formated_lines[i]['pp_desc'] = pay_sheet_line.getDescription() + # get the social contribution (= employer + salary share) ('cs' is a french acronym of 'cotisation sociale') + elif ID[-3:] == '_cs': + formated_lines[i]['cs'] = pay_sheet_line.getDestinationCredit() + formated_lines[i]['title'] = pay_sheet_line.getTitle() + formated_lines[i]['ps_desc'] = pay_sheet_line.getDescription() + +# calculation of the salary share ('ps' is a french acronym of 'part salariale') +for line in formated_lines: + if line['cs']!=None and line['pp']!=None and line['cs']!=line['pp']: + line['ps'] = float(line['cs']) - float(line['pp']) + if line['cs']!=None and line['pp']==None: + line['ps'] = float(line['cs']) + + +return formated_lines diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransactionLine_generate.py b/product/ERP5/skins/erp5_accounting/PaySheetTransactionLine_generate.py new file mode 100755 index 0000000000..e74851495d --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransactionLine_generate.py @@ -0,0 +1,175 @@ +## Script (Python) "PaySheetTransactionLine_generate" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +paysheet = context.getObject() +paysheet_type = paysheet.getPortalType() +paysheet_line_type = 'Pay Sheet Line' +paysheet_transactionline_type = 'Pay Sheet Transaction Line' +paysheet_cell_type = 'Pay Sheet Cell' + +employee = paysheet.getDestinationSection() +employer = paysheet.getSourceSection() +employer_object = paysheet.getSourceSectionValue() + + +# gross salary source and destination +charge_salariale = 'account/charges_salariales' +produit_salarial = 'account/produits_salariaux' + +# final salary source and destination +dette_salarie = 'account/dettes_salaries' +creance_salarie = 'account/creances_salaries' + +# employer share source and destination +charge_sociale = 'account/charges_sociales' +produit_social = 'account/produits_sociaux' + +# employer + employee share source and destination +dette_sociale = 'account/dettes_sociales' +creance_sociale = 'account/creances_sociales' + +# the currency related to this french rules set is euros +paysheet_resource = 'currency/EUR' + + + +# Create a new pay sheet line +def createPaySheetTransactionLine(new_title='', share='', + src_sec='', src='', src_deb=None, + dest_sec='', dest='', new_desc=''): + suffix = { 'social' : ' (cotisations sociales)' + , 'employer': ' (part patronale)' + } + if share == 'social' or share == 'employer': + new_title += suffix[share] + if share == 'social': + src_sec = employer + src = dette_sociale + dest = creance_sociale + elif share == 'employer': + src_sec = employer + src = charge_sociale + dest = produit_social + new_id = str(paysheet.generateNewId()) + context.portal_types.constructContent ( type_name = paysheet_transactionline_type + , container = paysheet + , id = new_id + ) + # alternate method but doesn't work + #new_line = paysheet.getObject(new_id) + paysheet[new_id].setTitle(new_title) + paysheet[new_id].setResource(paysheet_resource) + paysheet[new_id].setSourceSection(src_sec) + paysheet[new_id].setSource(src) + paysheet[new_id].setDestinationSection(dest_sec) + paysheet[new_id].setDestination(dest) + paysheet[new_id].setSourceDebit(src_deb) + paysheet[new_id].setDescription(new_desc) + + + +def addAccountingItem(title='', mplyee_share=None, mplyer_share=None, dest_org=''): + if mplyer_share == 0 and mplyee_share == 0: + return + if mplyer_share == 0: + createPaySheetTransactionLine ( new_title = title + , share = 'social' + , src_deb = mplyee_share + , dest_sec = dest_org + ) + return + if mplyee_share == 0: + createPaySheetTransactionLine ( new_title = title + , share = 'social' + , src_deb = mplyer_share + , dest_sec = dest_org + ) + createPaySheetTransactionLine ( new_title = title + , share = 'employer' + , src_deb = mplyer_share + , dest_sec = dest_org + ) + return + createPaySheetTransactionLine ( new_title = title + , share = 'social' + , src_deb = float(mplyer_share) + float(mplyee_share) + , dest_sec = dest_org + ) + createPaySheetTransactionLine ( new_title = title + , share = 'employer' + , src_deb = mplyer_share + , dest_sec = dest_org + ) + + + +# Only keep the PaySheetLine in the paysheet, delete all other objects +id_list = [] +for paysheet_item in paysheet.objectValues(): + if paysheet_item.getPortalType() != paysheet_line_type: + id_list.append(paysheet_item.getId()) +paysheet.manage_delObjects(id_list) + +# Get all amount +paysheet_details = paysheet.PaySheetTransaction_getDetails() +paysheet_categories = paysheet_details['paysheet_categories'] + +paysheet_formated_lines = [] +for category in paysheet_categories: + for line in paysheet_categories[category]['lines']: + paysheet_formated_lines.append(line) + +# Analyze every PaySheet Line +paysheet_lines = paysheet.objectValues() +for paysheet_item in paysheet_lines: + if paysheet_item.getPortalType() == paysheet_line_type: + + # Find the dictionnary that contain the pre-calculated employer and employee share + employer_share = 0.0 + employee_share = 0.0 + for line in paysheet_formated_lines: + if line['id'] == paysheet_item.getId(): + er = line['employer_share'] + ee = line['employee_share'] + if er not in (None, ''): + employer_share += abs(float(er)) + if ee not in (None, ''): + employee_share += abs(float(ee)) + + # Get the destination organisation + paysheet_line_service = paysheet_item.getResourceValue() + organisation = paysheet_line_service.getSource() + + # Add accounting item corresponding to the PaySheet Line + addAccountingItem ( title = paysheet_item.getTitle() + , mplyer_share = employer_share + , mplyee_share = employee_share + , dest_org = organisation + ) + +# Add the gross salary +createPaySheetTransactionLine ( new_title = 'Salaire brut' + , src_sec = employer + , src = charge_salariale + , src_deb = abs(float(paysheet_details['gross_salary'])) + , dest_sec = employee + , dest = produit_salarial + ) + +# Add the final salary +createPaySheetTransactionLine ( new_title = 'Salaire net' + , src_sec = employer + , src = dette_salarie + , src_deb = abs(float(paysheet_details['net_salary'])) + , dest_sec = employee + , dest = creance_salarie + ) + +# 'refresh' screen +return context.REQUEST.RESPONSE.redirect(context.absolute_url() + '?portal_status_message=Pay+Sheet+Transaction+Lines+created.') diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransactionLine_view.form b/product/ERP5/skins/erp5_accounting/PaySheetTransactionLine_view.form new file mode 100755 index 0000000000..afcff3c18f --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransactionLine_view.form @@ -0,0 +1,283 @@ +<?xml version="1.0"?> + +<form> + <title></title> + <row_length>4</row_length> + <name>pay_sheet_list</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>ID</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>person</default_module> + <description>Destination section</description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Person', 'Person'), ('Organisation', 'Organisation')]</portal_type> + <required type="int">0</required> + <title>Third party account</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>account</default_module> + <description>Destination</description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Account', 'account')]</portal_type> + <required type="int">0</required> + <title>Mirror account</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + <field><id>my_source_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description>Source section</description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Analytical section</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_source_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>account</default_module> + <description>Section</description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Account', 'account')]</portal_type> + <required type="int">0</required> + <title>Account</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_source_debit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Source debit (in euros)</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>my_source_credit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Source credit (in euros)</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_calcul_OLD.py b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_calcul_OLD.py new file mode 100755 index 0000000000..c51a0ad72e --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_calcul_OLD.py @@ -0,0 +1,538 @@ +## Script (Python) "PaySheetTransaction_calcul_OLD" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=agff_slice_1_base=None, agff_slice_1_er=None, agff_slice_1_sr=None, agff_slice_2_base=None, agff_slice_2_er=None, agff_slice_2_sr=None, agff_slice_a_base=None, agff_slice_a_er=None, agff_slice_a_sr=None, agff_slice_b_base=None, agff_slice_b_er=None, agff_slice_b_sr=None, agirc_slice_b_base=None, agirc_slice_b_er=None, agirc_slice_b_sr=None, agirc_slice_c_base=None, agirc_slice_c_er=None, agirc_slice_c_sr=None, ags_slice_a_base=None, ags_slice_a_er=None, ags_slice_b_base=None, ags_slice_b_er=None, apec_slice_b_base=None, apec_slice_b_er=None, apec_slice_b_sr=None, arrco_slice_1_base=None, arrco_slice_1_er=None, arrco_slice_1_sr=None, arrco_slice_2_base=None, arrco_slice_2_er=None, arrco_slice_2_sr=None, arrco_slice_a_base=None, arrco_slice_a_er=None, arrco_slice_a_sr=None, cet_slice_a_base=None, cet_slice_a_er=None, cet_slice_a_sr=None, cet_slice_b_base=None, cet_slice_b_er=None, cet_slice_b_sr=None, cet_slice_c_base=None, cet_slice_c_er=None, cet_slice_c_sr=None, construction_tax_base=None, construction_tax_er=None, courses_tax_base=None, courses_tax_er=None, crds_base=None, crds_sr=None, csg_deductible_base=None, csg_deductible_sr=None, csg_non_deductible_base=None, csg_non_deductible_sr=None, family_benefits_base=None, family_benefits_er=None, industrial_accident_base=None, industrial_accident_er=None, life_insurance_slice_a_base=None, life_insurance_slice_a_er=None, lodging_helps_base=None, lodging_helps_er=None, lodging_helps_limited_base=None, lodging_helps_limited_er=None, oldage_insurance_base=None, oldage_insurance_er=None, oldage_insurance_limited_base=None, oldage_insurance_limited_er=None, oldage_insurance_limited_sr=None, sickness_insurance_base=None, sickness_insurance_er=None, sickness_insurance_sr=None, syntec_base=None, syntec_er=None, syntec_sr=None, training_tax_base=None, training_tax_er=None, transport_payment_base=None, transport_payment_er=None, unemployment_insurance_slice_a_base=None, unemployment_insurance_slice_a_er=None, unemployment_insurance_slice_a_sr=None, unemployment_insurance_slice_b_base=None, unemployment_insurance_slice_b_er=None, unemployment_insurance_slice_b_sr=None, widowhood_insurance_base=None, widowhood_insurance_sr=None +##title= +## +True = 1 +False = 0 + +global paysheet +paysheet = context.getObject() +paysheet_type = paysheet.getPortalType() + +paysheet_line_type = 'Pay Sheet Line' +paysheet_cell_type = 'Pay Sheet Cell' + +employee = paysheet.getDestinationSection() +employee_object = paysheet.getDestinationSectionValue() +employer = paysheet.getSourceSection() +employer_object = paysheet.getSourceSectionValue() + +gross_salary = abs(paysheet.getGrossSalary()) +#paysheet_resource = paysheet.getCurrency() why it doesn't work ????? +paysheet_resource = 'currency/EUR' + + + +# set the title if empty +months = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'] +if paysheet.getTitle() in ('', None): + paysheet.setTitle('Salaire ' + str(employee_object.getTitle()) + ' ' + months[int(str(paysheet.getStartDate())[5:7])-1] + ' ' + str(paysheet.getStartDate())[0:4]) + + + +######################################################################### +# This part of the script implement functions to register all pay sheet +# informations from an ERP5 point of view. +######################################################################### + +def createPaySheetItem(title='', res='', dest_org='', cells=[]): + global paysheet + # select good cells only + good_cells = [] + for cell in cells: + if cell["base"] not in ('', 0, None) and cell["rate"] not in ('', 0, None): + good_cells.append(cell) + if len(good_cells) == 0: + return + # get all variation categories used in cells + var_cat_list = [] + for cell in good_cells: + var_cat_list.append(cell["x"]) + var_cat_list.append(cell["y"]) + # add a new Pay Sheet Line + payline = paysheet.newContent( portal_type = 'Pay Sheet Line' + , title = title + , resource = res + , destination_section = dest_org + , destination = dest_org + , variation_base_category_list = ('tax_category', 'salary_range') + , variation_category_list = var_cat_list + ) + # fill each cell with values + for cell in good_cells: + paycell = payline.getCell(cell["x"], cell["y"], base_id = 'movement') + paycell.edit(quantity=-cell["base"], price=cell["rate"]/100.0) + + + +######################################################################### +# This part of script describe the behaviour of the calculation process +# from accountant point of view. +######################################################################### + +# social organism +org_urssaf = 'organisation/urssaf' +org_assedic = 'organisation/assedic' +org_arrco = 'organisation/arrco' +org_agff = 'organisation/agff' +org_agirc = 'organisation/agirc' +org_apec = 'organisation/apec' +org_etat = 'organisation/etat' +org_ener = 'organisation/henner' + +# variation categories +cat_social_salary_share = 'tax_category/social/salary_share' +cat_social_employer_share = 'tax_category/social/employer_share' +cat_syntec_employer_share = 'tax_category/syntec_insurance/employer_share' +cat_syntec_salary_share = 'tax_category/syntec_insurance/salary_share' +cat_csg = 'tax_category/csg/salary_share' +cat_crds = 'tax_category/crds/salary_share' +cat_unemployment_salary_share = 'tax_category/unemployment/salary_share' +cat_unemployment_employer_share = 'tax_category/unemployment/employer_share' +cat_ags = 'tax_category/ags/employer_share' +cat_supplementary_pension_salary_share = 'tax_category/supplementary_pension/salary_share' +cat_supplementary_pension_employer_share = 'tax_category/supplementary_pension/employer_share' +cat_life_insurance_employer_share = 'tax_category/life_insurance/employer_share' +cat_apec_salary_share = 'tax_category/apec/salary_share' +cat_apec_employer_share = 'tax_category/apec/employer_share' +cat_taxes = 'tax_category/taxes/employer_share' +cat_gross_salary = 'salary_range/france/salaire_brut' +cat_limited_salary = 'salary_range/france/salaire_plafonne' +cat_syntec_limited_salary = 'salary_range/france/salaire_plafonne_syntec' +cat_brut_csg_salary = 'salary_range/france/salaire_brut_csg' +cat_brut_crds_salary = 'salary_range/france/salaire_brut_crds' +cat_slice_a = 'salary_range/france/tranche_a' +cat_slice_b = 'salary_range/france/tranche_b' +cat_slice_c = 'salary_range/france/tranche_c' +cat_slice_1 = 'salary_range/france/tranche_1' +cat_slice_2 = 'salary_range/france/tranche_2' + + +# sickness insurance = assurance maladie +createPaySheetItem( title = 'Assurance maladie' + , res = 'service/sickness_insurance' + , dest_org = org_urssaf + , cells = [ { "x" : cat_social_salary_share + , "y" : cat_gross_salary + , "base" : sickness_insurance_base + , "rate" : sickness_insurance_sr + }, + { "x" : cat_social_employer_share + , "y" : cat_gross_salary + , "base" : sickness_insurance_base + , "rate" : sickness_insurance_er + } + ] + ) + +# old-age insurance = assurance vieillesse +createPaySheetItem( title = 'Assurance vieillesse' + , res = 'service/oldage_insurance' + , dest_org = org_urssaf + , cells = [ { "x" : cat_social_salary_share + , "y" : cat_limited_salary + , "base" : oldage_insurance_limited_base + , "rate" : oldage_insurance_limited_sr + }, + { "x" : cat_social_employer_share + , "y" : cat_gross_salary + , "base" : oldage_insurance_base + , "rate" : oldage_insurance_er + }, + { "x" : cat_social_employer_share + , "y" : cat_limited_salary + , "base" : oldage_insurance_limited_base + , "rate" : oldage_insurance_limited_er + } + ] + ) + +# widowhood insurance = assurance veuvage +createPaySheetItem( title = 'Assurance veuvage' + , res = 'service/widowhood_insurance' + , dest_org = org_urssaf + , cells = [ { "x" : cat_social_salary_share + , "y" : cat_gross_salary + , "base" : widowhood_insurance_base + , "rate" : widowhood_insurance_sr + } + ] + ) + +# family benefits = allocations familiales +createPaySheetItem( title = 'Allocations familiales' + , res = 'service/family_benefits' + , dest_org = org_urssaf + , cells = [ { "x" : cat_social_employer_share + , "y" : cat_gross_salary + , "base" : family_benefits_base + , "rate" : family_benefits_er + } + ] + ) + +# industrial accident = accidents du travail +createPaySheetItem( title = 'Accidents du travail' + , res = 'service/industrial_accident' + , dest_org = org_urssaf + , cells = [ { "x" : cat_social_employer_share + , "y" : cat_gross_salary + , "base" : industrial_accident_base + , "rate" : industrial_accident_er + } + ] + ) + +# lodging helps = aide au logement +createPaySheetItem( title = 'Aide au logement' + , res = 'service/lodging_helps' + , dest_org = org_urssaf + , cells = [ { "x" : cat_social_employer_share + , "y" : cat_gross_salary + , "base" : lodging_helps_base + , "rate" : lodging_helps_er + }, + { "x" : cat_social_employer_share + , "y" : cat_limited_salary + , "base" : lodging_helps_limited_base + , "rate" : lodging_helps_limited_er + } + ] + ) + +# transport payment = versement au transport +createPaySheetItem( title = 'Versement au transport' + , res = 'service/transport_payment' + , dest_org = org_urssaf + , cells = [ { "x" : cat_social_employer_share + , "y" : cat_gross_salary + , "base" : transport_payment_base + , "rate" : transport_payment_er + } + ] + ) + +# CSG = Contribution Sociale Generalisee (déductible / non déductible) +createPaySheetItem( title = 'CSG deductible' + , res = 'service/csg_deductible' + , dest_org = org_urssaf + , cells = [ { "x" : cat_csg + , "y" : cat_brut_csg_salary + , "base" : csg_deductible_base + , "rate" : csg_deductible_sr + } + ] + ) +createPaySheetItem( title = 'CSG non deductible' + , res = 'service/csg_non_deductible' + , dest_org = org_urssaf + , cells = [ { "x" : cat_csg + , "y" : cat_brut_csg_salary + , "base" : csg_non_deductible_base + , "rate" : csg_non_deductible_sr + } + ] + ) + +# CRDS = Contribution pour le Remboursement de la Dette Sociale +createPaySheetItem( title = 'CRDS imposable' + , res = 'service/crds' + , dest_org = org_urssaf + , cells = [ { "x" : cat_crds + , "y" : cat_brut_crds_salary + , "base" : crds_base + , "rate" : crds_sr + } + ] + ) + +# unemployment insurance = assurance chomage +createPaySheetItem( title = 'Assurance chomage' + , res = 'service/unemployment_insurance' + , dest_org = org_assedic + , cells = [ { "x" : cat_unemployment_salary_share + , "y" : cat_slice_a + , "base" : unemployment_insurance_slice_a_base + , "rate" : unemployment_insurance_slice_a_sr + }, + { "x" : cat_unemployment_employer_share + , "y" : cat_slice_a + , "base" : unemployment_insurance_slice_a_base + , "rate" : unemployment_insurance_slice_a_er + }, + { "x" : cat_unemployment_salary_share + , "y" : cat_slice_b + , "base" : unemployment_insurance_slice_b_base + , "rate" : unemployment_insurance_slice_b_sr + }, + { "x" : cat_unemployment_employer_share + , "y" : cat_slice_b + , "base" : unemployment_insurance_slice_b_base + , "rate" : unemployment_insurance_slice_b_er + } + ] + ) + +# AGS (FNGS) +createPaySheetItem( title = 'AGS' + , res = 'service/ags' + , dest_org = org_assedic + , cells = [ { "x" : cat_ags + , "y" : cat_slice_a + , "base" : ags_slice_a_base + , "rate" : ags_slice_a_er + }, + { "x" : cat_ags + , "y" : cat_slice_b + , "base" : ags_slice_b_base + , "rate" : ags_slice_b_er + } + ] + ) + +# ARRCO +createPaySheetItem( title = 'ARRCO' + , res = 'service/arrco' + , dest_org = org_arrco + , cells = [ { "x" : cat_supplementary_pension_salary_share + , "y" : cat_slice_1 + , "base" : arrco_slice_1_base + , "rate" : arrco_slice_1_sr + }, + { "x" : cat_supplementary_pension_employer_share + , "y" : cat_slice_1 + , "base" : arrco_slice_1_base + , "rate" : arrco_slice_1_er + }, + { "x" : cat_supplementary_pension_salary_share + , "y" : cat_slice_2 + , "base" : arrco_slice_2_base + , "rate" : arrco_slice_2_sr + }, + { "x" : cat_supplementary_pension_employer_share + , "y" : cat_slice_2 + , "base" : arrco_slice_2_base + , "rate" : arrco_slice_1_er + }, + { "x" : cat_supplementary_pension_salary_share + , "y" : cat_slice_a + , "base" : arrco_slice_a_base + , "rate" : arrco_slice_a_sr + }, + { "x" : cat_supplementary_pension_employer_share + , "y" : cat_slice_a + , "base" : arrco_slice_a_base + , "rate" : arrco_slice_a_er + } + ] + ) + +# AGFF +createPaySheetItem( title = 'AGFF' + , res = 'service/agff' + , dest_org = org_agff + , cells = [ { "x" : cat_supplementary_pension_salary_share + , "y" : cat_slice_1 + , "base" : agff_slice_1_base + , "rate" : agff_slice_1_sr + }, + { "x" : cat_supplementary_pension_employer_share + , "y" : cat_slice_1 + , "base" : agff_slice_1_base + , "rate" : agff_slice_1_er + }, + { "x" : cat_supplementary_pension_salary_share + , "y" : cat_slice_2 + , "base" : agff_slice_2_base + , "rate" : agff_slice_2_sr + }, + { "x" : cat_supplementary_pension_employer_share + , "y" : cat_slice_2 + , "base" : agff_slice_2_base + , "rate" : agff_slice_2_er + }, + { "x" : cat_supplementary_pension_salary_share + , "y" : cat_slice_a + , "base" : agff_slice_a_base + , "rate" : agff_slice_a_sr + }, + { "x" : cat_supplementary_pension_employer_share + , "y" : cat_slice_a + , "base" : agff_slice_a_base + , "rate" : agff_slice_a_er + }, + { "x" : cat_supplementary_pension_salary_share + , "y" : cat_slice_b + , "base" : agff_slice_b_base + , "rate" : agff_slice_b_sr + }, + { "x" : cat_supplementary_pension_employer_share + , "y" : cat_slice_b + , "base" : agff_slice_b_base + , "rate" : agff_slice_b_er + } + ] + ) + +# AGIRC +createPaySheetItem( title = 'AGIRC' + , res = 'service/agirc' + , dest_org = org_agirc + , cells = [ { "x" : cat_supplementary_pension_salary_share + , "y" : cat_slice_b + , "base" : agirc_slice_b_base + , "rate" : agirc_slice_b_sr + }, + { "x" : cat_supplementary_pension_employer_share + , "y" : cat_slice_b + , "base" : agirc_slice_b_base + , "rate" : agirc_slice_b_er + }, + { "x" : cat_supplementary_pension_salary_share + , "y" : cat_slice_c + , "base" : agirc_slice_c_base + , "rate" : agirc_slice_c_sr + }, + { "x" : cat_supplementary_pension_employer_share + , "y" : cat_slice_c + , "base" : agirc_slice_c_base + , "rate" : agirc_slice_c_er + } + ] + ) + +# CET +createPaySheetItem( title = 'CET' + , res = 'service/cet' + , dest_org = org_agirc + , cells = [ { "x" : cat_supplementary_pension_salary_share + , "y" : cat_slice_a + , "base" : cet_slice_a_base + , "rate" : cet_slice_a_sr + }, + { "x" : cat_supplementary_pension_employer_share + , "y" : cat_slice_a + , "base" : cet_slice_a_base + , "rate" : cet_slice_a_er + }, + { "x" : cat_supplementary_pension_salary_share + , "y" : cat_slice_b + , "base" : cet_slice_b_base + , "rate" : cet_slice_b_sr + }, + { "x" : cat_supplementary_pension_employer_share + , "y" : cat_slice_b + , "base" : cet_slice_b_base + , "rate" : cet_slice_b_er + }, + { "x" : cat_supplementary_pension_salary_share + , "y" : cat_slice_c + , "base" : cet_slice_c_base + , "rate" : cet_slice_c_sr + }, + { "x" : cat_supplementary_pension_employer_share + , "y" : cat_slice_c + , "base" : cet_slice_c_base + , "rate" : cet_slice_c_er + } + ] + ) + +# life insurance = assurance deces +createPaySheetItem( title = 'Assurance deces' + , res = 'service/life_insurance' + , dest_org = org_urssaf + , cells = [ { "x" : cat_life_insurance_employer_share + , "y" : cat_slice_a + , "base" : life_insurance_slice_a_base + , "rate" : life_insurance_slice_a_er + } + ] + ) + +# APEC +createPaySheetItem( title = 'APEC' + , res = 'service/apec' + , dest_org = org_apec + , cells = [ { "x" : cat_apec_salary_share + , "y" : cat_slice_b + , "base" : apec_slice_b_base + , "rate" : apec_slice_b_sr + }, + { "x" : cat_apec_employer_share + , "y" : cat_slice_b + , "base" : apec_slice_b_base + , "rate" : apec_slice_b_er + } + ] + ) + +# construction tax +createPaySheetItem( title = 'Construction' + , res = 'service/construction' + , dest_org = org_etat + , cells = [ { "x" : cat_taxes + , "y" : cat_gross_salary + , "base" : construction_tax_base + , "rate" : construction_tax_er + } + ] + ) + +# training tax +createPaySheetItem( title = 'Apprentissage' + , res = 'service/training_tax' + , dest_org = org_etat + , cells = [ { "x" : cat_taxes + , "y" : cat_gross_salary + , "base" : training_tax_base + , "rate" : training_tax_er + } + ] + ) + +# courses tax +createPaySheetItem( title = 'Formation professionnelle' + , res = 'service/courses_tax' + , dest_org = org_etat + , cells = [ { "x" : cat_taxes + , "y" : cat_gross_salary + , "base" : courses_tax_base + , "rate" : courses_tax_er + } + ] + ) + +# Syntec convention +createPaySheetItem( title = 'Convention SYNTEC' + , res = 'service/syntec_insurance' + , dest_org = org_ener + , cells = [ { "x" : cat_syntec_salary_share + , "y" : cat_syntec_limited_salary + , "base" : syntec_base + , "rate" : syntec_sr + }, + { "x" : cat_syntec_employer_share + , "y" : cat_syntec_limited_salary + , "base" : syntec_base + , "rate" : syntec_er + } + ] + ) + + + +######################################################################### +# Create all Pay sheet transaction lines +######################################################################### + +#get_transaction().commit() +#context.PaySheetTransactionLine_generate() + +# return to pay sheet +return context.REQUEST.RESPONSE.redirect(context.absolute_url() + '?portal_status_message=Pay+Sheet+Calculation+done.') diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_checkParameters.py b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_checkParameters.py new file mode 100755 index 0000000000..9947906b3f --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_checkParameters.py @@ -0,0 +1,38 @@ +## Script (Python) "PaySheetTransaction_checkParameters" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +paysheet = context.getObject() +paysheet_type = paysheet.getPortalType() + +employee = paysheet.getDestinationSection() +employer = paysheet.getSourceSection() + +if paysheet.getGrossSalary() == None: + return context.REQUEST.RESPONSE.redirect(context.absolute_url() + '?portal_status_message=Gross+salary+is+required') + +if employee in ('', None): + return context.REQUEST.RESPONSE.redirect(context.absolute_url() + '?portal_status_message=The+employee+is+required') + +if employer in ('', None): + return context.REQUEST.RESPONSE.redirect(context.absolute_url() + '?portal_status_message=The+employer+is+required') + +employee_obj = paysheet.getDestinationSectionValue() +employer_obj = paysheet.getSourceSectionValue() + +if employee_obj.getCareerGrade() in ('', None): + return context.REQUEST.RESPONSE.redirect(context.absolute_url() + '?portal_status_message=The+employee+must+have+a+career+grade') + +if employer_obj.getCreationDate() in ('', None): + return context.REQUEST.RESPONSE.redirect(context.absolute_url() + '?portal_status_message=The+employer+must+have+an+organisation+creation+date') + +if employer_obj.getDefaultAddress().getZipCode() in ('', None): + return context.REQUEST.RESPONSE.redirect(context.absolute_url() + '?portal_status_message=The+employer+must+have+a+zip+code') + +# parameters are OK, go to the pre-calculation form +return context.REQUEST.RESPONSE.redirect(context.absolute_url() + "/PaySheetTransaction_previewForm?selection_name=default&dialog_category=object_action&form_id=PaySheetTransaction_view") diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_getDetails.py b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_getDetails.py new file mode 100755 index 0000000000..4ba813d07c --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_getDetails.py @@ -0,0 +1,139 @@ +## Script (Python) "PaySheetTransaction_getDetails" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +# this dict contain all paysheet details +paysheet_details = {} + +# initialize the employee and employer share total +total_employee_share = 0.0 +total_employer_share = 0.0 +total_taxable_employee_share = 0.0 + +# get the gross salary +gross_salary = context.getGrossSalary() +if gross_salary == None: + gross_salary = 0.0 + +paysheet_cat = {} +object_list = [] +for object in context.objectValues(): + object_list += [object] +# Sort the list by id since lines are already ordered by id. +object_list.sort(lambda x, y: cmp(int(x.getId()), int(y.getId()))) +for pay_sheet_line in object_list: + variation_list = pay_sheet_line.getVariationCategoryList() + range_variation = [] + for variation in variation_list: + if variation.find('salary_range')==0: + if not variation in range_variation: # Extra checking because + # get VariationCategoryList returns + # the same 1 items 2 times + range_variation += [variation] + for range in range_variation: + pay_sheet_dict = {} + #pay_sheet_dict['range']=range[range.rfind('/')+1:] + pay_sheet_dict['id'] = pay_sheet_line.getId() + pay_sheet_dict['title'] = pay_sheet_line.getResourceTitle() + for cell in pay_sheet_line.objectValues(): + predicate_list = cell.getPredicateValueList() + if range in predicate_list: + pay_sheet_dict['base_name'] = context.portal_categories.resolveCategory(range).getTitleOrId() + for predicate in predicate_list: + if cell.getTotalPrice() != 0: + if predicate.find('employee_share')>=0: + pay_sheet_dict['base']= - cell.getQuantity() + pay_sheet_dict['employee_share'] = cell.getTotalPrice() + pay_sheet_dict['employee_share_rate'] = cell.getPrice() * 100 + total_employee_share += float(-pay_sheet_dict['employee_share']) + # here we decide if a resource is taxable or not + if str(pay_sheet_line.getResource())[-14:] == 'non_deductible' or str(pay_sheet_line.getResource())[-4:] == 'crds' or str(pay_sheet_line.getResource())[-7:] == 'taxable': + pay_sheet_dict['taxable']='yes' + elif str(pay_sheet_line.getResource())[-10:] == 'deductible': + pay_sheet_dict['taxable']='no' + else: + pay_sheet_dict['taxable']='no' + if pay_sheet_dict['taxable'] == 'yes': + total_taxable_employee_share += float(-pay_sheet_dict['employee_share']) + elif predicate.find('employer_share')>=0: + pay_sheet_dict['base'] = - cell.getQuantity() + pay_sheet_dict['employer_share'] = cell.getTotalPrice() + pay_sheet_dict['employer_share_rate'] = cell.getPrice() * 100 + total_employer_share += float(-pay_sheet_dict['employer_share']) + for key in ('employee_share','employee_share_rate','employer_share','employer_share_rate'): + if not (pay_sheet_dict.has_key(key)): + pay_sheet_dict[key]='' # so that we can display nothing + + # find the category of the current pay sheet line + cat_id = None + cat_path = None + for var in variation_list: + sub_cat = var.split('/') + if sub_cat[0] == 'tax_category': + cat_id = sub_cat[1] + cat_path = sub_cat[0] + '/' + sub_cat[1] + break + if cat_id == None: + cat_id = 'no_cat' + # add the current pay sheet line to its category + if not paysheet_cat.has_key(cat_id): + paysheet_cat[cat_id] = {} + paysheet_cat[cat_id]['lines'] = [] + if cat_path != None: + paysheet_cat[cat_id]['title'] = context.portal_categories.resolveCategory(cat_path).getTitleOrId() + paysheet_cat[cat_id]['lines'].append(pay_sheet_dict) + +# get all paysheet transaction to calculate the sum of different value in a year +accounting_folder = context.aq_parent +paysheet_transactions = accounting_folder.contentValues(filter={'portal_type':'Pay Sheet Transaction'}) + +# initialize every yearly variable +yearly_net_salary = 0.0 +yearly_gross_salary = 0.0 +yearly_employee_share = 0.0 +yearly_employer_share = 0.0 +yearly_taxable_net_salary = 0.0 + +# get the current paysheet start date and employee +start_date = context.getStartDate() +employee = context.restrictedTraverse(context.getDestinationSectionRelativeUrl()) + +# browse through paysheet transaction +for paysheet_obj in paysheet_transactions: + # ignore the current paysheet to avoid infinite loop + if paysheet_obj.getId() != context.getId(): + # the paysheet must have the same employee + if (employee==None) or (employee!=None and context.restrictedTraverse(paysheet_obj.getDestinationSectionRelativeUrl())==employee): + # check the date + if (start_date==None) or (start_date!=None and paysheet_obj.getStartDate()!=None and start_date.year()==paysheet_obj.getStartDate().year() and paysheet_obj.getStartDate()<= start_date): + # get all detailed values of the paysheet + ps_details = paysheet_obj.PaySheetTransaction_getDetails() + # sum of yearly values + yearly_net_salary += float(ps_details['net_salary']) + yearly_gross_salary += float(ps_details['gross_salary']) + yearly_employee_share += float(ps_details['total_employee_share']) + yearly_employer_share += float(ps_details['total_employer_share']) + yearly_taxable_net_salary += float(ps_details['taxable_net_salary']) + +# save the total share values in the exported dict +paysheet_details['net_salary'] = gross_salary - total_employee_share +paysheet_details['gross_salary'] = gross_salary +paysheet_details['paysheet_categories'] = paysheet_cat +paysheet_details['total_employee_share'] = total_employee_share +paysheet_details['taxable_net_salary'] = paysheet_details['net_salary'] + total_taxable_employee_share +paysheet_details['total_employer_share'] = total_employer_share +paysheet_details['total_taxable_employee_share'] = total_taxable_employee_share + +# don't forget to add the current values to the yearly sum +paysheet_details['yearly_net_salary'] = yearly_net_salary + paysheet_details['net_salary'] +paysheet_details['yearly_gross_salary'] = yearly_gross_salary + paysheet_details['gross_salary'] +paysheet_details['yearly_employee_share'] = yearly_employee_share + paysheet_details['total_employee_share'] +paysheet_details['yearly_employer_share'] = yearly_employer_share + paysheet_details['total_employer_share'] +paysheet_details['yearly_taxable_net_salary'] = yearly_taxable_net_salary + paysheet_details['taxable_net_salary'] + +return paysheet_details diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_getDetails_BACKUP.py b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_getDetails_BACKUP.py new file mode 100755 index 0000000000..19678da97e --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_getDetails_BACKUP.py @@ -0,0 +1,118 @@ +## Script (Python) "PaySheetTransaction_getDetails_BACKUP" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +# this dict contain all paysheet details +paysheet_details = {} + +# initialize the salary and employer share total +total_salary_share = 0.0 +total_employer_share = 0.0 +total_taxable_salary_share = 0.0 + +# get the gross salary +gross_salary = context.getGrossSalary() + +pay_sheet_lines=tuple() +object_list = [] +for object in context.objectValues(): + object_list += [object] +# Sort the list by id since lines are already ordered by id. +object_list.sort(lambda x, y: cmp(int(x.getId()), int(y.getId()))) +for pay_sheet_line in object_list: + variation_list = pay_sheet_line.getVariationCategoryList() + range_variation = [] + for variation in variation_list: + if variation.find('salary_range')==0: + if not variation in range_variation: # Extra checking because + # get VariationCategoryList returns + # the same 1 items 2 times + range_variation += [variation] + for range in range_variation: + pay_sheet_dict = {} + #pay_sheet_dict['range']=range[range.rfind('/')+1:] + pay_sheet_dict['id'] = pay_sheet_line.getId() + pay_sheet_dict['title'] = pay_sheet_line.getResourceTitle() + for cell in pay_sheet_line.objectValues(): + predicate_list = cell.getPredicateValueList() + if range in predicate_list: + for predicate in predicate_list: + if cell.getTotalPrice() != 0: + if predicate.find('salary_share')>=0: + pay_sheet_dict['base']= - cell.getQuantity() + pay_sheet_dict['salary_share'] = cell.getTotalPrice() + pay_sheet_dict['salary_share_rate'] = cell.getPrice() * 100 + total_salary_share += float(-pay_sheet_dict['salary_share']) + # here we decide if a resource is taxable or not + if str(pay_sheet_line.getResource())[-14:] == 'non_deductible' or str(pay_sheet_line.getResource())[-4:] == 'crds' or str(pay_sheet_line.getResource())[-7:] == 'taxable': + pay_sheet_dict['taxable']='yes' + elif str(pay_sheet_line.getResource())[-10:] == 'deductible': + pay_sheet_dict['taxable']='no' + else: + pay_sheet_dict['taxable']='no' + if pay_sheet_dict['taxable'] == 'yes': + total_taxable_salary_share += float(-pay_sheet_dict['salary_share']) + elif predicate.find('employer_share')>=0: + pay_sheet_dict['base'] = - cell.getQuantity() + pay_sheet_dict['employer_share'] = cell.getTotalPrice() + pay_sheet_dict['employer_share_rate'] = cell.getPrice() * 100 + total_employer_share += float(-pay_sheet_dict['employer_share']) + for key in ('salary_share','salary_share_rate','employer_share','employer_share_rate'): + if not (pay_sheet_dict.has_key(key)): + pay_sheet_dict[key]='' # so that we can display nothing + pay_sheet_lines += (pay_sheet_dict,) + +# get all paysheet transaction to calculate the sum of different value in a year +accounting_folder = context.aq_parent +paysheet_transactions = accounting_folder.contentValues(filter={'portal_type':'Pay Sheet Transaction'}) + +# initialize every yearly variable +yearly_net_salary = 0.0 +yearly_gross_salary = 0.0 +yearly_salary_share = 0.0 +yearly_employer_share = 0.0 +yearly_taxable_net_salary = 0.0 + +# get the current paysheet start date and employee +start_date = context.getStartDate() +employee = context.restrictedTraverse(context.getDestinationSectionRelativeUrl()) + +# browse through paysheet transaction +for paysheet_obj in paysheet_transactions: + # ignore the current paysheet + if paysheet_obj.getId() != context.getId(): + # the paysheet must have the same employee + if (employee==None) or (employee!=None and context.restrictedTraverse(paysheet_obj.getDestinationSectionRelativeUrl())==employee): + # check the date + if (start_date==None) or (start_date!=None and paysheet_obj.getStartDate()!=None and start_date.year()==paysheet_obj.getStartDate().year() and paysheet_obj.getStartDate()<= start_date): + # get all detailed values of the paysheet + ps_details = paysheet_obj.PaySheetTransaction_getDetails() + # sum of yearly values + yearly_net_salary += float(ps_details['net_salary']) + yearly_gross_salary += float(ps_details['gross_salary']) + yearly_salary_share += float(ps_details['total_salary_share']) + yearly_employer_share += float(ps_details['total_employer_share']) + yearly_taxable_net_salary += float(ps_details['taxable_net_salary']) + +# save the total share values in the exported dict +paysheet_details['net_salary'] = gross_salary - total_salary_share +paysheet_details['gross_salary'] = gross_salary +paysheet_details['paysheet_lines'] = pay_sheet_lines +paysheet_details['total_salary_share'] = total_salary_share +paysheet_details['taxable_net_salary'] = paysheet_details['net_salary'] + total_taxable_salary_share +paysheet_details['total_employer_share'] = total_employer_share +paysheet_details['total_taxable_salary_share'] = total_taxable_salary_share + +# don't forget to add the current values to the yearly sum +paysheet_details['yearly_net_salary'] = yearly_net_salary + paysheet_details['net_salary'] +paysheet_details['yearly_gross_salary'] = yearly_gross_salary + paysheet_details['gross_salary'] +paysheet_details['yearly_salary_share'] = yearly_salary_share + paysheet_details['total_salary_share'] +paysheet_details['yearly_employer_share'] = yearly_employer_share + paysheet_details['total_employer_share'] +paysheet_details['yearly_taxable_net_salary'] = yearly_taxable_net_salary + paysheet_details['taxable_net_salary'] + +return paysheet_details diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_getFormattedLines_OLD.py b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_getFormattedLines_OLD.py new file mode 100755 index 0000000000..e8683d8bdf --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_getFormattedLines_OLD.py @@ -0,0 +1,57 @@ +## Script (Python) "PaySheetTransaction_getFormattedLines_OLD" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +# Example code: + +pay_sheet_lines=tuple() +object_list = [] +for object in context.objectValues(): + object_list += [object] +# Sort the list by id since lines are already ordered by id. +object_list.sort(lambda x, y: cmp(int(x.getId()), int(y.getId()))) +for pay_sheet_line in object_list: + variation_list = pay_sheet_line.getVariationCategoryList() + range_variation = [] + for variation in variation_list: + if variation.find('salary_range')==0: + if not variation in range_variation: # Extra checking because + # get VariationCategoryList returns + # the same 1 items 2 times + range_variation += [variation] + for range in range_variation: + pay_sheet_dict = {} + #pay_sheet_dict['range']=range[range.rfind('/')+1:] + pay_sheet_dict['id'] = pay_sheet_line.getId() + pay_sheet_dict['title'] = pay_sheet_line.getResourceTitle() + for cell in pay_sheet_line.objectValues(): + predicate_list = cell.getPredicateValueList() + if range in predicate_list: + for predicate in predicate_list: + if cell.getTotalPrice() != 0: + if predicate.find('salary_share')>=0: + pay_sheet_dict['range']= - cell.getQuantity() + pay_sheet_dict['salary_share']='%.2f' % cell.getTotalPrice() + pay_sheet_dict['salary_share_rate']='%.3f %%' % (cell.getPrice()*100) + if str(pay_sheet_line.getResource())[-14:] == 'non_deductible' or str(pay_sheet_line.getResource())[-4:] == 'crds' or str(pay_sheet_line.getResource())[-7:] == 'taxable': + pay_sheet_dict['taxable']='yes' + elif str(pay_sheet_line.getResource())[-10:] == 'deductible': + pay_sheet_dict['taxable']='no' + else: + pay_sheet_dict['taxable']='no' + elif predicate.find('employer_share')>=0: + pay_sheet_dict['range']= - cell.getQuantity() + pay_sheet_dict['employer_share']='%.2f' % cell.getTotalPrice() + pay_sheet_dict['employer_share_rate']='%.3f %%' % (cell.getPrice()*100) + for key in ('salary_share','salary_share_rate','employer_share','employer_share_rate'): + if not (pay_sheet_dict.has_key(key)): + pay_sheet_dict[key]='' # so that we can display nothing + pay_sheet_lines += (pay_sheet_dict,) + + +return pay_sheet_lines diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_getPreavis.py b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_getPreavis.py new file mode 100755 index 0000000000..741cf86e6b --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_getPreavis.py @@ -0,0 +1,48 @@ +## Script (Python) "PaySheetTransaction_getPreavis" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +# Définition des préavis selon le temps dans l'entreprise (en jours) +seuils = [ { 'limite':30 , 'preavis':'1 jour' }, # 1er mois d'essai + { 'limite':60 , 'preavis':'1 semaine' }, # 2e mois d'essai + { 'limite':730, 'preavis':'1 mois' }, # 2 premières années + { 'limite':0, 'preavis':'2 mois' } ] # Après les 2 premières années + + +paysheet = context.getObject() +employee_object = paysheet.getDestinationSectionValue() + + +# Récupération de l'entreprise actuelle +currentOrg = None +if hasattr(employee_object,"default_career"): + currentOrg = employee_object["default_career"].getSubordinationValue() + +if currentOrg == None: + return '???' + +# Calcul du temps total dans cette entreprise +totalTime = 0 +steps = employee_object.contentValues() +for step in steps: + if step.getPortalType() == "Career" and step.getId() != "default_career": + if step.getSubordinationValue() == currentOrg: + difference = step.getStopDate() - step.getStartDate() + if difference > 0: + totalTime = totalTime + difference + +totalTime = int( totalTime + (DateTime() - employee_object["default_career"].getStartDate()) ) + + +# Détermination du préavis +for i in range(len(seuils)): + if i < len(seuils)-1: + if seuils[i]['limite'] >= totalTime: + return seuils[i]['preavis'] + else: + return seuils[i]['preavis'] diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_initializePreview.py b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_initializePreview.py new file mode 100755 index 0000000000..8e9a2cfd6f --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_initializePreview.py @@ -0,0 +1,98 @@ +## Script (Python) "PaySheetTransaction_initializePreview" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=**kw +##title= +## +import random +from Products.ERP5Type.Document import newTempBase +from string import zfill + +global portal_object, num, l +portal_object = context.getPortalObject() +num = 0 +l = [] + +# get all pre-calculated rates and bases +default_values = context.PaySheetTransaction_preCalculation() + +# function to create a new preview line +def createPreviewLine ( new_id = None + , new_title = None + , new_base = None + , new_base_name = None + , new_employee_rate = None + , new_employer_rate = None + , new_service_url = None + , new_organisation_url = None + , new_salary_range_cat = None + , new_tax_cat = None + ): + global portal_object, num, l + num += 1 + int_len = 3 + o = newTempBase(portal_object, new_id) + o.setUid('new_%s' % zfill(num, int_len)) + o.edit(uid='new_%s' % zfill(num, int_len)) + o.edit ( id = new_id + , title = new_title + , base = new_base + , base_name = new_base_name + , employee_share_rate = new_employee_rate + , employer_share_rate = new_employer_rate + , service_url = new_service_url + , organisation_url = new_organisation_url + , salary_range_cat = new_salary_range_cat + , tax_cat = new_tax_cat + ) + l.append(o) + +# get all services related to pay sheet transaction +paysheet_services = [] +erp5site = context.portal_url.getPortalObject() +for service in erp5site['service'].objectValues(): + base_cat = service.getVariationRangeBaseCategoryList() + # a service is related to paysheet transaction if it has 'tax_category' et 'salary_range' as base category + if 'tax_category' in base_cat and 'salary_range' in base_cat: + paysheet_services.append(service) + +# Sort the service list by id +paysheet_services.sort(lambda x, y: cmp(x.getId(), y.getId())) + +# generate all lines for the preview form +for serv in paysheet_services: + cat_list = serv.getCategoryList() + # store all categories of the service into lists + tax_cat = [] + range_cat = [] + for cat in cat_list: + if str(cat).find('tax_category') != -1: + tax_cat.append(cat) + if str(cat).find('salary_range') != -1: + range_cat.append(cat) + # create a line for every salary_range of the service + for base in range_cat: + name = serv.getId() + '/' + context.portal_categories.resolveCategory(base).getId() + # a preview line is composed of a base calculation, an employee share rate and an employer share rate + if default_values.has_key(name): + new_base = default_values[name]['base'] + new_employee_rate = default_values[name]['employee_rate'] + new_employer_rate = default_values[name]['employer_rate'] + # create a preview line for every salary_range value of the service + createPreviewLine ( new_id = serv.getId() + , new_title = serv.getTitleOrId() + , new_base = new_base + , new_base_name = context.portal_categories.resolveCategory(base).getTitleOrId() + , new_employee_rate = new_employee_rate + , new_employer_rate = new_employer_rate + , new_service_url = serv.getRelativeUrl() + , new_organisation_url = serv.getSource() + , new_salary_range_cat = base + , new_tax_cat = tax_cat + ) + +# return the list of preview lines +return l diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_pdf_template.pt b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_pdf_template.pt new file mode 100755 index 0000000000..ca5123a05f --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_pdf_template.pt @@ -0,0 +1,163 @@ +<tal:block tal:define="employee python: here.getDestinationSectionValue(); + employer python: here.getSourceSectionValue(); + paysheet_details python: here.PaySheetTransaction_getDetails(); + paysheet_categories python: paysheet_details['paysheet_categories']; + urssaf python: employer.getDestinationSectionValue(); + start_date python: here.getStartDate()"> + + + + <template bottommargin='0.665cm' showboundary='0' topmargin='0.635cm' rightmargin='0.665cm' tal:define='portal python:here.portal_url.getPortalObject()' filename='paysheet.pdf' pagesize='A4' allowsplitting='1' landscape='0' leftmargin='0.635cm'> + + <stylesheet> + <tablestyle name="decompte"> + <stylecmd expr="('FONTSIZE', (0,0), (-1,-1), 7)"/> + <stylecmd expr="('OUTLINE', (0,0), (-1,-1), 0.7, (0.4,0.4,0.4))"/> + <stylecmd expr="('LINEAFTER', (0,0), (-1,-1), 0.1, (0.4,0.4,0.4))"/> + <stylecmd expr="('LEFTPADDING', (0,0), (-1,-1), 4)"/> + + <!-- Entête --> + <stylecmd expr="('TEXTCOLOR', (0,0), (-1,0), colors.white)"/> + <stylecmd expr="('FONT', (0,0), (-1,0), 'Helvetica-Bold', 7)"/> + <stylecmd expr="('BACKGROUND', (0,0), (-1,0), (0.4,0.4,0.4))"/> + <stylecmd expr="('LINEAFTER', (0,0), (-2,0), 0.1, colors.white)"/> + <stylecmd expr="('LEFTPADDING', (0,0), (-1,0), 0)"/> + <stylecmd expr="('RIGHTPADDING', (0,0), (-1,0), 0)"/> + <stylecmd expr="('ALIGNMENT', (0,0), (-1,0), 'CENTER')"/> + + <!-- Corps --> + <stylecmd expr="('TOPPADDING', (0,1), (-1,-1), 2)"/> + <stylecmd expr="('BOTTOMPADDING', (0,1), (-1,-1), 2)"/> + <stylecmd expr="('BACKGROUND', (0,1), (-1,-1), (0.95, 0.95, 0.95))"/> + <stylecmd expr="('TEXTCOLOR', (0,1), (-1,-1), colors.black)"/> + <stylecmd expr="('ALIGNMENT', (-5,1), (-1,-1), 'RIGHT')"/> + + <!-- Pied de tableau --> + <stylecmd expr="('BACKGROUND', (-1,1), (-1,-2), (0.85,0.85,0.85))"/> + <stylecmd expr="('BACKGROUND', (0,-1), (-2,-1), (0.85,0.85,0.85))"/> + <stylecmd expr="('BACKGROUND', (-1,-1), (-1,-1), (0.75,0.75,0.75))"/> + <stylecmd expr="('LINEABOVE', (0,-1), (-1,-1), 0.1, (0.4,0.4,0.4))"/> + </tablestyle> + + + + <tablestyle name="cumul_conges"> + <stylecmd expr="('FONTSIZE', (0,0), (-1,-1), 7)"/> + <stylecmd expr="('LEFTPADDING', (0,0), (-1,-1), 4)"/> + + <!-- Entête gauche --> + <stylecmd expr="('TEXTCOLOR', (0,0), (0,0), colors.white)"/> + <stylecmd expr="('FONT', (0,0), (0,0), 'Helvetica-Bold', 7)"/> + <stylecmd expr="('BACKGROUND', (0,0), (0,0), (0.4,0.4,0.4))"/> + <stylecmd expr="('TOPPADDING', (0,0), (0,0), 0)"/> + <stylecmd expr="('BOTTOMPADDING', (0,0), (0,0), 0)"/> + <stylecmd expr="('ALIGNMENT', (0,0), (0,0), 'CENTER')"/> + <stylecmd expr="('VALIGN', (0,0), (0,0), 'MIDDLE')"/> + + + <!-- <!- Première ligne de droite -> + <stylecmd expr="('LINEABOVE', (-1,0), (-1,0), 0.1, (0.4,0.4,0.4))"/> + <stylecmd expr="('LINEBEFORE', (-1,0), (-1,0), 0.1, (0.4,0.4,0.4))"/> + <stylecmd expr="('LINEAFTER', (-1,0), (-1,0), 0.1, (0.4,0.4,0.4))"/> + --> + + </tablestyle> + + <tablestyle name="cumul_conges_corps"> + <stylecmd expr="('FONTSIZE', (0,0), (-1,-1), 7)"/> + <stylecmd expr="('LEFTPADDING', (0,0), (-1,-1), 4)"/> + + <!--Tableau de gauche --> + <stylecmd expr="('GRID', (0,0), (4,1), 0.1, (0.4,0.4,0.4))"/> + <stylecmd expr="('ALIGNMENT', (0,0), (4,0), 'CENTER')"/> + <stylecmd expr="('ALIGNMENT', (0,1), (4,1), 'RIGHT')"/> + + <!-- Deuxième ligne de droite --> + <!-- <stylecmd expr="('LINEBELOW', (-1,0), (-1,0), 0.1, (0.4,0.4,0.4))"/> + <stylecmd expr="('LINEBEFORE', (-1,0), (-1,0), 0.1, (0.4,0.4,0.4))"/> + <stylecmd expr="('LINEAFTER', (-1,0), (-1,0), 0.1, (0.4,0.4,0.4))"/> + --> + <stylecmd expr="('OUTLINE', (-1,0), (-1,0), 0.1, (0.4,0.4,0.4))"/> + + </tablestyle> + + + </stylesheet> + + <pagetemplate startframe='content' id='FirstPage'> + <static> + + <!-- ATTENTION : L'image ne doit pas être en format png --> + <fixedimage filename='zodb:logo.jpg' y='27.275cm' x='1.016cm'/> + <infostring z='' color='(0.0,0.0,0.0)' align='center' y='27.5160804cm' x='14.208cm' font='Helvetica' size='20'>FEUILLE DE SALAIRE</infostring> + + <!-- Cadre employeur --> + <tal:block tal:condition="python: employer not in (None, '') and employer.getPortalType() == 'Organisation'"> + <tal:block tal:define="employer_group python: employer.getGroup()"> + <rectangle z='' height='5.239cm' width='7.038cm' stroke='(0.4,0.4,0.4)' y='21.074cm' x='1.016cm' linewidth='1'/> + <line y2='23.646cm' linewidth='1' z='' x2='8.042cm' stroke='(0.6,0.6,0.6)' y1='23.646cm' x1='1.016cm'/> + <line y2='21.741cm' linewidth='1' z='' x2='8.042cm' stroke='(0.6,0.6,0.6)' y1='21.741cm' x1='1.016cm'/> + + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='25.90483216cm' x='1.278cm' font='Helvetica-Bold' size='8' + tal:content="python: employer.getCorporateName()">Nexedi sarl</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='25.49483216cm' x='1.626cm' font='Helvetica' size='8' + tal:content="python: employer.getDefaultAddress().getStreetAddress()">943 Avenue de la République</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='25.21366432cm' x='1.626cm' font='Helvetica' size='8' + tal:content='python:employer.getDefaultAddress().getZipCode() + " " + employer.getDefaultAddress().getCity()'>59700 Marcq-en-Baroeul</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='24.70683216cm' x='1.27cm' font='Helvetica' size='8' + tal:content="python: 'Etablissement : %s' % employer_group" tal:condition="python: employer_group != None">Etablissement : nexedi</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='24.70683216cm' x='1.27cm' font='Helvetica' size='8' + tal:content="python: 'Etablissement : Etablissement principal'" tal:condition="python: employer_group == None">Etablissement : nexedi</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='24.42566432cm' x='1.27cm' font='Helvetica' size='8' + tal:content="python: 'Siret : %s' % employer.getGeographicIncorporateCode()">Siret : 440047504 00012</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='24.14449648cm' x='1.27cm' font='Helvetica' size='8' + tal:content="python: 'NAF (ex APE) : %s' % employer.getActivityCode()">NAF (ex APE) : 722Z</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='23.23783216cm' x='1.27cm' font='Helvetica' size='8' + tal:content="python: 'N°URSSAF : %s' % employer.getSocialCode()">N°URSSAF : 592 190071289 1013</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='22.95666432cm' x='1.27cm' font='Helvetica' size='8' + tal:content="python:urssaf.getTitle()">URSSAF de Roubaix-Tourcoing</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='22.37383216cm' x='1.626cm' font='Helvetica' size='8' + tal:content="python:urssaf.getDefaultAddress().getStreetAddress()">28, avenue de la Marne</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='22.09266432cm' x='1.626cm' font='Helvetica' size='8' + tal:content="python:urssaf.getDefaultAddress().getZipCode() + ' ' + urssaf.getDefaultAddress().getCity()">59208 Tourcoing</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='21.33283216cm' x='1.27cm' font='Helvetica' size='8' + tal:content="python: 'Convention collective de branche : %s' % employee.getDefaultCollectiveAgreementTitle()">Convention collective de branche : SYNTEC</infostring> + </tal:block> + </tal:block> + + + <!-- Cadre employé --> + <tal:block tal:condition="python: employee not in (None, '') and employee.getPortalType() == 'Person'"> + <rectangle z='' height='5.239cm' width='7.038cm' stroke='(0.4,0.4,0.4)' y='21.074cm' x='12.065cm' linewidth='1'/> + <line y2='23.994cm' linewidth='1' z='' x2='19.099cm' stroke='(0.6,0.6,0.6)' y1='23.994cm' x1='12.073cm'/> + <line y2='22.165cm' linewidth='1' z='' x2='19.099cm' stroke='(0.6,0.6,0.6)' y1='22.165cm' x1='12.073cm'/> + + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='25.91383216cm' x='12.327cm' font='Helvetica-Bold' size='8' + tal:content="python: employee.getTitle()">Sébastien Robin</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='25.50383216cm' x='12.675cm' font='Helvetica' size='8' + tal:content="python:employee.getDefaultAddress().getStreetAddress()">11, rue des chaudrons</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='25.22266432cm' x='12.675cm' font='Helvetica' size='8' + tal:content="python:employee.getDefaultAddress().getZipCode() + ' ' + employee.getDefaultAddress().getCity()">59300 Valenciennes</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='24.29683216cm' x='12.327cm' font='Helvetica' size='8' + tal:content="python: 'N°Secu.Soc. : %s' % employee.getSocialCode()">N°Secu.Soc. : 1 80 04 85 047 027 25</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='23.58583216cm' x='12.327cm' font='Helvetica' size='8' + tal:content="python: 'Emploi : %s' % employee.getDefaultCareerTitle()">Emploi : Directeur Technique</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='23.30466432cm' x='12.327cm' font='Helvetica' size='8' + tal:content="python: 'Qualification : %s' % employee.getCareerGrade().split('/')[-1:][0]">Qualification : ingenieur</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='23.02349648cm' x='12.327cm' font='Helvetica' size='8' + tal:content="python: 'Echelon : %s' % employee.getDefaultCareerSalaryLevel()">Echelon : 1</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='22.74232864cm' x='12.327cm' font='Helvetica' size='8' + tal:content="python: 'Coefficient : %s' % employee.getDefaultCareerSalaryCoefficient()">Coefficient : 1</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='21.75683216cm' x='12.327cm' font='Helvetica' size='8' + tal:content="python: 'Période : du %s au %s' % (start_date, here.getStopDate())">Période : du 2003/11/01 au 2003/11/30</infostring> + <infostring z='' color='(0.0,0.0,0.0)' align='left' y='21.47566432cm' x='12.327cm' font='Helvetica' size='8' + tal:content="python: 'Date de paiement : %s' % here.getTargetStopDate()">Date de paiement : 2003/11/04</infostring> + </tal:block> + + <line y2='1.506cm' linewidth='1' z='' x2='19.075cm' stroke='(0.6,0.6,0.6)' y1='1.506cm' x1='1.905cm'/> + <infostring z='' color='(0.0,0.0,0.0)' align='center' y='1.00183216cm' x='10.4855cm' font='Helvetica' size='8'>Dans votre intérêt et pour vous aider à faire valoir vos droits, conservez ce bulletin de paie sans limitation de durée.</infostring> + </static> + <frame showBoundary='0' leftpadding='0.1cm' height='18.74cm' width='19.701cm' rightpadding='0.1cm' y='1.689cm' x='0.635cm' nextid='content' toppadding='0.2cm' id='content' bottompadding='0.5cm'/> + </pagetemplate> + </template> +</tal:block> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_postCalculation.py b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_postCalculation.py new file mode 100755 index 0000000000..e89a8a5749 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_postCalculation.py @@ -0,0 +1,156 @@ +## Script (Python) "PaySheetTransaction_postCalculation" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=listbox=[],**kw +##title= +## +True = 1 +False = 0 + +global paysheet +paysheet = context.getObject() +paysheet_type = paysheet.getPortalType() + +paysheet_line_type = 'Pay Sheet Line' +paysheet_cell_type = 'Pay Sheet Cell' + +employee = paysheet.getDestinationSection() +employee_object = paysheet.getDestinationSectionValue() +employer = paysheet.getSourceSection() +employer_object = paysheet.getSourceSectionValue() + + + +# delete all objects in the paysheet +id_list = [] +for paysheet_item in paysheet.objectValues(): + id_list.append(paysheet_item.getId()) +paysheet.manage_delObjects(id_list) + + + +# this function register all paysheet informations in paysheet lines and cells +def createPaySheetItem(title='', res='', dest_org='', cells=[]): + global paysheet + # select good cells only + good_cells = [] + for cell in cells: + if cell["base"] not in ('', 0, None) and cell["rate"] not in ('', 0, None): + good_cells.append(cell) + if len(good_cells) == 0: + return + # get all variation categories used in cells + var_cat_list = [] + for cell in good_cells: + var_cat_list.append(cell["x"]) + var_cat_list.append(cell["y"]) + # add a new Pay Sheet Line + payline = paysheet.newContent( portal_type = 'Pay Sheet Line' + , title = title + , resource = res + , destination_section = dest_org + , destination = dest_org + , variation_base_category_list = ('tax_category', 'salary_range') + , variation_category_list = var_cat_list + ) + # fill each cell with values + for cell in good_cells: + paycell = payline.getCell(cell["x"], cell["y"], base_id = 'movement') + paycell.edit(quantity=-cell["base"], price=cell["rate"]/100.0) + + + +# set the title of the paysheet if empty +months = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'] +if paysheet.getTitle() in ('', None): + new_title = 'Salaire ' + str(employee_object.getTitle()) + if paysheet.getStartDate() not in ('', None): + new_title = ' ' + months[int(str(paysheet.getStartDate())[5:7])-1] + ' ' + str(paysheet.getStartDate())[0:4] + paysheet.setTitle(new_title) + + + +# get the ordered list of standard preview line objects +std_lines = context.PaySheetTransaction_initializePreview() + +# this list contain all paysheet items, indexed by service +paysheet_items = {} + +# scan every standard preview line to create an item for each service +for std_line in std_lines: + # get the service url (unique because containing the id) + service = std_line.getProperty('service_url') + # verify that the service is not existing + if not paysheet_items.has_key(service): + # create a temporary service item + temp_item = {} + # fill the new item with needed data + temp_item['title'] = std_line.getProperty('title') + temp_item['res'] = std_line.getProperty('service_url') + temp_item['dest_org'] = std_line.getProperty('organisation_url') + temp_item['cells'] = [] + # add the new service item to the list + paysheet_items[service] = temp_item + +# initialise the user preview line index +user_line_index = 0 + +# scan every standard preview line and get the correspondant user preview line to put user parameters in appropriate cells +for std_line in std_lines: + # define some values related to current standard preview line + service = std_line.getProperty('service_url') + salary_range_cat = std_line.getProperty('salary_range_cat') + tax_cat = std_line.getProperty('tax_cat') + # increment the user line index: we can use this strategy because preview lines (user or standard ones) are sorted + user_line_index += 1 + # get user paysheet parameters stored in user preview line (=listbox) + for user_line in listbox: + # search the user preview line corresponding to the standard preview line + if user_line.has_key('listbox_key') and int(user_line['listbox_key'])==user_line_index: + # got it ! we have the right line + # get the base salary + base = user_line['base'] + # scan allowed tax categories to get employee and/or employer share rate + for cat in tax_cat: + # define an empty new cell + new_cell = None + mployee_r = user_line['employee_share_rate'] + mployer_r = user_line['employer_share_rate'] + if str(cat).find('employer_share') != -1 and mployer_r not in (None, ''): + new_cell = { "x" : cat + , "y" : salary_range_cat + , "base" : base + , "rate" : mployer_r + } + if str(cat).find('employee_share') != -1 and mployee_r not in (None, ''): + new_cell = { "x" : cat + , "y" : salary_range_cat + , "base" : base + , "rate" : mployee_r + } + # add the cell to the conresponding paysheet item + if new_cell != None: + paysheet_items[service]['cells'].append(new_cell) + +# create a paysheet item for each service with user data in it +for item in paysheet_items: + if paysheet_items[item]['cells'] not in ([], None, ''): + #print item + createPaySheetItem ( title = paysheet_items[item]['title'] + , res = paysheet_items[item]['res'] + , dest_org = paysheet_items[item]['dest_org'] + , cells = paysheet_items[item]['cells'] + ) + + +# calculation of all paysheet transaction lines +#get_transaction().commit() +#context.PaySheetTransactionLine_generate() + +context.immediateReindexObject() + +# return to pay sheet +return context.REQUEST.RESPONSE.redirect(context.absolute_url() + '?portal_status_message=Pay+sheet+calculation+done.') diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_preCalculation.py b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_preCalculation.py new file mode 100755 index 0000000000..68e46c2774 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_preCalculation.py @@ -0,0 +1,356 @@ +## Script (Python) "PaySheetTransaction_preCalculation" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=ags_rate=None, industrial_accident_rate=None, transport_payment_rate=None, syntec_rate=None +##title= +## +True = 1 +False = 0 + +global paysheet +paysheet = context.getObject() +paysheet_type = paysheet.getPortalType() + +employee = paysheet.getDestinationSection() +employee_object = paysheet.getDestinationSectionValue() +employer = paysheet.getSourceSection() +employer_object = paysheet.getSourceSectionValue() + + +gross_salary = abs(paysheet.getGrossSalary()) + +# check if the employee is executive or not +if employee_object.getCareerGrade().split('/')[-1:][0] in ('engineer'): + executive = True +else: + executive = False + +company_birth = employer_object.getCreationDate() + +employer_region = employer_object.getDefaultAddress().getZipCode()[:2] + +# get the number of person which are employed by the company , +# sub_list = employer_object.getSubordinationRelatedValueList() +# company_size = 0 +# for person in sub_list: +# if person.getPortalType() == 'Person': # add condition: if current role == internal and defaultCareerEnd and defaultCareerStart fit in the current year +# #print repr(person) + repr(person.getTitle()) +# company_size += 1 +# +# print repr(company_size) +# +# return printed + +company_size = 3 + + +# limited salary = salaire plafonné +if gross_salary < 2432: #!!! depending of the wage periodicity, 2432 euros is for a month + limited_salary = gross_salary +else: + limited_salary = 2432 + +# "Char" slice type +slice_a_value = 2432 +slice_b_value = 9728 +slice_c_value = 19456 +char_slices = {} +if gross_salary < slice_a_value: + char_slices['A'] = gross_salary +else: + char_slices['A'] = slice_a_value + if gross_salary < slice_b_value: + char_slices['B'] = float(gross_salary) - float(slice_a_value) + else: + char_slices['B'] = slice_b_value + if gross_salary < slice_c_value: + char_slices['C'] = float(gross_salary) - float(slice_b_value) + else: + char_slices['C'] = slice_c_value + +# "Number" slice type +slice_1_value = 2432 +slice_2_value = 7296 +num_slices = {} +if gross_salary < slice_1_value: + char_slices['1'] = gross_salary +else: + char_slices['1'] = slice_1_value + if gross_salary < slice_2_value: + char_slices['2'] = gross_salary - slice_1_value + else: + char_slices['2'] = slice_2_value + +# age-slice of the company +old_limit = DateTime(1997, 1, 1) +if company_birth < old_limit: + comp_type = 'old' +else: + comp_type = 'new' + + +################# +# This script will fill the PaySheetTransaction_preview with default values for base salary calculation, employer and employee share +################# + +default = {} +# initialize all variables to None +paysheet_services = [] +erp5site = context.portal_url.getPortalObject() +for service in erp5site['service'].objectValues(): + base_cat = service.getVariationRangeBaseCategoryList() + if 'tax_category' in base_cat and 'salary_range' in base_cat: + paysheet_services.append(service) +for serv in paysheet_services: + cat_list = serv.getCategoryList() + tax_cat = [] + range_cat = [] + for cat in cat_list: + if str(cat).find('tax_category') != -1: + tax_cat.append(cat) + if str(cat).find('salary_range') != -1: + range_cat.append(cat) + for base in range_cat: + new_name = serv.getId() + '/' + context.portal_categories.resolveCategory(base).getId() + default[new_name] = {'employer_rate':None,'employee_rate':None,'base':None} + +# sickness insurance +if employer_region in ('57', '67', '68'): + er = 1.70 +else: + er = 0.75 +default['sickness_insurance/salaire_brut'] = \ +{ 'employer_rate' : 12.80 +, 'employee_rate' : er +, 'base' : gross_salary +} + +# old-age insurance +default['oldage_insurance/salaire_brut'] = \ +{ 'employer_rate' : 1.60 +, 'employee_rate' : None +, 'base' : gross_salary +} +default['oldage_insurance/salaire_plafonne'] = \ +{ 'employer_rate' : 8.20 +, 'employee_rate' : 6.55 +, 'base': limited_salary +} + +# widowhood insurance +default['widowhood_insurance/salaire_brut'] = \ +{ 'employer_rate' : None +, 'employee_rate' : 0.10 +, 'base' : gross_salary +} + +# family benefits +default['family_benefits/salaire_brut'] = \ +{ 'employer_rate' : 5.40 +, 'employee_rate' : None +, 'base' : gross_salary +} + +# industrial accident +# industrial_accident_rate is a parameter of this script, because rate depending of company size, department & trade (1.10 is for Nexedi, 1.0 is the default value) +if industrial_accident_rate in ('', 0, None): + industrial_accident_rate = 1.0 +default['industrial_accident/salaire_brut'] = \ +{ 'employer_rate' : industrial_accident_rate +, 'employee_rate' : None +, 'base' : gross_salary +} + +# lodging helps +if company_size > 9: + default['lodging_helps/salaire_brut'] = \ + { 'employer_rate' : 0.40 + , 'employee_rate' : None + , 'base' : gross_salary + } +else: + default['lodging_helps/salaire_plafonne'] = \ + { 'employer_rate' : 0.10 + , 'employee_rate' : None + , 'base': limited_salary + } + +# transport payment +# TODO: rate depending of the town, 1.80 is the 'default' value (when the town isn't referenced by laws) +if transport_payment_rate in ('', 0, None): + transport_payment_rate = 1.80 +if company_size > 9: + default['transport_payment/salaire_brut'] = \ + { 'employer_rate' : transport_payment_rate + , 'employee_rate' : None + , 'base' : gross_salary + } + +# CSG +default['csg_deductible/salaire_brut_csg'] = \ +{ 'employer_rate' :None +, 'employee_rate' :5.10 +, 'base' : 0.95 * gross_salary +} +default['csg_non_deductible/salaire_brut_csg'] = \ +{ 'employer_rate' :None, + 'employee_rate' : 2.4 +, 'base' : 0.95 * gross_salary +} + +# CRDS +default['crds/salaire_brut_crds'] = \ +{ 'employer_rate':None, +'employee_rate' : 0.50 +, 'base' : 0.95 * gross_salary +} + +# unemployment insurance +if char_slices.has_key('A'): + default['unemployment_insurance/tranche_a']['employer_rate'] = 4.0 + default['unemployment_insurance/tranche_a']['employee_rate'] = 2.4 + default['unemployment_insurance/tranche_a']['base'] = char_slices['A'] +if char_slices.has_key('B'): + default['unemployment_insurance/tranche_b']['employer_rate'] = 4.0 + default['unemployment_insurance/tranche_b']['employee_rate'] = 2.4 + default['unemployment_insurance/tranche_b']['base'] = char_slices['B'] + +# AGS +# ags_rate is a parameter of this script, 0.35% was the default value, now it's 0.45% +if ags_rate in ('', 0, None): + ags_rate = 0.45 +if char_slices.has_key('A'): + default['ags/tranche_a']['employer_rate'] = ags_rate + default['ags/tranche_a']['base'] = char_slices['A'] +if char_slices.has_key('B'): + default['ags/tranche_b']['employer_rate'] = ags_rate + default['ags/tranche_b']['base'] = char_slices['B'] + +# ARRCO +if executive == False: + if num_slices.has_key('1'): + default['arrco/tranche_1']['employer_rate'] = 4.5 + default['arrco/tranche_1']['employee_rate'] = 3.0 + default['arrco/tranche_1']['base'] = num_slices['1'] + if num_slices.has_key('2'): + if comp_type == 'old': + employee_share_rate = 6.0 + employer_share_rate = 9.0 + else: + employee_share_rate = 8.0 + employer_share_rate = 12.0 + default['arrco/tranche_2']['employer_rate'] = employer_share_rate + default['arrco/tranche_2']['employee_rate'] = employee_share_rate + default['arrco/tranche_2']['base'] = num_slices['2'] +elif char_slices.has_key('A'): + default['arrco/tranche_a']['employer_rate'] = 4.5 + default['arrco/tranche_a']['employee_rate'] = 3.0 + default['arrco/tranche_a']['base'] = char_slices['A'] + +# AGFF +if executive == True: + if char_slices.has_key('A'): + default['agff/tranche_a']['employer_rate'] = 1.20 + default['agff/tranche_a']['employee_rate'] = 0.80 + default['agff/tranche_a']['base'] = char_slices['A'] + if char_slices.has_key('B'): + default['agff/tranche_b']['employer_rate'] = 1.30 + default['agff/tranche_b']['employee_rate'] = 0.90 + default['agff/tranche_b']['base'] = char_slices['B'] +else: + if num_slices.has_key('1'): + default['agff/tranche_1']['employer_rate'] = 1.20 + default['agff/tranche_1']['employee_rate'] = 0.80 + default['agff/tranche_1']['base'] = num_slices['1'] + if num_slices.has_key('2'): + default['agff/tranche_2']['employer_rate'] = 1.30 + default['agff/tranche_2']['employee_rate'] = 0.90 + default['agff/tranche_2']['base'] = num_slices['2'] + +# AGIRC +# TODO: fix the repartition of share rate in case of slice C +if executive == True: + if char_slices.has_key('B'): + default['agirc/tranche_b']['employer_rate'] = 12.50 + default['agirc/tranche_b']['employee_rate'] = 7.50 + default['agirc/tranche_b']['base'] = char_slices['B'] + if char_slices.has_key('C'): + # free repartition (20% to share between employee & employer) + default['agirc/tranche_b']['employer_rate'] = 10.00 + default['agirc/tranche_b']['employee_rate'] = 10.00 + default['agirc/tranche_b']['base'] = char_slices['C'] + +# CET +if executive == True: + if char_slices.has_key('A'): + default['cet/tranche_a']['employer_rate'] = 0.22 + default['cet/tranche_a']['employee_rate'] = 0.13 + default['cet/tranche_a']['base'] = char_slices['A'] + if char_slices.has_key('B'): + default['cet/tranche_b']['employer_rate'] = 0.22 + default['cet/tranche_b']['employee_rate'] = 0.13 + default['cet/tranche_b']['base'] = char_slices['B'] + if char_slices.has_key('C'): + default['cet/tranche_c']['employer_rate'] = 0.22 + default['cet/tranche_c']['employee_rate'] = 0.13 + default['cet/tranche_c']['base'] = char_slices['C'] + +# life insurance +if executive == True and char_slices.has_key('A'): + default['life_insurance/tranche_a'] = \ + { 'employer_rate' : 1.5 + , 'employee_rate': None + , 'base' : char_slices['A'] + } + +# APEC +if char_slices.has_key('B'): + default['apec/tranche_b'] = \ + { 'employer_rate' : 0.036 + , 'employee_rate' : 0.024 + , 'base' : char_slices['B'] + } + +# construction tax +if company_size > 9: + default['construction_tax/salaire_brut'] = \ + { 'employer_rate' : 0.45 + , 'employee_rate': None + , 'base' : gross_salary + } + +# training tax +default['training_tax/salaire_brut'] = \ +{ 'employer_rate' : 0.50 +, 'employee_rate': None +, 'base' : gross_salary +} + +# courses tax +if company_size < 10: + rate = 0.15 +else: + rate = 1.5 +default['courses_tax/salaire_brut'] = \ +{ 'employer_rate' : rate +, 'employee_rate':None +, 'base' : gross_salary +} + +# Syntec convention +#syntec_rate = 0.915 +# XXX If it is the paysheet of yoshinory , we do *2 because he is married. +# if married(employee) : syntec_rate = syntec_rate * 2 +#syntec_rate = 1.83 +if syntec_rate in ('', 0, None): + syntec_rate = 0.915 +default['syntec_insurance/salaire_plafonne_syntec'] = \ +{ 'employer_rate' : syntec_rate +, 'employee_rate' : syntec_rate +, 'base' : 2432 +} + +return default diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_previewForm.form b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_previewForm.form new file mode 100755 index 0000000000..8abb86211e --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_previewForm.form @@ -0,0 +1,218 @@ +<?xml version="1.0"?> + +<form> + <title>Calculate the Pay Sheet Transaction</title> + <row_length>4</row_length> + <name>PaySheetTransaction_postCalculation</name> + <pt>form_view_dialog</pt> + <action>PaySheetTransaction_postCalculation</action> + <update_action></update_action> + <method>POST</method> + <enctype>multipart/form-data</enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[('title', 'Tax title'), ('base_name', 'Base name'), ('base', 'Base value'), ('employer_share_rate', 'Employer share rate'), ('employee_share_rate', 'Employee share rate')]</all_columns> + <all_editable_columns type="list">[('base', 'Base value'), ('employer_share_rate', 'Employer share rate'), ('employee_share_rate', 'Employee share rate')]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('title', 'Tax title'), ('base_name', 'Base name'), ('base', 'Base value'), ('employer_share_rate', 'Employer share rate'), ('employee_share_rate', 'Employee share rate')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('base', 'Base value'), ('employer_share_rate', 'Employer share rate'), ('employee_share_rate', 'Employee share rate')]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">100</lines> + <list_action>folder_contents</list_action> + <list_method type="method">PaySheetTransaction_initializePreview</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>pay_sheet_transaction_calcul_preview</selection_name> + <sort type="list">[('title', 'Tax title'), ('base_name', 'Base name')]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>listbox</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + <field><id>listbox_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>listbox_base</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">15</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Base value</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>listbox_employer_share_rate</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Employer share rate (%)</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>listbox_base_name</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Base name</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>listbox_employee_share_rate</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Employee share rate (%)</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_print.pt b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_print.pt new file mode 100755 index 0000000000..73cc35b516 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_print.pt @@ -0,0 +1,233 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> + +<html tal:define="employee python: here.restrictedTraverse(here.getDestinationSectionRelativeUrl()); + employer python: here.restrictedTraverse(here.getSourceSectionRelativeUrl()); + paysheet_details python: here.PaySheetTransaction_getDetails(); + paysheet_categories python: paysheet_details['paysheet_categories']; + urssaf python: here.restrictedTraverse(employer.getDestinationSection()); + start_date python: here.getStartDate()"> + <head> + <meta http-equiv="content-type" content="text/html;charset=ISO-8859-1"> + <title tal:content="python: here.getTitleOrId()"/> + <style type="text/css">@import "PaySheet.css";</style> + </head> + + <body> + + <div class="page"> + + <div class="logotitle"> + <table width="100%"> + <tr> + <td><img src="logo.png"></td> + <td><h1>FEUILLE DE SALAIRE</h1></td> + </tr> + </table> + </div> + + <div class="left" tal:condition="python: employer not in (None, '') and employer.getPortalType() == 'Organisation'"> + <div class="details" tal:define="employer_group python: employer.getGroup()"> + <p> + <span class="name" tal:content="python: employer.getCorporateName()"/><br/> + <span id="sub" tal:content="python: employer.getDefaultAddress().getStreetAddress()"/><br/> + <span id="sub" tal:content="python: employer.getDefaultAddress().getZipCode() + ' ' + employer.getDefaultAddress().getCity()"/><br/> + <span tal:replace="python: 'Etablissement : %s' % employer_group" tal:condition="python: employer_group != None"/><span tal:replace="python: 'Etablissement : Etablissement principal'" tal:condition="python: employer_group == None"/><br/> + <!--span tal:replace="python: 'Tel : %s' % employer.getDefaultTelephone().asText()"/><br/><!--optional--> + <!--span tal:replace="python: 'Fax : %s' % employer.getDefaultFax().asText()"/><br/><!--optional--> + <!--span tal:replace="python: 'E-mail : %s' % employer.getDefaultEmail().asText()"/><br/><!--optional--> + <span tal:replace="python: 'Siret : %s' % employer.getGeographicIncorporateCode()"/><br/> + <span tal:replace="python: 'NAF (ex APE) : %s' % employer.getActivityCode()"/><br/> + </p> + <div class="topline"> + <p> + <span tal:replace="python: 'N°URSSAF : %s' % employer.getSocialCode()"/><br/> + <span tal:replace="python:urssaf.getTitle()"/><br/> + <span id="sub" tal:content="python:urssaf.getDefaultAddress().getStreetAddress()"/><br/> + <span id="sub" tal:content="python:urssaf.getDefaultAddress().getZipCode() + ' ' + urssaf.getDefaultAddress().getCity()"/><br/> + </p> + </div> + <div class="topline"> + <p> + <span tal:replace="python: 'Convention collective de branche : %s' % employee.getDefaultCollectiveAgreementTitle()"/><br/> + </p> + </div> + </div> + </div> + + <div class="right" tal:condition="python: employee not in (None, '') and employee.getPortalType() == 'Person'"> + <div class="details"> + <p> + <span class="name" tal:content="python: employee.getTitle()"/><br/> + <span id="sub" tal:content="python:employee.getDefaultAddress().getStreetAddress()"/><br/> + <span id="sub" tal:content="python:employee.getDefaultAddress().getZipCode() + ' ' + employee.getDefaultAddress().getCity()"/><br/> + <!--span tal:replace="python: 'Tel : %s' % employee.getDefaultTelephone().asText()"/><br/><!--optional--> + <!--span tal:replace="python: 'Fax : %s' % employee.getDefaultFax().asText()"/><br/><!--optional--> + <!--span tal:replace="python: 'E-mail : %s' % employee.getDefaultEmail().asText()"/><br/><!--optional--> + <span tal:replace="python: 'N°Secu.Soc. : %s' % employee.getSocialCode()"/><br/> + </p> + <div class="topline"> + <p> + <!--span tal:replace="python: 'Matricule : %s' % employee.getId()"/><br/><!--optional--> + <span tal:replace="python: 'Emploi : %s' % employee.getDefaultCareerTitle()"/><br/> + <span tal:replace="python: 'Qualification : %s' % employee.getCareerGrade().split('/')[-1:][0]"/><br/> + <span tal:replace="python: 'Echelon : %s' % employee.getDefaultCareerSalaryLevel()"/><br/> + <span tal:replace="python: 'Coefficient : %s' % employee.getDefaultCareerSalaryCoefficient()"/><br/> + </p> + </div> + <div class="topline"> + <p> + <span tal:replace="python: 'Periode : du %s au %s' % (start_date, here.getStopDate())"/><br/> + <span tal:replace="python: 'Date de paiement : %s' % here.getTargetStopDate()"/><br/> + <!--span>Type de paiement: ???</span><br/><!--optional--> + </p> + </div> + </div> + </div> + + <div class="spacer"> </div> + + <br/> + <br/> + + <table width="100%" cellspacing="0" class="data"> + <tr class="header"> + <td class="text">Nature</td> + <td class="text">Assiette</td> + <td class="number">Montant</td> + <td class="number">Taux part patronale</td> + <td class="number">Part patronale</td> + <td class="number">Taux part salariale</td> + <td class="number">Part salariale</td> + </tr> + <tr class="subtotal"> + <td class="text">Salaire brut</td> + <td class="text"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"><tal:block replace="python: '%.2f' % paysheet_details['gross_salary']" condition="python: paysheet_details['gross_salary'] not in (None, '')"> </tal:block></td> + </tr> + <tal:block condition="python: paysheet_categories.has_key('no_cat')"> + <tal:block define="no_cat_lines python: paysheet_categories['no_cat']['lines']"> + <tr tal:repeat="line no_cat_lines"> + <td class="text" id="sub"><tal:block content="python: line['title']"/></td> + <td class="text"><tal:block content="python: line['base_name']"/></td> + <td class="number"><tal:block replace="python: '%.2f' % line['base']" condition="python: line['base'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.3f %%' % line['employer_share_rate']" condition="python: line['employer_share_rate'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.2f' % line['employer_share']" condition="python: line['employer_share'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.3f %%' % line['employee_share_rate']" condition="python: line['employee_share_rate'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.2f' % line['employee_share']" condition="python: line['employee_share'] not in (None, '')"> </tal:block></td> + </tr> + </tal:block> + </tal:block> + <tal:block repeat="category paysheet_categories"> + <tr class="category"> + <td class="text"><tal:block content="python: paysheet_categories[category]['title']"/></td> + <td class="text"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + </tr> + <tal:block define="paysheet_lines python: paysheet_categories[category]['lines']"> + <tr tal:repeat="line paysheet_lines"> + <td class="text" id="sub"><tal:block content="python: line['title']"/></td> + <td class="text"><tal:block content="python: line['base_name']"/></td> + <td class="number"><tal:block replace="python: '%.2f' % line['base']" condition="python: line['base'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.3f %%' % line['employer_share_rate']" condition="python: line['employer_share_rate'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.2f' % line['employer_share']" condition="python: line['employer_share'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.3f %%' % line['employee_share_rate']" condition="python: line['employee_share_rate'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.2f' % line['employee_share']" condition="python: line['employee_share'] not in (None, '')"> </tal:block></td> + </tr> + </tal:block> + </tal:block> + <tr class="subtotal"> + <td class="text">Total des cotisations</td> + <td class="text"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"><tal:block replace="python: '-%.2f' % paysheet_details['total_employer_share']" condition="python: paysheet_details['total_employer_share'] not in ('', None)"> </tal:block></td> + <td class="number"> </td> + <td class="number"><tal:block replace="python: '-%.2f' % paysheet_details['total_employee_share']" condition="python: paysheet_details['total_employee_share'] not in ('', None)"> </tal:block></td> + </tr> + <tr class="total"> + <td class="text">Salaire Net</td> + <td class="text"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"><tal:block replace="python: '%.2f' % paysheet_details['net_salary']" condition="python: paysheet_details['net_salary'] not in ('', None)"> </tal:block></td> + </tr> + <tal:block repeat="category paysheet_categories"> + <tal:block define="paysheet_lines python: paysheet_categories[category]['lines']"> + <tal:block repeat="line paysheet_lines"> + <tr tal:condition="python: line.has_key('taxable') and line['taxable']=='yes'"> + <td class="text"><tal:block content="python: line['title']"/></td> + <td class="text"><tal:block content="python: line['base_name']"/></td> + <td class="number"><tal:block replace="python: '%.2f' % line['base']" condition="python: line['base'] not in ('', None)"> </tal:block></td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"><tal:block replace="python: '%.3f %%' % line['employee_share_rate']" condition="python: line['employee_share_rate'] not in ('', None)"> </tal:block></td> + <td class="number"><tal:block replace="python: '+%.2f' % abs(float(line['employee_share']))" condition="python: line['employee_share'] not in ('', None)"> </tal:block></td> + </tr> + </tal:block> + </tal:block> + </tal:block> + <tr class="total"> + <td class="text">Salaire Net Imposable</td> + <td class="text"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"><tal:block replace="python: '%.2f' % paysheet_details['taxable_net_salary']" condition="python: paysheet_details['taxable_net_salary'] not in ('', None)"> </tal:block></td> + </tr> + </table> + + <br/> + <br/> + + <div class="left"> + <table cellspacing="0" class="yearly-sum"> + <caption tal:content="python: 'Cumuls annuels (%s)' % start_date.year()" tal:condition="python: start_date not in ('', None)"/> + <tr class="header"> + <td>Salaire brut</td> + <td>Cotisations salariales</td> + <td>Salaire net</td> + <td>Net imposable</td> + <td>Part patronale</td> + </tr> + <tr class="total"> + <td><tal:block replace="python: '%.2f' % paysheet_details['yearly_gross_salary']" condition="python: paysheet_details['yearly_gross_salary'] not in ('', None)"> </tal:block></td> + <td><tal:block replace="python: '%.2f' % paysheet_details['yearly_employee_share']" condition="python: paysheet_details['yearly_employee_share'] not in ('', None)"> </tal:block></td> + <td><tal:block replace="python: '%.2f' % paysheet_details['yearly_net_salary']" condition="python: paysheet_details['yearly_net_salary'] not in ('', None)"> </tal:block></td> + <td><tal:block replace="python: '%.2f' % paysheet_details['yearly_taxable_net_salary']" condition="python: paysheet_details['yearly_taxable_net_salary'] not in ('', None)"> </tal:block></td> + <td><tal:block replace="python: '%.2f' % paysheet_details['yearly_employer_share']" condition="python: paysheet_details['yearly_employer_share'] not in ('', None)"> </tal:block></td> + </tr> + </table> + </div> + + <div class="right"> + <div class="details"> + <p> + <span tal:replace="python: 'Durée des congés payés : ???'"/><br/> + <span tal:replace="python: 'Durée des délais de préavis : ???'"/><br/> + </p> + </div> + </div> + + <div class="spacer"> </div> + + <br/> + <br/> + + <div class="disclaimer"> + Dans votre intérêt et pour vous aider à faire valoir vos droits, conservez ce bulletin de paie sans limitation de durée. + </div> + + </div> + </body> +</html> diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_print_old.pt b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_print_old.pt new file mode 100755 index 0000000000..73cc35b516 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_print_old.pt @@ -0,0 +1,233 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> + +<html tal:define="employee python: here.restrictedTraverse(here.getDestinationSectionRelativeUrl()); + employer python: here.restrictedTraverse(here.getSourceSectionRelativeUrl()); + paysheet_details python: here.PaySheetTransaction_getDetails(); + paysheet_categories python: paysheet_details['paysheet_categories']; + urssaf python: here.restrictedTraverse(employer.getDestinationSection()); + start_date python: here.getStartDate()"> + <head> + <meta http-equiv="content-type" content="text/html;charset=ISO-8859-1"> + <title tal:content="python: here.getTitleOrId()"/> + <style type="text/css">@import "PaySheet.css";</style> + </head> + + <body> + + <div class="page"> + + <div class="logotitle"> + <table width="100%"> + <tr> + <td><img src="logo.png"></td> + <td><h1>FEUILLE DE SALAIRE</h1></td> + </tr> + </table> + </div> + + <div class="left" tal:condition="python: employer not in (None, '') and employer.getPortalType() == 'Organisation'"> + <div class="details" tal:define="employer_group python: employer.getGroup()"> + <p> + <span class="name" tal:content="python: employer.getCorporateName()"/><br/> + <span id="sub" tal:content="python: employer.getDefaultAddress().getStreetAddress()"/><br/> + <span id="sub" tal:content="python: employer.getDefaultAddress().getZipCode() + ' ' + employer.getDefaultAddress().getCity()"/><br/> + <span tal:replace="python: 'Etablissement : %s' % employer_group" tal:condition="python: employer_group != None"/><span tal:replace="python: 'Etablissement : Etablissement principal'" tal:condition="python: employer_group == None"/><br/> + <!--span tal:replace="python: 'Tel : %s' % employer.getDefaultTelephone().asText()"/><br/><!--optional--> + <!--span tal:replace="python: 'Fax : %s' % employer.getDefaultFax().asText()"/><br/><!--optional--> + <!--span tal:replace="python: 'E-mail : %s' % employer.getDefaultEmail().asText()"/><br/><!--optional--> + <span tal:replace="python: 'Siret : %s' % employer.getGeographicIncorporateCode()"/><br/> + <span tal:replace="python: 'NAF (ex APE) : %s' % employer.getActivityCode()"/><br/> + </p> + <div class="topline"> + <p> + <span tal:replace="python: 'N°URSSAF : %s' % employer.getSocialCode()"/><br/> + <span tal:replace="python:urssaf.getTitle()"/><br/> + <span id="sub" tal:content="python:urssaf.getDefaultAddress().getStreetAddress()"/><br/> + <span id="sub" tal:content="python:urssaf.getDefaultAddress().getZipCode() + ' ' + urssaf.getDefaultAddress().getCity()"/><br/> + </p> + </div> + <div class="topline"> + <p> + <span tal:replace="python: 'Convention collective de branche : %s' % employee.getDefaultCollectiveAgreementTitle()"/><br/> + </p> + </div> + </div> + </div> + + <div class="right" tal:condition="python: employee not in (None, '') and employee.getPortalType() == 'Person'"> + <div class="details"> + <p> + <span class="name" tal:content="python: employee.getTitle()"/><br/> + <span id="sub" tal:content="python:employee.getDefaultAddress().getStreetAddress()"/><br/> + <span id="sub" tal:content="python:employee.getDefaultAddress().getZipCode() + ' ' + employee.getDefaultAddress().getCity()"/><br/> + <!--span tal:replace="python: 'Tel : %s' % employee.getDefaultTelephone().asText()"/><br/><!--optional--> + <!--span tal:replace="python: 'Fax : %s' % employee.getDefaultFax().asText()"/><br/><!--optional--> + <!--span tal:replace="python: 'E-mail : %s' % employee.getDefaultEmail().asText()"/><br/><!--optional--> + <span tal:replace="python: 'N°Secu.Soc. : %s' % employee.getSocialCode()"/><br/> + </p> + <div class="topline"> + <p> + <!--span tal:replace="python: 'Matricule : %s' % employee.getId()"/><br/><!--optional--> + <span tal:replace="python: 'Emploi : %s' % employee.getDefaultCareerTitle()"/><br/> + <span tal:replace="python: 'Qualification : %s' % employee.getCareerGrade().split('/')[-1:][0]"/><br/> + <span tal:replace="python: 'Echelon : %s' % employee.getDefaultCareerSalaryLevel()"/><br/> + <span tal:replace="python: 'Coefficient : %s' % employee.getDefaultCareerSalaryCoefficient()"/><br/> + </p> + </div> + <div class="topline"> + <p> + <span tal:replace="python: 'Periode : du %s au %s' % (start_date, here.getStopDate())"/><br/> + <span tal:replace="python: 'Date de paiement : %s' % here.getTargetStopDate()"/><br/> + <!--span>Type de paiement: ???</span><br/><!--optional--> + </p> + </div> + </div> + </div> + + <div class="spacer"> </div> + + <br/> + <br/> + + <table width="100%" cellspacing="0" class="data"> + <tr class="header"> + <td class="text">Nature</td> + <td class="text">Assiette</td> + <td class="number">Montant</td> + <td class="number">Taux part patronale</td> + <td class="number">Part patronale</td> + <td class="number">Taux part salariale</td> + <td class="number">Part salariale</td> + </tr> + <tr class="subtotal"> + <td class="text">Salaire brut</td> + <td class="text"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"><tal:block replace="python: '%.2f' % paysheet_details['gross_salary']" condition="python: paysheet_details['gross_salary'] not in (None, '')"> </tal:block></td> + </tr> + <tal:block condition="python: paysheet_categories.has_key('no_cat')"> + <tal:block define="no_cat_lines python: paysheet_categories['no_cat']['lines']"> + <tr tal:repeat="line no_cat_lines"> + <td class="text" id="sub"><tal:block content="python: line['title']"/></td> + <td class="text"><tal:block content="python: line['base_name']"/></td> + <td class="number"><tal:block replace="python: '%.2f' % line['base']" condition="python: line['base'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.3f %%' % line['employer_share_rate']" condition="python: line['employer_share_rate'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.2f' % line['employer_share']" condition="python: line['employer_share'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.3f %%' % line['employee_share_rate']" condition="python: line['employee_share_rate'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.2f' % line['employee_share']" condition="python: line['employee_share'] not in (None, '')"> </tal:block></td> + </tr> + </tal:block> + </tal:block> + <tal:block repeat="category paysheet_categories"> + <tr class="category"> + <td class="text"><tal:block content="python: paysheet_categories[category]['title']"/></td> + <td class="text"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + </tr> + <tal:block define="paysheet_lines python: paysheet_categories[category]['lines']"> + <tr tal:repeat="line paysheet_lines"> + <td class="text" id="sub"><tal:block content="python: line['title']"/></td> + <td class="text"><tal:block content="python: line['base_name']"/></td> + <td class="number"><tal:block replace="python: '%.2f' % line['base']" condition="python: line['base'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.3f %%' % line['employer_share_rate']" condition="python: line['employer_share_rate'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.2f' % line['employer_share']" condition="python: line['employer_share'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.3f %%' % line['employee_share_rate']" condition="python: line['employee_share_rate'] not in (None, '')"> </tal:block></td> + <td class="number"><tal:block replace="python: '%.2f' % line['employee_share']" condition="python: line['employee_share'] not in (None, '')"> </tal:block></td> + </tr> + </tal:block> + </tal:block> + <tr class="subtotal"> + <td class="text">Total des cotisations</td> + <td class="text"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"><tal:block replace="python: '-%.2f' % paysheet_details['total_employer_share']" condition="python: paysheet_details['total_employer_share'] not in ('', None)"> </tal:block></td> + <td class="number"> </td> + <td class="number"><tal:block replace="python: '-%.2f' % paysheet_details['total_employee_share']" condition="python: paysheet_details['total_employee_share'] not in ('', None)"> </tal:block></td> + </tr> + <tr class="total"> + <td class="text">Salaire Net</td> + <td class="text"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"><tal:block replace="python: '%.2f' % paysheet_details['net_salary']" condition="python: paysheet_details['net_salary'] not in ('', None)"> </tal:block></td> + </tr> + <tal:block repeat="category paysheet_categories"> + <tal:block define="paysheet_lines python: paysheet_categories[category]['lines']"> + <tal:block repeat="line paysheet_lines"> + <tr tal:condition="python: line.has_key('taxable') and line['taxable']=='yes'"> + <td class="text"><tal:block content="python: line['title']"/></td> + <td class="text"><tal:block content="python: line['base_name']"/></td> + <td class="number"><tal:block replace="python: '%.2f' % line['base']" condition="python: line['base'] not in ('', None)"> </tal:block></td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"><tal:block replace="python: '%.3f %%' % line['employee_share_rate']" condition="python: line['employee_share_rate'] not in ('', None)"> </tal:block></td> + <td class="number"><tal:block replace="python: '+%.2f' % abs(float(line['employee_share']))" condition="python: line['employee_share'] not in ('', None)"> </tal:block></td> + </tr> + </tal:block> + </tal:block> + </tal:block> + <tr class="total"> + <td class="text">Salaire Net Imposable</td> + <td class="text"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"> </td> + <td class="number"><tal:block replace="python: '%.2f' % paysheet_details['taxable_net_salary']" condition="python: paysheet_details['taxable_net_salary'] not in ('', None)"> </tal:block></td> + </tr> + </table> + + <br/> + <br/> + + <div class="left"> + <table cellspacing="0" class="yearly-sum"> + <caption tal:content="python: 'Cumuls annuels (%s)' % start_date.year()" tal:condition="python: start_date not in ('', None)"/> + <tr class="header"> + <td>Salaire brut</td> + <td>Cotisations salariales</td> + <td>Salaire net</td> + <td>Net imposable</td> + <td>Part patronale</td> + </tr> + <tr class="total"> + <td><tal:block replace="python: '%.2f' % paysheet_details['yearly_gross_salary']" condition="python: paysheet_details['yearly_gross_salary'] not in ('', None)"> </tal:block></td> + <td><tal:block replace="python: '%.2f' % paysheet_details['yearly_employee_share']" condition="python: paysheet_details['yearly_employee_share'] not in ('', None)"> </tal:block></td> + <td><tal:block replace="python: '%.2f' % paysheet_details['yearly_net_salary']" condition="python: paysheet_details['yearly_net_salary'] not in ('', None)"> </tal:block></td> + <td><tal:block replace="python: '%.2f' % paysheet_details['yearly_taxable_net_salary']" condition="python: paysheet_details['yearly_taxable_net_salary'] not in ('', None)"> </tal:block></td> + <td><tal:block replace="python: '%.2f' % paysheet_details['yearly_employer_share']" condition="python: paysheet_details['yearly_employer_share'] not in ('', None)"> </tal:block></td> + </tr> + </table> + </div> + + <div class="right"> + <div class="details"> + <p> + <span tal:replace="python: 'Durée des congés payés : ???'"/><br/> + <span tal:replace="python: 'Durée des délais de préavis : ???'"/><br/> + </p> + </div> + </div> + + <div class="spacer"> </div> + + <br/> + <br/> + + <div class="disclaimer"> + Dans votre intérêt et pour vous aider à faire valoir vos droits, conservez ce bulletin de paie sans limitation de durée. + </div> + + </div> + </body> +</html> diff --git a/product/ERP5/skins/erp5_accounting/PaySheetTransaction_view.form b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_view.form new file mode 100755 index 0000000000..89651eb1b6 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheetTransaction_view.form @@ -0,0 +1,351 @@ +<?xml version="1.0"?> + +<form> + <title></title> + <row_length>4</row_length> + <name>pay_sheet_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>Default</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>ID</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_source_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <portal_type type="list">[('Organisation', 'Organisation')]</portal_type> + <read_only type="int">0</read_only> + <relation_setter_id></relation_setter_id> + <required type="int">0</required> + <title>Employer</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>person</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <portal_type type="list">[('Person', 'Person')]</portal_type> + <read_only type="int">0</read_only> + <relation_setter_id></relation_setter_id> + <required type="int">0</required> + <title>Employee</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_gross_salary</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Gross Salary (Euros)</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Begin</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">1</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>End</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_target_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">1</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Payment date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'ID'), ('getTitle', 'Tax title'), ('getSourceSectionTitle', 'Source'), ('getDestinationSectionTitle', 'Destination'), ('getQuantity', 'Amount (in euros)')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description>Details of contributions based on salary.</description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[]</editable_columns> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">200</lines> + <list_action>list</list_action> + <list_method type="method">searchFolder</list_method> + <meta_types type="list">[]</meta_types> + <not_viewable type="int">0</not_viewable> + <portal_types type="list">[]</portal_types> + <read_only type="int">0</read_only> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>paysheet_line_list_selection</selection_name> + <sort type="list">[]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Pay Sheet Details</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/PaySheet_getReportLines.py b/product/ERP5/skins/erp5_accounting/PaySheet_getReportLines.py new file mode 100755 index 0000000000..0369bdb14d --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheet_getReportLines.py @@ -0,0 +1,45 @@ +## Script (Python) "PaySheet_getReportLines" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +report_items = context.PaySheet_zGetDetailedTotal() + +report_lines = [] + +# scan every sql report item +for item in report_items: + line = { 'title' : None + , 'employer_totalbase' : None + , 'employer_rate' : None + , 'employer_total' : None + , 'employee_totalbase' : None + , 'employee_rate' : None + , 'employee_total' : None + , 'total' : None + } + # sort by employer/salary share + if item['variation_text'].find('employee_share') != -1: + line['title'] = item['parent_title'] + line['employee_totalbase'] = item['base'] + line['employee_rate'] = item['rate'] + line['employee_total'] = item['total_price'] + if item['variation_text'].find('employer_share') != -1: + line['title'] = item['parent_title'] + line['employer_totalbase'] = item['base'] + line['employer_rate'] = item['rate'] + line['employer_total'] = item['total_price'] + report_lines.append(line) + +# scan every line and group them + +#here.portal + +# first grouping: + + +return report_lines diff --git a/product/ERP5/skins/erp5_accounting/PaySheet_printAnnualReport.pt b/product/ERP5/skins/erp5_accounting/PaySheet_printAnnualReport.pt new file mode 100755 index 0000000000..ab670cdd1e --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheet_printAnnualReport.pt @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> + +<html tal:define="report_items python: here.PaySheet_getReportLines()"> + <head> + <meta http-equiv="content-type" content="text/html;charset=ISO-8859-1"> + <title>Pay Sheet Annual Report</title> + <style type="text/css">@import "PaySheet.css";</style> + </head> + + <body> + + <div class="spacer"> </div> + + <div class="logotitle"> + <table width="100%"> + <tr> + <td><img src="logo.png"></td> + <td><h1>Rapport Annuel: Charges à payer par caisses</h1></td> + </tr> + </table> + </div> + + <div class="spacer"> </div> + + <table> + <tr class="big-header"> + <th>Caisse</th> + <th>Base patronale</th> + <th>Taux patronal</th> + <th>Part patronale</th> + <th>Base salariale</th> + <th>Taux salarial</th> + <th>Part salariale</th> + <th>Total</th> + </tr> + <tr class="line" tal:repeat="item python: report_items"> + <td class="line-data"><span tal:content="python: item['title']"/></td> + <td class="line-data"><span tal:content="python: item['employer_totalbase']"/></td> + <td class="line-data"><span tal:content="python: item['employer_rate']"/></td> + <td class="line-data"><span tal:content="python: item['employer_total']"/></td> + <td class="line-data"><span tal:content="python: item['employee_totalbase']"/></td> + <td class="line-data"><span tal:content="python: item['employee_rate']"/></td> + <td class="line-data"><span tal:content="python: item['employee_total']"/></td> + <td class="line-data"><span tal:content="python: item['total']"/></td> + </tr> + </table> + + </body> +</html> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/PaySheet_totalDestinationList.form b/product/ERP5/skins/erp5_accounting/PaySheet_totalDestinationList.form new file mode 100755 index 0000000000..2381c19afb --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheet_totalDestinationList.form @@ -0,0 +1,80 @@ +<?xml version="1.0"?> + +<form> + <title>Account List</title> + <row_length>4</row_length> + <name>accounting_transaction_list</name> + <pt>form_list</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('target_start_date', 'target_start_date'), ('destination_title', 'destination_title'), ('variation_text', 'variation_text'), ('total_price', 'total_price')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">25</lines> + <list_action>list</list_action> + <list_method type="method">PaySheet_zGetTotalDestinationList</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">1</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>paysheet_total_selection</selection_name> + <sort type="list">[]</sort> + <stat_method></stat_method> + <title>Account Listbox</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/PaySheet_zGetDetailedTotal.zsql b/product/ERP5/skins/erp5_accounting/PaySheet_zGetDetailedTotal.zsql new file mode 100755 index 0000000000..e0822d5d1a --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheet_zGetDetailedTotal.zsql @@ -0,0 +1,29 @@ +<dtml-comment> +title: +connection_id:MySQL +max_rows:1000 +max_cache:100 +cache_time:0 +class_name: +class_file: +</dtml-comment> +<params>year</params> +SELECT + parent.title AS parent_title, + movement.variation_text AS variation_text, + destination.title AS destination_title, + movement.price AS rate, + - SUM(movement.quantity) AS base, + - SUM(movement.total_price) AS total_price +FROM + catalog +LEFT JOIN + movement ON (movement.uid = catalog.uid) +LEFT JOIN + catalog AS destination ON (movement.destination_uid = destination.uid) +LEFT JOIN + catalog AS parent ON (catalog.parent_uid = parent.uid) +WHERE + catalog.portal_type = "Pay Sheet Cell" <dtml-if year>and YEAR(movement.target_stop_date) = <dtml-sqlvar year type="int"> </dtml-if> +GROUP BY + movement.resource_uid, movement.variation_text, movement.price \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/PaySheet_zGetTotalDestinationList.zsql b/product/ERP5/skins/erp5_accounting/PaySheet_zGetTotalDestinationList.zsql new file mode 100755 index 0000000000..035ddb4031 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaySheet_zGetTotalDestinationList.zsql @@ -0,0 +1,25 @@ +<dtml-comment> +title: +connection_id:MySQL +max_rows:1000 +max_cache:100 +cache_time:0 +class_name: +class_file: +</dtml-comment> +<params>year</params> +SELECT + YEAR(movement.target_stop_date) as target_stop_date, + movement.variation_text AS variation_text, + destination.title as destination_title, + - SUM(movement.total_price) as total_price +FROM + catalog +LEFT JOIN + movement ON (movement.uid = catalog.uid) +LEFT JOIN + catalog AS destination ON (movement.destination_uid = destination.uid) +WHERE + catalog.portal_type = "Pay Sheet Cell" <dtml-if year>and YEAR(movement.target_stop_date)=<dtml-sqlvar year type="int"> </dtml-if> +GROUP BY + movement.target_stop_date, movement.destination_uid, movement.variation_text \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/PaymentTransaction_detail.form b/product/ERP5/skins/erp5_accounting/PaymentTransaction_detail.form new file mode 100755 index 0000000000..103be42465 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaymentTransaction_detail.form @@ -0,0 +1,570 @@ +<?xml version="1.0"?> + +<form> + <title>Payment Transaction</title> + <row_length>4</row_length> + <name>PaymentTransaction_detail</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_source_section</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">1</required> + <size type="int">1</size> + <title>Section</title> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python: [['Nexedi', 'organisation/nexedi']]</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_source_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Transaction Reference</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Person', 'Person')]</portal_type> + <relation_setter_id></relation_setter_id> + <required type="int">0</required> + <title>Third Party</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission></editable_permission> + <editable_role></editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Invoice Number</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission></viewable_permission> + <viewable_role></viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_resource</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Currency</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:[('','')]+map(lambda x:(x.id,'currency/%s' %x.id),here.currency.objectValues())</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">0</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Start Date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">0</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Stop Date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Description</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>simulation_state</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">1</read_only> + <required type="int">0</required> + <title>State</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>python:here.portal_workflow.getInfoFor(here, 'simulation_state')</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Third Party Transaction Reference</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('source', 'Section Account'), ('source_debit', 'Debit'), ('source_credit', 'Credit'), ('destination', 'Third Party Account'), ('destination_debit', 'Debit'), ('destination_credit', 'Credit')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('source_debit', 'Debit'), ('source_credit', 'Credit'), ('destination', 'Destination'), ('source', 'Source')]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[('resource', 'resource')]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>folder_contents</list_action> + <list_method type="method">searchInvoiceTransaction</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>payment_transaction_line_selection</selection_name> + <sort type="list">[('id', 'id')]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Payment Transaction Lines</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + <field><id>listbox_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>listbox_source</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_source</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineSourceItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_destination</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_destination</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineDestinationItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_source_debit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>listbox_source_credit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/PaymentTransaction_view.form b/product/ERP5/skins/erp5_accounting/PaymentTransaction_view.form new file mode 100755 index 0000000000..36d11b7b99 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/PaymentTransaction_view.form @@ -0,0 +1,607 @@ +<?xml version="1.0"?> + +<form> + <title>Payment Transaction</title> + <row_length>4</row_length> + <name>PaymentTransaction_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_source_section</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">1</required> + <size type="int">1</size> + <title>Section</title> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python: [['Nexedi', 'organisation/nexedi'], ]</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_source_payment</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Section Account</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python: here.getAccountingTransactionSourcePaymentItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_source_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Transaction Reference</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Person', 'Person')]</portal_type> + <relation_setter_id></relation_setter_id> + <required type="int">0</required> + <title>Third Party</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_payment</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Third Party Account</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python: here.getAccountingTransactionDestinationPaymentItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission></editable_permission> + <editable_role></editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Invoice Number</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission></viewable_permission> + <viewable_role></viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_resource</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Currency</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:[('','')]+map(lambda x:(x.id,'currency/%s' %x.id),here.currency.objectValues())</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Operation Date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Description</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>simulation_state</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">1</read_only> + <required type="int">0</required> + <title>State</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>python:here.portal_workflow.getInfoFor(here, 'simulation_state')</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Third Party Transaction Reference</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('source', 'Account'), ('source_debit', 'Debit'), ('source_credit', 'Credit')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('source_debit', 'Debit'), ('source_credit', 'Credit'), ('source', 'Account')]</editable_columns> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[('resource', 'resource')]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>folder_contents</list_action> + <list_method type="method">searchInvoiceTransaction</list_method> + <meta_types type="list">[]</meta_types> + <not_viewable type="int">0</not_viewable> + <portal_types type="list">[]</portal_types> + <read_only type="int">0</read_only> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>payment_transaction_line_selection</selection_name> + <sort type="list">[('id', 'id')]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Payment Transaction Lines</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + <field><id>listbox_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>listbox_source</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_source</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineSourceItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_destination</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_destination</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineDestinationItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_source_debit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>listbox_source_credit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_credit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/Resource_zGetInventory.zsql b/product/ERP5/skins/erp5_accounting/Resource_zGetInventory.zsql new file mode 100755 index 0000000000..66200e3245 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/Resource_zGetInventory.zsql @@ -0,0 +1,76 @@ +<dtml-comment> +title: +connection_id:MySQL +max_rows:1000 +max_cache:100 +cache_time:0 +class_name:InventoryBrain +class_file:InventoryBrain.py +</dtml-comment> +<params>resource_uid:list +resource:list +from_date +to_date +node +section +node_uid +section_uid +variation_text=None +node_category +section_category +resource_category +omit_simulation +omit_input +omit_output +simulation_state +query</params> +SELECT + SUM(stock.quantity) AS inventory, + SUM(stock.quantity) AS quantity, + COUNT(DISTINCT node.title) AS node_title, + COUNT(DISTINCT node.relative_url) AS node_relative_url, + COUNT(DISTINCT section.title) AS section_title, + COUNT(DISTINCT section.relative_url) AS section_relative_url, + COUNT(DISTINCT resource.title) AS resource_title, + COUNT(DISTINCT resource.relative_url) AS resource_relative_url, + COUNT(DISTINCT movement.variation_text) AS variation_text, + MAX(stock.resource_uid) AS resource_uid, + COUNT(DISTINCT stock.uid) AS stock_uid +FROM + movement + LEFT JOIN catalog ON (movement.uid = catalog.uid) + LEFT JOIN stock ON (movement.uid = stock.uid) + , catalog AS node, catalog AS section, catalog AS resource <dtml-if node_category>, catalog AS node_c, catalog AS node_bc, category AS node_membership </dtml-if> <dtml-if section_category>, catalog AS section_c, catalog AS section_bc, category AS section_membership</dtml-if> <dtml-if resource_category>, catalog AS resource_c, catalog AS resource_bc, category AS resource_membership </dtml-if> <dtml-if query>, category </dtml-if> +WHERE + 1 = 1 +<dtml-if resource>AND (<dtml-in resource> resource.relative_url = <dtml-sqlvar sequence-item type="string"><dtml-if sequence-end><dtml-else> OR </dtml-if></dtml-in>) +</dtml-if><dtml-if resource_uid>AND (<dtml-in resource_uid> movement.resource_uid = <dtml-sqlvar sequence-item type="int"><dtml-if sequence-end><dtml-else> OR </dtml-if></dtml-in>) +</dtml-if><dtml-if "variation_text not in (None, 'None')">AND movement.variation_text = <dtml-sqlvar variation_text type="string"> +</dtml-if>AND movement.is_accountable = 1 +AND node.uid = stock.node_uid +AND section.uid = stock.section_uid +AND stock.resource_uid = resource.uid +<dtml-if from_date>AND movement.stop_date >= <dtml-sqlvar from_date type="string"> +</dtml-if><dtml-if to_date>AND movement.stop_date < <dtml-sqlvar to_date type="string"> +</dtml-if><dtml-if node_uid>AND stock.node_uid = <dtml-sqlvar node_uid type="int"> +</dtml-if><dtml-if section_uid>AND stock.section_uid = <dtml-sqlvar section_uid type="int"> +</dtml-if><dtml-if node>AND node.relative_url = <dtml-sqlvar node type="string"> +</dtml-if><dtml-if section>AND section.relative_url = <dtml-sqlvar section type="string"> +</dtml-if><dtml-if node_category>AND node_c.relative_url = <dtml-sqlvar node_category type="string"> +AND node_membership.category_uid = node_c.uid +AND node_membership.base_category_uid = node_bc.uid +AND node_membership.uid = node.uid +</dtml-if><dtml-if section_category>AND section_c.relative_url = <dtml-sqlvar section_category type="string"> +AND section_membership.category_uid = section_c.uid +AND section_membership.base_category_uid = section_bc.uid +AND section_membership.uid = section.uid +</dtml-if><dtml-if resource_category>AND resource_c.relative_url = <dtml-sqlvar resource_category type="string"> +AND resource_membership.category_uid = resource_c.uid +AND resource_membership.base_category_uid = resource_bc.uid +AND resource_membership.uid = resource.uid +</dtml-if><dtml-if omit_simulation>AND catalog.portal_type != "Simulation Movement" +</dtml-if><dtml-if omit_input>AND stock.quantity < 0 AND movement.source_uid <> movement.destination_uid +</dtml-if><dtml-if omit_output>AND stock.quantity > 0 AND movement.source_uid <> movement.destination_uid +</dtml-if><dtml-if simulation_state>AND (<dtml-in simulation_state> catalog.simulation_state = <dtml-sqlvar sequence-item type="string"><dtml-if sequence-end><dtml-else> OR </dtml-if></dtml-in>) +</dtml-if><dtml-if query>AND category.uid = node.uid +AND <dtml-var query></dtml-if> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/account_template_view.form b/product/ERP5/skins/erp5_accounting/account_template_view.form new file mode 100755 index 0000000000..5952448786 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/account_template_view.form @@ -0,0 +1,82 @@ +<?xml version="1.0"?> + +<form> + <title>Account</title> + <row_length>4</row_length> + <name>accounting_transaction_list</name> + <pt>form_view</pt> + <action>base_edit</action> + <method>POST</method> + <enctype></enctype> + <groups> + <group> + <title>left</title> + <fields> + + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>center</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('quantity', 'Quantity'), ('parent_title', 'Concerned Invoice'), ('type', 'Type'), ('date', 'Date')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">1</domain_tree> + <editable_columns type="list">[]</editable_columns> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">25</lines> + <list_action>list</list_action> + <list_method type="method">sql_stock_account_parent</list_method> + <meta_types type="list">[]</meta_types> + <not_viewable type="int">0</not_viewable> + <portal_types type="list">[('Accounting Transaction', 'Accounting Transaction'), ('Purchase Invoice Transaction', 'Purchase Invoice Transaction'), ('Sale Invoice Transaction', 'Sale Invoice Transaction')]</portal_types> + <read_only type="int">0</read_only> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">1</search> + <search_columns type="list">[]</search_columns> + <select type="int">1</select> + <selection_name>account_selection</selection_name> + <sort type="list">[]</sort> + <stat_method></stat_method> + <title>Transactions concerned by this account</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/accounting_report.form b/product/ERP5/skins/erp5_accounting/accounting_report.form new file mode 100755 index 0000000000..1efcd7cbaf --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/accounting_report.form @@ -0,0 +1,99 @@ +<?xml version="1.0"?> + +<form> + <title>Accounting Report</title> + <row_length>1</row_length> + <name>accounting_transaction_search</name> + <pt>form_dialog</pt> + <action>transaction_line_list</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">0</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">1</required> + <time_separator>:</time_separator> + <title>Start date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">0</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">1</required> + <time_separator>:</time_separator> + <title>Stop date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/accounting_transaction_detail.form b/product/ERP5/skins/erp5_accounting/accounting_transaction_detail.form new file mode 100755 index 0000000000..d9c3868865 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/accounting_transaction_detail.form @@ -0,0 +1,562 @@ +<?xml version="1.0"?> + +<form> + <title>Accounting Transaction</title> + <row_length>4</row_length> + <name>accounting_transaction_detail</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_source_section</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Section</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python: [['Nexedi', 'organisation/nexedi']]</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_source_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Section Transaction Reference</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Person', 'Person')]</portal_type> + <relation_setter_id></relation_setter_id> + <required type="int">0</required> + <title>Third Party</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission></editable_permission> + <editable_role></editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Transaction Reference</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission></viewable_permission> + <viewable_role></viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_resource</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Currency</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:[('','')]+map(lambda x:(x.id,'currency/%s' %x.id),here.currency.objectValues())</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">0</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Start Date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">0</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Stop Date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Description</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>simulation_state</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">1</read_only> + <required type="int">0</required> + <title>State</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>python:here.portal_workflow.getInfoFor(here, 'simulation_state')</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Third Party Transaction Reference</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('source', 'Section Account'), ('source_debit', 'Debit'), ('source_credit', 'Credit'), ('destination', 'Third Party Account'), ('destination_debit', 'Debit'), ('destination_credit', 'Credit')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('source_debit', 'Debit'), ('source_credit', 'Credit'), ('destination', 'Destination'), ('source', 'Source')]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[('resource', 'resource')]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>folder_contents</list_action> + <list_method type="method">searchInvoiceTransaction</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>accounting_transaction_line_selection</selection_name> + <sort type="list">[('id', 'id')]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Accounting Transaction Lines</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + <field><id>listbox_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>listbox_source</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_source</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineSourceItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_destination</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_destination</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineDestinationItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_source_debit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>listbox_source_credit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/calculPaySheet.py b/product/ERP5/skins/erp5_accounting/calculPaySheet.py new file mode 100755 index 0000000000..1c02556c31 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/calculPaySheet.py @@ -0,0 +1,514 @@ +## Script (Python) "calculPaySheet" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +# TODO: "#!!!" style comment +# o replace etat by right organism + +True = 1 +False = 0 + +pay_sheet = context.getObject() +pay_sheet_type = pay_sheet.getPortalType() +pay_sheet_line_type = pay_sheet_type + ' Line' +employee = pay_sheet.getDestinationSection() +employer = pay_sheet.getSourceSection() +employer_object = pay_sheet.getSourceSectionValue() + +# social organism +org_urssaf = 'organisation/urssaf' +org_assedic = 'organisation/assedic' +org_arrco = 'organisation/arrco' +org_agff = 'organisation/agff' +org_agirc = 'organisation/agirc' +org_apec = 'organisation/apec' +org_etat = 'organisation/etat' + +# gross salary source and destination +charge_salariale = 'account/charges_salariales' +produit_salarial = 'account/produits_salariales' + +# final salary source and destination +dette_salarie = 'account/dettes_salaries' +creance_salarie = 'account/creances_salaries' + +# employer share source and destination +charge_sociale = 'account/charges_sociales' +produit_social = 'account/produits_sociaux' + +# employer + employee share source and destination +dette_sociale = 'account/dettes_sociales' +creance_sociale = 'account/creances_sociales' + + + +### get the gross salary and other basic informations to calculate the paysheet + +gross_salary = abs(pay_sheet.getGrossSalary()) +#pay_sheet_resource = pay_sheet.getCurrency() why it doesn't work ????? +pay_sheet_resource = 'currency/EUR' + +global salary_share_total +salary_share_total = 0.0 + +executive = True ################### #!!! dynamic get + +company_birth = DateTime(2000, 10, 21) + +employer_region = employer_object.getDefaultAddress().getZipCode()[:2] + +sub_list = employer_object.getSubordinationRelatedValueList() +company_size = 0 +for person in sub_list: + if person.getPortalType() == 'Person': + company_size += 1 + +company_size = 3 + +### define some parameters for the calculation + +# ceiling salary +if gross_salary < 2432: #!!! depending of the wage periodicity, 2432 euros is for a month + ceiling_salary = gross_salary +else: + ceiling_salary = 2432 + +# "Char" slice type +if gross_salary <= 2432: + char_slice = 'A' +elif gross_salary <= 9728: + char_slice = 'B' +elif gross_salary <= 19456: + char_slice = 'C' +else: + char_slice = '' + +# "Number" slice type +if gross_salary <= 2432: + num_slice = 1 +elif gross_salary <= 7296: + num_slice = 2 +else: + num_slice = 0 + +# age-slice of the company +old_limit = DateTime(1997, 1, 1) +if company_birth < old_limit: + comp_type = 'old' +else: + comp_type = 'new' + + + +### create a new pay sheet line +def createPaySheetLine(new_id='', new_title='', share='', + src_sec='', src='', src_deb=None, + dest_sec='', dest='', new_desc=''): + + suffix = {'cs': '', + 'pp': ' (part patronale)'} + if share == 'pp' or share == 'cs': + new_id = string.replace(string.lower(new_title), ' ', '_') + new_id += '_' + share + #new_title = string.replace(new_title, '?', 'e') + #new_title = string.replace(new_title, '?', 'e') + #new_title = string.replace(new_title, '?', 'o') + new_title += suffix[share] + if share == 'cs': + src_sec = employer + src = dette_sociale + dest = creance_sociale + elif share == 'pp': + src_sec = employer + src = charge_sociale + dest = produit_social + #if wrong ID (existing or wrong name): new_id = str(pay_sheet.generateNewId()) + context.portal_types.constructContent(type_name = pay_sheet_line_type, + container = pay_sheet, + id = new_id) + pay_sheet[new_id].setTitle(new_title) + pay_sheet[new_id].setResource(pay_sheet_resource) # default currency + pay_sheet[new_id].setSourceSection(src_sec) + pay_sheet[new_id].setSource(src) + pay_sheet[new_id].setDestinationSection(dest_sec) + pay_sheet[new_id].setDestination(dest) + pay_sheet[new_id].setSourceDebit(src_deb) + pay_sheet[new_id].setSourceDebit(src_deb) + pay_sheet[new_id].setDescription(new_desc) + + + +### add a pay sheet item and manage the accounting writing rules +def addPaySheetItem(title='', values={'salary_share_rate':None, 'employer_share_rate':None, 'base_value':None, 'base_description':None}, dest_org=''): + global salary_share_total + salary_share_value = None + employer_share_value = None + ps_description = None + pp_description = None + if values['salary_share_rate']!=None and values['base_value']!=None: + salary_share_value = (float(values['salary_share_rate']) / 100) * values['base_value'] + ps_description = "= " + str(values['salary_share_rate']) + "% * " + str(values['base_value']) + " (=" + str(values['base_description']) + ")" + if values['employer_share_rate']!=None and values['base_value']!=None: + employer_share_value = (float(values['employer_share_rate']) / 100) * values['base_value'] + pp_description = "= " + str(values['employer_share_rate']) + "% * " + str(values['base_value']) + " (=" + str(values['base_description']) + ")" + if salary_share_value == None and employer_share_value == None: + return + if salary_share_value != None: + salary_share_total += float(salary_share_value) + if employer_share_value == None: + createPaySheetLine( new_title = title, + share = 'cs', + src_deb = salary_share_value, + dest_sec = dest_org, + new_desc = ps_description) + return + if salary_share_value == None: + createPaySheetLine( new_title = title, + share = 'cs', + src_deb = employer_share_value, + dest_sec = dest_org, + new_desc = ps_description) + createPaySheetLine( new_title = title, + share = 'pp', + src_deb = employer_share_value, + dest_sec = dest_org, + new_desc = pp_description) + return + createPaySheetLine( new_title = title, + share = 'cs', + src_deb = float(employer_share_value) + float(salary_share_value), + dest_sec = dest_org, + new_desc = ps_description) + createPaySheetLine( new_title = title, + share = 'pp', + src_deb = employer_share_value, + dest_sec = dest_org, + new_desc = pp_description) + + + +### add the gross salary Pay Sheet Line +createPaySheetLine( new_id = 'gs', + new_title = 'Salaire brut', + src_sec = employer, + src = charge_salariale, + src_deb = gross_salary, + dest_sec = employee, + dest = produit_salarial) + + + +### Social Security +# sickness insurance +sickness_insurance = { 'salary_share_rate' : None + , 'employer_share_rate' : 12.80 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +if employer_region == '57' or employer_region == '67' or employer_region == '68': + sickness_insurance['salary_share_rate'] = 1.70 +else: + sickness_insurance['salary_share_rate'] = 0.75 +addPaySheetItem(title = 'Assurance maladie', + values = sickness_insurance, + dest_org = org_urssaf) + +# old-age insurance +# this contribution is special because salary and employer shares are calculated from 2 base +# salary_share_value = (6.55 / 100) * ceiling_salary +# salary_share_total += float(salary_share_value) +# ps_description = "= 6.55% * " + str(ceiling_salary) + " (=salaire plafonné)" +# employer_share_value = gross_salary * (1.60 / 100) + ceiling_salary * (8.20 / 100) +# pp_description = "= 1.60% * " + str(gross_salary) + " + 8.20% * " + str(ceiling_salary) + " = 1.60% * salaire brut + 8.20% * salaire plafonné" +# createPaySheetLine( new_title = 'Assurance vieillesse', +# share = 'cs', +# src_deb = float(employer_share_value) + float(salary_share_value), +# dest_sec = org_urssaf, +# new_desc = ps_description) +# createPaySheetLine( new_title = 'Assurance vieillesse', +# share = 'pp', +# src_deb = employer_share_value, +# dest_sec = org_urssaf, +# new_desc = pp_description) +oldage_insurance1 = { 'salary_share_rate' : None + , 'employer_share_rate' : 1.60 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +addPaySheetItem(title = 'Assurance vieillesse 1', + values = oldage_insurance1, + dest_org = org_urssaf) +oldage_insurance2 = { 'salary_share_rate' : 6.55 + , 'employer_share_rate' : 8.20 + , 'base_value' : ceiling_salary + , 'base_description' : "salaire plafonné" + } +addPaySheetItem(title = 'Assurance vieillesse 2', + values = oldage_insurance2, + dest_org = org_urssaf) +# widowhood insurance +widowhood_insurance = { 'salary_share_rate' : 0.10 + , 'employer_share_rate' : None + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +addPaySheetItem(title = 'Assurance veuvage', + values = widowhood_insurance, + dest_org = org_urssaf) +# family benefits +family_benefits = { 'salary_share_rate' : None + , 'employer_share_rate' : 5.40 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +addPaySheetItem(title = 'Allocations familiales', + values = family_benefits, + dest_org = org_urssaf) +# industrial accident +industrial_accident = { 'salary_share_rate' : None + , 'employer_share_rate' : 1.10 # rate depending of company size, department & trade; 1.0 as standard rate, 1.1 for IT + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +addPaySheetItem(title = 'Accidents du travail', + values = industrial_accident, + dest_org = org_urssaf) +# lodging helps +lodging_helps = { 'salary_share_rate' : None + , 'employer_share_rate' : None + , 'base_value' : None + , 'base_description' : None + } +if company_size > 9: + lodging_helps['employer_share_rate'] = 0.40 + lodging_helps['base_description'] = "salaire brut" + lodging_helps['base_value'] = gross_salary +else: + lodging_helps['employer_share_rate'] = 0.10 + lodging_helps['base_description'] = "salaire plafonné" + lodging_helps['base_value'] = ceiling_salary +addPaySheetItem(title = 'Aide au logement', + values = lodging_helps, + dest_org = org_urssaf) +# transport payment +if company_size > 9: + transport_payment = { 'salary_share_rate' : None + , 'employer_share_rate' : 1.80 # rate depending of the town + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + addPaySheetItem(title = 'Versement au transport', + values = transport_payment, + dest_org = org_urssaf) + + + +### CSG = Contribution Sociale Generalisee (deductible / non deductible) +CSGd = { 'salary_share_rate' : 2.4 + , 'employer_share_rate' : None + , 'base_value' : 0.95 * gross_salary + , 'base_description' : "95% du salaire brut" + } +addPaySheetItem(title = 'CSG deductible', + values = CSGd, + dest_org = org_urssaf) +CSGnd = { 'salary_share_rate' : 5.1 + , 'employer_share_rate' : None + , 'base_value' : 0.95 * gross_salary + , 'base_description' : "95% du salaire brut" + } +addPaySheetItem(title = 'CSG non deductible', + values = CSGnd, + dest_org = org_urssaf) + + + +### CRDS = Contribution pour le Remboursement de la Dette Sociale +CRDS = { 'salary_share_rate' : 0.5 + , 'employer_share_rate' : None + , 'base_value' : 0.95 * gross_salary + , 'base_description' : "95% du salaire brut" + } +addPaySheetItem(title = 'CRDS', + values = CRDS, + dest_org = org_urssaf) + + + +### Unemployment Insurance +if char_slice == 'A' or char_slice == 'B': + unemployment_insurance = { 'salary_share_rate' : 2.4 + , 'employer_share_rate' : 4.0 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + addPaySheetItem(title = 'Assurance chomage', + values = unemployment_insurance, + dest_org = org_assedic) + + + +### AGS (FNGS) +if char_slice == 'A' or char_slice == 'B': + AGS = { 'salary_share_rate' : None + , 'employer_share_rate' : 0.35 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + addPaySheetItem(title = 'AGS', + values = AGS, + dest_org = org_assedic) + + + +### supplementary pension +# ARRCO +ARRCO = { 'salary_share_rate' : None + , 'employer_share_rate' : None + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +if executive == False: + if num_slice == 1: + ARRCO['salary_share_rate'] = 3.0 + ARRCO['employer_share_rate'] = 4.5 + elif num_slice == 2: + if comp_type == 'old': + ARRCO['salary_share_rate'] = 6.0 + ARRCO['employer_share_rate'] = 9.0 + else: + ARRCO['salary_share_rate'] = 8.0 + ARRCO['employer_share_rate'] = 12.0 +elif char_slice == 'A': + ARRCO['salary_share_rate'] = 3.0 + ARRCO['employer_share_rate'] = 4.5 +addPaySheetItem(title = 'ARRCO', + values = ARRCO, + dest_org = org_arrco) +# AGFF +AGFF = { 'salary_share_rate' : None + , 'employer_share_rate' : None + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +if ((executive == False and num_slice == 1) or + (executive == True and char_slice == 'A')): + AGFF['salary_share_rate'] = 0.80 + AGFF['employer_share_rate'] = 1.20 +elif ((executive == False and num_slice == 2) or + (executive == True and char_slice == 'B')): + AGFF['salary_share_rate'] = 0.90 + AGFF['employer_share_rate'] = 1.30 +addPaySheetItem(title = 'AGFF', + values = AGFF, + dest_org = org_agff) +# AGIRC +if executive == True: + AGIRC = { 'salary_share_rate' : None + , 'employer_share_rate' : None + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + if char_slice == 'B': + AGIRC['salary_share_rate'] = 7.50 + AGIRC['employer_share_rate'] = 12.50 + elif char_slice == 'C': + # free repartition (20% to share between employee & employer) + AGIRC['salary_share_rate'] = 10.0 + AGIRC['employer_share_rate'] = 10.0 + addPaySheetItem(title = 'AGIRC', + values = AGIRC, + dest_org = org_agirc) +# CET +if executive == True and (char_slice == 'A' or char_slice == 'B' or char_slice == 'C'): + CET = { 'salary_share_rate' : 0.13 + , 'employer_share_rate' : 0.22 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + addPaySheetItem(title = 'CET', + values = CET, + dest_org = org_agirc) + + + +### life insurance +if executive == True and char_slice == 'A': + life_insurance = { 'salary_share_rate' : None + , 'employer_share_rate' : 1.5 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + addPaySheetItem(title = 'Assurance deces', + values = life_insurance, + dest_org = org_urssaf) + + + +### APEC +if char_slice == 'B': + APEC = { 'salary_share_rate' : 0.024 + , 'employer_share_rate' : 0.036 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + #!!! verifier l'application de cette histoire de forfait... + #if executive == True and DateTime.Date.Today().month == 3: + # apec['s'] = apec['s'] + 7.0 + # apec['e'] = apec['e'] + 10.51 + addPaySheetItem(title = 'APEC', + values = APEC, + dest_org = org_apec) + + + +### Taxes +# construction tax +if company_size > 9: + construction_tax = { 'salary_share_rate' : None + , 'employer_share_rate' : 0.45 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + addPaySheetItem(title = 'Construction', + values = construction_tax, + dest_org = org_etat) +# training tax +training_tax = { 'salary_share_rate' : None + , 'employer_share_rate' : 0.50 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +addPaySheetItem(title = 'Apprentissage', + values = training_tax, + dest_org = org_etat) +# courses tax +courses_tax = { 'salary_share_rate' : None + , 'employer_share_rate' : None + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +if company_size < 10: + courses_tax['employer_share_rate'] = 0.15 +else: + courses_tax['employer_share_rate'] = 1.5 +addPaySheetItem(title = 'Formation professionnelle', + values = courses_tax, + dest_org = org_etat) + + + +### Take Home salary +final_salary = gross_salary - salary_share_total +createPaySheetLine(new_id = 'final_salary', + new_title = 'Salaire Net', + src_sec = employer, + src = dette_salarie, + src_deb = final_salary, + dest_sec = employee, + dest = creance_salarie) diff --git a/product/ERP5/skins/erp5_accounting/calculPaySheetTransaction.py b/product/ERP5/skins/erp5_accounting/calculPaySheetTransaction.py new file mode 100755 index 0000000000..761a903a51 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/calculPaySheetTransaction.py @@ -0,0 +1,514 @@ +## Script (Python) "calculPaySheetTransaction" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +# TODO: "#!!!" style comment +# o replace etat by right organism + +True = 1 +False = 0 + +pay_sheet = context.getObject() +pay_sheet_type = pay_sheet.getPortalType() +pay_sheet_line_type = pay_sheet_type + ' Line' +employee = pay_sheet.getDestinationSection() +employer = pay_sheet.getSourceSection() +employer_object = pay_sheet.getSourceSectionValue() + +# social organism +org_urssaf = 'organisation/urssaf' +org_assedic = 'organisation/assedic' +org_arrco = 'organisation/arrco' +org_agff = 'organisation/agff' +org_agirc = 'organisation/agirc' +org_apec = 'organisation/apec' +org_etat = 'organisation/etat' + +# gross salary source and destination +charge_salariale = 'account/charges_salariales' +produit_salarial = 'account/produits_salariales' + +# final salary source and destination +dette_salarie = 'account/dettes_salaries' +creance_salarie = 'account/creances_salaries' + +# employer share source and destination +charge_sociale = 'account/charges_sociales' +produit_social = 'account/produits_sociaux' + +# employer + employee share source and destination +dette_sociale = 'account/dettes_sociales' +creance_sociale = 'account/creances_sociales' + + + +### get the gross salary and other basic informations to calculate the paysheet + +gross_salary = abs(pay_sheet.getGrossSalary()) +#pay_sheet_resource = pay_sheet.getCurrency() why it doesn't work ????? +pay_sheet_resource = 'currency/EUR' + +global salary_share_total +salary_share_total = 0.0 + +executive = True ################### #!!! dynamic get + +company_birth = DateTime(2000, 10, 21) + +employer_region = employer_object.getDefaultAddress().getZipCode()[:2] + +sub_list = employer_object.getSubordinationRelatedValueList() +company_size = 0 +for person in sub_list: + if person.getPortalType() == 'Person': + company_size += 1 + +company_size = 3 + +### define some parameters for the calculation + +# ceiling salary +if gross_salary < 2432: #!!! depending of the wage periodicity, 2432 euros is for a month + ceiling_salary = gross_salary +else: + ceiling_salary = 2432 + +# "Char" slice type +if gross_salary <= 2432: + char_slice = 'A' +elif gross_salary <= 9728: + char_slice = 'B' +elif gross_salary <= 19456: + char_slice = 'C' +else: + char_slice = '' + +# "Number" slice type +if gross_salary <= 2432: + num_slice = 1 +elif gross_salary <= 7296: + num_slice = 2 +else: + num_slice = 0 + +# age-slice of the company +old_limit = DateTime(1997, 1, 1) +if company_birth < old_limit: + comp_type = 'old' +else: + comp_type = 'new' + + + +### create a new pay sheet line +def createPaySheetLine(new_id='', new_title='', share='', + src_sec='', src='', src_deb=None, + dest_sec='', dest='', new_desc=''): + + suffix = {'cs': '', + 'pp': ' (part patronale)'} + if share == 'pp' or share == 'cs': + new_id = string.replace(string.lower(new_title), ' ', '_') + new_id += '_' + share + #new_title = string.replace(new_title, '?', 'e') + #new_title = string.replace(new_title, '?', 'e') + #new_title = string.replace(new_title, '?', 'o') + new_title += suffix[share] + if share == 'cs': + src_sec = employer + src = dette_sociale + dest = creance_sociale + elif share == 'pp': + src_sec = employer + src = charge_sociale + dest = produit_social + #if wrong ID (existing or wrong name): new_id = str(pay_sheet.generateNewId()) + context.portal_types.constructContent(type_name = pay_sheet_line_type, + container = pay_sheet, + id = new_id) + pay_sheet[new_id].setTitle(new_title) + pay_sheet[new_id].setResource(pay_sheet_resource) # default currency + pay_sheet[new_id].setSourceSection(src_sec) + pay_sheet[new_id].setSource(src) + pay_sheet[new_id].setDestinationSection(dest_sec) + pay_sheet[new_id].setDestination(dest) + pay_sheet[new_id].setSourceDebit(src_deb) + pay_sheet[new_id].setSourceDebit(src_deb) + pay_sheet[new_id].setDescription(new_desc) + + + +### add a pay sheet item and manage the accounting writing rules +def addPaySheetItem(title='', values={'salary_share_rate':None, 'employer_share_rate':None, 'base_value':None, 'base_description':None}, dest_org=''): + global salary_share_total + salary_share_value = None + employer_share_value = None + ps_description = None + pp_description = None + if values['salary_share_rate']!=None and values['base_value']!=None: + salary_share_value = (float(values['salary_share_rate']) / 100) * values['base_value'] + ps_description = "= " + str(values['salary_share_rate']) + "% * " + str(values['base_value']) + " (=" + str(values['base_description']) + ")" + if values['employer_share_rate']!=None and values['base_value']!=None: + employer_share_value = (float(values['employer_share_rate']) / 100) * values['base_value'] + pp_description = "= " + str(values['employer_share_rate']) + "% * " + str(values['base_value']) + " (=" + str(values['base_description']) + ")" + if salary_share_value == None and employer_share_value == None: + return + if salary_share_value != None: + salary_share_total += float(salary_share_value) + if employer_share_value == None: + createPaySheetLine( new_title = title, + share = 'cs', + src_deb = salary_share_value, + dest_sec = dest_org, + new_desc = ps_description) + return + if salary_share_value == None: + createPaySheetLine( new_title = title, + share = 'cs', + src_deb = employer_share_value, + dest_sec = dest_org, + new_desc = ps_description) + createPaySheetLine( new_title = title, + share = 'pp', + src_deb = employer_share_value, + dest_sec = dest_org, + new_desc = pp_description) + return + createPaySheetLine( new_title = title, + share = 'cs', + src_deb = float(employer_share_value) + float(salary_share_value), + dest_sec = dest_org, + new_desc = ps_description) + createPaySheetLine( new_title = title, + share = 'pp', + src_deb = employer_share_value, + dest_sec = dest_org, + new_desc = pp_description) + + + +### add the gross salary Pay Sheet Line +createPaySheetLine( new_id = 'gs', + new_title = 'Salaire brut', + src_sec = employer, + src = charge_salariale, + src_deb = gross_salary, + dest_sec = employee, + dest = produit_salarial) + + + +### Social Security +# sickness insurance +sickness_insurance = { 'salary_share_rate' : None + , 'employer_share_rate' : 12.80 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +if employer_region == '57' or employer_region == '67' or employer_region == '68': + sickness_insurance['salary_share_rate'] = 1.70 +else: + sickness_insurance['salary_share_rate'] = 0.75 +addPaySheetItem(title = 'Assurance maladie', + values = sickness_insurance, + dest_org = org_urssaf) + +# old-age insurance +# this contribution is special because salary and employer shares are calculated from 2 base +# salary_share_value = (6.55 / 100) * ceiling_salary +# salary_share_total += float(salary_share_value) +# ps_description = "= 6.55% * " + str(ceiling_salary) + " (=salaire plafonné)" +# employer_share_value = gross_salary * (1.60 / 100) + ceiling_salary * (8.20 / 100) +# pp_description = "= 1.60% * " + str(gross_salary) + " + 8.20% * " + str(ceiling_salary) + " = 1.60% * salaire brut + 8.20% * salaire plafonné" +# createPaySheetLine( new_title = 'Assurance vieillesse', +# share = 'cs', +# src_deb = float(employer_share_value) + float(salary_share_value), +# dest_sec = org_urssaf, +# new_desc = ps_description) +# createPaySheetLine( new_title = 'Assurance vieillesse', +# share = 'pp', +# src_deb = employer_share_value, +# dest_sec = org_urssaf, +# new_desc = pp_description) +oldage_insurance1 = { 'salary_share_rate' : None + , 'employer_share_rate' : 1.60 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +addPaySheetItem(title = 'Assurance vieillesse 1', + values = oldage_insurance1, + dest_org = org_urssaf) +oldage_insurance2 = { 'salary_share_rate' : 6.55 + , 'employer_share_rate' : 8.20 + , 'base_value' : ceiling_salary + , 'base_description' : "salaire plafonné" + } +addPaySheetItem(title = 'Assurance vieillesse 2', + values = oldage_insurance2, + dest_org = org_urssaf) +# widowhood insurance +widowhood_insurance = { 'salary_share_rate' : 0.10 + , 'employer_share_rate' : None + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +addPaySheetItem(title = 'Assurance veuvage', + values = widowhood_insurance, + dest_org = org_urssaf) +# family benefits +family_benefits = { 'salary_share_rate' : None + , 'employer_share_rate' : 5.40 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +addPaySheetItem(title = 'Allocations familiales', + values = family_benefits, + dest_org = org_urssaf) +# industrial accident +industrial_accident = { 'salary_share_rate' : None + , 'employer_share_rate' : 1.10 # rate depending of company size, department & trade; 1.0 as standard rate, 1.1 for IT + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +addPaySheetItem(title = 'Accidents du travail', + values = industrial_accident, + dest_org = org_urssaf) +# lodging helps +lodging_helps = { 'salary_share_rate' : None + , 'employer_share_rate' : None + , 'base_value' : None + , 'base_description' : None + } +if company_size > 9: + lodging_helps['employer_share_rate'] = 0.40 + lodging_helps['base_description'] = "salaire brut" + lodging_helps['base_value'] = gross_salary +else: + lodging_helps['employer_share_rate'] = 0.10 + lodging_helps['base_description'] = "salaire plafonné" + lodging_helps['base_value'] = ceiling_salary +addPaySheetItem(title = 'Aide au logement', + values = lodging_helps, + dest_org = org_urssaf) +# transport payment +if company_size > 9: + transport_payment = { 'salary_share_rate' : None + , 'employer_share_rate' : 1.80 # rate depending of the town + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + addPaySheetItem(title = 'Versement au transport', + values = transport_payment, + dest_org = org_urssaf) + + + +### CSG = Contribution Sociale Generalisee (deductible / non deductible) +CSGd = { 'salary_share_rate' : 2.4 + , 'employer_share_rate' : None + , 'base_value' : 0.95 * gross_salary + , 'base_description' : "95% du salaire brut" + } +addPaySheetItem(title = 'CSG deductible', + values = CSGd, + dest_org = org_urssaf) +CSGnd = { 'salary_share_rate' : 5.1 + , 'employer_share_rate' : None + , 'base_value' : 0.95 * gross_salary + , 'base_description' : "95% du salaire brut" + } +addPaySheetItem(title = 'CSG non deductible', + values = CSGnd, + dest_org = org_urssaf) + + + +### CRDS = Contribution pour le Remboursement de la Dette Sociale +CRDS = { 'salary_share_rate' : 0.5 + , 'employer_share_rate' : None + , 'base_value' : 0.95 * gross_salary + , 'base_description' : "95% du salaire brut" + } +addPaySheetItem(title = 'CRDS', + values = CRDS, + dest_org = org_urssaf) + + + +### Unemployment Insurance +if char_slice == 'A' or char_slice == 'B': + unemployment_insurance = { 'salary_share_rate' : 2.4 + , 'employer_share_rate' : 4.0 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + addPaySheetItem(title = 'Assurance chomage', + values = unemployment_insurance, + dest_org = org_assedic) + + + +### AGS (FNGS) +if char_slice == 'A' or char_slice == 'B': + AGS = { 'salary_share_rate' : None + , 'employer_share_rate' : 0.35 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + addPaySheetItem(title = 'AGS', + values = AGS, + dest_org = org_assedic) + + + +### supplementary pension +# ARRCO +ARRCO = { 'salary_share_rate' : None + , 'employer_share_rate' : None + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +if executive == False: + if num_slice == 1: + ARRCO['salary_share_rate'] = 3.0 + ARRCO['employer_share_rate'] = 4.5 + elif num_slice == 2: + if comp_type == 'old': + ARRCO['salary_share_rate'] = 6.0 + ARRCO['employer_share_rate'] = 9.0 + else: + ARRCO['salary_share_rate'] = 8.0 + ARRCO['employer_share_rate'] = 12.0 +elif char_slice == 'A': + ARRCO['salary_share_rate'] = 3.0 + ARRCO['employer_share_rate'] = 4.5 +addPaySheetItem(title = 'ARRCO', + values = ARRCO, + dest_org = org_arrco) +# AGFF +AGFF = { 'salary_share_rate' : None + , 'employer_share_rate' : None + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +if ((executive == False and num_slice == 1) or + (executive == True and char_slice == 'A')): + AGFF['salary_share_rate'] = 0.80 + AGFF['employer_share_rate'] = 1.20 +elif ((executive == False and num_slice == 2) or + (executive == True and char_slice == 'B')): + AGFF['salary_share_rate'] = 0.90 + AGFF['employer_share_rate'] = 1.30 +addPaySheetItem(title = 'AGFF', + values = AGFF, + dest_org = org_agff) +# AGIRC +if executive == True: + AGIRC = { 'salary_share_rate' : None + , 'employer_share_rate' : None + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + if char_slice == 'B': + AGIRC['salary_share_rate'] = 7.50 + AGIRC['employer_share_rate'] = 12.50 + elif char_slice == 'C': + # free repartition (20% to share between employee & employer) + AGIRC['salary_share_rate'] = 10.0 + AGIRC['employer_share_rate'] = 10.0 + addPaySheetItem(title = 'AGIRC', + values = AGIRC, + dest_org = org_agirc) +# CET +if executive == True and (char_slice == 'A' or char_slice == 'B' or char_slice == 'C'): + CET = { 'salary_share_rate' : 0.13 + , 'employer_share_rate' : 0.22 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + addPaySheetItem(title = 'CET', + values = CET, + dest_org = org_agirc) + + + +### life insurance +if executive == True and char_slice == 'A': + life_insurance = { 'salary_share_rate' : None + , 'employer_share_rate' : 1.5 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + addPaySheetItem(title = 'Assurance deces', + values = life_insurance, + dest_org = org_urssaf) + + + +### APEC +if char_slice == 'B': + APEC = { 'salary_share_rate' : 0.024 + , 'employer_share_rate' : 0.036 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + #!!! verifier l'application de cette histoire de forfait... + #if executive == True and DateTime.Date.Today().month == 3: + # apec['s'] = apec['s'] + 7.0 + # apec['e'] = apec['e'] + 10.51 + addPaySheetItem(title = 'APEC', + values = APEC, + dest_org = org_apec) + + + +### Taxes +# construction tax +if company_size > 9: + construction_tax = { 'salary_share_rate' : None + , 'employer_share_rate' : 0.45 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } + addPaySheetItem(title = 'Construction', + values = construction_tax, + dest_org = org_etat) +# training tax +training_tax = { 'salary_share_rate' : None + , 'employer_share_rate' : 0.50 + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +addPaySheetItem(title = 'Apprentissage', + values = training_tax, + dest_org = org_etat) +# courses tax +courses_tax = { 'salary_share_rate' : None + , 'employer_share_rate' : None + , 'base_value' : gross_salary + , 'base_description' : "salaire brut" + } +if company_size < 10: + courses_tax['employer_share_rate'] = 0.15 +else: + courses_tax['employer_share_rate'] = 1.5 +addPaySheetItem(title = 'Formation professionnelle', + values = courses_tax, + dest_org = org_etat) + + + +### Take Home salary +final_salary = gross_salary - salary_share_total +createPaySheetLine(new_id = 'final_salary', + new_title = 'Salaire Net', + src_sec = employer, + src = dette_salarie, + src_deb = final_salary, + dest_sec = employee, + dest = creance_salarie) diff --git a/product/ERP5/skins/erp5_accounting/copy_of_PaySheetTransaction_pdf_template.pt b/product/ERP5/skins/erp5_accounting/copy_of_PaySheetTransaction_pdf_template.pt new file mode 100755 index 0000000000..358f09964b --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/copy_of_PaySheetTransaction_pdf_template.pt @@ -0,0 +1,8 @@ + <template bottommargin='0.665cm' showboundary='0' topmargin='0.635cm' rightmargin='0.665cm' tal:define='portal python:here.portal_url.getPortalObject()' filename='paysheet.pdf' pagesize='A4' allowsplitting='1' landscape='0' leftmargin='0.635cm'> + <pagetemplate startframe='content' id='FirstPage'> + <static> + <infostring x='3cm' y='3cm'>blabla</infostring> + </static> + <frame showBoundary='0' leftpadding='0.1cm' height='18.14cm' width='19.701cm' rightpadding='0.1cm' y='2.289cm' x='0.635cm' nextid='content' toppadding='0.2cm' id='content' bottompadding='0.5cm'/> + </pagetemplate> + </template> diff --git a/product/ERP5/skins/erp5_accounting/copy_of_Resource_zGetInventory.zsql b/product/ERP5/skins/erp5_accounting/copy_of_Resource_zGetInventory.zsql new file mode 100755 index 0000000000..b8debda7f7 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/copy_of_Resource_zGetInventory.zsql @@ -0,0 +1,39 @@ +<dtml-comment> +title: +connection_id:MySQL +max_rows:1000 +max_cache:100 +cache_time:0 +class_name:InventoryBrain +class_file:InventoryBrain.py +</dtml-comment> +<params>resource_uid:list +resource:list +from_date +to_date +node +section +node_uid +section_uid +variation_text=None +node_category +section_category +resource_category +omit_simulation +omit_input +omit_output +simulation_state +query</params> +SELECT + SUM(stock.quantity) AS inventory +FROM + movement + LEFT JOIN catalog ON (movement.uid = catalog.uid) + LEFT JOIN stock ON (movement.uid = stock.uid) + , catalog AS node, catalog AS section, catalog AS resource +WHERE + 1 = 1 +AND movement.is_accountable = 1 +AND node.uid = stock.node_uid +AND section.uid = stock.section_uid +AND stock.resource_uid = resource.uid diff --git a/product/ERP5/skins/erp5_accounting/getAccountPcgItemList.py b/product/ERP5/skins/erp5_accounting/getAccountPcgItemList.py new file mode 100755 index 0000000000..c945dc4f23 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/getAccountPcgItemList.py @@ -0,0 +1,18 @@ +## Script (Python) "getAccountPcgItemList" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +def display(x): + return "%s - %s" % (x.getId(), x.getTitle()) + +def sort(x,y): + return cmp(display(x), display(y)) + +obj = context.restrictedTraverse('portal_categories/pcg') +item_list = obj.getCategoryChildItemList(base=0, display_method=display, sort_method=sort) +return item_list diff --git a/product/ERP5/skins/erp5_accounting/pay_sheet_line_view.form b/product/ERP5/skins/erp5_accounting/pay_sheet_line_view.form new file mode 100755 index 0000000000..59eeb39cf4 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/pay_sheet_line_view.form @@ -0,0 +1,13 @@ +<?xml version="1.0"?> + +<form> + <title></title> + <row_length>4</row_length> + <name>pay_sheet_line_view</name> + <pt>form_view</pt> + <action></action> + <method>POST</method> + <enctype></enctype> + <groups> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/pay_sheet_list.form b/product/ERP5/skins/erp5_accounting/pay_sheet_list.form new file mode 100755 index 0000000000..9e026ce88a --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/pay_sheet_list.form @@ -0,0 +1,13 @@ +<?xml version="1.0"?> + +<form> + <title></title> + <row_length>4</row_length> + <name>pay_sheet_list</name> + <pt>form_view</pt> + <action></action> + <method>POST</method> + <enctype></enctype> + <groups> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/pay_sheet_print.pt b/product/ERP5/skins/erp5_accounting/pay_sheet_print.pt new file mode 100755 index 0000000000..22dacd4dff --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/pay_sheet_print.pt @@ -0,0 +1,114 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> + +<html> + <head> + <meta http-equiv="content-type" content="text/html;charset=ISO-8859-1"> + <title>Pay Sheet</title> + <style type="text/css"> + @import "pay_sheet_css.css"; + </style> + </head> + + <body tal:define="employee python: here.restrictedTraverse(here.getDestinationSectionRelativeUrl()); + employer python: here.restrictedTraverse(here.getSourceSectionRelativeUrl())"> + + <div class="spacer"> </div> + + <div class="logo"> + <img src="logo.png"> + </div> + + <div class="title"> + <h1>FEUILLE DE SALAIRE</h1> + <h2 tal:content="python: '- n°%s -' % here.getId()"/> + </div> + + <div class="spacer"> </div> + + <div class="employer"> + <span class="name" tal:content="python: employer.getCorporateName()"/><br/> + <span tal:content="python: '%s %s %s' % ( + employer.getDefaultAddress().getStreetAddress(), + employer.getDefaultAddress().getZipCode(), + employer.getDefaultAddress().getCity())"/><br/> + <span tal:content="python: 'Tel: %s' % employer.getDefaultTelephone().asText()"/><br/><!--optional--> + <span tal:content="python: 'Fax: %s' % employer.getDefaultFax().asText()"/><br/><!--optional--> + <span tal:content="python: 'E-mail: %s' % employer.getDefaultEmail().asText()"/><br/><!--optional--> + <span tal:content="python: 'N°Siret: '"/><br/><!-- from organisation details --> + <span tal:content="python: 'N°APE: '"/><br/><!-- from organisation details --> + <span tal:content="python: 'N°URSSAF: '"/><br/><!-- from organisation details --> + <span tal:content="python: 'Adresse URSSAF: '"/><br/><!-- from organisation details --> + </div> + + <div class="employee"> + <span class="name" tal:content="python: employee.getTitle()"/><br/> + <span>Emploi: Directeur Recherche et Développement</span><br/><!-- from career --> + <span tal:content="python: 'Matricule: %s' % employee.getId()"/><br/><!--optional--> + <span>Qualification: Ingénieur</span><br/><!-- from career --> + <span>Echelon: 1</span><br/><!-- from career --> + <span>Coefficient: 1.0</span><br/><!-- from career --> + <span tal:content="python: '%s %s %s' % ( + employee.getDefaultAddress().getStreetAddress(), + employee.getDefaultAddress().getZipCode(), + employee.getDefaultAddress().getCity())"/><br/><!--optional--> + <span tal:content="python: 'Tel: %s' % employee.getDefaultTelephone().asText()"/><br/><!--optional--> + <span tal:content="python: 'Fax: %s' % employee.getDefaultFax().asText()"/><br/><!--optional--> + <span tal:content="python: 'E-mail: %s' % employee.getDefaultEmail().asText()"/><br/><!--optional--> + <span tal:content="python: 'N°Secu: '"/><br/><!--optional--> + </div> + + <div class="spacer"> </div> + + <div class="contract_rules"> + <span tal:content="python: 'Convention collective de banche:'"/><br/> + <span tal:content="python: 'Durée des congés de payés:'"/><br/> + <span tal:content="python: 'Durée des délais de préavis:'"/><br/> + </div> + + <div class="payment"> + <span tal:content="python: 'Periode: du %s au %s' % ( + here.getStartDate(), + here.getStopDate())"/><br/> + <span tal:content="python: 'Date de paiement: %s' % here.getTargetStopDate()"/><br/> + <span>Type de paiement: Virement</span><br/><!-- from salary information in person --><!--optional--> + </div> + + <div class="disclaimer"> + Dans votre intérêt et pour vous aider à faire valoir vos droits, conservez ce bulletin de paie sans limitation de durée. + </div> + + <br> + + <table width="100%"> + <tr bgcolor=000000> + <th><font color=ffffff>Nature</font></th> + <th><font color=ffffff>Part patronale</font></th> + <th><font color=ffffff>Calcul PP</font></th> + <th><font color=ffffff>Part salariale</font></th> + <th><font color=ffffff>Calcul PS</font></th> + </tr> + <tr> + <td tal:content="python: here.gs.getTitle()"/> + <td> </td> + <td> </td> + <td tal:content="python: '%.2f' % here.gs.getDestinationCredit()"/> + <td> </td> + </tr> + <tr tal:define="pay_sheet_lines python: here.PaySheetLinesPrintFormat()" + tal:repeat="line pay_sheet_lines"> + <td class="line"><span tal:content="python: line['title']"/></td> + <td class="line"><span tal:content="python: line['pp']"/></td> + <td class="line"><span tal:content="python: line['pp_desc']"/></td> + <td class="line"><span tal:content="python: line['ps']"/></td> + <td class="line"><span tal:content="python: line['ps_desc']"/></td> + </tr> + <tr > + <td><b tal:content="python: here.final_salary.getTitle()"/> (EUR)</td> + <td> </td> + <td> </td> + <td><b tal:content="python: '%.2f' % here.final_salary.getDestinationCredit()"/></td> + <td> </td> + </tr> + </table> + </body> +</html> diff --git a/product/ERP5/skins/erp5_accounting/pay_sheet_view.form b/product/ERP5/skins/erp5_accounting/pay_sheet_view.form new file mode 100755 index 0000000000..c9503bf60b --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/pay_sheet_view.form @@ -0,0 +1,13 @@ +<?xml version="1.0"?> + +<form> + <title></title> + <row_length>4</row_length> + <name>pay_sheet_view</name> + <pt>form_view</pt> + <action></action> + <method>POST</method> + <enctype></enctype> + <groups> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/purchase_invoice_transaction_detail.form b/product/ERP5/skins/erp5_accounting/purchase_invoice_transaction_detail.form new file mode 100755 index 0000000000..93fcd668a0 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/purchase_invoice_transaction_detail.form @@ -0,0 +1,569 @@ +<?xml version="1.0"?> + +<form> + <title>Purchase Invoice Transaction</title> + <row_length>4</row_length> + <name>purchase_invoice_list</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_source_section</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">1</required> + <size type="int">1</size> + <title>Customer</title> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python: [['Nexedi', 'organisation/nexedi']]</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_source_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Transaction Reference</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Vendor</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission></editable_permission> + <editable_role></editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Invoice Number</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission></viewable_permission> + <viewable_role></viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_resource</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Currency</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:[('','')]+map(lambda x:(x.id,'currency/%s' %x.id),here.currency.objectValues())</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">0</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Start Date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">0</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Stop Date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Description</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>simulation_state</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">1</read_only> + <required type="int">0</required> + <title>State</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>python:here.portal_workflow.getInfoFor(here, 'simulation_state')</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Vendor Transaction Reference</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('source', 'Customer Account'), ('source_debit', 'Debit'), ('source_credit', 'Credit'), ('destination', 'Vendor Account'), ('destination_debit', 'Debit'), ('destination_credit', 'Credit')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('source_debit', 'Debit'), ('source_credit', 'Credit'), ('destination', 'Destination'), ('source', 'Source')]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[('resource', 'resource')]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>folder_contents</list_action> + <list_method type="method">searchInvoiceTransaction</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>purchase_invoice_transaction_line_selection</selection_name> + <sort type="list">[('id', 'id')]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Purchase Invoice Transaction Lines</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + <field><id>listbox_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>listbox_source</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_source</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineSourceItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_destination</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_destination</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineDestinationItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_source_debit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>listbox_source_credit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/sale_invoice_transaction_detail.form b/product/ERP5/skins/erp5_accounting/sale_invoice_transaction_detail.form new file mode 100755 index 0000000000..bd9c6917da --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/sale_invoice_transaction_detail.form @@ -0,0 +1,472 @@ +<?xml version="1.0"?> + +<form> + <title>Sale Invoice Transaction</title> + <row_length>4</row_length> + <name>sale_invoice_transaction_detail</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Client</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_source_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Vendor</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>resource</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Currency</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>here/l0/getDefaultResource | nothing</default> + <items>python:map(lambda x: (x.id,'currency/%s' % x.id),here.currency.objectValues())</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_causality_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>causality</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>sale_packing_list</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Sale Packing List', 'Sale Packing List')]</portal_type> + <required type="int">0</required> + <title>Packing List</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">0</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Start Date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">0</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Stop Date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Description</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('title', 'Title'), ('source', 'Source'), ('source_debit', 'Debit'), ('source_credit', 'Credit'), ('destination', 'Destination'), ('destination_debit', 'Debit'), ('destination_credit', 'Credit')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('title', 'Title'), ('source_debit', 'Debit'), ('source_credit', 'Credit'), ('destination', 'Destination'), ('source', 'Source')]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[('resource', 'resource')]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>folder_contents</list_action> + <list_method type="method">searchFolder</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[('Sale Invoice Transaction Line', 'Sale Invoice Transaction Line'), ('Accounting Transaction Line', 'Accounting Transaction Line')]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>purchase_invoice_transaction_line_selection</selection_name> + <sort type="list">[('id', 'id')]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Sale Invoice Transaction Lines</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + <field><id>listbox_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>listbox_source</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_source</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineSourceItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_destination</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_destination</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineDestinationItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_source_debit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>listbox_source_credit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/searchInvoiceTransaction.py b/product/ERP5/skins/erp5_accounting/searchInvoiceTransaction.py new file mode 100755 index 0000000000..04ed94c803 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/searchInvoiceTransaction.py @@ -0,0 +1,33 @@ +## Script (Python) "searchInvoiceTransaction" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=**kw +##title= +## +sort_dict = { 'income': '\0\0', + 'expense': '\0\0', + 'receivable': '\0\1', + 'payable': '\0\1', + 'collected_vat': '\0\2', + 'refundable_vat': '\0\3' } + +def sortInvoiceTransactionLine(a, b): + a_id = a.getId() + if a_id in sort_dict: + a_id = sort_dict[a_id] + b_id = b.getId() + if b_id in sort_dict: + b_id = sort_dict[b_id] + return cmp(a_id, b_id) + +object_list = [] + +for o in context.searchFolder(**kw): + obj = o.getObject() + object_list.append(obj) + +object_list.sort(sortInvoiceTransactionLine) +return object_list diff --git a/product/ERP5/skins/erp5_accounting/sql_stock_account_date.zsql b/product/ERP5/skins/erp5_accounting/sql_stock_account_date.zsql new file mode 100755 index 0000000000..510cf59fdd --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/sql_stock_account_date.zsql @@ -0,0 +1,26 @@ +<dtml-comment> +title: +connection_id:MySQL +max_rows:1000 +max_cache:100 +cache_time:0 +class_name:ZSQLBrain +class_file:zsqlbrain.py +</dtml-comment> +<params>query</params> +<dtml-if query> +SELECT DISTINCT catalog.*, stock.quantity, movement.start_date, movement.stop_date, resource.title +FROM catalog, stock, category, catalog as resource, movement +WHERE catalog.uid = stock.uid + AND movement.resource_uid=resource.uid + AND movement.uid = catalog.uid + AND category.uid = stock.node_uid + AND (<dtml-var query>) +<dtml-else> +SELECT DISTINCT catalog.*, stock.quantity, movement.start_date, movement.stop_date, resource.title +FROM catalog, catalog as node, stock, catalog as resource, movement +WHERE catalog.uid = stock.uid + AND stock.node_uid = node.uid + AND movement.resource_uid=resource.uid + AND movement.uid = catalog.uid +</dtml-if> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/sql_stock_account_date_stat.zsql b/product/ERP5/skins/erp5_accounting/sql_stock_account_date_stat.zsql new file mode 100755 index 0000000000..0039808cf9 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/sql_stock_account_date_stat.zsql @@ -0,0 +1,27 @@ +<dtml-comment> +title: +connection_id:MySQL +max_rows:1000 +max_cache:100 +cache_time:0 +class_name:ZSQLBrain +class_file:zsqlbrain.py +</dtml-comment> +<params>query +stat_query</params> +<dtml-if query> +SELECT <dtml-var stat_query> +FROM catalog, stock, category, catalog as resource, movement +WHERE catalog.uid = stock.uid + AND movement.resource_uid=resource.uid + AND movement.uid = catalog.uid + AND category.uid = stock.node_uid + AND (<dtml-var query>) +<dtml-else> +SELECT <dtml-var stat_query> +FROM catalog, catalog as node, stock, catalog as resource, movement +WHERE catalog.uid = stock.uid + AND stock.node_uid = node.uid + AND movement.resource_uid=resource.uid + AND movement.uid = catalog.uid +</dtml-if> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/sql_stock_account_parent.zsql b/product/ERP5/skins/erp5_accounting/sql_stock_account_parent.zsql new file mode 100755 index 0000000000..ecc1eb567b --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/sql_stock_account_parent.zsql @@ -0,0 +1,25 @@ +<dtml-comment> +title: +connection_id:MySQL +max_rows:1000 +max_cache:100 +cache_time:0 +class_name:ZSQLBrain +class_file:zsqlbrain.py +</dtml-comment> +<params>getUid +query</params> +<dtml-if getUid> +SELECT DISTINCT catalog.*, stock.quantity, parent.Title as parent_title +FROM catalog, catalog as node, stock, catalog as parent, category +WHERE catalog.uid = stock.uid + AND stock.node_uid = node.uid + AND catalog.parent_uid = parent.uid + AND stock.node_uid = <dtml-var getUid> + AND stock.quantity != 0.0 +<dtml-if query> + AND category.uid = stock.section_uid +AND <dtml-var query> +</dtml-if> + +</dtml-if> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/sql_stock_count.zsql b/product/ERP5/skins/erp5_accounting/sql_stock_count.zsql new file mode 100755 index 0000000000..9760f4ed90 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/sql_stock_count.zsql @@ -0,0 +1,16 @@ +<dtml-comment> +title: +connection_id:MySQL +max_rows:1000 +max_cache:100 +cache_time:0 +class_name: +class_file: +</dtml-comment> +<params>query</params> +SELECT SUM(stock.quantity) +FROM catalog, catalog as node, stock, category +WHERE catalog.uid = stock.uid + AND node.uid = category.uid + AND stock.node_uid = node.uid + AND <dtml-var query> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/sql_stock_search.zsql b/product/ERP5/skins/erp5_accounting/sql_stock_search.zsql new file mode 100755 index 0000000000..a28063b877 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/sql_stock_search.zsql @@ -0,0 +1,17 @@ +<dtml-comment> +title: +connection_id:MySQL +max_rows:1000 +max_cache:100 +cache_time:0 +class_name: +class_file: +</dtml-comment> +<params>query +getUid</params> +SELECT DISTINCT catalog.*, stock.quantity +FROM catalog, catalog as node, stock, category +WHERE catalog.uid = stock.uid + AND node.uid = category.uid + AND stock.node_uid = node.uid + AND <dtml-var query> diff --git a/product/ERP5/skins/erp5_accounting/transaction_line_list.form b/product/ERP5/skins/erp5_accounting/transaction_line_list.form new file mode 100755 index 0000000000..def9030a50 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/transaction_line_list.form @@ -0,0 +1,62 @@ +<?xml version="1.0"?> + +<form> + <title></title> + <row_length>4</row_length> + <name>accounting_transaction_list</name> + <pt>form_list</pt> + <action></action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>Default</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('start_date', 'start_date'), ('stop_date', 'stop_date'), ('id', 'id'), ('Type', 'Type')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[('portal_categories/pcg', 'PCG'), ('portal_categories/financial_section', 'Financial Section'), ('portal_categories/account_type', 'Account type')]</domain_root_list> + <domain_tree type="int">1</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">30</lines> + <list_action>list</list_action> + <list_method type="method">sql_stock_account_date</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[('Accounting Transaction', 'Accounting Transaction'), ('Purchase Invoice Transaction', 'Purchase Invoice Transaction'), ('Sale Invoice Transaction', 'Sale Invoice Transaction')]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">1</search> + <search_columns></search_columns> + <select type="int">1</select> + <selection_name>transaction_line_selection</selection_name> + <sort type="list">[('id', 'id')]</sort> + <stat_method type="method">sql_stock_account_date_stat</stat_method> + <title>Transaction Line List</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_accounting/transaction_list_ui.form b/product/ERP5/skins/erp5_accounting/transaction_list_ui.form new file mode 100755 index 0000000000..ea529eb8e9 --- /dev/null +++ b/product/ERP5/skins/erp5_accounting/transaction_list_ui.form @@ -0,0 +1,85 @@ +<?xml version="1.0"?> + +<form> + <title>Set List Setting</title> + <row_length>2</row_length> + <name>transaction_list_ui</name> + <pt>form_list_ui</pt> + <action>base_list_ui</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>columns</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[('None', 'None'), ('Id', 'id'), ('Title', 'Title'), ('Description', 'Description')]</items> + <required type="int">1</required> + <size type="int">1</size> + <title>columns</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>lines</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[('5', '5'), ('10', '10'), ('25', '25'), ('50', '50'), ('100', '100'), ('200', '200'), ('500', '500')]</items> + <required type="int">1</required> + <size type="int">1</size> + <title>Line</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/Assignment_view.form b/product/ERP5/skins/erp5_crm/Assignment_view.form new file mode 100755 index 0000000000..3bfefbc5b2 --- /dev/null +++ b/product/ERP5/skins/erp5_crm/Assignment_view.form @@ -0,0 +1,244 @@ +<?xml version="1.0"?> + +<form> + <title>Assignment</title> + <row_length>4</row_length> + <name>General</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>Left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>ID</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>here/id</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Title</title> + <truncate type="int">0</truncate> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Begin</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>End</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>Right</title> + <fields> + + <field><id>my_function</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[('Registered office', 'Registered office'), ('Store', 'Store'), ('Wharehouse', 'Wharehouse'), ('Workshop', 'Workshop')]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Function</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>here/getDefaultFunction</default> + <items>here/portal_categories/function/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_activity</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[('Distribution', 'Distribution'), ('Manufacture', 'Manufacture'), ('Transport', 'Transport')]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Activity</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>here/getDefaultActivity</default> + <items>here/portal_categories/activity/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>Middle</title> + <fields> + + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">3</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Comments</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">100</width> + </values> + <tales> + <default>here/Description</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>List</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/Career_shiftDefault.py b/product/ERP5/skins/erp5_crm/Career_shiftDefault.py new file mode 100755 index 0000000000..3d9dcffcf9 --- /dev/null +++ b/product/ERP5/skins/erp5_crm/Career_shiftDefault.py @@ -0,0 +1,45 @@ +## Script (Python) "Career_shiftDefault" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +object_list = [] +default_career = None +new_start_date = None + +# Create a list of all career line except the default one +for object in context.objectValues(): + if object.getPortalType() == 'Career': + if object.getId() != 'default_career': + object_list += [object] + else: + default_career = object + new_start_date = default_career.getStopDate() + +# No default career +if default_career == None: + return context.REQUEST.RESPONSE.redirect(context.absolute_url() + '/person_career_view' + '?portal_status_message=Current+career+need+to+be+defined') + +# Inverse sort of the list by id +object_list.sort(lambda x, y: -cmp(int(x.getId()), int(y.getId()))) + +# Shift all career lines id values +new_id = str(context.generateNewId()) +for career_line in object_list: + current_id = career_line.getId() + context.manage_renameObject(current_id, new_id) + new_id = current_id + +# Create a new default_career +context.manage_renameObject('default_career', new_id) +new_default = context.manage_copyObjects(ids=(new_id,)) +new_object = context.manage_pasteObjects(new_default) +context.manage_renameObject(new_object[0]['new_id'], 'default_career') +context.setDefaultCareerStopDate(None) +context.setDefaultCareerStartDate(new_start_date) + +return context.REQUEST.RESPONSE.redirect(context.absolute_url() + '/person_career_view' + '?portal_status_message=New+career+step+added') diff --git a/product/ERP5/skins/erp5_crm/Career_view.form b/product/ERP5/skins/erp5_crm/Career_view.form new file mode 100755 index 0000000000..cde6bd1728 --- /dev/null +++ b/product/ERP5/skins/erp5_crm/Career_view.form @@ -0,0 +1,396 @@ +<?xml version="1.0"?> + +<form> + <title>Career</title> + <row_length>4</row_length> + <name>General</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>Left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>ID</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>here/id</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_subordination_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>subordination</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation')]</portal_type> + <required type="int">0</required> + <title>Organisation</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Begin</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">1</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>End</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>Right</title> + <fields> + + <field><id>my_collective_agreement_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Collective agreement title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_role</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Role</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>here/getDefaultRole</default> + <items>here/portal_categories/role/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_grade</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Grade</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>here/getDefaultGrade</default> + <items>here/portal_categories/grade/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_salary_level</id> <type>IntegerField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <end></end> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <start></start> + <title>Salary level</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_integer">You did not enter an integer.</message> + <message name="integer_out_of_range">The integer you entered was out of range.</message> + </messages> + </field> + <field><id>my_salary_coefficient</id> <type>IntegerField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <end></end> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <start></start> + <title>Salary coefficient</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_integer">You did not enter an integer.</message> + <message name="integer_out_of_range">The integer you entered was out of range.</message> + </messages> + </field> + <field><id>my_skill_list</id> <type>MultiListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default type="list">[]</default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">5</size> + <title>Skills</title> + <unicode type="int">0</unicode> + <view_separator><br /> +</view_separator> + </values> + <tales> + <default>here/getSkillList</default> + <items>here/portal_categories/skill/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>Middle</title> + <fields> + + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">3</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Comments</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">100</width> + </values> + <tales> + <default>here/Description</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>List</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/event_2_sale_opportunity.py b/product/ERP5/skins/erp5_crm/event_2_sale_opportunity.py new file mode 100755 index 0000000000..5d203e6840 --- /dev/null +++ b/product/ERP5/skins/erp5_crm/event_2_sale_opportunity.py @@ -0,0 +1,31 @@ +## Script (Python) "event_2_sale_opportunity" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +# this script allow to create a new object from this current one + +current_object = context.getObject() +module = context.getPortalObject().opportunity + +# Create a new object +new_id = str(module.generateNewId()) +context.portal_types.constructContent(type_name='Sale Opportunity', + container=module, + id=new_id +) +new_object = module[new_id] + + +# If we do this before, each added line will take 20 times more time +# because of programmable acquisition +new_object.edit( + title=current_object.getTitle(), + client_value_list = current_object.getSourceValueList() +) +# Now create the relation between the current object and the new one +current_object.setFollowUpValueList([new_object]) diff --git a/product/ERP5/skins/erp5_crm/event_2_support_request.py b/product/ERP5/skins/erp5_crm/event_2_support_request.py new file mode 100755 index 0000000000..5329b11f1a --- /dev/null +++ b/product/ERP5/skins/erp5_crm/event_2_support_request.py @@ -0,0 +1,31 @@ +## Script (Python) "event_2_support_request" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +# this script allow to create a new object from this current one + +current_object = context.getObject() +module = context.getPortalObject().support_request + +# Create a new object +new_id = str(module.generateNewId()) +context.portal_types.constructContent(type_name='Support Request', + container=module, + id=new_id +) +new_object = module[new_id] + + +# If we do this before, each added line will take 20 times more time +# because of programmable acquisition +new_object.edit( + title=current_object.getTitle(), + client_value_list = current_object.getSourceValueList() +) +# Now create the relation between the current object and the new one +current_object.setFollowUpValueList([new_object]) diff --git a/product/ERP5/skins/erp5_crm/person_assignment_view.form b/product/ERP5/skins/erp5_crm/person_assignment_view.form new file mode 100755 index 0000000000..2f1c5da300 --- /dev/null +++ b/product/ERP5/skins/erp5_crm/person_assignment_view.form @@ -0,0 +1,138 @@ +<?xml version="1.0"?> + +<form> + <title>Person Assignment View</title> + <row_length>4</row_length> + <name>General</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>id</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Usual Name</title> + <truncate type="int">0</truncate> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[('getStartDate', 'getStartDate'), ('getStopDate', 'getStopDate')]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('getStartDate', 'Begin'), ('getStopDate', 'End'), ('title', 'Title'), ('function', 'Function'), ('activity', 'Activity')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[('id', "''"), ('Title', "''")]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('getStartDate', 'getStartDate'), ('getStopDate', 'getStopDate')]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <global_attributes type="list">[]</global_attributes> + <height type="int">5</height> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>folder_contents</list_action> + <list_cookie>CONTACT_LIST</list_cookie> + <list_method type="method">searchFolder</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[('Assignment', 'Assignment')]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <reverse type="int">0</reverse> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>folder_selection</selection_name> + <sort type="list">[]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Assignments</title> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/person_career_log_print.pt b/product/ERP5/skins/erp5_crm/person_career_log_print.pt new file mode 100755 index 0000000000..e860c65b7e --- /dev/null +++ b/product/ERP5/skins/erp5_crm/person_career_log_print.pt @@ -0,0 +1,43 @@ +<html> + <head> + <title tal:content="template/title">The title</title> + </head> + <body> + + <img src="logo.png" /> + + <h2 align="center"><span tal:condition="template/title" + tal:replace="template/title">optional template id</span></h2> + + <table width="100%" border="1"> + <tr> + <th>Nom</th> + <th>Date Naissance</th> + <th>Nationalité</th> + <th>Sexe</th> + <th>Compétences</th> + <th>Affectation</th> + <th>Arrivée</th> + <th>Départ</th> + <th>Description</th> + </tr> + <tr tal:repeat="item python:here.sort_sql_list(here.z_person_career_log(),(('start_date','ASC'),))"> + <span tal:define="my_assignment python:item.getObject(); + my_person python:my_assignment.aq_parent" + > + <td valign="top"><a tal:content="my_person/getTitle" + tal:attributes="href python:'%s/person_viewProfile' % my_person.getRelativeUrl()" /></td> + <td valign="top" ><font size="-2" tal:content="my_assignment/getBirthday"/></td> + <td valign="top" ><font size="-2" tal:content="my_assignment/getDefaultNationality"/></td> + <td valign="top" ><font size="-2" tal:content="my_assignment/getGender"/></td> + <td valign="top"><font size="-2"><ul><li tal:repeat="skill my_assignment/getSkillList" + tal:content="skill"></li></ul></font></td> + <td valign="top"><a tal:content="item/getTitle" tal:attributes="href item/getPath"/></td> + <td valign="top"><font size="-2" tal:content="my_assignment/getStartDate"/></td> + <td valign="top"><font size="-2" tal:content="my_assignment/getStopDate"/></td> + <td valign="top"><font size="-2" tal:content="item/Description"/></td> + </span> + </tr> + </table> + </body> +</html> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/person_career_view.form b/product/ERP5/skins/erp5_crm/person_career_view.form new file mode 100755 index 0000000000..ab74656ceb --- /dev/null +++ b/product/ERP5/skins/erp5_crm/person_career_view.form @@ -0,0 +1,464 @@ +<?xml version="1.0"?> + +<form> + <title>Person Career View</title> + <row_length>4</row_length> + <name>General</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>id</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Usual name</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_default_career_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Career title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_default_career_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Beginning of this career step</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_default_career_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">1</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>End of this current career step</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_subordination_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>subordination</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation')]</portal_type> + <relation_setter_id>setCareerSubordinationUidList</relation_setter_id> + <required type="int">0</required> + <title>Current organisation</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_default_collective_agreement_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Collective agreement title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_default_career_salary_level</id> <type>IntegerField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <end></end> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <start></start> + <title>Current salary level</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_integer">You did not enter an integer.</message> + <message name="integer_out_of_range">The integer you entered was out of range.</message> + </messages> + </field> + <field><id>my_default_career_salary_coefficient</id> <type>IntegerField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <end></end> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <start></start> + <title>Current salary coefficient</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_integer">You did not enter an integer.</message> + <message name="integer_out_of_range">The integer you entered was out of range.</message> + </messages> + </field> + <field><id>my_career_role</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Current role</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>here/portal_categories/role/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_career_grade</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Current grade</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>here/portal_categories/grade/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_career_skill_list</id> <type>MultiListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default type="list">[]</default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">5</size> + <title>Current skills</title> + <unicode type="int">0</unicode> + <view_separator><br /></view_separator> + </values> + <tales> + <items>here/portal_categories/skill/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + <field><id>my_default_career_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">3</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Current career comments</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">100</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[('getStartDate', 'getStartDate'), ('getStopDate', 'getStopDate')]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('getStartDate', 'Begin'), ('getStopDate', 'End'), ('title', 'Title'), ('getSubordinationTitle', 'Organisation'), ('collective_agreement_title', 'Collective agreement'), ('role', 'Role'), ('grade', 'Grade'), ('salary_level', 'Salary level'), ('salary_coefficient', 'Salary coeff.')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[('id', "''"), ('Title', "''")]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('getStartDate', 'getStartDate'), ('getStopDate', 'getStopDate')]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <global_attributes type="list">[]</global_attributes> + <height type="int">5</height> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>folder_contents</list_action> + <list_cookie>CONTACT_LIST</list_cookie> + <list_method type="method">searchFolder</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[('Career', 'Career')]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <reverse type="int">0</reverse> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>folder_selection</selection_name> + <sort type="list">[]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Career step list</title> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/person_viewDetails.form b/product/ERP5/skins/erp5_crm/person_viewDetails.form new file mode 100755 index 0000000000..cea7358416 --- /dev/null +++ b/product/ERP5/skins/erp5_crm/person_viewDetails.form @@ -0,0 +1,282 @@ +<?xml version="1.0"?> + +<form> + <title>Details</title> + <row_length>4</row_length> + <name>person_viewDetails</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>id</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Usual Name</title> + <truncate type="int">0</truncate> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_first_name</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Personal Name</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>here/getFirstName</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_last_name</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Surname</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>here/getLastName</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_middle_name</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Middle Name</title> + <truncate type="int">0</truncate> + </values> + <tales> + <default>here/getMiddleName</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_prefix</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Prefix</title> + <truncate type="int">0</truncate> + </values> + <tales> + <default>here/getPrefix</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_suffix</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Suffix</title> + <truncate type="int">0</truncate> + </values> + <tales> + <default>here/getSuffix</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_social_code</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Social code</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <external_validator></external_validator> + <extra></extra> + <height type="int">3</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Comments</title> + <width type="int">100</width> + </values> + <tales> + <default>here/Description</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/project_line_view.form b/product/ERP5/skins/erp5_crm/project_line_view.form new file mode 100755 index 0000000000..4bc356cafa --- /dev/null +++ b/product/ERP5/skins/erp5_crm/project_line_view.form @@ -0,0 +1,326 @@ +<?xml version="1.0"?> + +<form> + <title>Project Line</title> + <row_length>4</row_length> + <name>project_line_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype>multipart/form-data</enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>Left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Id</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_target_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Start</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_target_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Stop</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>Right</title> + <fields> + + <field><id>my_source_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>person</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Collaborateur</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_base_price</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Taux horaire ou journalier</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>my_quantity_unit</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[('Heure', 'Heure'), ('Journ\xe9e', 'Journ\xe9e')]</items> + <required type="int">1</required> + <size type="int">2</size> + <title>Unité</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_target_quantity</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Quantity</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>my_destination_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation')]</portal_type> + <required type="int">0</required> + <title>Lieu</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Description</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/project_list.form b/product/ERP5/skins/erp5_crm/project_list.form new file mode 100755 index 0000000000..68d1beb27b --- /dev/null +++ b/product/ERP5/skins/erp5_crm/project_list.form @@ -0,0 +1,81 @@ +<?xml version="1.0"?> + +<form> + <title>Project</title> + <row_length>4</row_length> + <name>project_list</name> + <pt>form_list</pt> + <action>doSelect</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'ID'), ('title', 'Title'), ('default_destination_title', 'Real Client'), ('default_destination_section_title', 'Invoiced Client'), ('getStartDate', 'Start Date'), ('getStopDate', 'Stop Date')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>list</list_action> + <list_method type="method">portal_catalog</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[('Project', 'Project')]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">1</search> + <search_columns type="list">[]</search_columns> + <select type="int">1</select> + <selection_name>project_selection</selection_name> + <sort type="list">[]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Project List</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/project_report_line_view.form b/product/ERP5/skins/erp5_crm/project_report_line_view.form new file mode 100755 index 0000000000..21a44becd6 --- /dev/null +++ b/product/ERP5/skins/erp5_crm/project_report_line_view.form @@ -0,0 +1,394 @@ +<?xml version="1.0"?> + +<form> + <title>line of a project report</title> + <row_length>4</row_length> + <name>project_report_line_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Project report line Id</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>dmy</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>start date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>dmy</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>stop date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_default_order_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>order</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>project</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Project', 'Project')]</portal_type> + <required type="int">0</required> + <title>Project</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>here/getDefaultOrderTitle</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_section_id</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default>Billiable</default> + <description>This field describes if the line expense can be billiable to the invoiced client</description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[('Billiable', 'Billiable'), ('Non Billiable', 'Non Billiable')]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Billiable ?</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_destination_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description>The client for which the expense was done</description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation')]</portal_type> + <required type="int">0</required> + <title>Client</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_quantity</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>quantity</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>my_quantity_unit</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default>EUR</default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>currency</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:map(lambda x: (x.id,'currency/%s' % x.id),here.currency.objectValues())</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_expense_type</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Expense Type</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>here/portal_categories/expense_type/getCategoryChildTitleItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>description</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>destination_price</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Reimboursement</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>source_price</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Amount</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/project_report_list.form b/product/ERP5/skins/erp5_crm/project_report_list.form new file mode 100755 index 0000000000..4fb6570a32 --- /dev/null +++ b/product/ERP5/skins/erp5_crm/project_report_list.form @@ -0,0 +1,81 @@ +<?xml version="1.0"?> + +<form> + <title>Project Report</title> + <row_length>4</row_length> + <name>project_report_list</name> + <pt>form_list</pt> + <action>doSelect</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'Id'), ('Start_date', 'Start Date'), ('Stop_date', 'Stop Date'), ('Source_section_title', 'name of the employee'), ('project_report_state', 'state'), ('TotalBilliableQuantity', 'Billiable Expense'), ('TotalNonBilliableQuantity', 'Non Billiable Expense'), ('TotalQuantity', 'Total')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>list</list_action> + <list_method type="method">portal_catalog</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[('Project Report', 'Project Report')]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>project report selection</selection_name> + <sort type="list">[]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Project Report List</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/project_report_view.form b/product/ERP5/skins/erp5_crm/project_report_view.form new file mode 100755 index 0000000000..66d1d8ceda --- /dev/null +++ b/product/ERP5/skins/erp5_crm/project_report_view.form @@ -0,0 +1,353 @@ +<?xml version="1.0"?> + +<form> + <title>View of a project report</title> + <row_length>4</row_length> + <name>project_report_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>Left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Id of a project report</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_source_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>person</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Worker name</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_source_section_id</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source_section</base_category> + <catalog_index>Id</catalog_index> + <css_class></css_class> + <default></default> + <default_module>person</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('person', 'person')]</portal_type> + <required type="int">0</required> + <title>Worker Id</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>Right</title> + <fields> + + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>dmy</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>start date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>dmy</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>stop date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>project_report_state</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Project Report State</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>python:here.portal_workflow.getInfoFor(here, 'project_report_state')</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>Center</title> + <fields> + + <field><id>TotalBilliableQuantity</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Billiable Expense</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>TotalNonBilliableQuantity</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Non Billiable Expense</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>TotalQuantity</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Total Expense</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>Bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[('id', 'id'), ('Title', 'Title'), ('target_quantity', 'target_quantity')]</all_columns> + <all_editable_columns type="list">[('target_quantity', 'target_quantity')]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('Start_date', 'Date'), ('Default_order_title', 'Projet'), ('target_quantity', 'target_quantity'), ('Title', 'Title')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('target_quantity', 'target_quantity')]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>list</list_action> + <list_method type="method">searchFolder</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[('Project Report Line', 'Project Report Line')]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">1</search> + <search_columns></search_columns> + <select type="int">1</select> + <selection_name>project_report_selection</selection_name> + <sort type="list">[]</sort> + <stat_method></stat_method> + <title>listbox</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>Hidden</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/project_view.form b/product/ERP5/skins/erp5_crm/project_view.form new file mode 100755 index 0000000000..9f875749bf --- /dev/null +++ b/product/ERP5/skins/erp5_crm/project_view.form @@ -0,0 +1,377 @@ +<?xml version="1.0"?> + +<form> + <title>View of a project</title> + <row_length>4</row_length> + <name>project_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Id of the project</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Project Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation')]</portal_type> + <required type="int">0</required> + <title>Invoiced Client</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation')]</portal_type> + <required type="int">0</required> + <title>Real Client</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>dmy</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Start Date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_stop_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>dmy</input_order> + <input_style>text</input_style> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Stop Date</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + <field><id>TotalEstimatedTime</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description>The total estimated time spent on the project</description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Estimated Time</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>TotalBilliableTime</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description>The estimated revenue that project brings to the company</description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Revenue of Billiable Time</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>TotalEstimatedBilliableTime</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description>The estimated billiable time that project brings to the company</description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Estimated Billiable Time</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[('id', 'id'), ('Title', 'Title'), ('source_title', 'Colleague'), ('target_quantity', 'Estimated Time'), ('destination_title', 'Location')]</all_columns> + <all_editable_columns type="list">[('target_quantity', 'Estimated Time')]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('Title', 'Task Title'), ('source_title', 'Colleague'), ('target_quantity', 'Estimated Time'), ('quantity_unit', 'Unit'), ('destination_title', 'Location')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('target_quantity', 'Estimated Time')]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>list</list_action> + <list_method type="method">searchFolder</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[('Project Line', 'Project Line')]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">1</search> + <search_columns></search_columns> + <select type="int">1</select> + <selection_name>project_selection</selection_name> + <sort type="list">[]</sort> + <stat_method></stat_method> + <title>listbox</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + <field><id>listbox_target_quantity</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_quantity</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/support_request_list.form b/product/ERP5/skins/erp5_crm/support_request_list.form new file mode 100755 index 0000000000..5a569563ad --- /dev/null +++ b/product/ERP5/skins/erp5_crm/support_request_list.form @@ -0,0 +1,86 @@ +<?xml version="1.0"?> + +<form> + <title>Support Request</title> + <row_length>4</row_length> + <name>support_request_list</name> + <pt>form_list</pt> + <action>doSelect</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[('Description', 'Description')]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('Title', 'Title'), ('sale_state', 'State'), ('Description', 'Description')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[('Title', "''"), ('sale_state', "''"), ('Description', "''")]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <global_attributes type="list">[]</global_attributes> + <height type="int">5</height> + <hidden type="int">0</hidden> + <lines type="int">30</lines> + <list_action>list</list_action> + <list_cookie>PERSON_LIST</list_cookie> + <list_method type="method">portal_catalog</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[('Support Request', 'Support Request')]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <reverse type="int">0</reverse> + <search type="int">1</search> + <search_columns type="list">[]</search_columns> + <select type="int">1</select> + <selection_name>support_request_selection</selection_name> + <sort type="list">[]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Support Request List</title> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/support_request_view.form b/product/ERP5/skins/erp5_crm/support_request_view.form new file mode 100755 index 0000000000..170ce9dd7d --- /dev/null +++ b/product/ERP5/skins/erp5_crm/support_request_view.form @@ -0,0 +1,255 @@ +<?xml version="1.0"?> + +<form> + <title>Support Request</title> + <row_length>4</row_length> + <name>General</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>Left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>ID</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>here/id</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">30</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Usual Name</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>here/Title</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>Right</title> + <fields> + + <field><id>my_client_person_title_list</id> <type>MultiRelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>client</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default type="list">[]</default> + <default_module>person</default_module> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <portal_type type="list">[('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Client persons</title> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <view_separator><br /> +</view_separator> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + <default>here/getClientPersonTitleList</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>my_client_organisation_title_list</id> <type>MultiRelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>client</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default type="list">[]</default> + <default_module>organisation</default_module> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <portal_type type="list">[('Organisation', 'Organisation')]</portal_type> + <required type="int">0</required> + <title>Client organisations</title> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <view_separator><br /> +</view_separator> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + <default>here/getClientOrganisationTitleList</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>Middle</title> + <fields> + + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">3</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Comments</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">100</width> + </values> + <tales> + <default>here/Description</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[('id', 'id'), ('portal_type', 'Type'), ('Title', 'Title')]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('portal_type', 'Type'), ('Title', 'Title')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <global_attributes type="list">[]</global_attributes> + <height type="int">5</height> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>folder_contents</list_action> + <list_cookie>CONTACT_LIST</list_cookie> + <list_method type="method">getFollowUpRelatedValueList</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <reverse type="int">0</reverse> + <search type="int">0</search> + <search_columns></search_columns> + <select type="int">0</select> + <selection_name>contact_list_selection</selection_name> + <sort type="list">[]</sort> + <stat_method></stat_method> + <title>Contacts</title> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_crm/z_person_career_log.zsql b/product/ERP5/skins/erp5_crm/z_person_career_log.zsql new file mode 100755 index 0000000000..c6e7095718 --- /dev/null +++ b/product/ERP5/skins/erp5_crm/z_person_career_log.zsql @@ -0,0 +1,14 @@ +<dtml-comment> +title:Registre du personnel +connection_id:MySQL +max_rows:10 +max_cache:0 +cache_time:1 +class_name:ZSQLBrain +class_file:zsqlbrain.py +</dtml-comment> +<params></params> +SELECT * +FROM catalog +WHERE portal_type = 'Assignment' +ORDER BY Date \ No newline at end of file diff --git a/product/ERP5/skins/erp5_trade/AccountingTransaction_addPaymentTransaction.py b/product/ERP5/skins/erp5_trade/AccountingTransaction_addPaymentTransaction.py new file mode 100755 index 0000000000..17bbe8982e --- /dev/null +++ b/product/ERP5/skins/erp5_trade/AccountingTransaction_addPaymentTransaction.py @@ -0,0 +1,25 @@ +## Script (Python) "AccountingTransaction_addPaymentTransaction" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=folder, id +##title= +## +product = container.manage_addProduct[ 'ERP5' ] + +product.addAccountingTransaction(id) +my_transaction = folder[id] + +my_transaction.newContent(portal_type='Accounting Transaction Line', + source='account/prestation_service', + id='receivable') +my_transaction.newContent(portal_type='Accounting Transaction Line', + source='account/achat_pc_storever', + id='payable') +my_transaction.newContent(portal_type='Accounting Transaction Line', + source='account/banques_etablissements_financiers', + id='bank') + +return my_transaction diff --git a/product/ERP5/skins/erp5_trade/DeliveryLine_asCellRange.py b/product/ERP5/skins/erp5_trade/DeliveryLine_asCellRange.py new file mode 100755 index 0000000000..18bcc4c5da --- /dev/null +++ b/product/ERP5/skins/erp5_trade/DeliveryLine_asCellRange.py @@ -0,0 +1,25 @@ +## Script (Python) "DeliveryLine_asCellRange" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +line_ids = context.order_line_matrix_item_list(base_category_list = ('tax_category', 'coloris', 'variante'), base=1) +column_ids = context.order_line_matrix_item_list(base_category_list = ('salary_range','taille',), base=1) +tab_ids = context.order_line_matrix_item_list(base_category_list = ('salary_range','tax_category', 'taille','coloris','variante'), + base=1, include=0) + +line_ids = map(lambda x: x[0], line_ids) +column_ids = map(lambda x: x[0], column_ids) +tab_ids = map(lambda x: x[0], tab_ids) + + +if len(tab_ids) is 0: + return [line_ids, column_ids] +elif tab_ids[0] is None: + return [line_ids, column_ids] +else: + return [line_ids, column_ids, tab_ids] diff --git a/product/ERP5/skins/erp5_trade/DeliveryLine_zGetTotal.zsql b/product/ERP5/skins/erp5_trade/DeliveryLine_zGetTotal.zsql new file mode 100755 index 0000000000..6df107da08 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/DeliveryLine_zGetTotal.zsql @@ -0,0 +1,21 @@ +<dtml-comment> +title: +connection_id:MySQL +max_rows:1000 +max_cache:100 +cache_time:0 +class_name: +class_file: +</dtml-comment> +<params>uid</params> +SELECT + SUM(quantity) AS total_quantity, + SUM(total_price) AS total_price, + SUM(target_quantity) AS target_total_quantity, + SUM(target_total_price) AS target_total_price, + AVG(price) AS average_price +FROM catalog, movement +WHERE + catalog.parent_uid = <dtml-sqlvar uid type="int"> +AND + catalog.uid = movement.uid diff --git a/product/ERP5/skins/erp5_trade/Delivery_zGetTotal.zsql b/product/ERP5/skins/erp5_trade/Delivery_zGetTotal.zsql new file mode 100755 index 0000000000..3dfe42fe07 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Delivery_zGetTotal.zsql @@ -0,0 +1,29 @@ +<dtml-comment> +title: +connection_id:MySQL +max_rows:1000 +max_cache:100 +cache_time:0 +class_name: +class_file: +</dtml-comment> +<params>uid +resource_uid +variation_text</params> +SELECT + SUM(quantity) AS inventory, + SUM(quantity) AS total_quantity, + SUM(total_price) AS total_price, + SUM(target_quantity) AS target_total_quantity, + SUM(target_total_price) AS target_total_price, + AVG(price) AS average_price +FROM movement, catalog +WHERE + movement.delivery_uid = <dtml-sqlvar uid type="int"> +<dtml-if resource_uid>AND (<dtml-in resource_uid> movement.resource_uid = <dtml-sqlvar sequence-item type="int"><dtml-if sequence-end><dtml-else> OR </dtml-if></dtml-in>) +</dtml-if><dtml-if variation_text>AND movement.variation_text = <dtml-sqlvar variation_text type="string"> +</dtml-if> +AND movement.is_accountable = 1 +AND catalog.portal_type <> "Container" +AND catalog.portal_type <> "Simulation Movement" +AND catalog.uid = movement.uid \ No newline at end of file diff --git a/product/ERP5/skins/erp5_trade/Invoice_addPurchaseInvoice.py b/product/ERP5/skins/erp5_trade/Invoice_addPurchaseInvoice.py new file mode 100755 index 0000000000..a4d4950e44 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Invoice_addPurchaseInvoice.py @@ -0,0 +1,28 @@ +## Script (Python) "Invoice_addPurchaseInvoice" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=folder, id +##title= +## +product = container.manage_addProduct[ 'ERP5' ] + +product.addInvoice(id) +my_transaction = folder[id] + +my_transaction.newContent(portal_type='Purchase Invoice Transaction Line', + source='account/dette_fournisseur', + id='expense') +my_transaction.newContent(portal_type='Purchase Invoice Transaction Line', + source='account/achat_pc_storever', + id='payable') +my_transaction.newContent(portal_type='Purchase Invoice Transaction Line', + source='account/tva_collectee_196', + id='collected_vat') +my_transaction.newContent(portal_type='Purchase Invoice Transaction Line', + source='account/tva_recuperable_196', + id='refundable_vat') + +return my_transaction diff --git a/product/ERP5/skins/erp5_trade/Invoice_addSaleInvoice.py b/product/ERP5/skins/erp5_trade/Invoice_addSaleInvoice.py new file mode 100755 index 0000000000..fe186c2728 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Invoice_addSaleInvoice.py @@ -0,0 +1,25 @@ +## Script (Python) "Invoice_addSaleInvoice" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=folder, id +##title= +## +product = container.manage_addProduct[ 'ERP5' ] + +product.addInvoice(id) +my_transaction = folder[id] + +my_transaction.newContent(portal_type='Sale Invoice Transaction Line', + source='account/ventes_composants_storever', + id='income') +my_transaction.newContent(portal_type='Sale Invoice Transaction Line', + source='account/prestation_service', + id='receivable') +my_transaction.newContent(portal_type='Sale Invoice Transaction Line', + source='account/tva_collectee_196', + id='collected_vat') + +return my_transaction diff --git a/product/ERP5/skins/erp5_trade/Invoice_viewAccountingLineList.form b/product/ERP5/skins/erp5_trade/Invoice_viewAccountingLineList.form new file mode 100755 index 0000000000..423791c46c --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Invoice_viewAccountingLineList.form @@ -0,0 +1,565 @@ +<?xml version="1.0"?> + +<form> + <title>Sale Invoice Transaction</title> + <row_length>4</row_length> + <name>sale_invoice_list</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_source_section</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <size type="int">1</size> + <title>Vendor</title> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python: [['Nexedi', 'organisation/nexedi']]</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_source_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Transaction Reference</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <portal_type type="list">[('Organisation', 'Organisation'), ('Person', 'Person')]</portal_type> + <read_only type="int">0</read_only> + <relation_setter_id></relation_setter_id> + <required type="int">0</required> + <title>Customer</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">1</read_only> + <required type="int">0</required> + <title>Invoice Number</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_resource</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Currency</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:[('','')]+map(lambda x:(x.id,'currency/%s' %x.id),here.currency.objectValues())</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">1</default_now> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>ymd</input_order> + <input_style>text</input_style> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Invoice Date</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">5</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Description</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>simulation_state</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">1</read_only> + <required type="int">0</required> + <title>State</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>python:here.portal_workflow.getInfoFor(here, 'simulation_state')</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">0</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Customer Transaction Reference</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('source', 'Account'), ('source_debit', 'Debit'), ('source_credit', 'Credit')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('source_debit', 'Debit'), ('source_credit', 'Credit'), ('source', 'Source')]</editable_columns> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[('resource', 'resource')]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>folder_contents</list_action> + <list_method type="method">searchInvoiceTransaction</list_method> + <meta_types type="list">[]</meta_types> + <not_viewable type="int">0</not_viewable> + <portal_types type="list">[('Sale Invoice Transaction Line', 'Sale Invoice Transaction Line'), ('Accounting Transaction Line', 'Accounting Transaction Line')]</portal_types> + <read_only type="int">0</read_only> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>purchase_invoice_transaction_line_selection</selection_name> + <sort type="list">[('id', 'id')]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Sale Invoice Transaction Lines</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + <field><id>listbox_destination</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_destination</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineDestinationItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_source</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_source</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineSourceItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_source_credit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>listbox_source_debit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>listbox_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_trade/Invoice_viewInvoiceLineList.form b/product/ERP5/skins/erp5_trade/Invoice_viewInvoiceLineList.form new file mode 100755 index 0000000000..ab92a0b04f --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Invoice_viewInvoiceLineList.form @@ -0,0 +1,721 @@ +<?xml version="1.0"?> + +<form> + <title>Sale Invoice Transaction</title> + <row_length>4</row_length> + <name>sale_invoice_list</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Identity</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_source_section</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <size type="int">1</size> + <title>Vendor</title> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python: [['Nexedi', 'organisation/nexedi']]</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">1</read_only> + <required type="int">0</required> + <title>Invoice Reference</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <height type="int">3</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Description</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>my_source_administration_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source_administration</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>person</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Sale Manager</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_start_date</id> <type>DateTimeField</type> + <values> + <allow_empty_time type="int">0</allow_empty_time> + <alternate_name></alternate_name> + <ampm_time_style type="int">0</ampm_time_style> + <css_class></css_class> + <date_only type="int">1</date_only> + <date_separator>/</date_separator> + <default_now type="int">0</default_now> + <description></description> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <hidden type="int">0</hidden> + <input_order>dmy</input_order> + <input_style>text</input_style> + <not_viewable type="int">0</not_viewable> + <read_only type="int">0</read_only> + <required type="int">0</required> + <time_separator>:</time_separator> + <title>Invoice Date</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_datetime">You did not enter a valid date and time.</message> + <message name="datetime_out_of_range">The date and time you entered were out of range.</message> + </messages> + </field> + <field><id>my_price_currency</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Currency</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:[('','')]+map(lambda x:(x.id,'currency/%s' %x.id),here.currency.objectValues())</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>simulation_state</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">0</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <read_only type="int">1</read_only> + <required type="int">0</required> + <title>State</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <default>python:here.portal_workflow.getInfoFor(here, 'simulation_state')</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_causality_id</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>causality</base_category> + <catalog_index>id</catalog_index> + <css_class></css_class> + <default></default> + <default_module>sale_packing_list</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <portal_type type="list">[('Sale Packing List', 'Sale Packing List')]</portal_type> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>Packing List No</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation')]</portal_type> + <required type="int">0</required> + <title>Deliver to</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <not_viewable type="int">0</not_viewable> + <portal_type type="list">[('Organisation', 'Organisation'), ('Person', 'Person')]</portal_type> + <read_only type="int">0</read_only> + <required type="int">0</required> + <title>For the account of</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_value_added_tax_recoverable</id> <type>CheckBoxField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default type="int">0</default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <title>VAT in use</title> + </values> + <tales> + <default>here/getValueAddedTaxRecoverable</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + <field><id>my_value_added_tax_ratio</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>VAT ratio</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>my_incoterm</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Incoterm</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:here.portal_categories.incoterm.getCategoryChildItemList(display_id = 'getTitle', display_none_category=1)</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_delivery_mode</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>Delivery Mode</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>here/portal_categories/delivery_mode/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'id'), ('resource_title', 'Resource'), ('quantity', 'Quantity'), ('quantity_unit', 'Unit')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[('quantity', 'quantity')]</editable_columns> + <editable_expression></editable_expression> + <editable_permission type="list">[]</editable_permission> + <editable_role type="list">[]</editable_role> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>folder_contents</list_action> + <list_method type="method">searchFolder</list_method> + <meta_types type="list">[]</meta_types> + <not_viewable type="int">0</not_viewable> + <portal_types type="list">[('Invoice Line', 'Invoice Line')]</portal_types> + <read_only type="int">0</read_only> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>sale_invoice_line_selection</selection_name> + <sort type="list">[('id', 'id')]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Sale Invoice Transaction Lines</title> + <viewable_expression></viewable_expression> + <viewable_permission type="list">[]</viewable_permission> + <viewable_role type="list">[]</viewable_role> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + <field><id>listbox_title</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Title</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>listbox_source</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_source</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineSourceItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_destination</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>listbox_destination</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python:cell.getObject().getInvoiceTransactionLineDestinationItemList()</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>listbox_source_debit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>listbox_source_credit</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">5</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>listbox_source_debit</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_trade/Invoice_zGetDescription.py b/product/ERP5/skins/erp5_trade/Invoice_zGetDescription.py new file mode 100755 index 0000000000..9fd2231d88 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Invoice_zGetDescription.py @@ -0,0 +1,39 @@ +## Script (Python) "Invoice_zGetDescription" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +from string import join + +description = context.getComment('') +return description + +# Try to cut the comment without cutting the words +# pbl: capital letter are larger, and the test on the length of sentence isn't good ... +def recursive_string_cut(b,s): + l = 80 + if len(s) < l: + return b+s + else: + c = s[:l].split(' ') + if len(c) < 2: + # I don't think that a word with more than 80 caracters can exist ... and it can crash the memory + return s[:l] + else: + return recursive_string_cut(b+join(c[:-2],' ')+'\n', join(c[-2:],' ')+s[l:] ) + + +# get all the lines +description_lines = description.split('\n') + +# cut the too long lines +result_description_lines = map( ( lambda x: recursive_string_cut('',x) ),description_lines) + +# recreate a string +result = join(result_description_lines,'\n') + +return result diff --git a/product/ERP5/skins/erp5_trade/Invoice_zGetDueDate.py b/product/ERP5/skins/erp5_trade/Invoice_zGetDueDate.py new file mode 100755 index 0000000000..fdd031d426 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Invoice_zGetDueDate.py @@ -0,0 +1,43 @@ +## Script (Python) "Invoice_zGetDueDate" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +packing_list_list = context.getCausalityValueList(portal_type=['Sale Packing List','Sales Packing List']) + +if len(packing_list_list) > 0: + packing_list = context.getCausalityValueList(portal_type=['Sale Packing List','Sales Packing List'])[0] + order = packing_list.SalesPackingList_getCausalitySalesOrder() + from DateTime import DateTime + due_date = packing_list.getTargetStopDate( DateTime() ) + pat = order.getPaymentAdditionalTerm() +else: + due_date = context.getStartDate() + pat = None + +due_date += context.getPaymentTerm(30) +peom = context.getPaymentEndOfMonth() + +if peom: + i = 0 + month = due_date.month() + while (month == (due_date + i).month()): + i += 1 + due_date = (due_date + i - 1) + + if pat != None: + due_date += pat + +else: + if pat != None: + i = 0 + month = due_date.month() + while (month == (due_date + i).month()): + i -= 1 + due_date = (due_date + i + pat) + +return due_date diff --git a/product/ERP5/skins/erp5_trade/Invoice_zGetEscompteDescription.py b/product/ERP5/skins/erp5_trade/Invoice_zGetEscompteDescription.py new file mode 100755 index 0000000000..7865d5a1d2 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Invoice_zGetEscompteDescription.py @@ -0,0 +1,25 @@ +## Script (Python) "Invoice_zGetEscompteDescription" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +tmp_list = context.contentValues(filter={'portal_type':'Remise', 'discount_type_title':'Escompte'}) + +escompte_list = filter(lambda item: item.getDiscountType() == 'Escompte', tmp_list) + +if escompte_list != []: + escompte_object = escompte_list[0] + if escompte_object.getDescription() != None: + escompte_description = string.replace(escompte_object.getDescription(),'%','%%')[:45] + elif escompte_object.getDiscountRatio() != None: + escompte_description = '%.2f' % (escompte_object.getDiscountRatio() * 100) + '%% sous 10 jours' + else: + escompte_description = '2%% sous 10 jours' +else: + escompte_description = '2%% sous 10 jours' + +return escompte_description diff --git a/product/ERP5/skins/erp5_trade/Invoice_zGetPaymentTime.py b/product/ERP5/skins/erp5_trade/Invoice_zGetPaymentTime.py new file mode 100755 index 0000000000..f83260ebee --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Invoice_zGetPaymentTime.py @@ -0,0 +1,31 @@ +## Script (Python) "Invoice_zGetPaymentTime" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +packing_list = context.getCausalityValueList(portal_type=['Sale Packing List','Sales Packing List'])[0] + +#order = packing_list.getCausalityValueList(portal_type=['Sale Order','Sales Order'])[0] +order = packing_list.SalesPackingList_getCausalitySalesOrder() +payment_term = context.getPaymentTerm(30) + +payment_end_of_month = context.getPaymentEndOfMonth() + +pat = order.getPaymentAdditionalTerm() + +result = '%i jours ' % payment_term + +if pat == None: + if payment_end_of_month: + result += 'en fin de mois' + else: + result += 'net' +else: + result += 'le %i' % pat + + +return result diff --git a/product/ERP5/skins/erp5_trade/Invoice_zGetSourceSectionDescription.py b/product/ERP5/skins/erp5_trade/Invoice_zGetSourceSectionDescription.py new file mode 100755 index 0000000000..0495701242 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Invoice_zGetSourceSectionDescription.py @@ -0,0 +1,31 @@ +## Script (Python) "Invoice_zGetSourceSectionDescription" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +source_section_title = context.getSourceSectionTitle() + + +case = { + 'Coramy': ('Coramy', + '5 bis, rue Denis Cordonnier - 59820 Gravelines - Tél. : 33(0)3 28 51 91 51 - Fax : 33(0)3 28 23 34 96', + 'MAILLOTS DE BAIN - GYM - SWIMSUITS - FITNESS', + 'S.A.S. au capital de 435.200 € - T.V.A. FR 67 611 750 274 - R.C. Dunkerque 611 750 274 - SIRET 611 750 274 00023 - CNUF 15971', + '40'), + 'BLS': ('BLS' , + '5 bis, rue Denis Cordonnier - 59820 Gravelines - Tél. : 33(0)3 28 51 86 26 - Fax : 33(0)3 28 23 34 96', + 'LICENSE MAILLOTS DE BAIN DIM FEMME & HOMME', + 'S.A.R.L. au capital de 10.000 € - T.V.A. FR 51 442 959 243 - R.C. Dunkerque 442 959 243 - SIRET 442 959 243 00019' + '60'), + 'Houvenaegel':('Houvenaegel' , + '5 bis, rue Denis Cordonnier - 59820 Gravelines - Tél. : 33(0)3 28 51 91 55 - Fax : 33(0)3 28 23 34 96', + 'MAILLOTS DE BAIN - GYM - SWIMSUITS - FITNESS', + 'S.A.R.L. au capital de 7.622,45 € - T.V.A. FR 07 422 769 810 - R.C. Dunkerque 422 769 810 - SIRET 422 769 810 00025', + '20') +} + +return case[ source_section_title ] diff --git a/product/ERP5/skins/erp5_trade/Invoice_zGetTotal.zsql b/product/ERP5/skins/erp5_trade/Invoice_zGetTotal.zsql new file mode 100755 index 0000000000..491496a3fb --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Invoice_zGetTotal.zsql @@ -0,0 +1,13 @@ +<dtml-comment> +title: +connection_id:MySQL +max_rows:100000 +max_cache:100 +cache_time:0 +class_name:ZSQLBrain +class_file:zsqlbrain.py +</dtml-comment> +<params>uid</params> +SELECT sum(movement.quantity) AS total_quantity, sum(movement.total_price) AS total_price from movement +WHERE movement.delivery_uid = <dtml-var uid> +AND movement.has_cell_content = 0 \ No newline at end of file diff --git a/product/ERP5/skins/erp5_trade/Invoice_zGetTotalNetPrice.py b/product/ERP5/skins/erp5_trade/Invoice_zGetTotalNetPrice.py new file mode 100755 index 0000000000..f8158636bf --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Invoice_zGetTotalNetPrice.py @@ -0,0 +1,23 @@ +## Script (Python) "Invoice_zGetTotalNetPrice" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +# price = context.getTotalPrice() +price = context.Invoice_zGetTotal()[0].total_price + +discount_list_tmp = context.contentValues(filter={'portal_type':'Remise'}) +discount_list = filter(lambda x: x not in [None,0] ,discount_list_tmp) + +if len(discount_list) > 1: + discount_list.sort(lambda x,y: cmp(x.getIntIndex(),y.getIntIndex())) + +for discount_line in discount_list: + if discount_line.getImmediateDiscount(): + price *= (1 - discount_line.getDiscountRatio()) + +return price diff --git a/product/ERP5/skins/erp5_trade/Invoice_zGetTotalVat.py b/product/ERP5/skins/erp5_trade/Invoice_zGetTotalVat.py new file mode 100755 index 0000000000..6c08aad87f --- /dev/null +++ b/product/ERP5/skins/erp5_trade/Invoice_zGetTotalVat.py @@ -0,0 +1,21 @@ +## Script (Python) "Invoice_zGetTotalVat" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +price = context.Invoice_zGetTotalNetPrice() + +if context.getValueAddedTaxRecoverable(): + vat_ratio = context.getValueAddedTaxRatio() + if vat_ratio != None: + price *= vat_ratio + else: + price = 0 +else: + price = 0 + +return price diff --git a/product/ERP5/skins/erp5_trade/SaleOrder_print.pt b/product/ERP5/skins/erp5_trade/SaleOrder_print.pt new file mode 100755 index 0000000000..33d61b9266 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/SaleOrder_print.pt @@ -0,0 +1,148 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> + +<html> + + <head> + <meta http-equiv="content-type" content="text/html;charset=ISO-8859-1"> + <title tal:content="here/getTitle">Nexedi</title> + + </head> + + <body bgcolor="#ffffff" + tal:define="from_organisation python:here.restrictedTraverse('/nexedi/organisation/nexedi'); + client_invoice python:here.getDefaultValue('destination',spec=['Organisation', 'Person']); + client_delivery python:here.getDefaultValue('destination',spec=['Organisation', 'Person']); + order_line_list python:here.contentValues(filter={'portal_type':'Sale Order Line'}); + total_price python:here.getDefaultTotalPrice()"> + + + <table width=100%> + <tr> + <td colspan=3><img src="logo.png"></td> + </tr> + <tr> + <td align=left tal:content="python: from_organisation.getCorporateName()" colspan="2" /> + <td align=right tal:content="python: 'Shipping Date: %s' % here.getStartDate()"/> + </tr> + <tr> + <td align=left tal:content="python: 'Tel: %s' % from_organisation.getDefaultTelephone().asText()" colspan="2"/> + <td align=right tal:content="python: 'Delivery Date: %s' % here.getStopDate()"/> + </tr> + <tr> + <td tal:content="python: from_organisation.getDefaultAddress().getStreetAddress()" colspan="2"/> + <td align=right tal:content="python: 'Proforma No: ERP5/%s' % here.getId()"/> + </tr> + <tr> + <td tal:content="python: '%s %s' % + (from_organisation.getDefaultAddress().getZipCode(), + from_organisation.getDefaultAddress().getCity())" colspan="3"/> + </tr> + <tr> + <td tal:content="python: from_organisation.getDefaultAddress().getRegionTitle()" colspan="3"/> + </tr> + + <tr> + <th colspan=3> + <h2>PROFORMA</h2> + </th> + </tr> + + </table> + + <br/> + + <table width=100%> + <tr bgcolor=000000> + <th align=left><font color=ffffff>PROFORMA ADDRESS</font></th> + <th align=left><font color=ffffff>DELIVERY ADDRESS</font></th> + </tr> + + <tr> + <td align=left tal:content="client_invoice/getCorporateName | client_invoice/getTitle"/> + <td align=left tal:content="client_delivery/getCorporateName | client_delivery/getTitle"/> + </tr> + <tr> + <td align=left tal:content="python: client_invoice.getDefaultAddress().getStreetAddress()" tal:on-error="nothing"/> + <td align=left tal:content="python: client_delivery.getDefaultAddress().getStreetAddress()" tal:on-error="nothing"/> + </tr> + <tr> + <td align=left> + <tal:block tal:replace="python: client_invoice.getDefaultAddress().getZipCode()" tal:on-error="nothing"/> + <tal:block tal:replace="python: client_invoice.getDefaultAddress().getCity()" tal:on-error="nothing"/> + </td> + <td align=left> + <tal:block tal:replace="python: client_delivery.getDefaultAddress().getZipCode()" tal:on-error="nothing"/> + <tal:block tal:replace="python: client_delivery.getDefaultAddress().getCity()" tal:on-error="nothing"/> + </td> + </tr> + <tr> + <td align=left tal:content="python: client_invoice.getDefaultAddress().getRegionTitle()" tal:on-error="nothing"/> + <td align=left tal:content="python: client_delivery.getDefaultAddress().getRegionTitle()" tal:on-error="nothing"/> + </tr> + </table> + + <br/> + + <table width=100%> + <tr bgcolor=000000> + <th align=left nowrap><font color=ffffff>Number</font></th> + <th align=left nowrap><font color=ffffff>Description</font></th> + <th nowrap><font color=ffffff>Quantity</th> + <th nowrap><font color=ffffff>Unit</font></th> + <th nowrap><font color=ffffff>Unit Price</font></th> + <th nowrap><font color=ffffff>Total Price</font></th> + </tr> + <tal:block tal:repeat="line order_line_list"> + <tr valign=top tal:condition="python:line.getQuantity()>0"> + + <td align=left tal:content="python:line.getId()"></td> + <!-- <td> </td> --> + <td tal:content="python: line.getResourceTitle()"></td> + <td align=right tal:content="python: '%.0f' % line.getQuantity()"></td> + <td align=right tal:content="python: line.getQuantityUnit()"></td> + <td align=right tal:content="python: '%.02f' % line.getPrice()"></td> + <td align=right tal:content="python: '%.02f' % line.getTotalPrice()"></td> + </tr> + </tal:block> + <tr> + <td colspan=6><hr noshade></td> + </tr> + <tr> + <th colspan=4 align=right>Total + (<span tal:replace="here/income/getResourceId | nothing"/>)</th> + <td colspan=2 align=right tal:content="python: '%.02f' % round(here.Invoice_zGetTotal()[0].total_price, 2)" tal:on-error="nothing"></td> + </tr> + <tr> + <td colspan=1 align=left tal:content="python:here.getDescription()"></td> + <th colspan=3 align=right>VAT <tal:block tal:replace="python: ( 0.0) * 100.0"/> % (<span tal:replace="here/income/getResourceId | nothing"/>)</th> + <td colspan=2 align=right tal:content="python: '%.02f' % round(here.Invoice_zGetTotalVat(), 2)" tal:on-error="nothing"></td> + </tr> + <tr> + <td colspan=3> </td> + <td colspan=3><hr noshade></td> + </tr> + <tr> + <td colspan=3></td> + + <th colspan=1 align=right nowrap>Amount Paid + (<span tal:replace="here/income/getResourceId | nothing"/>)</th> + <th colspan=2 align=right tal:content="python: '%.02f' % (round(here.Invoice_zGetTotalVat(), 2) + round(here.Invoice_zGetTotalNetPrice(), 2))" tal:on-error="nothing"></th> + </tr> + <tr> + <td> </td> + </tr> + </table> + + <table width="100%"> + <tr> + <td><center><h6>RCS Roubaix Tourcoing 440 047 504<br> + Banque: 30027 Guichet: 00039 Compte: 00000013323 RIB: 36<br>IBAN: FR76 3002 7175 3900 0410 2760 135<br> + VAT FR72440047504</h6></center></td> + </tr> + </table> + + + +</body> + +</html> diff --git a/product/ERP5/skins/erp5_trade/discount_view.form b/product/ERP5/skins/erp5_trade/discount_view.form new file mode 100755 index 0000000000..34fe4e0b9d --- /dev/null +++ b/product/ERP5/skins/erp5_trade/discount_view.form @@ -0,0 +1,229 @@ +<?xml version="1.0"?> + +<form> + <title>Remise</title> + <row_length>4</row_length> + <name>remise_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Discount</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <external_validator></external_validator> + <extra></extra> + <height type="int">3</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Description</title> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>my_int_index</id> <type>IntegerField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <end></end> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">1</required> + <start></start> + <title>Order No</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_integer">You did not enter an integer.</message> + <message name="integer_out_of_range">The integer you entered was out of range.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_discount_type</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">1</required> + <size type="int">1</size> + <title>Discount Type</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>here/portal_categories/discount_type/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_immediate_discount</id> <type>CheckBoxField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default type="int">0</default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <title>Discount deduced on invoice</title> + </values> + <tales> + <default>here/getImmediateDiscount</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + <field><id>my_discount_ratio</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Discount Ratio</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>my_discount</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Total</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_trade/getAccountingTransactionDestinationPaymentItemList.py b/product/ERP5/skins/erp5_trade/getAccountingTransactionDestinationPaymentItemList.py new file mode 100755 index 0000000000..bf2718db39 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/getAccountingTransactionDestinationPaymentItemList.py @@ -0,0 +1,24 @@ +## Script (Python) "getAccountingTransactionDestinationPaymentItemList" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +def sort(a, b): + return cmp(a[0], b[0]) + +item_list = [['', '']] + +organisation = context.getDestinationSectionValue() +if organisation is not None: + bank_account_list = organisation.contentValues(filter={'portal_type': 'Bank Account'}) + for bank_account in bank_account_list: + url = bank_account.getRelativeUrl() + label = bank_account.getIban() + item_list.append([label, url]) + +item_list.sort(sort) +return item_list diff --git a/product/ERP5/skins/erp5_trade/getAccountingTransactionSourcePaymentItemList.py b/product/ERP5/skins/erp5_trade/getAccountingTransactionSourcePaymentItemList.py new file mode 100755 index 0000000000..4e5723f031 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/getAccountingTransactionSourcePaymentItemList.py @@ -0,0 +1,24 @@ +## Script (Python) "getAccountingTransactionSourcePaymentItemList" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +def sort(a, b): + return cmp(a[0], b[0]) + +item_list = [['', '']] + +organisation = context.getSourceSectionValue() +if organisation is not None: + bank_account_list = organisation.contentValues(filter={'portal_type': 'Bank Account'}) + for bank_account in bank_account_list: + url = bank_account.getRelativeUrl() + label = bank_account.getIban() + item_list.append([label, url]) + +item_list.sort(sort) +return item_list diff --git a/product/ERP5/skins/erp5_trade/getBalanceTransactionLineSourcePaymentItemList.py b/product/ERP5/skins/erp5_trade/getBalanceTransactionLineSourcePaymentItemList.py new file mode 100755 index 0000000000..a1f6327ef0 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/getBalanceTransactionLineSourcePaymentItemList.py @@ -0,0 +1,24 @@ +## Script (Python) "getBalanceTransactionLineSourcePaymentItemList" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters= +##title= +## +def sort(a, b): + return cmp(a[0], b[0]) + +item_list = [['', '']] + +organisation = context.aq_parent.getSourceSectionValue() +if organisation is not None: + bank_account_list = organisation.contentValues(filter={'portal_type': 'Bank Account'}) + for bank_account in bank_account_list: + url = bank_account.getRelativeUrl() + label = bank_account.getIban() + item_list.append([label, url]) + +item_list.sort(sort) +return item_list diff --git a/product/ERP5/skins/erp5_trade/invoice_transaction_print.pt b/product/ERP5/skins/erp5_trade/invoice_transaction_print.pt new file mode 100755 index 0000000000..e9116a8b49 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/invoice_transaction_print.pt @@ -0,0 +1,169 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> + +<html> + + <head> + <meta http-equiv="content-type" content="text/html;charset=ISO-8859-1"> + <title tal:content="here/getTitle">Nexedi</title> + + </head> + + <body bgcolor="#ffffff" + tal:define="packing_list python:here.getDefaultValue('causality',spec=['Sale Packing List']); + invoice_line_list python:here.contentValues(filter={'portal_type':'Invoice Line'}); + from_organisation python:here.restrictedTraverse('/nexedi/organisation/nexedi'); + client_invoice python:here.getDefaultValue('destination_section',spec=['Organisation', 'Person']); + client_delivery python:here.getDefaultValue('destination_section',spec=['Organisation', 'Person']); + total_price python:here.getDefaultTotalPrice()"> + + + <table width=100%> + <tr> + <td colspan=3><img src="logo.png"></td> + </tr> + <tr> + <td align=left tal:content="python: from_organisation.getCorporateName()" colspan="2" /> + <td align=right tal:content="python: 'Invoice Date: %s' % here.getStartDate()"/> + </tr> + <tr> + <td align=left tal:content="python: 'Tel: %s' % from_organisation.getDefaultTelephone().asText()" colspan="2"/> + <td align=right tal:content="python: 'Pay Before: %s' % here.Invoice_zGetDueDate()"/> + </tr> + <tr> + <td tal:content="python: from_organisation.getDefaultAddress().getStreetAddress()" colspan="2"/> + <td align=right tal:content="python: 'Invoice No: ERP5/%s' % here.getId()"/> + </tr> + <tr> + <td tal:content="python: '%s %s' % + (from_organisation.getDefaultAddress().getZipCode(), + from_organisation.getDefaultAddress().getCity())" colspan="3"/> + </tr> + <tr> + <td tal:content="python: from_organisation.getDefaultAddress().getRegionTitle()" colspan="3"/> + </tr> + + <tr> + <th colspan=3> + <h2>INVOICE</h2> + </th> + </tr> + + </table> + + <br/> + + <table width=100%> + <tr bgcolor=000000> + <th align=left><font color=ffffff>INVOICE ADDRESS</font></th> + <th align=left><font color=ffffff>DELIVERY ADDRESS</font></th> + </tr> + + <tr> + <td align=left tal:content="client_invoice/getCorporateName | client_invoice/getTitle"/> + <td align=left tal:content="client_delivery/getCorporateName | client_delivery/getTitle"/> + </tr> + <tr> + <td align=left tal:content="python: client_invoice.getDefaultAddress().getStreetAddress()" tal:on-error="nothing"/> + <td align=left tal:content="python: client_delivery.getDefaultAddress().getStreetAddress()" tal:on-error="nothing"/> + </tr> + <tr> + <td align=left> + <tal:block tal:replace="python: client_invoice.getDefaultAddress().getZipCode()" tal:on-error="nothing"/> + <tal:block tal:replace="python: client_invoice.getDefaultAddress().getCity()" tal:on-error="nothing"/> + </td> + <td align=left> + <tal:block tal:replace="python: client_delivery.getDefaultAddress().getZipCode()" tal:on-error="nothing"/> + <tal:block tal:replace="python: client_delivery.getDefaultAddress().getCity()" tal:on-error="nothing"/> + </td> + </tr> + <tr> + <td align=left tal:content="python: client_invoice.getDefaultAddress().getRegionTitle()" tal:on-error="nothing"/> + <td align=left tal:content="python: client_delivery.getDefaultAddress().getRegionTitle()" tal:on-error="nothing"/> + </tr> + </table> + + <br/> + + <table width=100%> + <tr bgcolor=000000> + <th align=left nowrap><font color=ffffff>Number</font></th> + <th align=left nowrap><font color=ffffff>Description</font></th> + <th nowrap><font color=ffffff>Quantity</th> + <th nowrap><font color=ffffff>Unit</font></th> + <th nowrap><font color=ffffff>Unit Price</font></th> + <th nowrap><font color=ffffff>Total Price</font></th> + </tr> + <tal:block tal:condition="python: packing_list is not None"> + <span tal:define="ordered_line_list python:packing_list.contentValues(filter={'portal_type':'Delivery Line'})" + tal:repeat="line ordered_line_list"> + <tr valign=top tal:condition="python:line.getQuantity()>0"> + + <td align=left tal:content="python:line.getId()"></td> + <!-- <td> </td> --> + <td tal:content="python: line.getResourceTitle()"></td> + <td align=right tal:content="python: '%.0f' % line.getQuantity()"></td> + <td>n/a</td> + <td align=right tal:content="python: '%.02f' % line.getPrice()"></td> + <td align=right tal:content="python: '%.02f' % line.getTotalPrice()"></td> + </tr> + </span> + </tal:block> + <tal:block tal:condition="python: invoice_line_list is not None"> + <tal:block tal:repeat="line invoice_line_list"> + <tr valign=top tal:condition="python:line.getQuantity() not in (0.0, -0.0, 0)"> + + <td align=left tal:content="python:line.getId()"></td> + <!-- <td> </td> --> + <td tal:content="python: line.getResourceTitle()"></td> + <td align=right tal:content="python: '%.0f' % line.getQuantity()"></td> + <td align=right tal:content="python: line.getQuantityUnitTitle()">n/a</td> + <td align=right tal:content="python: '%.02f' % line.getPrice()"></td> + <td align=right tal:content="python: '%.02f' % line.getTotalPrice()"></td> + </tr> + </tal:block> + </tal:block> + <tr> + <td colspan=6><hr noshade></td> + </tr> + <tr> + <th colspan=4 align=right>Total + (<span tal:replace="here/income/getResourceId | nothing"/>)</th> + <td colspan=2 align=right tal:content="python: '%.02f' % round(here.getTotalPrice(), 2)" tal:on-error="nothing"></td> + </tr> + <tr> + <td colspan=1 align=left tal:content="python:here.getDescription()"></td> + <th colspan=3 align=right>VAT <tal:block tal:replace="python: (here.getValueAddedTaxRatio() or 0.0) * 100.0"/> % (<span tal:replace="here/income/getResourceId | nothing"/>)</th> + <td colspan=2 align=right tal:content="python: '%.02f' % round(here.Invoice_zGetTotalVat(), 2)" tal:on-error="nothing"></td> + </tr> + <tr> + <td colspan=3> </td> + <td colspan=3><hr noshade></td> + </tr> + <tr> + <td colspan=3>A régler dans <b tal:content="python: here.getPaymentTerm(30)">0</b> jours au plus tard. + <br><font size="-3">Conditions de réglement: par chèue, à 0 jours date de la facture. Paiement accepté en euros. + Tout retard de réglement donnera lieu à une pénalité de 1,5% du montant dû par mois. + Réserve de propriété nous conservons la pleine propriété des marchandises jusqu'au paiement intégral du prix, des taxes et accessoires.</font></td> + + <th colspan=1 align=right nowrap>Amount Paid + (<span tal:replace="here/income/getResourceId | nothing"/>)</th> + <th colspan=2 align=right tal:content="python: '%.02f' % (round(here.Invoice_zGetTotalVat(), 2) + round(here.Invoice_zGetTotalNetPrice(), 2))" tal:on-error="nothing"></th> + </tr> + <tr> + <td> </td> + </tr> + </table> + + <table width="100%"> + <tr> + <td><center><h6>RCS Roubaix Tourcoing 440 047 504<br> + Banque: 30027 Guichet: 00039 Compte: 00000013323 RIB: 36<br>IBAN: FR76 3002 7175 3900 0410 2760 135<br> + VAT FR72440047504</h6></center></td> + </tr> + </table> + + + +</body> + +</html> diff --git a/product/ERP5/skins/erp5_trade/order_line_matrix_item_list.py b/product/ERP5/skins/erp5_trade/order_line_matrix_item_list.py new file mode 100755 index 0000000000..1e90aa56b7 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/order_line_matrix_item_list.py @@ -0,0 +1,38 @@ +## Script (Python) "order_line_matrix_item_list" +##bind container=container +##bind context=context +##bind namespace= +##bind script=script +##bind subpath=traverse_subpath +##parameters=base_category_list=[], base=1, include=1 +##title= +## +clist = [] +variation_category_list=[] + +if include == 1 : + for category in context.getVariationBaseCategoryList(): + if category in base_category_list : + variation_category_list.append(category) +else : + for category in context.getVariationBaseCategoryList(): + if not category in base_category_list : + variation_category_list.append(category) + +for base_category in variation_category_list : + if base_category in ('coloris','morphologie','variante'): + title_list = map(lambda x:('/'.join(x.getPhysicalPath()[len(x.portal_categories.getPhysicalPath()):])), + context.getValueList(base_category)) + value_list = context.getCategoryMembershipList(base_category, base=base) + for index in range(len(title_list)) : + clist += [(value_list[index],title_list[index])] + else : + title_list = context.getCategoryMembershipList(base_category, base=0) + value_list = context.getCategoryMembershipList(base_category, base=base) + for index in range(len(title_list)) : + clist += [(value_list[index],title_list[index])] + +if len(clist)==0 : + clist.append((None,None)) + +return clist diff --git a/product/ERP5/skins/erp5_trade/payment_condition_view.form b/product/ERP5/skins/erp5_trade/payment_condition_view.form new file mode 100755 index 0000000000..5a7d39e9ec --- /dev/null +++ b/product/ERP5/skins/erp5_trade/payment_condition_view.form @@ -0,0 +1,286 @@ +<?xml version="1.0"?> + +<form> + <title>Condition de paiement</title> + <row_length>4</row_length> + <name>condition_paiement_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_id</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">1</required> + <title>Payment</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_description</id> <type>TextAreaField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <external_validator></external_validator> + <extra></extra> + <height type="int">3</height> + <hidden type="int">0</hidden> + <max_length></max_length> + <max_linelength></max_linelength> + <max_lines></max_lines> + <required type="int">0</required> + <title>Description</title> + <width type="int">40</width> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_many_lines">You entered too many lines.</message> + <message name="line_too_long">A line was too long.</message> + <message name="too_long">You entered too many characters.</message> + </messages> + </field> + <field><id>my_payment_ratio</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Percentage of total</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + <field><id>my_payment_amount</id> <type>FloatField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <title>Total</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_float">You did not enter a floating point number.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_payment_mode</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">1</required> + <size type="int">1</size> + <title>Payment Mode</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>here/portal_categories/payment_mode/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_payment_term</id> <type>IntegerField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <end></end> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">1</required> + <start></start> + <title>Payment Delay (days)</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_integer">You did not enter an integer.</message> + <message name="integer_out_of_range">The integer you entered was out of range.</message> + </messages> + </field> + <field><id>my_payment_end_of_month</id> <type>CheckBoxField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default type="int">0</default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <title>Payment at the end of month</title> + </values> + <tales> + <default>here/getPaymentEndOfMonth</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + <field><id>my_payment_additional_term</id> <type>IntegerField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <end></end> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <start></start> + <title>Supplemental Delay (days)</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_integer">You did not enter an integer.</message> + <message name="integer_out_of_range">The integer you entered was out of range.</message> + </messages> + </field> + <field><id>my_trade_date</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">1</required> + <size type="int">1</size> + <title>Reference Date</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>here/portal_categories/trade_date/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_trade/trade_condition_discount_view.form b/product/ERP5/skins/erp5_trade/trade_condition_discount_view.form new file mode 100755 index 0000000000..cdf20d19c7 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/trade_condition_discount_view.form @@ -0,0 +1,87 @@ +<?xml version="1.0"?> + +<form> + <title>Discounts</title> + <row_length>4</row_length> + <name>trade_condition_profile_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[('id', 'Discount'), ('description', 'Description'), ('getDiscountRatio', 'Ratio')]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'Discount'), ('description', 'Description'), ('getDiscountRatio', 'Ratio')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[('id', "''"), ('description', "''")]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>list</list_action> + <list_method type="method">searchFolder</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[('Discount', 'Discount')]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>discount_selection</selection_name> + <sort type="list">[('id', 'id')]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Discounts</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_trade/trade_condition_payment_view.form b/product/ERP5/skins/erp5_trade/trade_condition_payment_view.form new file mode 100755 index 0000000000..a6227d7795 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/trade_condition_payment_view.form @@ -0,0 +1,221 @@ +<?xml version="1.0"?> + +<form> + <title>Payment</title> + <row_length>4</row_length> + <name>trade_condition_payment_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_payment_mode</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">1</required> + <size type="int">1</size> + <title>Payment Mode</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>here/portal_categories/payment_mode/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_payment_term</id> <type>IntegerField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <end></end> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">1</required> + <start></start> + <title>Payment Delay (days)</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_integer">You did not enter an integer.</message> + <message name="integer_out_of_range">The integer you entered was out of range.</message> + </messages> + </field> + <field><id>my_payment_end_of_month</id> <type>CheckBoxField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default type="int">0</default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <title>Payment at the end of month</title> + </values> + <tales> + <default>here/getPaymentEndOfMonth</default> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + <field><id>my_payment_additional_term</id> <type>IntegerField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">10</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <end></end> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <required type="int">0</required> + <start></start> + <title>Supplemental Delay (days)</title> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="not_integer">You did not enter an integer.</message> + <message name="integer_out_of_range">The integer you entered was out of range.</message> + </messages> + </field> + <field><id>my_trade_date</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">1</required> + <size type="int">1</size> + <title>Reference Date</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>here/portal_categories/trade_date/getFormItemList</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + </fields> + </group> + <group> + <title>center</title> + <fields> + + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + <field><id>listbox</id> <type>ListBox</type> + <values> + <all_columns type="list">[('id', 'Payment'), ('description', 'Description')]</all_columns> + <all_editable_columns type="list">[]</all_editable_columns> + <alternate_name></alternate_name> + <columns type="list">[('id', 'Payment'), ('description', 'Description')]</columns> + <css_class></css_class> + <default></default> + <default_params type="list">[('id', "''"), ('description', "''")]</default_params> + <description></description> + <domain_root_list type="list">[]</domain_root_list> + <domain_tree type="int">0</domain_tree> + <editable type="int">1</editable> + <editable_columns type="list">[]</editable_columns> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <global_attributes type="list">[]</global_attributes> + <hidden type="int">0</hidden> + <lines type="int">10</lines> + <list_action>list</list_action> + <list_method type="method">searchFolder</list_method> + <meta_types type="list">[]</meta_types> + <portal_types type="list">[('Payment Condition', 'Payment Condition')]</portal_types> + <report_root_list type="list">[]</report_root_list> + <report_tree type="int">0</report_tree> + <search type="int">0</search> + <search_columns type="list">[]</search_columns> + <select type="int">0</select> + <selection_name>payment_condition_selection</selection_name> + <sort type="list">[('id', 'id')]</sort> + <sort_columns type="list">[]</sort_columns> + <stat_method></stat_method> + <title>Supplemental Payments</title> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file diff --git a/product/ERP5/skins/erp5_trade/trade_condition_profile_view.form b/product/ERP5/skins/erp5_trade/trade_condition_profile_view.form new file mode 100755 index 0000000000..bde5a29ef9 --- /dev/null +++ b/product/ERP5/skins/erp5_trade/trade_condition_profile_view.form @@ -0,0 +1,410 @@ +<?xml version="1.0"?> + +<form> + <title>Profile of Trade</title> + <row_length>4</row_length> + <name>trade_condition_profile_view</name> + <pt>form_view</pt> + <action>base_edit</action> + <update_action></update_action> + <method>POST</method> + <enctype></enctype> + <encoding>UTF-8</encoding> + <stored_encoding>ISO-8859-1</stored_encoding> + <unicode_mode>false</unicode_mode> + <groups> + <group> + <title>left</title> + <fields> + + <field><id>my_source_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Category', 'Category'), ('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Delivered by</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_source_section</id> <type>ListField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <extra_item></extra_item> + <first_item type="int">0</first_item> + <hidden type="int">0</hidden> + <items type="list">[]</items> + <required type="int">0</required> + <size type="int">1</size> + <title>For the account of</title> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + <items>python: [['Nexedi', 'organisation/nexedi']]</items> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="unknown_selection">You selected an item that was not in the list.</message> + </messages> + </field> + <field><id>my_source_decision_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source_decision</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Category', 'Category'), ('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Ordered for</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_source_administration_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source_administration</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Category', 'Category'), ('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Managed by</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_source_payment_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>source_payment</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Category', 'Category'), ('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Paid for</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>right</title> + <fields> + + <field><id>my_destination_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Category', 'Category'), ('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Deliver to</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_section_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_section</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Category', 'Category'), ('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>For the account of</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_decision_organisation_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_decision</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Category', 'Category')]</portal_type> + <required type="int">0</required> + <title>Ordered by</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_administration_organisation_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_administration</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Category', 'Category')]</portal_type> + <required type="int">0</required> + <title>Invoice for</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + <field><id>my_destination_payment_title</id> <type>RelationStringField</type> + <values> + <alternate_name></alternate_name> + <base_category>destination_payment</base_category> + <catalog_index>Title</catalog_index> + <css_class></css_class> + <default></default> + <default_module>organisation</default_module> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <jump_method>base_jump_relation</jump_method> + <max_length></max_length> + <portal_type type="list">[('Organisation', 'Organisation'), ('Category', 'Category'), ('Person', 'Person')]</portal_type> + <required type="int">0</required> + <title>Paid by</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <update_method>base_update_relation</update_method> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>center</title> + <fields> + + <field><id>my_source_decision_destination_reference</id> <type>StringField</type> + <values> + <alternate_name></alternate_name> + <css_class></css_class> + <default></default> + <description></description> + <display_maxwidth></display_maxwidth> + <display_width type="int">20</display_width> + <editable type="int">1</editable> + <enabled type="int">1</enabled> + <external_validator></external_validator> + <extra></extra> + <hidden type="int">0</hidden> + <max_length></max_length> + <required type="int">0</required> + <title>Provider Code</title> + <truncate type="int">0</truncate> + <unicode type="int">0</unicode> + <whitespace_preserve type="int">0</whitespace_preserve> + </values> + <tales> + </tales> + <messages> + <message name="external_validator_failed">The input failed the external validator.</message> + <message name="required_not_found">Input is required but no input given.</message> + <message name="too_long">Too much input was given.</message> + </messages> + </field> + </fields> + </group> + <group> + <title>bottom</title> + <fields> + + </fields> + </group> + <group> + <title>hidden</title> + <fields> + + </fields> + </group> + </groups> +</form> \ No newline at end of file -- 2.30.9