Compare commits

...

263 Commits

Author SHA1 Message Date
Clément Mombereau
c88e7b0bb4 [ADD] new module project_task_report 2024-12-09 12:32:12 -03:00
Alexis de Lattre
5af6c895d0 Add modules commission_simple, commission_simple_agent, commission_simple_agent_purchase
Add demo data in sale_agent
2024-11-30 01:19:31 +01:00
Alexis de Lattre
7bdd579b1c [IMP] product_usability: add main supplier in tree view as optional 2024-11-25 09:33:03 +01:00
Alexis de Lattre
c9f0569516 [IMP] account_usability_akretion: improve action from account.account form view that jumps to account.move.line tree view 2024-11-25 08:23:45 +00:00
Alexis de Lattre
c37b607f97 [IMP] sale_agent: add tracking and fr translation 2024-11-21 09:59:39 +01:00
Alexis de Lattre
5f4929f819 [IMP] base_usability: add possibility to have fax in header if partner_fax is installed 2024-11-19 16:14:35 +00:00
Alexis de Lattre
59c7084159 base_company_extension: handle case where company legal type is already in company name 2024-11-19 15:28:59 +00:00
Alexis de Lattre
a2952ca6b2 [IMP] base_usability: add fields in partner tree view with optional=hide 2024-11-08 16:19:39 +00:00
Alexis de Lattre
f5b8f1674a [FIX] sale_agent: double string 2024-11-07 17:24:57 +01:00
Alexis de Lattre
e22badc605 Add module sale_agent 2024-11-07 17:18:57 +01:00
Alexis de Lattre
f93f17b27b [IMP] stock_usability: add tracking on lot fields (model already inherit from mail.thread) 2024-11-05 00:21:36 +01:00
Florian
74586cff13 Merge pull request #220 from akretion/16-account-usability-warning-existing-reverse-move
[16] account_usability_akretion : Replace error by warning in case a user try to reverse an already reversed account move
2024-10-23 11:27:11 +02:00
Alexis de Lattre
48c0e02e94 [IMP] stock_valuation_xlsx french translation 2024-10-22 10:06:19 +02:00
Alexis de Lattre
a035748c2d [IMP] stock_valuation_xlsx: FR translation 2024-10-21 18:39:45 +02:00
Alexis de Lattre
594c3fb0ed [IMP] stock_valuation_xlsx: add barcode in stock variation report
Fix empty col in variation XLSX report
2024-10-21 17:31:02 +02:00
Alexis de Lattre
02c082f966 [MIG] stock_valuation_xlsx from v14 to v16 2024-10-21 14:46:24 +02:00
Alexis de Lattre
97cf376e90 purchase_usability: take into account ir.config_parameter usability.line_name_no_product_code when using _prepare_purchase_order_line() 2024-10-17 10:57:35 +02:00
Alexis de Lattre
c3f007e716 [IMP] product_usability: optional=show on min_qty 2024-10-15 12:33:36 +00:00
Alexis de Lattre
a333bc4e84 [IMP] stock_usability: always show picking_type_id in the last tab of the picking form view 2024-10-10 17:27:08 +00:00
Alexis de Lattre
9e5670934e Improve mrp_subcontracting_usability: add fields in views, domain on subcontractor_ids M2M field on mrp.bom. 2024-10-08 13:54:36 +00:00
Alexis de Lattre
c74a647945 [IMP] account_usability_akretion: simplify code for invoice attach del upon invoice back to draft 2024-09-30 10:54:14 +02:00
Alexis de Lattre
fca7209056 [FIX] account_usability_akretion: fix deletion of PDF invoice attachment when invoice is back to draft 2024-09-30 09:08:58 +02:00
Alexis de Lattre
6d9b4c92eb sale_stock_usability: add method to display delivery order on out invoice report 2024-09-30 08:18:37 +02:00
Alexis de Lattre
68327c28b6 base_usability: Add rcs_siren in company header 2024-09-30 08:15:07 +02:00
Alexis de Lattre
592e40637a mrp_usability: add tracking on some fields 2024-09-30 08:12:56 +02:00
Alexis de Lattre
b6624f2491 [IMP] account_usability_akretion: add search on account in account.move search view 2024-09-30 08:07:00 +02:00
Alexis de Lattre
3a11c99ccb stock_usability: Add product_barcode on orderpoint tree view (optional hide) 2024-09-30 07:47:36 +02:00
Alexis de Lattre
36f277940c [MIG] partner_products_shortcut to v16 2024-09-30 07:40:24 +02:00
Florian da Costa
c09e3a1108 [IMP] account_usability_akretion : Replace error by warning in case a user try to reverse an already reversed account move
The goal is to allow multiple refund for a single invoice. It may happen to refund invoice partially and they refund again partially later.
2024-08-28 15:49:26 +02:00
Alexis de Lattre
3b5b64349b stock_usability: trigger now 'manual' by default 2024-07-18 13:11:32 +00:00
Alexis de Lattre
efddeb3a3c product_usability: add support for GTIN-14 in barcode type 2024-07-18 13:05:50 +00:00
Alexis de Lattre
c126a286c4 forward port patch web-buttons_14_max_instead_of_7.diff from v14 to v16 2024-07-15 08:29:31 +00:00
Alexis de Lattre
670ba212d9 Remove patch web-export-add_technical_field_name.diff because the feature is now native 2024-07-11 18:53:03 +02:00
Alexis de Lattre
c26ed6cdfb base_partner_ref: Remove commented code 2024-07-09 14:45:39 +02:00
Alexis de Lattre
dd0841385f account_usability_akretion: update FR translation
Fix res.company form view
sale_usability: enable static terms on res.company form view
2024-07-09 12:50:52 +02:00
Alexis de Lattre
b91abe54a5 Add fr translation several usability modules
Add fr translation for crm_usability, delivery_usability, link_tracker_usability, mail_usability, mass_mailing_usability, mrp_subcontracting_usability and pos_usability
2024-07-08 00:12:44 +02:00
Raphaël Valyi
210af49098 Merge pull request #219 from akretion/16.0-mig-sale_no_optional_product
[MIG] sale_no_optional_product
2024-07-06 16:06:46 -03:00
Raphaël Valyi
19158d9309 [MIG] sale_no_optional_product 2024-07-05 21:02:46 +00:00
Alexis de Lattre
4577524f0e stock_usability: add FR translation 2024-07-05 00:32:26 +02:00
Alexis de Lattre
8fd0cb5601 mrp_usability: update FR translation 2024-07-04 18:23:23 +02:00
Alexis de Lattre
8d584871d6 sale_usability+sale_stock_usability: update FR translation
sale_usability: remove wizard discount on all lines, which is mostly native
2024-07-04 18:13:41 +02:00
Alexis de Lattre
a7fd6a1361 purchase_usability+purchase_stock_usability: Add FR translation 2024-07-04 17:32:51 +02:00
Alexis de Lattre
2b2293593c product_usability: add FR translation 2024-07-04 17:15:53 +02:00
Alexis de Lattre
f1614afda2 base_usability: update fr translation 2024-07-04 16:49:54 +02:00
Alexis de Lattre
227a7ec18d Add patch for OCA localization 2024-06-21 17:32:16 +02:00
Arnaud LAYEC
827557689f Add a 'send & save' button next to 'save & close' 2024-06-15 12:30:21 +02:00
Arnaud LAYEC
67ff087f6e Add 'Opportunity' field on a new 'CRM' notebook page on Calendar 2024-06-15 12:30:21 +02:00
Arnaud LAYEC
9507be2943 [base_mail_sender_bcc] manifest version change from 14 to 16.0.1.0.0 2024-06-15 12:30:21 +02:00
Alexis de Lattre
740d167331 purchase_stock_generic_product and sale_stock_generic_product: allows the use of generic products 2024-06-15 12:24:12 +02:00
Alexis de Lattre
d07e38e1f3 base_usability: add group by on industry_id on partner search view 2024-06-13 10:04:08 +02:00
Alexis de Lattre
55b84a170e account_usability_ak: pivot view by default on account.invoice.report 2024-06-13 10:03:03 +02:00
Mourad
252da11a30 [16.0] IMP display currency for partner bank account 2024-05-06 14:07:28 +02:00
Alexis de Lattre
4ee69f3bff pos_usability: add payment methods in tree view of pos.order (via a computed char field) 2024-04-12 15:08:01 +00:00
Alexis de Lattre
46fcf5c0ef base_usability: add name_get() on ir.model.fields
Add patch to add technical field name in export dialog box
2024-04-11 19:29:14 +02:00
Alexis de Lattre
2c794033b0 mrp_usability: Allow to change the destination location until 'Mark as done'
Native behavior: it is only possible to change the destination stock
location of a production order in draft state.
2024-04-09 19:27:07 +02:00
Alexis de Lattre
2f784eb1a0 sale_usability: improve tree view of sale.order 2024-04-09 17:03:11 +02:00
Alexis de Lattre
b019baed6e [IMP] base_usability: improve report header methods on res.company 2024-03-27 11:17:26 +01:00
David Beal
5532a8e165 IMP dev_menu: update items 2024-03-22 10:26:41 +01:00
Olivier Nibart
a4c2a43cf7 [16.0][MIG] product_manager_group 2024-03-14 16:12:31 +01:00
Olivier Nibart
f9246c6988 [16.0][MIG] product_manager_group_stock 2024-03-14 16:12:04 +01:00
Alexis de Lattre
8364b42930 product_print_zpl_barcode: add timeout and improve error message 2024-03-13 12:27:09 +01:00
Alexis de Lattre
df370f4948 account_usability_ak: optional=show on general account of analytic lines 2024-03-06 16:04:03 +00:00
Alexis de Lattre
282f48db3e sale_order_route: fix crash upon module installation and add route_id in sale.report
sale_stock_usability: direct access to warehouse_id in the sale.report pivot view
2024-02-27 12:34:25 +01:00
Alexis de Lattre
73c3c1a664 base_usability: add ape, eori and siret as ready-to-go fields in header 2024-02-07 22:01:30 +00:00
Alexis de Lattre
ac0afd6e2b [FIX] product_print_zpl_barcode: remove usage of print group 2024-01-30 18:05:14 +01:00
Alexis de Lattre
a61d1458d8 product_print_zpl_barcode: remove dependency on base_report_to_printer
We now print directly on the ZPL printer, without going through CUPS
2024-01-30 17:00:56 +01:00
Alexis de Lattre
0756beb8f5 base_usability: add web-advanced_search_startswith.diff 2024-01-22 23:47:15 +01:00
Alexis de Lattre
0656d319ce stock_usability: improve product.template tree view 2024-01-18 13:50:10 +00:00
Alexis de Lattre
a517fe67a8 account_usability_akretion: update account.invoice.report views 2024-01-18 13:22:46 +00:00
Alexis de Lattre
2953baba22 [FIX] purchase_stock_usability and purchase_usability: fix computation of supplier code 2023-11-30 10:41:08 +00:00
Alexis de Lattre
5ea3f5adfd [MIG] sale_order_route: to v16 2023-11-30 10:40:27 +00:00
Alexis de Lattre
92a1b511c1 purchase_stock_usability: add product_supplier_code in tree view of stock.move and stock.move.line
purchase_usability: improve computation of product_supplier_code on purchase order line
2023-11-29 16:51:15 +01:00
Alexis de Lattre
5ad925cee1 [MIG] base_dynamic_list from v14 to v16 2023-11-23 19:07:55 +01:00
Alexis de Lattre
b8e335fb10 [MIG] link_tracker_usability to v16 2023-11-23 11:51:37 +01:00
Alexis de Lattre
c693ccc62c pos_usability: add patch "pos-always_open_cashbox.diff" 2023-10-24 11:50:00 +02:00
Alexis de Lattre
983a25367f pos_usability : finalize order by sequence on pos.payment.method 2023-10-23 15:22:36 +02:00
Alexis de Lattre
e36f88e23a pos_usability: add sequenc eon pos.payment.method 2023-10-23 12:40:09 +00:00
Alexis de Lattre
18e9ed99ff [FIX] stock_quant_package_move_wizard: set picking_id on stock.move.line 2023-10-05 21:57:57 +02:00
Alexis de Lattre
dea732e270 account_usability_ak: add blocked on account.move and show warning banner on invoice form view 2023-09-27 23:41:58 +02:00
Alexis de Lattre
150916200d stock_usability: remove default filter my counts 2023-09-11 19:09:05 +02:00
Alexis de Lattre
48247b6d06 Add module sale_remove_my_quotation_filter 2023-09-11 18:42:08 +02:00
Alexis de Lattre
1971808c7d purchase_stock_usability: add picking_type_id in tree view (hide) 2023-09-06 16:02:11 +02:00
Alexis de Lattre
5724d31ac1 stock_usability: Add computed field is_dropship (needed to customize some reports)
Add optional fields in stock.move tree view
2023-09-06 15:56:12 +02:00
Alexis de Lattre
3ecfde15f0 Add module mrp_subcontracting_usability 2023-09-06 15:43:38 +02:00
Alexis de Lattre
44fedbf72e [MIG] base_partner_one2many_phone v14 -> v16 2023-09-06 00:41:29 +02:00
Alexis de Lattre
5f731d18f1 Fix string 2023-07-15 15:40:48 +02:00
Alexis de Lattre
7477deeae3 product_print_zpl_barcode: print multi labels at once
Print from product tree view and form view (product.product and product.template)
Print from done stock picking using must_print_barcode
2023-07-15 15:16:58 +02:00
Alexis de Lattre
2905b5f426 pos_usability: add product_id in pos.order.line form view 2023-07-13 11:58:25 +02:00
Alexis de Lattre
42287c674a Remove module sales_team_usability
Remove module sales_team_usability because, in v16, it's too risky to
change a field from translate=True to Translate=False
2023-06-29 15:19:04 +02:00
Alexis de Lattre
01eff33bcb account_usability_ak : improve journal view (hide->show on payment_account_id) 2023-06-29 12:46:18 +02:00
Alexis de Lattre
14bb6c5834 [MIG] eradicate_quick_create to v16 2023-06-29 11:12:05 +02:00
Mourad
695eaed6b9 [FIX][16.0] account_usability_akretion : Translations 2023-06-12 16:54:19 +02:00
Alexis de Lattre
2a862a96d5 [MIG] base_partner_ref to v16 2023-06-02 16:29:10 +02:00
Alexis de Lattre
e435a250f3 account_usability_akretion: add chatter messages when reversing an account.move
This is a forward-port of a commit in account_usability v14
2023-05-16 19:48:14 +02:00
Alexis de Lattre
facd3adf74 account_product_fiscal_classification_pos_sale: Add inherit of group_by 2023-05-15 15:03:54 +02:00
Alexis de Lattre
e5393eb88d Rename to account_product_fiscal_classification_pos_sale 2023-05-15 15:01:17 +02:00
Alexis de Lattre
2764390d40 Add module account_product_fiscal_classification_sale 2023-05-15 14:29:40 +02:00
Alexis de Lattre
d87ff61f2f account_usability_akretion: show inv duplicate warning not only in draft state, but also in posted state
Add confirm button on cancel button
2023-04-06 18:32:48 +02:00
David Beal
a1f8185549 IMP dev_menu: apply new style for menuitem 2023-03-23 12:19:54 +01:00
David Beal
2997154c49 Update menu_view.xml 2023-03-23 12:19:54 +01:00
David Beal
db24e73175 IMP base_usa: add write_date on config parameter 2023-03-22 10:08:07 +01:00
Alexis de Lattre
1e19fc906c [MIG] pos_usability to v16 2023-03-17 10:20:29 +00:00
Alexis de Lattre
b954772126 account_usability: fix journal form view 2023-03-03 11:26:37 +01:00
Alexis de Lattre
3f16203ffc account_usability: remove account type from res.partner.tree view 2023-03-02 14:48:37 +01:00
Alexis de Lattre
21f5b53f8b [MIG] product_print_zpl_barcode to v16 2023-03-01 23:19:50 +01:00
Alexis de Lattre
02970847f4 stock_usability: add simple stock.quant tree view (readonly) without JS
Add a button from stock.location to access simple stock.quant tree view
2023-02-13 23:46:30 +01:00
Alexis de Lattre
16f5c9e955 [ADD] stock_quant_package_move_wizard 2023-02-13 23:44:01 +01:00
Alexis de Lattre
875eadc516 Add module pos_check_deposit 2022-12-29 22:44:12 +01:00
Alexis de Lattre
f9f5d2e1b9 account_usability_akretion: fix crash on account.account search on code 2022-12-29 00:07:08 +01:00
Alexis de Lattre
795e9a1737 stock_usability: inventory: set default location via filter on location 2022-12-27 14:30:24 +01:00
Alexis de Lattre
492a7275c2 Remove translate=False
fixes bug #190
2022-12-17 18:51:14 +01:00
Alexis de Lattre
16c4b1cebe Restore sale/purchase/account line 'name' field without product_code via ir.config_parameter 2022-12-14 09:51:51 +00:00
Alexis de Lattre
aad5fa4ff0 account_usability_ak : update for py3o 2022-12-14 09:46:19 +01:00
Alexis de Lattre
a0c1d5f55f [MIG] account_usability to v16 + rename to account_usability_akretion 2022-12-13 23:02:02 +01:00
Alexis de Lattre
a63c35fcbf [MIG] partner tree and product tree modules 2022-12-13 10:49:22 +01:00
Alexis de Lattre
03d045be1c product_usability: ondelete=restrict on supplierinfo/partner_id
Add tracking on uom fields on product.template
2022-12-12 20:43:33 +00:00
Alexis de Lattre
a86f90b382 product_usability: group by detailed_type, not by type 2022-12-10 16:29:44 +00:00
Alexis de Lattre
4aaee98c43 stock_usability: add removal strategy in location tree view (optional) 2022-12-10 15:40:34 +00:00
Alexis de Lattre
62627a63a6 product_usability: set default list_price value to 0 2022-12-10 13:44:50 +00:00
Alexis de Lattre
6d69bc659e [MIG] sale_confirm_wizard and sale_quotation_title
Update sale_usability to take advantage of base_view_inheritance_extension in v16
2022-12-08 08:40:53 +01:00
Alexis de Lattre
767c6a7fd9 [MIG] sale_stock_usability to v16 2022-10-31 00:02:57 +01:00
Alexis de Lattre
fbdf814cb0 [MIG] sale_usability to v16 2022-10-30 23:44:09 +01:00
Alexis de Lattre
5c14e3199e stock_usability: improve display of reservations
mrp_usability: disable change in view to fix a bug
2022-10-29 21:45:02 +02:00
Alexis de Lattre
70957e8404 product_usability: remove pre-compute=True on non-stored field 2022-10-29 15:44:40 +02:00
Alexis de Lattre
6025575ae4 [MIG] crm_usability to v16 2022-10-27 23:23:32 +02:00
Alexis de Lattre
8486c75f90 [MIG] delivery_usability to v16 2022-10-27 23:13:29 +02:00
Alexis de Lattre
a7a1eefb15 [MIG] base_company_extension to v16 2022-10-27 22:35:11 +02:00
Alexis de Lattre
fe6a332ba9 [MIG] mail_usability 2022-10-27 22:27:44 +02:00
Alexis de Lattre
bbb0cb17f7 [MIG] mrp_usability to v16 2022-10-27 22:23:25 +02:00
Alexis de Lattre
71ebe2adea [MIG] purchase_stock_usability to v16 2022-10-27 22:04:17 +02:00
Alexis de Lattre
367cb1af93 [MIG] purchase_usability to v16 2022-10-27 21:57:19 +02:00
Alexis de Lattre
a9292506ae [MIG] product_usability to v16 2022-10-27 21:27:46 +02:00
Alexis de Lattre
15c77b3e8a [MIG] stock_usability from v14 to v16 2022-10-27 00:05:43 +02:00
Alexis de Lattre
4f13432bdc [MIG] base_usability to v16 2022-10-26 22:03:36 +02:00
Alexis de Lattre
9aac933dcb Initialize v16 branch 2022-10-26 21:09:52 +02:00
beau sebastien
deb37a1688 Merge pull request #184 from akretion/14.0-fix-sale_stock_usability_del_picking_status
[FIX][14.0] Module: sale_stock_usability del picking_status
2022-10-25 12:43:49 +02:00
beau sebastien
6d3e4d83c7 Merge pull request #180 from akretion/14.0-stock_inventory_usability
ADD module stock_inventory_usability
2022-10-25 12:42:53 +02:00
Alexis de Lattre
58afed17e5 purchase_usability: up-port button "Delete lines qty=0" from v10 2022-10-20 11:34:17 +02:00
Alexis de Lattre
b1b4620cdc sale_usability: add client_order_ref in tree view with optional arg 2022-10-18 15:00:16 +02:00
Alexis de Lattre
164397fbac account_usability: remove use of field 'reconciled' in account.move.line filters 2022-10-17 17:03:35 +02:00
Alexis de Lattre
3ae427c5de account_invoice_update_wizard: improve migration to v14
account_invoice_update_wizard: remove 'name' field. Improve field
labels.
Add module account_invoice_update_wizard_payment_mode
2022-10-07 15:54:04 +02:00
Alexis de Lattre
db2cd72d04 account_usability: "Invoicing" -> "Accounting" 2022-10-06 23:02:54 +02:00
Alexis de Lattre
44a92bde2d account_usability: reversal wizard: check the move hasn't already been reversed 2022-09-27 09:04:39 +02:00
Kev-Roche
da8849e745 [FIX][14.0] Module: sale_stock_usability del picking_status 2022-09-26 21:48:33 +02:00
Alexis de Lattre
23222e997b base_usability: add currency_id in res.company tree view 2022-09-23 17:47:05 +02:00
Alexis de Lattre
3259a667eb Improve French translation and fix some strings
Remove balance field which was wrongly introduced by PR https://github.com/akretion/odoo-usability/pull/171
2022-09-20 15:31:07 +02:00
Alexis de Lattre
9aa65925a9 Add number of lines on bank statement form and tree views 2022-09-20 14:23:03 +02:00
Claude Perrin
f23aa52b08 add French translation for four modules
sale_confirm_wizard sale_quotation_title sale_usability
account_usability
2022-09-20 14:09:29 +02:00
Alexis de Lattre
f4687b886c account_usability: Add link to Outstanding Payments/Receipts in journal dashboard 2022-09-13 23:27:19 +02:00
Alexis de Lattre
daddd6c17c account_usability: Improve bank statement list view 2022-09-13 21:24:08 +02:00
Alexis de Lattre
b790aac9d8 stock_usability: quant tree view: add sum=1 on inventory_quantity 2022-09-12 16:44:24 +02:00
Alexis de Lattre
ca61dbce3f account_usability: invoice search view: add groupby on commercial_partner_id and payment_state 2022-09-12 11:22:54 +02:00
Alexis de Lattre
6242dec047 stock_usability: Improve display of reservations from quants
Add link to stock.move.lines from lot form view
2022-09-05 14:09:37 +02:00
Alexis de Lattre
7b0e4bcb55 account_usability: analytic_account_id optional=show on account.reconcile.model
native value was optional=hide
2022-08-10 13:53:36 +02:00
Alexis de Lattre
6c04b2dd5a account_usability: also disable warning banner when hide_bank_statement_balance is True 2022-08-07 00:29:31 +02:00
Alexis de Lattre
01e209ed43 account_usability: add optional=show on currency_id on move lines 2022-08-06 09:18:04 +02:00
Alexis de Lattre
a69556bad0 account_usability: improve the label and help message of hide_bank_statement_balance 2022-08-05 23:00:45 +02:00
Alexis de Lattre
82da5e1afb account_usability: remove dep on base_view_inheritance_extension
This dependency was needed in v12, but it's not the case in v14
2022-08-05 12:52:27 +00:00
Alexis de Lattre
fd5e620373 Add module account_move_label_copy 2022-08-05 12:47:47 +00:00
Alexis de Lattre
9589db3abe Add a patch in account_usability 2022-08-01 22:11:01 +02:00
Benoit
c51a847f80 ADD module stock_inventory_usability 2022-07-25 16:21:15 +02:00
Alexis de Lattre
a800657f54 stock_usability : add sum on some fields in picking form view 2022-07-15 10:44:51 +02:00
Alexis de Lattre
5fbe6d340a Add module account_menu_usability 2022-07-13 22:07:50 +02:00
Sébastien BEAU
f3874a5903 sale_stock_usability: make the view homogenius with purchase_stock_usability 2022-07-12 13:51:45 +02:00
Alexis de Lattre
f0faa58830 stock_usability: picking form: always show location_id and location_dest_id on stock.picking 2022-07-11 15:57:14 +02:00
beau sebastien
b38fc99978 Merge pull request #166 from khoivo1601/14.0-imp-account_invoice_update_wizard
[14.0][IMP] account_invoice_update_wizard
2022-07-09 16:05:41 +02:00
Alexis de Lattre
372a18365c stock_usability: add location_id and location_dest_id in stock.move form view embedded in picking 2022-07-06 15:44:58 +02:00
Alexis de Lattre
27d86cf151 sale_usability: add a wizard to write discount on all lines
The wizard is available under the "Action" menu. It has an option to
apply only on product or service lines.

Add a button "Send ack by email" on confirmed sale.order
2022-07-06 12:14:51 +02:00
Alexis de Lattre
d67141e128 base_usability: add method _report_print_datetime() on res.users 2022-07-06 11:54:41 +02:00
beau sebastien
02450832cb Merge pull request #174 from akretion/14.0-improve-bank-statement-reset-to-draft
14.0 improve bank statement reset to draft
2022-07-04 09:58:04 +02:00
Alexis de Lattre
627c5980c9 account_usability: Add constraint on account.journal
reconcile=False by default on suspense account.
2022-07-01 08:41:56 +02:00
Alexis de Lattre
6f27b13bf9 account_usability: invoice_tree: optional hide-> show for residual field 2022-06-30 20:38:38 +02:00
Alexis de Lattre
1de8676d4e product_usability: improve menus under Configuration > Technical 2022-06-29 14:35:24 +02:00
Alexis de Lattre
9139955fac base_usability: improve ir.property tree+search views 2022-06-29 12:00:22 +02:00
Alexis de Lattre
a5b5dd83a2 account_usability: adapt context for suspensed_account_id for user_type_id
This commit follows a change in the account module made in this commit: c16bc3192f
Improve multi-company support in the wizard account.group.generate
Remove widget="selection" on fiscal_position on res.partner form
2022-06-28 22:13:20 +02:00
Francois DESMOTTES
5f704d34a7 [FIX] Fix access error on model ir.actions.act_window 2022-06-28 22:11:15 +02:00
Alexis de Lattre
9087296a54 sale_confirm_wizard: add commitment_date in confirm wizard 2022-06-17 10:23:56 +02:00
Alexis de Lattre
4ac5c23b30 purchase_usability: warning when price and/or delay is auto-updated following a qty change
It is similar to the feature present in sale_usability when the qty is updated and the price unit changes
2022-06-16 18:18:19 +02:00
Sébastien BEAU
403b24ffc1 account_usability: add translation 2022-06-01 17:24:18 +02:00
Sébastien BEAU
85f8fe5b30 account_usability: reset to draft the bank statement do not unreconcile 2022-06-01 17:23:59 +02:00
Kévin Roche
fde3dfae10 Merge pull request #177 from akretion/14.0-imp-account_usability_translation_fr
[14.0][IMP] account_usability translation FR
2022-06-01 16:28:29 +02:00
Kev-Roche
4f90a7fd91 [14.0][IMP] account_usability translation FR 2022-06-01 16:25:41 +02:00
Alexis de Lattre
1fd25be02f mail_no_portal: also remove the powered by Odoo at the bottom of the mail
Because the OCA/social module 'mail_debrand' doesn't work cf github.com/OCA/social/issues/839
2022-05-18 20:06:24 +02:00
Alexis de Lattre
174fac6d88 Add module mail_no_portal 2022-05-18 19:42:39 +02:00
Alexis de Lattre
9507d1fbd8 product_usability: add field barcode_type
Remove field barcode_code128, which was buggy
2022-05-16 19:30:48 +02:00
Alexis de Lattre
a89f1a9ae7 stock_valuation_xlsx: add barcode in report
Don't display '0' when the product code is empty
2022-05-16 19:30:05 +02:00
Alexis de Lattre
abb36545d9 stock_account_usability: add shortcut to stock.valuation.layer from product form view 2022-05-13 18:35:57 +02:00
Alexis de Lattre
296746ce6e stock_valuation_xlsx: restore past cost price support, using stock valuation layers
Don't replace the native menu entry any more.
Code refactoring between the 2 wizards
Improve multi-company support
2022-05-13 17:25:05 +02:00
Kev-Roche
d0a9ec27ef [UPD] pos_usability translation 2022-05-09 18:58:39 +02:00
beau sebastien
d3989e96d7 Merge pull request #171 from akretion/14.0-account-usability-add-balance
[IMP] add balance
2022-05-02 16:36:03 +02:00
Kev-Roche
f1a0aa6253 pos_usability : add pos initial amount 2022-04-27 22:02:38 +02:00
Alexis de Lattre
c7bd3319a9 product_usability: add a menu entry for UoMs in Configuration > Technique
This allows to have a menu entry for UoM even when the sale and stock
modules are NOT installed.
2022-04-22 08:58:43 +02:00
Sébastien BEAU
fe96425d84 [IMP] show team on partner in no dev mode 2022-04-12 12:30:26 +02:00
Sébastien BEAU
a59c2e774a [IMP] add balance 2022-04-11 13:43:40 +02:00
beau sebastien
cad0654983 Merge pull request #170 from akretion/14.0-add-company-tracking
[IMP] add tracking
2022-04-11 09:33:31 +02:00
Sébastien BEAU
55622ec6a9 [IMP] add tracking 2022-04-08 17:26:11 +02:00
beau sebastien
f166fe93be Merge pull request #159 from akretion/14.0-shopinvader_usability
[14.0][ADD] shopinvader_usability
2022-04-08 17:24:38 +02:00
Alexis de Lattre
b8a6cbcfea mrp_usability: Add fields in tree view with optional="hide"
sale_order_route: Add route_id in tree view with optional="hide"
2022-03-31 21:48:13 +02:00
Alexis de Lattre
f6b10a7caa [MIG] sale_order_add_bom from v10 to v14 2022-03-31 10:52:55 +02:00
Alexis de Lattre
371229e9e5 sale_order_add_bom: add kit wizard now available on pickings 2022-03-31 10:52:55 +02:00
Alexis de Lattre
1dbfd23524 Remove _rec_name from mrp.bom because there is now a native name_get() 2022-03-31 10:52:55 +02:00
Alexis de Lattre
9a9459f013 sale_order_add_bom: fix related field definition 2022-03-31 10:52:55 +02:00
Alexis de Lattre
5a58ae0d9a FIX my previous commit: related_sudo -> compute_sudo 2022-03-31 10:52:55 +02:00
Alexis de Lattre
b162227645 Add related_sudo where it may be needed
PEP8 fix
2022-03-31 10:52:55 +02:00
Alexis de Lattre
3c24e94122 Add module sale_force_invoice_status 2022-03-31 10:52:55 +02:00
Stéphane Bidoul (ACSONE)
400f316c7f [10.0] setup.py and addons versions (#35)
* [IMP] set 10.0 version prefix in all installable addons

* [FIX] 10.0 instead of 9.0 version prefix for sale_order_add_bom on 10.0 branch

* [ADD] setup.py for all installable addons
2022-03-31 10:52:55 +02:00
Alexis de Lattre
86af01667a Port sale_order_add_bom to v10 2022-03-31 10:52:55 +02:00
Alexis de Lattre
8967bf289a Add modules sale_from_private_stock and sale_order_add_bom
Port base_company_extension to v10
Avoid blockage on l10n_fr_infogreffe_connector
2022-03-31 10:52:55 +02:00
Alexis de Lattre
1fdaf52787 stock_valuation_xlsx: fix access right issue 2022-03-30 17:22:27 +02:00
Alexis de Lattre
6907302f8e [MIG] sale_purchase_no_product_template_menu 2022-03-28 17:31:32 +02:00
Alexis de Lattre
a3e23ab5e7 [MIG] base_mail_sender_bcc from v10 to v14
Code almost unchanged.
2022-03-28 17:22:13 +02:00
Khoi Vo
686c6f3900 [IMP] account_invoice_update_wizard: Migration to 14.0 2022-03-16 08:57:51 +07:00
Alexis de Lattre
a850586716 account_usability: account.invoice.report in pivot by default (instead of graph) 2022-03-15 15:46:50 +01:00
Alexis de Lattre
fdef51ea57 account_usability: add name_search() on account.incoterms 2022-03-11 09:01:32 +01:00
Clément Mombereau
806389e04b Merge pull request #163 from akretion/14.0-explicit-reconcile-error
account_usability: explicit error msg on unposted reconciliation
2022-03-08 19:23:12 -03:00
clementmbr
c12b496004 account_usability: explicit error msg on unposted reconciliation 2022-03-08 19:21:02 -03:00
Alexis de Lattre
447b0107be account_usability: change the behavior of 'date' on in_invoice/in_refund when the 'invoice_date' is changed 2022-03-08 21:02:55 +01:00
Alexis de Lattre
f9a7983d71 account_usability: update move line search view for reconcile filters 2022-03-01 15:55:03 +01:00
David Beal
870746b965 UPD stk_no_prd_tmpl: make installable 2022-02-28 18:06:05 +01:00
Alexis de Lattre
f22c6522d5 Add industry_id in account.invoice.report 2022-02-23 00:22:54 +01:00
Alexis de Lattre
1ef97629b7 [FIX] account_usability: fix cash in computation of sale_dates 2022-02-22 00:59:48 +01:00
Alexis de Lattre
77a372b3ca account_usability: Add date in outstanding payment widget 2022-02-08 20:39:11 +01:00
Alexis de Lattre
221b090cc8 sale_usability: pivot view by default on sale.report 2022-02-08 07:54:50 +01:00
Raphaël Valyi
e4a2ff5bd4 Merge pull request #153 from akretion/14.0-web_tab_title
[14.0][ADD] web_tab_title
2022-01-26 10:51:31 -03:00
Alexis de Lattre
c1d334b109 account_usability: small code cleanup 2022-01-06 23:34:44 +01:00
Sébastien BEAU
c7c9b2d341 [IMP] add tracking on category 2022-01-04 17:21:46 +01:00
Alexis de Lattre
eddab6020a account_usability: improve view for analytic account and analytic account group 2021-12-31 00:33:48 +01:00
Alexis de Lattre
d1181ca91d account_usability: improve view of account.group
Add group by on group_id in search view of account.account
2021-12-31 00:21:42 +01:00
Kevin Khao
df673718e5 [14.0][ADD] shopinvader_usability 2021-12-27 16:30:11 +03:00
Alexis de Lattre
bb83765ee2 account_usability: default value for user_type_id on journal accounts 2021-12-19 17:28:03 +01:00
Alexis de Lattre
88615a0774 Add barcode_code128 on product.product 2021-12-19 12:58:22 +01:00
Alexis de Lattre
05e649fa86 account_usability: avoir error when user doesn't have admin rights 2021-12-18 21:40:32 +01:00
Alexis de Lattre
08118ec4f5 Add support for config param usability.line_name_no_product_code
The same ir.config_parameter is used in:
- purchase_usability for purchase.order.line
- sale_usability for sale.order.line
- account_usability for account.move.line
2021-12-03 22:24:59 +01:00
Alexis de Lattre
6d496ba302 Add static legal terms on company for invoice and sale
Add product_supplier_code on purchase.order.line
2021-12-03 17:27:03 +00:00
Kev-Roche
40b79890fe [FIX] stock_reception_usability 2021-12-01 14:31:24 +01:00
Kévin Roche
58b8d300b8 Merge pull request #160 from akretion/14.0_purchase_usability_French_traduction
[TRAD][14.0] French traduction purchase_usability
2021-11-30 15:35:25 +01:00
Kev-Roche
cdcf4eb406 [TRAD][14.0] French traduction purchase_usability 2021-11-30 15:32:37 +01:00
Kevin.roche
a22f79ef44 [ADD] stock_reception_usability 2021-11-29 13:24:24 +01:00
Alexis de Lattre
99dd4de4f7 stock_valuation_xlsx: first port to v14 without price history (when you ask for a past price, you get the current price for the moment) 2021-11-26 23:57:22 +01:00
Alexis de Lattre
f3d6b67043 [MIG] link_tracker_usability from v10 to v14
Prepare port of mass_mailing_usability... but no real port for the moment
2021-11-18 17:18:08 +01:00
Alexis de Lattre
1963af114b mass_mailing_usability: Fix dependencies 2021-11-18 16:51:13 +01:00
Alexis de Lattre
1da4c40927 Add module mass_mailing_usability
Improve module link_tracker_usability
2021-11-18 16:51:13 +01:00
Alexis de Lattre
edc9db5839 New module link_tracker_usability 2021-11-18 16:51:13 +01:00
Alexis de Lattre
882d068f1a [MIG] base_partner_ref from v12 to v14 2021-11-18 16:20:49 +01:00
Alexis de Lattre
878db1d0a1 [MIG] crm_usability from v10 to v14
New module sales_team_usability (remove translation on crm.tag, which
was in crm_usability in v10)
2021-11-18 10:43:53 +01:00
Alexis de Lattre
600acd2f26 Add multi-company ir.rule for crm.lead 2021-11-18 10:21:09 +01:00
Alexis de Lattre
059c3b4a09 Add groupby on partner on opportunity search view 2021-11-18 10:21:09 +01:00
David Beal
895e1d9dd0 FIX branding 2021-11-18 10:21:09 +01:00
Alexis de Lattre
0b3ffc804f translate=False on 'name' field of crm.lead.tag and res.partner.category 2021-11-18 10:21:09 +01:00
Alexis de Lattre
c0a03dbb0e Work on usability of CRM 2021-11-18 10:21:09 +01:00
David Beal
6e5f263283 IMP add icons 2021-11-18 10:21:09 +01:00
Raphaël Valyi
d4ebbb28d9 Merge pull request #150 from akretion/14.0-imp-moves-domain-picking-view
[IMP] StockMoves locations domain in picking view
2021-11-16 13:09:50 -03:00
Raphaël Valyi
7dd204e57e Merge pull request #148 from akretion/14.0-product-usability-filter-domain-supinfo
product_usability: Improve filter domain on supplier product name/reference
2021-11-16 12:34:55 -03:00
Alexis de Lattre
e1a84973da account_usability: FIX display of decimal precision of sale price in product form view 2021-11-12 12:37:42 +01:00
Alexis de Lattre
13e68ac0f5 Remove modules pos_no_product_template_menu and sale_purchase_no_product_template_menu
We won't port those modules to v14
2021-11-04 12:37:34 +01:00
Alexis de Lattre
3b17c2e5fb Improve register payment wizard view 2021-11-04 11:16:24 +01:00
Alexis de Lattre
0be112dc84 Improve pos_usability
Fix FR translation of base_partner_one2many_phone to avoid a crash when loading the FR translation
2021-10-30 00:40:33 +02:00
Raphaël Valyi
ce2255623d [ADD] web_tab_title 2021-10-26 22:06:48 -03:00
Kevin.roche
2854d4fdda [IMP] sale_usability: access to sale orders from invoice view 2021-10-21 22:51:08 +02:00
Alexis de Lattre
6c51a92acc account_usability: delete invoice PDF attachment when putting a customer invoice/refund back to draft
This feature was native up to v12, but was forgotten in the invoice/move merge of v13
2021-10-21 22:48:51 +02:00
Alexis de Lattre
f3910ab528 account_usability: remove field default_move_line_name which we don't use any more 2021-10-20 23:29:04 +02:00
clementmbr
279dc7c6c0 [IMP] add domain on origin and destination location for stock.moves in picking view 2021-10-06 14:43:15 +02:00
clementmbr
45500f5bd8 product_usability: Improve filter domain on supplier product names 2021-09-03 15:25:55 +02:00
524 changed files with 15727 additions and 3911 deletions

View File

@@ -1,23 +0,0 @@
# © 2016-2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Account Fiscal Position Payable Receivable",
"version": "12.0.1.0.0",
"category": "Accounting & Finance",
"license": "AGPL-3",
"summary": "Configure payable/receivable accounts on fiscal positions",
"description": """
Account Fiscal Position Payable Receivable
==========================================
This module allows to configure a special *Partner Receivable Account* and a special *Partner Payable Account* on fiscal positions. This is used in the onchange of the fiscal position of partners.
This module has been written by Alexis de Lattre from Akretion <alexis.delattre@akretion.com>.
""",
"author": "Akretion",
"website": "http://www.akretion.com",
"depends": ["account"],
"data": ["views/account_fiscal_position_view.xml"],
"installable": False,
}

View File

@@ -1,2 +0,0 @@
from . import account_fiscal_position
from . import res_partner

View File

@@ -1,21 +0,0 @@
# © 2016-2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, fields
class AccountFiscalPosition(models.Model):
_inherit = "account.fiscal.position"
receivable_account_id = fields.Many2one(
"account.account",
string="Partner Receivable Account",
company_dependent=True,
domain=[("internal_type", "=", "receivable")],
)
payable_account_id = fields.Many2one(
"account.account",
string="Partner Payable Account",
company_dependent=True,
domain=[("internal_type", "=", "payable")],
)

View File

@@ -1,25 +0,0 @@
# © 2016-2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, api
class ResPartner(models.Model):
_inherit = "res.partner"
@api.onchange("property_account_position_id")
def fiscal_position_receivable_payable_change(self):
fp = self.property_account_position_id
ipo = self.env["ir.property"]
if fp.receivable_account_id:
self.property_account_receivable_id = fp.receivable_account_id
else:
self.property_account_receivable_id = ipo.get(
"property_account_receivable_id", "res.partner"
)
if fp.payable_account_id:
self.property_account_payable_id = fp.payable_account_id
else:
self.property_account_payable_id = ipo.get(
"property_account_payable_id", "res.partner"
)

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_account_position_form" model="ir.ui.view">
<field name="name">receivable_payable.fiscal_position_form</field>
<field name="model">account.fiscal.position</field>
<field name="inherit_id" ref="account.view_account_position_form" />
<field name="arch" type="xml">
<field name="company_id" position="after">
<field name="receivable_account_id"/>
<field name="payable_account_id"/>
</field>
</field>
</record>
</odoo>

View File

@@ -4,7 +4,7 @@
{ {
'name': 'Account Invoice Update Wizard', 'name': 'Account Invoice Update Wizard',
'version': '12.0.1.0.0', 'version': '14.0.1.0.0',
'category': 'Accounting & Finance', 'category': 'Accounting & Finance',
'license': 'AGPL-3', 'license': 'AGPL-3',
'summary': 'Wizard to update non-legal fields of an open/paid invoice', 'summary': 'Wizard to update non-legal fields of an open/paid invoice',
@@ -14,8 +14,9 @@
'account', 'account',
], ],
'data': [ 'data': [
'wizard/account_invoice_update_view.xml', 'security/ir.model.access.csv',
'views/account_invoice.xml', 'wizard/account_move_update_view.xml',
], 'views/account_move.xml',
],
'installable': False, 'installable': False,
} }

View File

@@ -1 +1 @@
from . import account_invoice from . import account_move

View File

@@ -1,22 +1,18 @@
# Copyright 2019 Camptocamp # Copyright 2019-2022 Camptocamp
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, fields, api, _ from odoo import models
from odoo.exceptions import UserError
import odoo.addons.decimal_precision as dp
class AccountInvoice(models.Model): class AccountMove(models.Model):
_inherit = 'account.invoice' _inherit = 'account.move'
def prepare_update_wizard(self): def prepare_update_wizard(self):
self.ensure_one() self.ensure_one()
wizard = self.env['account.invoice.update'] wizard = self.env['account.move.update']
res = wizard._prepare_default_get(self) res = wizard._prepare_default_get(self)
action = self.env.ref( action = self.env["ir.actions.actions"]._for_xml_id(
'account_invoice_update_wizard.account_invoice_update_action' 'account_invoice_update_wizard.account_invoice_update_action')
).read()[0]
action['name'] = "Update Wizard" action['name'] = "Update Wizard"
action['res_id'] = wizard.create(res).id action['res_id'] = wizard.create(res).id
return action return action

View File

@@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_account_move_update,account.move.update.user,model_account_move_update,account.group_account_invoice,1,1,1,1
access_account_move_line_update,account.move.line.update.user,model_account_move_line_update,account.group_account_invoice,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_account_move_update account.move.update.user model_account_move_update account.group_account_invoice 1 1 1 1
3 access_account_move_line_update account.move.line.update.user model_account_move_line_update account.group_account_invoice 1 1 1 1

View File

@@ -1 +1 @@
from . import test_account_invoice_update_wizard from . import test_account_move_update_wizard

View File

@@ -1,196 +0,0 @@
# Copyright 2018-2019 Camptocamp
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.tests.common import SavepointCase
from odoo.exceptions import UserError
class TestAccountInvoiceUpdateWizard(SavepointCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.customer12 = cls.env.ref('base.res_partner_12')
cls.product16 = cls.env.ref('product.product_product_16')
cls.product24 = cls.env.ref('product.product_product_24')
uom_unit = cls.env.ref('uom.product_uom_categ_unit')
cls.invoice1 = cls.env['account.invoice'].create({
'name': 'Test invoice',
'partner_id': cls.customer12.id,
})
cls.inv_line1 = cls.env['account.invoice.line'].create({
'invoice_id': cls.invoice1.id,
'name': "Line1",
'product_id': cls.product16.id,
'product_uom_id': uom_unit.id,
'account_id': cls.invoice1.account_id.id,
'price_unit': 42.0,
})
cls.inv_line2 = cls.env['account.invoice.line'].create({
'invoice_id': cls.invoice1.id,
'name': "Line2",
'product_id': cls.product24.id,
'product_uom_id': uom_unit.id,
'account_id': cls.invoice1.account_id.id,
'price_unit': 1111.1,
})
cls.aa1 = cls.env.ref('analytic.analytic_partners_camp_to_camp')
cls.aa2 = cls.env.ref('analytic.analytic_nebula')
cls.atag1 = cls.env.ref('analytic.tag_contract')
cls.atag2 = cls.env['account.analytic.tag'].create({
'name': '',
})
def create_wizard(self, invoice):
res = self.invoice1.prepare_update_wizard()
self.wiz = self.env['account.invoice.update'].browse(res['res_id'])
def test_add_analytic_account_line1(self):
""" Add analytic account on an invoice line
after the invoice has been approved.
This will:
- update the move line
- create a new analytic line.
"""
self.invoice1.action_invoice_open()
self.create_wizard(self.invoice1)
wiz_line = self.wiz.line_ids.filtered(
lambda rec: rec.invoice_line_id == self.inv_line1)
wiz_line.account_analytic_id = self.aa1
self.wiz.run()
related_ml = self.invoice1.move_id.line_ids.filtered(
lambda rec: rec.product_id == self.product16)
self.assertEqual(related_ml.analytic_account_id, self.aa1)
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
def test_change_analytic_account_line1(self):
""" Change analytic account on an invoice line
after the invoice has been approved.
This will:
- update the move line
- update the existing analytic line."""
self.inv_line1.account_analytic_id = self.aa2
self.invoice1.action_invoice_open()
self.create_wizard(self.invoice1)
wiz_line = self.wiz.line_ids.filtered(
lambda rec: rec.invoice_line_id == self.inv_line1)
wiz_line.account_analytic_id = self.aa1
self.wiz.run()
related_ml = self.invoice1.move_id.line_ids.filtered(
lambda rec: rec.product_id == self.product16)
self.assertEqual(related_ml.analytic_account_id, self.aa1)
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
def test_error_grouped_move_lines(self):
""" Change analytic account on an invoice line
after the invoice has been approved where both
lines were grouped in the same move line.
This will raise an error.
"""
self.invoice1.journal_id.group_invoice_lines = True
self.inv_line2.product_id = self.product16
self.inv_line2.unit_price = 42.0
self.invoice1.action_invoice_open()
self.create_wizard(self.invoice1)
line1 = self.wiz.line_ids[0]
line1.account_analytic_id = self.aa1
with self.assertRaises(UserError):
self.wiz.run()
def test_add_analytic_tags_line1(self):
""" Add analytic tags on an invoice line
after the invoice has been approved.
This will update move line.
"""
self.invoice1.action_invoice_open()
self.create_wizard(self.invoice1)
wiz_line = self.wiz.line_ids.filtered(
lambda rec: rec.invoice_line_id == self.inv_line1)
wiz_line.analytic_tag_ids = self.atag2
self.wiz.run()
related_ml = self.invoice1.move_id.line_ids.filtered(
lambda rec: rec.product_id == self.product16)
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
self.assertFalse(related_ml.analytic_line_ids)
def test_change_analytic_tags_line1(self):
""" Change analytic tags on an invoice line
after the invoice has been approved.
It will update move line and analytic line
"""
self.inv_line1.account_analytic_id = self.aa2
self.inv_line1.analytic_tag_ids = self.atag1
self.invoice1.action_invoice_open()
self.create_wizard(self.invoice1)
wiz_line = self.wiz.line_ids.filtered(
lambda rec: rec.invoice_line_id == self.inv_line1)
wiz_line.analytic_tag_ids = self.atag2
self.wiz.run()
related_ml = self.invoice1.move_id.line_ids.filtered(
lambda rec: rec.product_id == self.product16)
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
self.assertEqual(related_ml.analytic_line_ids.tag_ids, self.atag2)
def test_add_analytic_info_line1(self):
""" Add analytic account and tags on an invoice line
after the invoice has been approved.
This will:
- update move line
- create an analytic line
"""
self.invoice1.action_invoice_open()
self.create_wizard(self.invoice1)
wiz_line = self.wiz.line_ids.filtered(
lambda rec: rec.invoice_line_id == self.inv_line1)
wiz_line.account_analytic_id = self.aa1
wiz_line.analytic_tag_ids = self.atag2
self.wiz.run()
related_ml = self.invoice1.move_id.line_ids.filtered(
lambda rec: rec.product_id == self.product16)
self.assertEqual(related_ml.analytic_account_id, self.aa1)
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
self.assertEqual(related_ml.analytic_line_ids.tag_ids, self.atag2)
def test_empty_analytic_account_line1(self):
""" Remove analytic account
after the invoice has been approved.
This will raise an error as it is not implemented.
"""
self.inv_line1.account_analytic_id = self.aa2
self.invoice1.action_invoice_open()
self.create_wizard(self.invoice1)
wiz_line = self.wiz.line_ids.filtered(
lambda rec: rec.invoice_line_id == self.inv_line1)
wiz_line.account_analytic_id = False
self.wiz.run()
related_ml = self.invoice1.move_id.line_ids.filtered(
lambda rec: rec.product_id == self.product16)
self.assertFalse(related_ml.analytic_account_id)
self.assertFalse(related_ml.analytic_line_ids)

View File

@@ -0,0 +1,173 @@
# Copyright 2018-2022 Camptocamp
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.tests.common import SavepointCase
class TestAccountInvoiceUpdateWizard(SavepointCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.customer12 = cls.env.ref('base.res_partner_12')
cls.product16 = cls.env.ref('product.product_product_16')
uom_unit = cls.env.ref('uom.product_uom_categ_unit')
cls.move1 = cls.env['account.move'].create({
'name': 'Test invoice',
'partner_id': cls.customer12.id,
'move_type': 'out_invoice',
'invoice_line_ids': [
[0, None, {
'name': 'Line1',
'product_id': cls.product16.id,
'product_uom_id': uom_unit.id,
'quantity': 1,
'price_unit': 42.0,
'credit': 42.0,
'debit': 0
}],
],
})
cls.aa1 = cls.env.ref('analytic.analytic_partners_camp_to_camp')
cls.aa2 = cls.env.ref('analytic.analytic_nebula')
cls.atag1 = cls.env.ref('analytic.tag_contract')
cls.atag2 = cls.env['account.analytic.tag'].create({
'name': '',
})
def create_wizard(self, move):
res = move.prepare_update_wizard()
self.wiz = self.env['account.move.update'].browse(res['res_id'])
def test_add_analytic_account_line1(self):
""" Add analytic account on a move line
after the move has been approved.
This will:
- update the move line
- create a new analytic line.
"""
self.move1._post()
self.create_wizard(self.move1)
wiz_line = self.wiz.line_ids.filtered(
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
wiz_line.analytic_account_id = self.aa1
self.wiz.run()
related_ml = self.move1.invoice_line_ids.filtered(
lambda rec: rec.product_id == self.product16)
self.assertEqual(related_ml.analytic_account_id, self.aa1)
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
def test_change_analytic_account_line1(self):
""" Change analytic account on a move line
after the move has been approved.
This will:
- update the move line
- update the existing analytic line."""
move_line1 = self.move1.invoice_line_ids.filtered(lambda rec: rec.product_id == self.product16)
move_line1.analytic_account_id = self.aa2
self.move1._post()
self.create_wizard(self.move1)
wiz_line = self.wiz.line_ids.filtered(
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
wiz_line.analytic_account_id = self.aa1
self.wiz.run()
related_ml = self.move1.invoice_line_ids.filtered(
lambda rec: rec.product_id == self.product16)
self.assertEqual(related_ml.analytic_account_id, self.aa1)
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
def test_add_analytic_tags_line1(self):
""" Add analytic tags on a move line
after the move has been approved.
This will update move line.
"""
self.move1._post()
self.create_wizard(self.move1)
wiz_line = self.wiz.line_ids.filtered(
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
wiz_line.analytic_tag_ids = self.atag2
self.wiz.run()
related_ml = self.move1.invoice_line_ids.filtered(
lambda rec: rec.product_id == self.product16)
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
self.assertFalse(related_ml.analytic_line_ids)
def test_change_analytic_tags_line1(self):
""" Change analytic tags on a move line
after the move has been approved.
It will update move line and analytic line
"""
move_line1 = self.move1.invoice_line_ids.filtered(lambda rec: rec.product_id == self.product16)
move_line1.analytic_account_id = self.aa2
move_line1.analytic_tag_ids = self.atag1
self.move1._post()
self.create_wizard(self.move1)
wiz_line = self.wiz.line_ids.filtered(
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
wiz_line.analytic_tag_ids = self.atag2
self.wiz.run()
related_ml = self.move1.invoice_line_ids.filtered(
lambda rec: rec.product_id == self.product16)
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
self.assertEqual(related_ml.analytic_line_ids.tag_ids, self.atag2)
def test_add_analytic_info_line1(self):
""" Add analytic account and tags on a move line
after the move has been approved.
This will:
- update move line
- create an analytic line
"""
self.move1._post()
self.create_wizard(self.move1)
wiz_line = self.wiz.line_ids.filtered(
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
wiz_line.analytic_account_id = self.aa1
wiz_line.analytic_tag_ids = self.atag2
self.wiz.run()
related_ml = self.move1.invoice_line_ids.filtered(
lambda rec: rec.product_id == self.product16)
self.assertEqual(related_ml.analytic_account_id, self.aa1)
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
self.assertEqual(related_ml.analytic_line_ids.tag_ids, self.atag2)
def test_empty_analytic_account_line1(self):
""" Remove analytic account
after the move has been approved.
This will raise an error as it is not implemented.
"""
move_line1 = self.move1.invoice_line_ids.filtered(lambda rec: rec.product_id == self.product16)
move_line1.analytic_account_id = self.aa2
self.move1._post()
self.create_wizard(self.move1)
wiz_line = self.wiz.line_ids.filtered(
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
wiz_line.analytic_account_id = False
self.wiz.run()
related_ml = self.move1.invoice_line_ids.filtered(
lambda rec: rec.product_id == self.product16)
self.assertFalse(related_ml.analytic_account_id)
self.assertFalse(related_ml.analytic_line_ids)

View File

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="invoice_supplier_form" model="ir.ui.view">
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_supplier_form"/>
<field name="arch" type="xml">
<button name="action_invoice_draft" position="before">
<button name="prepare_update_wizard" type="object" string="Update Invoice" states="open,paid" groups="account.group_account_invoice"/>
</button>
</field>
</record>
<record id="invoice_form" model="ir.ui.view">
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_form"/>
<field name="arch" type="xml">
<button name="action_invoice_draft" position="before">
<button name="prepare_update_wizard" type="object" string="Update Invoice" states="open,paid" groups="account.group_account_invoice"/>
</button>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_move_form_inherit" model="ir.ui.view">
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<button name="button_draft" position="before">
<button name="prepare_update_wizard" type="object" string="Update Invoice" states="posted" groups="account.group_account_invoice"/>
</button>
</field>
</record>
</odoo>

View File

@@ -1 +1 @@
from . import account_invoice_update from . import account_move_update

View File

@@ -1,5 +1,5 @@
# Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>) # Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# Copyright 2018-2019 Camptocamp # Copyright 2018-2022 Camptocamp
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, fields, api, _ from odoo import models, fields, api, _
@@ -7,38 +7,34 @@ from odoo.exceptions import UserError
import odoo.addons.decimal_precision as dp import odoo.addons.decimal_precision as dp
class AccountInvoiceUpdate(models.TransientModel): class AccountMoveUpdate(models.TransientModel):
_name = 'account.invoice.update' _name = 'account.move.update'
_description = 'Wizard to update non-legal fields of invoice' _description = 'Wizard to update non-legal fields of invoice'
invoice_id = fields.Many2one( invoice_id = fields.Many2one(
'account.invoice', string='Invoice', required=True, 'account.move', string='Invoice', required=True,
readonly=True) readonly=True)
type = fields.Selection(related='invoice_id.type', readonly=True) move_type = fields.Selection(related='invoice_id.move_type')
company_id = fields.Many2one( company_id = fields.Many2one(related='invoice_id.company_id')
related='invoice_id.company_id', readonly=True) partner_id = fields.Many2one(related='invoice_id.partner_id')
partner_id = fields.Many2one(
related='invoice_id.partner_id', readonly=True)
user_id = fields.Many2one('res.users', string='Salesperson') user_id = fields.Many2one('res.users', string='Salesperson')
payment_term_id = fields.Many2one( invoice_payment_term_id = fields.Many2one(
'account.payment.term', string='Payment Term') 'account.payment.term', string='Payment Term')
reference = fields.Char(string='Invoice Reference') ref = fields.Char(string='Reference') # field label is customized in the view
name = fields.Char(string='Reference/Description') invoice_origin = fields.Char(string='Source Document')
origin = fields.Char(string='Source Document')
comment = fields.Text('Additional Information')
partner_bank_id = fields.Many2one( partner_bank_id = fields.Many2one(
'res.partner.bank', string='Bank Account') 'res.partner.bank', string='Bank Account')
line_ids = fields.One2many( line_ids = fields.One2many(
'account.invoice.line.update', 'parent_id', string='Invoice Lines') 'account.move.line.update', 'parent_id', string='Invoice Lines')
@api.model @api.model
def _simple_fields2update(self): def _simple_fields2update(self):
'''List boolean, date, datetime, char, text fields''' '''List boolean, date, datetime, char, text fields'''
return ['reference', 'name', 'origin', 'comment'] return ['ref', 'invoice_origin']
@api.model @api.model
def _m2o_fields2update(self): def _m2o_fields2update(self):
return ['payment_term_id', 'user_id', 'partner_bank_id'] return ['invoice_payment_term_id', 'user_id', 'partner_bank_id']
@api.model @api.model
def _prepare_default_get(self, invoice): def _prepare_default_get(self, invoice):
@@ -55,16 +51,17 @@ class AccountInvoiceUpdate(models.TransientModel):
'name': line.name, 'name': line.name,
'quantity': line.quantity, 'quantity': line.quantity,
'price_subtotal': line.price_subtotal, 'price_subtotal': line.price_subtotal,
'account_analytic_id': line.account_analytic_id.id, 'analytic_account_id': line.analytic_account_id.id,
'currency_id': line.currency_id.id,
'analytic_tag_ids': aa_tags, 'analytic_tag_ids': aa_tags,
'display_type': line.display_type, 'display_type': line.display_type,
}]) }])
return res return res
@api.onchange('type') @api.onchange('move_type')
def type_on_change(self): def move_type_on_change(self):
res = {'domain': {}} res = {'domain': {}}
if self.type in ('out_invoice', 'out_refund'): if self.move_type in ('out_invoice', 'out_refund'):
res['domain']['partner_bank_id'] =\ res['domain']['partner_bank_id'] =\
"[('partner_id.ref_company_ids', 'in', [company_id])]" "[('partner_id.ref_company_ids', 'in', [company_id])]"
else: else:
@@ -72,7 +69,6 @@ class AccountInvoiceUpdate(models.TransientModel):
"[('partner_id', '=', partner_id)]" "[('partner_id', '=', partner_id)]"
return res return res
@api.multi
def _prepare_invoice(self): def _prepare_invoice(self):
vals = {} vals = {}
inv = self.invoice_id inv = self.invoice_id
@@ -82,8 +78,8 @@ class AccountInvoiceUpdate(models.TransientModel):
for m2ofield in self._m2o_fields2update(): for m2ofield in self._m2o_fields2update():
if self[m2ofield] != inv[m2ofield]: if self[m2ofield] != inv[m2ofield]:
vals[m2ofield] = self[m2ofield].id or False vals[m2ofield] = self[m2ofield].id or False
if 'payment_term_id' in vals: if 'invoice_payment_term_id' in vals:
pterm_list = self.payment_term_id.compute( pterm_list = self.invoice_payment_term_id.compute(
value=1, date_ref=inv.date_invoice)[0] value=1, date_ref=inv.date_invoice)[0]
if pterm_list: if pterm_list:
vals['date_due'] = max(line[0] for line in pterm_list) vals['date_due'] = max(line[0] for line in pterm_list)
@@ -91,15 +87,15 @@ class AccountInvoiceUpdate(models.TransientModel):
@api.model @api.model
def _line_simple_fields2update(self): def _line_simple_fields2update(self):
return ["name",] return ["name"]
@api.model @api.model
def _line_m2o_fields2update(self): def _line_m2o_fields2update(self):
return ["account_analytic_id",] return ["analytic_account_id"]
@api.model @api.model
def _line_m2m_fields2update(self): def _line_m2m_fields2update(self):
return ["analytic_tag_ids",] return ["analytic_tag_ids"]
@api.model @api.model
def _prepare_invoice_line(self, line): def _prepare_invoice_line(self, line):
@@ -115,87 +111,45 @@ class AccountInvoiceUpdate(models.TransientModel):
vals[field] = [(6, 0, line[field].ids)] vals[field] = [(6, 0, line[field].ids)]
return vals return vals
@api.multi def _prepare_move_line_and_analytic_line(self, inv_line):
def _prepare_move(self):
mvals = {}
inv = self.invoice_id
ini_ref = inv.move_id.ref
ref = inv.reference or inv.name
if ini_ref != ref:
mvals['ref'] = ref
return mvals
@api.multi
def _get_matching_inv_line(self, move_line):
""" Find matching invoice line by product """
# TODO make it accept more case as lines won't
# be grouped unless journal.group_invoice_line is True
inv_line = self.invoice_id.invoice_line_ids.filtered(
lambda rec: rec.product_id == move_line.product_id)
if len(inv_line) != 1:
raise UserError(
"Cannot match a single invoice line to move line %s" %
move_line.name)
return inv_line
@api.multi
def _prepare_move_line(self, inv_line):
mlvals = {} mlvals = {}
inv_line_upd = self.line_ids.filtered(
lambda rec: rec.invoice_line_id == inv_line)
ini_aa = inv_line.account_analytic_id
new_aa = inv_line_upd.account_analytic_id
if ini_aa != new_aa:
mlvals['analytic_account_id'] = new_aa.id
ini_aa_tags = inv_line.analytic_tag_ids
new_aa_tags = inv_line_upd.analytic_tag_ids
if ini_aa_tags != new_aa_tags:
mlvals['analytic_tag_ids'] = [(6, None, new_aa_tags.ids)]
return mlvals
@api.multi
def _prepare_analytic_line(self, inv_line):
alvals = {} alvals = {}
inv_line_upd = self.line_ids.filtered( inv_line_upd = self.line_ids.filtered(
lambda rec: rec.invoice_line_id == inv_line) lambda rec: rec.invoice_line_id == inv_line)
ini_aa = inv_line.account_analytic_id ini_aa = inv_line.analytic_account_id
new_aa = inv_line_upd.account_analytic_id new_aa = inv_line_upd.analytic_account_id
if ini_aa != new_aa: if ini_aa != new_aa:
mlvals['analytic_account_id'] = new_aa.id
alvals['account_id'] = new_aa.id alvals['account_id'] = new_aa.id
ini_aa_tags = inv_line.analytic_tag_ids ini_aa_tags = inv_line.analytic_tag_ids
new_aa_tags = inv_line_upd.analytic_tag_ids new_aa_tags = inv_line_upd.analytic_tag_ids
if ini_aa_tags != new_aa_tags: if ini_aa_tags != new_aa_tags:
mlvals['analytic_tag_ids'] = [(6, None, new_aa_tags.ids)]
alvals['tag_ids'] = [(6, None, new_aa_tags.ids)] alvals['tag_ids'] = [(6, None, new_aa_tags.ids)]
return alvals return mlvals, alvals
@api.multi
def _update_payment_term_move(self): def _update_payment_term_move(self):
self.ensure_one() self.ensure_one()
inv = self.invoice_id inv = self.invoice_id
if ( if (
self.payment_term_id and self.invoice_payment_term_id and
self.payment_term_id != inv.payment_term_id and self.invoice_payment_term_id != inv.invoice_payment_term_id):
inv.move_id):
# I don't update pay term when the invoice is partially (or fully) # I don't update pay term when the invoice is partially (or fully)
# paid because if you have a payment term with several lines # paid because if you have a payment term with several lines
# of the same amount, you would also have to take into account # of the same amount, you would also have to take into account
# the reconcile marks to put the new maturity date on the right # the reconcile marks to put the new maturity date on the right
# lines # lines
if inv.payment_ids: if inv.payment_id:
raise UserError(_( raise UserError(_(
"This wizard doesn't support the update of payment " "This wizard doesn't support the update of payment "
"terms on an invoice which is partially or fully " "terms on an invoice which is partially or fully "
"paid.")) "paid."))
prec = self.env['decimal.precision'].precision_get('Account') prec = self.env['decimal.precision'].precision_get('Account')
term_res = self.payment_term_id.compute( term_res = self.invoice_payment_term_id.compute(
inv.amount_total, inv.date_invoice)[0] inv.amount_total, inv.date_invoice)[0]
new_pterm = {} # key = int(amount * 100), value = [date1, date2] new_pterm = {} # key = int(amount * 100), value = [date1, date2]
for entry in term_res: for entry in term_res:
@@ -220,11 +174,10 @@ class AccountInvoiceUpdate(models.TransientModel):
"new payment term '%s'. You can only switch to a " "new payment term '%s'. You can only switch to a "
"payment term that has the same number of terms " "payment term that has the same number of terms "
"with the same amount.") % ( "with the same amount.") % (
inv.payment_term_id.name, self.payment_term_id.name)) inv.invoice_payment_term_id.name, self.invoice_payment_term_id.name))
for line in lines: for line in lines:
line.date_maturity = new_pterm[iamount].pop() line.date_maturity = new_pterm[iamount].pop()
@api.multi
def run(self): def run(self):
self.ensure_one() self.ensure_one()
inv = self.invoice_id inv = self.invoice_id
@@ -235,28 +188,24 @@ class AccountInvoiceUpdate(models.TransientModel):
if ivals: if ivals:
updated = True updated = True
inv.write(ivals) inv.write(ivals)
if inv.move_id: if inv:
mvals = self._prepare_move() for ml in inv.line_ids.filtered(
if mvals:
inv.move_id.write(mvals)
for ml in inv.move_id.line_ids.filtered(
# we are only interested in invoice lines, not tax lines # we are only interested in invoice lines, not tax lines
lambda rec: bool(rec.product_id) lambda rec: bool(rec.product_id)
): ):
if ml.credit == 0.0: if ml.credit == 0.0:
continue continue
inv_line = self._get_matching_inv_line(ml) analytic_account = ml.analytic_account_id
mlvals = self._prepare_move_line(inv_line) mlvals, alvals = self._prepare_move_line_and_analytic_line(ml)
if mlvals: if mlvals:
updated = True updated = True
ml.write(mlvals) ml.write(mlvals)
aalines = ml.analytic_line_ids aalines = ml.analytic_line_ids
alvals = self._prepare_analytic_line(inv_line)
if aalines and alvals: if aalines and alvals:
updated = True updated = True
if ('account_id' in alvals and if ('account_id' in alvals and
alvals['account_id'] is False): alvals['account_id'] is False):
former_aa = inv_line.account_analytic_id former_aa = analytic_account
to_remove_aalines = aalines.filtered( to_remove_aalines = aalines.filtered(
lambda rec: rec.account_id == former_aa) lambda rec: rec.account_id == former_aa)
# remove existing analytic line # remove existing analytic line
@@ -279,24 +228,24 @@ class AccountInvoiceUpdate(models.TransientModel):
return True return True
class AccountInvoiceLineUpdate(models.TransientModel): class AccountMoveLineUpdate(models.TransientModel):
_name = 'account.invoice.line.update' _name = 'account.move.line.update'
_description = 'Update non-legal fields of invoice lines' _description = 'Update non-legal fields of invoice lines'
parent_id = fields.Many2one( parent_id = fields.Many2one(
'account.invoice.update', string='Wizard', ondelete='cascade') 'account.move.update', string='Wizard', ondelete='cascade')
invoice_line_id = fields.Many2one( invoice_line_id = fields.Many2one(
'account.invoice.line', string='Invoice Line', readonly=True) 'account.move.line', string='Invoice Line', readonly=True)
name = fields.Text(string='Description', required=True) name = fields.Text(string='Description', required=True)
display_type = fields.Selection([ display_type = fields.Selection([
('line_section', "Section"), ('line_section', "Section"),
('line_note', "Note")], default=False, help="Technical field for UX purpose.") ('line_note', "Note")], default=False, help="Technical field for UX purpose.")
quantity = fields.Float( quantity = fields.Float(
string='Quantity', digits=dp.get_precision('Product Unit of Measure'), string='Quantity', digits='Product Unit of Measure', readonly=True)
readonly=True) price_subtotal = fields.Monetary(
price_subtotal = fields.Float( string='Amount', readonly=True)
string='Amount', readonly=True, digits=dp.get_precision('Account')) analytic_account_id = fields.Many2one(
account_analytic_id = fields.Many2one(
'account.analytic.account', string='Analytic Account') 'account.analytic.account', string='Analytic Account')
analytic_tag_ids = fields.Many2many( analytic_tag_ids = fields.Many2many(
'account.analytic.tag', string='Analytic Tags') 'account.analytic.tag', string='Analytic Tags')
currency_id = fields.Many2one('res.currency', readonly=True)

View File

@@ -7,32 +7,32 @@
<odoo> <odoo>
<record id="account_invoice_update_form" model="ir.ui.view"> <record id="account_invoice_update_form" model="ir.ui.view">
<field name="model">account.invoice.update</field> <field name="model">account.move.update</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Update Invoice Wizard"> <form string="Update Invoice Wizard">
<group name="main"> <group name="main">
<field name="invoice_id" invisible="1"/> <field name="invoice_id" invisible="1"/>
<field name="type" invisible="1"/> <field name="move_type" invisible="1"/>
<field name="company_id" invisible="1"/> <field name="company_id" invisible="1"/>
<field name="partner_id" invisible="1"/> <field name="partner_id" invisible="1"/>
<field name="reference" attrs="{'invisible': [('type', 'not in', ('in_invoice', 'in_refund'))]}"/> <field string="Bill Reference" attrs="{'invisible': [('move_type', 'not in', ('in_invoice', 'in_refund'))]}" name="ref"/>
<field name="origin"/> <field string="Customer Reference" attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'out_refund'))]}" name="ref"/>
<field name="name"/> <field name="invoice_origin"/>
<field name="payment_term_id" widget="selection"/> <field name="invoice_payment_term_id" widget="selection"/>
<field name="partner_bank_id"/> <field name="partner_bank_id"/>
<field name="user_id"/> <field name="user_id" options="{'no_open': True, 'no_create': True, 'no_create_edit': True}"/>
<field name="comment"/>
</group> </group>
<group name="lines"> <group name="lines">
<field name="line_ids" nolabel="1"> <field name="line_ids" nolabel="1">
<tree editable="bottom" create="false" delete="false" edit="true"> <tree editable="bottom" create="false" delete="false" edit="true">
<field name="invoice_line_id" invisible="1"/> <field name="invoice_line_id" invisible="1"/>
<field name="display_type" invisible="1"/> <field name="display_type" invisible="1"/>
<field name="currency_id" invisible="1"/>
<field name="name"/> <field name="name"/>
<field name="quantity" attrs="{'invisible': [('display_type', '!=', False)]}"/> <field name="quantity" attrs="{'invisible': [('display_type', '!=', False)]}"/>
<field name="price_subtotal" attrs="{'invisible': [('display_type', '!=', False)]}"/> <field name="price_subtotal" attrs="{'invisible': [('display_type', '!=', False)]}"/>
<field name="account_analytic_id" attrs="{'invisible': [('display_type', '!=', False)]}" groups="analytic.group_analytic_accounting"/> <field name="analytic_account_id" attrs="{'invisible': [('display_type', '!=', False)]}" groups="analytic.group_analytic_accounting"/>
<field name="analytic_tag_ids" attrs="{'invisible': [('display_type', '!=', False)]}" groups="analytic.group_analytic_accounting" widget="many2many_tags"/> <field name="analytic_tag_ids" attrs="{'invisible': [('display_type', '!=', False)]}" groups="analytic.group_analytic_tags" widget="many2many_tags"/>
</tree> </tree>
</field> </field>
</group> </group>
@@ -46,7 +46,7 @@
<record id="account_invoice_update_action" model="ir.actions.act_window"> <record id="account_invoice_update_action" model="ir.actions.act_window">
<field name="name">Invoice Update Wizard</field> <field name="name">Invoice Update Wizard</field>
<field name="res_model">account.invoice.update</field> <field name="res_model">account.move.update</field>
<field name="view_mode">form</field> <field name="view_mode">form</field>
<field name="target">new</field> <field name="target">new</field>
</record> </record>

View File

@@ -0,0 +1,39 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
Account Invoice Update Wizard
=============================
This module adds a button *Update Invoice* on Customer and Supplier invoices in
Open or Paid state. This button starts a wizard which allows the user to update
non-legal fields of the invoice:
* Source Document
* Reference/Description
* Payment terms (update allowed only to a payment term with same number of terms
of the same amount and on invoices without any payment)
* Bank Account
* Salesman
* Notes
* Description of invoice lines
* Analytic account
* Analytic tags
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/akretion/odoo-usability/issues>`_. In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
help us smash it by providing detailed and welcomed feedback.
Contributors
------------
* Alexis de Lattre <alexis.delattre@akretion.com>
* Florian da Costa <florian.dacosta@akretion.com>
* Matthieu Dietrich <matthieu.dietrich@camptocamp.com>
* Yannick Vaucher <yannick.vaucher@camptocamp.com>
* Mykhailo Panarin <m.panarin@mobilunity.com>
* Artem Kostyuk <a.kostyuk@mobilunity.com>

View File

@@ -0,0 +1 @@
from . import wizard

View File

@@ -0,0 +1,17 @@
# Copyright 2022 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
'name': 'Account Invoice Update Wizard Payment Mode',
'version': '14.0.1.0.0',
'category': 'Accounting & Finance',
'license': 'AGPL-3',
'summary': 'Add Payment Mode to Invoice Update Wizard',
'author': 'Akretion',
'website': 'https://github.com/akretion/odoo-usability',
'depends': ['account_invoice_update_wizard', 'account_payment_partner'],
'data': ['wizard/account_move_update_view.xml'],
'installable': False,
'auto_install': True,
}

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_move_form_inherit" model="ir.ui.view">
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<button name="button_draft" position="before">
<button name="prepare_update_wizard" type="object" string="Update Invoice" states="posted" groups="account.group_account_invoice"/>
</button>
</field>
</record>
</odoo>

View File

@@ -0,0 +1 @@
from . import account_move_update

View File

@@ -0,0 +1,24 @@
# Copyright 2022 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import models, fields, api, _
class AccountMoveUpdate(models.TransientModel):
_inherit = 'account.move.update'
payment_mode_filter_type_domain = fields.Char(
related='invoice_id.payment_mode_filter_type_domain')
partner_bank_filter_type_domain = fields.Many2one(
related='invoice_id.partner_bank_filter_type_domain')
bank_account_required = fields.Boolean(
related='invoice_id.bank_account_required')
payment_mode_id = fields.Many2one("account.payment.mode")
@api.model
def _m2o_fields2update(self):
m2o_list = super()._m2o_fields2update()
m2o_list.append('payment_mode_id')
return m2o_list

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="account_invoice_update_form" model="ir.ui.view">
<field name="model">account.move.update</field>
<field name="inherit_id" ref="account_invoice_update_wizard.account_invoice_update_form"/>
<field name="arch" type="xml">
<field name="invoice_payment_term_id" position="after">
<field name="payment_mode_filter_type_domain" invisible="1"/>
<field name="partner_bank_filter_type_domain" invisible="1"/>
<field name="bank_account_required" invisible="1"/>
<field name="payment_mode_id" domain="[('payment_type', '=', payment_mode_filter_type_domain), ('company_id', '=', company_id)]"/>
</field>
<field name="partner_bank_id" position="attributes">
<attribute name="domain">
[('partner_id', '=', partner_bank_filter_type_domain),
'|',('company_id', '=', company_id),('company_id', '=', False)]
</attribute>
<attribute name="attrs">{'required': [('bank_account_required', '=', True),('move_type', 'in', ('in_invoice', 'in_refund'))]}</attribute>
</field>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,18 @@
# Copyright 2022 Akretion France (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Account Menu Usability',
'version': '14.0.1.0.0',
'category': 'Accounting & Finance',
'license': 'AGPL-3',
'summary': 'Small usability enhancements in account_menu module',
'author': 'Akretion',
'website': 'https://github.com/akretion/odoo-usability',
'depends': ['account_menu'],
'data': [
'views/account_menu.xml',
],
'installable': False,
}

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<!-- Accounting Templates are useful only when creating a new company/loading
a chart of accounts, so we put it under 'Settings > Technical' and not
under 'Invoicing > Configuration' which already has a lot of menu entries -->
<record id="account_menu.menu_account_coa_settings" model="ir.ui.menu">
<field name="name">Accounting Templates</field>
<field name="parent_id" ref="base.menu_custom"/>
</record>
</odoo>

View File

@@ -0,0 +1,29 @@
# Copyright 2022 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Account Move Label Copy',
'version': '14.0.1.0.0',
'category': 'Accounting & Finance',
'license': 'AGPL-3',
'summary': 'When creating a Journal Entry manually, copy label from line to line',
'description': """
Account Move Label Copy
=======================
This module is ONLY for users who don't accept to use the 'Reference' (ref) to store the description of the journal entry (the recommended method), but want to use the label on the lines for that purpose (name field of account.move.line). With this module, the label of the first line will be copied by default to the other lines upon creation of each line.
I don't recommend the use of this module.
""",
'author': 'Akretion',
'website': 'http://www.akretion.com',
'depends': [
'account',
'base_view_inheritance_extension',
],
'data': [
'views/account_move.xml',
],
'installable': False,
}

View File

@@ -0,0 +1 @@
from . import account_move

View File

@@ -0,0 +1,13 @@
# Copyright 2022 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import fields, models
class AccountMove(models.Model):
_inherit = "account.move"
default_move_line_name = fields.Char(
related='line_ids.name',
string='Default Journal Item Label')

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_move_form" model="ir.ui.view">
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<field name="narration" position="after">
<field name="default_move_line_name" invisible="1"/>
</field>
<xpath expr="//page[@id='aml_tab']/field[@name='line_ids']" position="attributes">
<attribute name="context" operation="python_dict" key="default_name">default_move_line_name</attribute>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1 @@
from . import report

View File

@@ -0,0 +1,32 @@
# Copyright 2023 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Account Product Fiscal Classification - Sale',
'version': '16.0.1.0.0',
'category': 'Sales',
'license': 'AGPL-3',
'summary': 'Glue module between account_product_fiscal_classification and sale',
'description': """
This module adds a **Start Date** and **End Date** field on invoice
lines. For example, if you have an insurance contrat for your company
that run from April 1st 2013 to March 31st 2014, you will enter these
dates as start and end dates on the supplier invoice line. If your
fiscal year ends on December 31st 2013, 3 months of expenses are part of
the 2014 fiscal year and should not be part of the 2013 fiscal year. So,
thanks to this module, you will create a *Prepaid Expense* on December
31st 2013 and OpenERP will identify this expense with the 3 months that
are after the cut-off date and propose to generate the appropriate
cut-off journal entry.
This module has been written by Alexis de Lattre from Akretion
<alexis.delattre@akretion.com>.
""",
'author': 'Akretion',
'maintainers': ['alexis-via'],
'website': 'https://github.com/akretion/odoo-usability',
'depends': ['pos_sale', 'account_product_fiscal_classification'],
"data": ['report/sale_report_view.xml'],
'auto_install': True,
}

View File

@@ -0,0 +1 @@
from . import sale_report

View File

@@ -0,0 +1,35 @@
# Copyright 2023 Akretion France (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class SaleReport(models.Model):
_inherit = "sale.report"
fiscal_classification_id = fields.Many2one(
"account.product.fiscal.classification",
string="Product Fiscal Classification",
readonly=True,
)
def _select_additional_fields(self):
res = super()._select_additional_fields()
res["fiscal_classification_id"] = "t.fiscal_classification_id"
return res
def _group_by_sale(self):
res = super()._group_by_sale()
res += ", t.fiscal_classification_id"
return res
def _fill_pos_fields(self, additional_fields):
res = super()._fill_pos_fields(additional_fields)
res['fiscal_classification_id'] = "t.fiscal_classification_id"
return res
def _group_by_pos(self):
res = super()._group_by_pos()
res += ", t.fiscal_classification_id"
return res

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2023 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_order_product_search" model="ir.ui.view">
<field name="model">sale.report</field>
<field name="inherit_id" ref="sale.view_order_product_search"/>
<field name="arch" type="xml">
<filter name="Category" position="after">
<filter name="fiscal_classification_groupby" string="Product Fiscal Classification" context="{'group_by': 'fiscal_classification_id'}"/>
</filter>
</field>
</record>
</odoo>

View File

@@ -1,59 +0,0 @@
# Copyright 2015-2020 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, models
import logging
logger = logging.getLogger(__name__)
class AccountAccount(models.Model):
_inherit = 'account.account'
@api.depends('name', 'code')
def name_get(self):
if self._context.get('account_account_show_code_only'):
res = []
for record in self:
res.append((record.id, record.code))
return res
else:
return super().name_get()
# https://github.com/odoo/odoo/issues/23040
# TODO mig to v14 ?
def fix_bank_account_types(self):
aao = self.env['account.account']
companies = self.env['res.company'].search([])
if len(companies) > 1:
self = self.sudo()
logger.info("START the script 'fix bank and cash account types'")
bank_type = self.env.ref('account.data_account_type_liquidity')
asset_type = self.env.ref('account.data_account_type_current_assets')
journals = self.env['account.journal'].search(
[('type', 'in', ('bank', 'cash'))], order='company_id')
journal_accounts_bank_type = aao
for journal in journals:
for account in [
journal.default_credit_account_id,
journal.default_debit_account_id]:
if account:
if account.user_type_id != bank_type:
account.user_type_id = bank_type.id
logger.info(
'Company %s: Account %s updated to Bank '
'and Cash type',
account.company_id.display_name, account.code)
if account not in journal_accounts_bank_type:
journal_accounts_bank_type += account
accounts = aao.search([
('user_type_id', '=', bank_type.id)], order='company_id, code')
for account in accounts:
if account not in journal_accounts_bank_type:
account.user_type_id = asset_type.id
logger.info(
'Company %s: Account %s updated to Current Asset type',
account.company_id.display_name, account.code)
logger.info("END of the script 'fix bank and cash account types'")
return True

View File

@@ -1,16 +0,0 @@
# Copyright 2015-2020 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, models
class AccountIncoterms(models.Model):
_inherit = 'account.incoterms'
@api.depends('code', 'name')
def name_get(self):
res = []
for rec in self:
res.append((rec.id, '[%s] %s' % (rec.code, rec.name)))
return res

View File

@@ -1,60 +0,0 @@
# Copyright 2015-2020 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class AccountJournal(models.Model):
_inherit = 'account.journal'
hide_bank_statement_balance = fields.Boolean(
string='Hide Bank Statement Balance',
help="You may want to enable this option when your bank "
"journal is generated from a bank statement file that "
"doesn't handle start/end balance (QIF for instance) and "
"you don't want to enter the start/end balance manually: it "
"will prevent the display of wrong information in the accounting "
"dashboard and on bank statements.")
@api.depends(
'name', 'currency_id', 'company_id', 'company_id.currency_id', 'code')
def name_get(self):
res = []
if self._context.get('journal_show_code_only'):
for journal in self:
res.append((journal.id, journal.code))
return res
else:
for journal in self:
name = "[%s] %s" % (journal.code, journal.name)
if (
journal.currency_id and
journal.currency_id != journal.company_id.currency_id):
name = "%s (%s)" % (name, journal.currency_id.name)
res.append((journal.id, name))
return res
# @api.constrains('default_credit_account_id', 'default_debit_account_id')
# def _check_account_type_on_bank_journal(self):
# bank_acc_type = self.env.ref('account.data_account_type_liquidity')
# for jrl in self:
# if jrl.type in ('bank', 'cash'):
# if (
# jrl.default_debit_account_id and
# jrl.default_debit_account_id.user_type_id !=
# bank_acc_type):
# raise ValidationError(_(
# "On journal '%s', the default debit account '%s' "
# "should be configured with Type = 'Bank and Cash'.")
# % (jrl.display_name,
# jrl.default_debit_account_id.display_name))
# if (
# jrl.default_credit_account_id and
# jrl.default_credit_account_id.user_type_id !=
# bank_acc_type):
# raise ValidationError(_(
# "On journal '%s', the default credit account '%s' "
# "should be configured with Type = 'Bank and Cash'.")
# % (jrl.display_name,
# jrl.default_credit_account_id.display_name))

View File

@@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2015-2020 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_account_type_tree" model="ir.ui.view">
<field name="name">account_usability.account_type_tree</field>
<field name="model">account.account.type</field>
<field name="inherit_id" ref="account.view_account_type_tree" />
<field name="arch" type="xml">
<field name="type" position="after">
<field name="include_initial_balance" optional="show"/>
</field>
</field>
</record>
</odoo>

View File

@@ -1,51 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2018-2020 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="account_invoice_report_tree" model="ir.ui.view">
<field name="name">usability.account.invoice.report.tree</field>
<field name="model">account.invoice.report</field>
<field name="arch" type="xml">
<tree string="Invoices Analysis">
<field name="move_id"/>
<field name="invoice_date"/>
<field name="invoice_date_due"/>
<field name="move_type"/>
<field name="commercial_partner_id"/>
<field name="invoice_user_id"/>
<field name="product_id"/>
<field name="quantity" sum="1"/>
<field name="product_uom_id" groups="uom.group_uom"/>
<field name="price_subtotal" sum="1"/>
<field name="state"/>
</tree>
</field>
</record>
<record id="account.action_account_invoice_report_all_supp" model="ir.actions.act_window">
<field name="context">{'search_default_current': 1, 'search_default_supplier': 1, 'group_by': ['invoice_date']}</field> <!-- Remove group_by_no_leaf, which breaks tree view -->
</record>
<record id="account.action_account_invoice_report_all" model="ir.actions.act_window">
<field name="context">{'search_default_current': 1, 'search_default_customer': 1, 'group_by': ['invoice_date']}</field> <!-- Remove group_by_no_leaf, which breaks tree view -->
</record>
<record id="view_account_invoice_report_pivot" model="ir.ui.view">
<field name="name">usability.account.invoice.report</field>
<field name="model">account.invoice.report</field>
<field name="inherit_id" ref="account.view_account_invoice_report_pivot"/>
<field name="arch" type="xml">
<pivot position="attributes">
<attribute name="disable_linking"></attribute>
</pivot>
</field>
</record>
</odoo>

View File

@@ -1,111 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2015-2020 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_move_form" model="ir.ui.view">
<field name="name">account_usability.account.move.form</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<field name="fiscal_position_id" position="attributes">
<attribute name="widget">selection</attribute>
</field>
<field name="invoice_incoterm_id" position="attributes">
<attribute name="widget">selection</attribute>
</field>
<button name="action_register_payment" position="attributes">
<attribute name="class">btn-default</attribute>
</button>
<button name="action_register_payment" position="before">
<button name="%(account.account_invoices)d" type="action" string="Print" attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
</button>
<button name="preview_invoice" position="attributes">
<attribute name="attrs">{'invisible': 1}</attribute>
</button>
<!-- move sent field and make it visible -->
<field name="is_move_sent" position="replace"/>
<field name="invoice_origin" position="attributes">
<attribute name="invisible">0</attribute>
</field>
<field name="invoice_origin" position="after">
<field name="is_move_sent" attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
</field>
<xpath expr="//field[@name='line_ids']/tree/field[@name='analytic_account_id']" position="attributes">
<attribute name="optional">show</attribute>
</xpath>
<xpath expr="//field[@name='line_ids']/tree/field[@name='tax_tag_ids']" position="after">
<field name="matching_number" optional="hide"/>
<field name="reconcile_string" optional="show"/>
</xpath>
<xpath expr="//field[@name='invoice_line_ids']/tree/field[@name='product_id']" position="after">
<field name="product_barcode" optional="hide"/>
</xpath>
</field>
</record>
<record id="view_account_invoice_filter" model="ir.ui.view">
<field name="name">account_usability.account.move.search</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_account_invoice_filter"/>
<field name="arch" type="xml">
<filter name="due_date" position="after">
<separator/>
<filter name="to_send" string="To Send" domain="[('is_move_sent', '=', False), ('state', '=', 'posted'), ('move_type', 'in', ('out_invoice', 'out_refund'))]"/>
<filter name="sent" string="Sent" domain="[('is_move_sent', '=', True), ('move_type', 'in', ('out_invoice', 'out_refund'))]"/>
<separator/>
<filter name="no_attachment" string="Missing Attachment" domain="[('has_attachment', '=', False)]"/>
</filter>
</field>
</record>
<record id="view_move_line_tree" model="ir.ui.view">
<field name="model">account.move.line</field>
<field name="inherit_id" ref="account.view_move_line_tree"/>
<field name="arch" type="xml">
<field name="matching_number" position="after">
<button title="View Journal Entry Form" type="object" name="show_account_move_form" icon="fa-arrow-right"/>
</field>
</field>
</record>
<record id="view_account_move_line_filter" model="ir.ui.view">
<field name="name">account_usability.account_move_line_search</field>
<field name="model">account.move.line</field>
<field name="inherit_id" ref="account.view_account_move_line_filter"/>
<field name="arch" type="xml">
<filter name="unposted" position="before">
<filter name="current_year" string="Current Year" domain="[('date', '&gt;=', (context_today().strftime('%Y-01-01'))), ('date', '&lt;=', (context_today().strftime('%Y-12-31')))]"/>
<filter name="previous_year" string="Previous Year" domain="[('date', '&gt;=', (context_today() + relativedelta(day=1, month=1, years=-1)).strftime('%Y-%m-%d')), ('date', '&lt;=', (context_today() + relativedelta(day=31, month=12, years=-1)).strftime('%Y-%m-%d'))]"/>
<separator/>
</filter>
<field name="partner_id" position="after">
<field name="reconcile_string" />
<field name="debit" filter_domain="['|', ('debit', '=', self), ('credit', '=', self)]" string="Debit or Credit"/>
</field>
<filter name="unreconciled" position="before">
<filter name="reconciled" string="Fully Reconciled" domain="[('full_reconcile_id', '!=', False)]"/>
</filter>
<filter name="unreconciled" position="attributes">
<attribute name="string">Unreconciled or Partially Reconciled</attribute>
</filter>
<!--
<field name="name" position="attributes">
<attribute name="string">Name or Reference</attribute>
</field> -->
<field name="partner_id" position="attributes">
<attribute name="domain">['|', ('parent_id', '=', False), ('is_company', '=', True)]</attribute>
</field>
</field>
</record>
<record id="account.action_move_journal_line" model="ir.actions.act_window">
<field name="context">{'default_move_type': 'entry', 'view_no_maturity': True}</field>
<!-- Remove 'search_default_misc_filter': 1 -->
</record>
</odoo>

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2015-2020 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">account_usability account config page</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="account.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='bank_cash']" position="inside">
<div class="col-xs-12 col-md-6 o_setting_box" id="transfer_account">
<div class="o_setting_left_pane"/>
<div class="o_setting_right_pane">
<label for="transfer_account_id"/>
<div class="text-muted">
Transit account when you transfer money from a bank account of your company to another bank account of your company.
</div>
<field name="transfer_account_id"/>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2017-2020 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_partner_property_form" model="ir.ui.view">
<field name="name">account_usability.res.partner.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="account.view_partner_property_form"/>
<field name="arch" type="xml">
<field name="property_account_position_id" position="attributes">
<attribute name="widget">selection</attribute>
</field>
<xpath expr="//field[@name='bank_ids']/tree/field[@name='acc_number']" position="after">
<field name="acc_type"/>
</xpath>
</field>
</record>
</odoo>

View File

@@ -1,22 +0,0 @@
# Copyright 2018-2020 Akretion France (https://akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
from dateutil.relativedelta import relativedelta
class AccountMoveReversal(models.TransientModel):
_inherit = 'account.move.reversal'
@api.model
def _default_date(self):
date_dt = None
if (
self._context.get('active_model') == 'account.move' and
self._context.get('active_id')):
move = self.env['account.move'].browse(self._context['active_id'])
date_dt = move.date + relativedelta(days=1)
return date_dt
date = fields.Date(default=_default_date)

View File

@@ -1,12 +0,0 @@
# Copyright 2015-2020 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
transfer_account_id = fields.Many2one(
related='company_id.transfer_account_id', readonly=False)

View File

@@ -23,14 +23,14 @@ This modules adds the following functions:
* Add an *Overdue* filter on invoice search view (this feature was previously * Add an *Overdue* filter on invoice search view (this feature was previously
located in te module *account_invoice_overdue_filter*) located in te module *account_invoice_overdue_filter*)
* Increase the default limit of 80 lines in account move and account move line view. * Increase the default limit of 80 lines in journal entries and journal items views.
* disable reconciliation "guessing" * disable reconciliation "guessing"
* fast search on *Reconcile Ref* for account move line. * fast search on *Reconcile Ref* for journal items.
* add sale dates to invoice report to be compliant with * add sale dates to invoice report to be compliant with
https://www.service-public.fr/professionnels-entreprises/vosdroits/F31808 https://www.service-public.fr/professionnels-entreprises/vosdroits/F31808
* Sale date on qweb invoices * Sale date on qweb invoices
* A wizard to mark several invoices as sent at once (forward from v8) * A wizard to mark several invoices as sent at once (forward from v8)
* Default date for Account Move Reversal is now D+1 instead of today * Default date for reversal journal entry is now D+1 instead of today
* Track more fields on invoice (see details in account.py) * Track more fields on invoice (see details in account.py)
* Add boolean fields `has_discount` and `has_attachment` on invoice * Add boolean fields `has_discount` and `has_attachment` on invoice
* Add button "Delete line qty = 0" on supplier invoice * Add button "Delete line qty = 0" on supplier invoice
@@ -41,8 +41,8 @@ This modules adds the following functions:
* add direct search of journal using code * add direct search of journal using code
* add copy=False on some fields * add copy=False on some fields
* Add unicity constraint on analytic codes per company * Add unicity constraint on analytic codes per company
* Better default values on account move * Better default values on journal entry
* Add link from account move line to invoice * Add link from journal items to to invoice
* Add start_date and end_date on bank statements * Add start_date and end_date on bank statements
* Add transfer_account_id to invoicing config page * Add transfer_account_id to invoicing config page
* Improve domain reconciliation widget * Improve domain reconciliation widget
@@ -52,6 +52,7 @@ This modules adds the following functions:
* don't attach PDF upon invoice report generation on supplier invoices/refunds * don't attach PDF upon invoice report generation on supplier invoices/refunds
* Add filter on debit and credit amount for Move Lines * Add filter on debit and credit amount for Move Lines
* Add supplier invoice number in invoice tree view * Add supplier invoice number in invoice tree view
* Add date in outstanding payment widget on invoice form view (requires `odoo PR 84180 <https://github.com/odoo/odoo/pull/84180>`_)
Together with this module, I recommend the use of the following modules: Together with this module, I recommend the use of the following modules:

View File

@@ -0,0 +1,3 @@
from . import models
from . import wizard
from .hooks import post_init_hook

View File

@@ -1,37 +1,41 @@
# Copyright 2015-2020 Akretion (http://www.akretion.com) # Copyright 2015-2022 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com> # @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{ {
'name': 'Account Usability', 'name': 'Account Usability',
'version': '14.0.1.0.0', 'version': '16.0.1.0.0',
'category': 'Accounting & Finance', 'category': 'Accounting & Finance',
'license': 'AGPL-3', 'license': 'AGPL-3',
'summary': 'Small usability enhancements in account module', 'summary': 'Small usability enhancements in account module',
'author': 'Akretion', 'author': 'Akretion',
'website': 'http://www.akretion.com', 'website': 'https://github.com/akretion/odoo-usability',
'depends': [ 'depends': [
'account', 'account',
'base_view_inheritance_extension',
'base_usability', # needed only to access base_usability.group_nobody 'base_usability', # needed only to access base_usability.group_nobody
# in v12, I may create a module only for group_nobody
], ],
'data': [ 'data': [
'views/account_account_type.xml',
'views/account_account.xml', 'views/account_account.xml',
'views/account_bank_statement.xml', 'views/account_group.xml',
# 'views/account_bank_statement.xml',
'views/account_invoice_report.xml', 'views/account_invoice_report.xml',
'views/account_journal.xml', 'views/account_journal.xml',
'views/account_move.xml', 'views/account_move.xml',
'views/account_analytic_line.xml',
'views/account_menu.xml', 'views/account_menu.xml',
'views/account_tax.xml', 'views/account_tax.xml',
'views/product.xml', # 'views/product.xml', # TODO
'views/res_config_settings.xml', 'views/res_company.xml',
'views/res_partner.xml',
'views/account_report.xml', 'views/account_report.xml',
'wizard/account_invoice_mark_sent_view.xml', 'wizard/account_invoice_mark_sent_view.xml',
'wizard/account_group_generate_view.xml', 'wizard/account_group_generate_view.xml',
'wizard/account_payment_register_views.xml',
'wizard/account_move_reversal.xml',
'security/ir.model.access.csv', 'security/ir.model.access.csv',
], # 'report/invoice_report.xml', # TODO
"views/res_partner.xml",
],
# 'qweb': ['static/src/xml/account_payment.xml'],
'installable': True, 'installable': True,
# "post_init_hook": "post_init_hook",
} }

View File

@@ -0,0 +1,15 @@
diff --git a/addons/account/__init__.py b/addons/account/__init__.py
index 138004b0849..07e6475f760 100644
--- a/addons/account/__init__.py
+++ b/addons/account/__init__.py
@@ -45,7 +45,9 @@ def _auto_install_l10n(env):
module_list.append('l10n_de_skr03')
module_list.append('l10n_de_skr04')
else:
- if env['ir.module.module'].search([('name', '=', 'l10n_' + country_code.lower())]):
+ if env['ir.module.module'].search([('name', '=', 'l10n_%s_oca' % country_code.lower())]):
+ module_list.append('l10n_%s_oca' % country_code.lower())
+ elif env['ir.module.module'].search([('name', '=', 'l10n_' + country_code.lower())]):
module_list.append('l10n_' + country_code.lower())
else:
module_list.append('l10n_generic_coa')

View File

@@ -0,0 +1,32 @@
diff --git a/addons/account/models/account_journal_dashboard.py b/addons/account/models/account_journal_dashboard.py
index 49e166e5823..5e352c03d7a 100644
--- a/addons/account/models/account_journal_dashboard.py
+++ b/addons/account/models/account_journal_dashboard.py
@@ -309,6 +309,7 @@ class account_journal(models.Model):
'has_at_least_one_statement': has_at_least_one_statement,
'nb_lines_bank_account_balance': nb_lines_bank_account_balance,
'outstanding_pay_account_balance': formatLang(self.env, currency.round(outstanding_pay_account_balance), currency_obj=currency),
+ 'account_balance_plus_outstanding': formatLang(self.env, currency.round(bank_account_balance + outstanding_pay_account_balance), currency_obj=currency),
'nb_lines_outstanding_pay_account_balance': nb_lines_outstanding_pay_account_balance,
'last_balance': formatLang(self.env, currency.round(last_balance) + 0.0, currency_obj=currency),
'number_draft': number_draft,
diff --git a/addons/account/views/account_journal_dashboard_view.xml b/addons/account/views/account_journal_dashboard_view.xml
index 347a36c265e..fd7fb7b67ca 100644
--- a/addons/account/views/account_journal_dashboard_view.xml
+++ b/addons/account/views/account_journal_dashboard_view.xml
@@ -278,6 +278,15 @@
<span><t t-esc="dashboard.outstanding_pay_account_balance"/></span>
</div>
</div>
+ <div class="row" t-if="dashboard.nb_lines_outstanding_pay_account_balance > 0">
+ <div id="dashboard_account_balance_plus_outstanding" class="col overflow-hidden text-left">
+ <span title="Balance + Outstanding">Balance + Outstanding</span>
+ </div>
+ <div class="col-auto text-right">
+ <span><t t-esc="dashboard.account_balance_plus_outstanding"/></span>
+ </div>
+ </div>
+
<t t-if="dashboard.has_at_least_one_statement and dashboard.account_balance != dashboard.last_balance">
<div class="row" name="latest_statement">
<div class="col overflow-hidden text-left">

View File

@@ -0,0 +1,9 @@
# Copyright 2022 Akretion (https://www.akretion.com).
# @author Sébastien BEAU <sebastien.beau@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import SUPERUSER_ID, api
def post_init_hook(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
env["account.move.line"].update_matching_number()

View File

@@ -0,0 +1,610 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_usability_akretion
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-07 14:47+0000\n"
"PO-Revision-Date: 2024-07-07 14:47+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_usability_akretion
#. odoo-python
#: code:addons/account_usability_akretion/wizard/account_group_generate.py:0
#, python-format
msgid ""
"%d account groups already exists in company '%s'. This wizard is designed to"
" generate account groups from scratch."
msgstr ""
"%d groupes de comptes existent déjà dans la société '%s'. Cet assistant "
"est conçu pour créer des groupes de comptes à partir de zéro."
#. module: account_usability_akretion
#. odoo-python
#: code:addons/account_usability_akretion/models/account_move.py:0
#, python-format
msgid ""
"A reverse journal entry <a href=# data-oe-model=account.move data-oe-"
"id=%d>%s</a> has been generated."
msgstr ""
"Une extourne <a href=# data-oe-model=account.move data-oe-"
"id=%d>%s</a> a été générée."
#. module: account_usability_akretion
#. odoo-python
#: code:addons/account_usability_akretion/wizard/account_move_reversal.py:0
#, python-format
msgid "%s reversed by %s"
msgstr "%s extourné par %s"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_move_reversal
msgid ""
"You are about to reverse entries that have already been reversed or partially reversed (refund). Make sure it is intented.\n"
" Already reversed entries are the following :"
msgstr "Vous êtes sur le point d'extourner une pièce comptable déjà extournée, ou partiellement extournée (avoir). Vérifiez que c'est bien ce que vous souhaitez faire.\n"
" Les pièces comptables déjà extournées sont les suivantes :"
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_account_account
msgid "Account"
msgstr "Compte"
#. module: account_usability_akretion
#. odoo-python
#: code:addons/account_usability_akretion/wizard/account_group_generate.py:0
#, python-format
msgid "Account Groups"
msgstr "Groupes de comptes"
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_account_move_reversal
msgid "Account Move Reversal"
msgstr "Extourne de l'écriture comptable"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move_line__account_reconcile
msgid "Allow Reconciliation"
msgstr "Autoriser le lettrage"
#. module: account_usability_akretion
#: model:ir.model.constraint,message:account_usability_akretion.constraint_account_analytic_account_code_company_unique
msgid ""
"An analytic account with the same code already exists in the same company!"
msgstr ""
"Un compte analytique avec le même code existe déjà dans la même société !"
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_account_analytic_account
msgid "Analytic Account"
msgstr "Compte analytique"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_move_form
msgid "Are you sure you want to cancel this invoice?"
msgstr "Êtes-vous sûr de vouloir annuler cette facture ?"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_move_form
msgid "Are you sure you want to cancel this journal entry?"
msgstr "Êtes-vous sûr de vouloir annuler cette pièce comptable ?"
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_res_partner_bank
#: model:ir.ui.menu,name:account_usability_akretion.res_partner_bank_account_config_menu
msgid "Bank Accounts"
msgstr "Comptes bancaires"
#. module: account_usability_akretion
#: model:ir.ui.menu,name:account_usability_akretion.res_bank_account_config_menu
msgid "Banks"
msgstr "Banques"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_group_generate_form
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_invoice_mark_sent_form
msgid "Cancel"
msgstr "Annuler"
#. module: account_usability_akretion
#: model:ir.model.fields,help:account_usability_akretion.field_account_move_line__account_reconcile
msgid ""
"Check this box if this account allows invoices & payments matching of "
"journal items."
msgstr ""
"Cochez cette case si ce compte permet de faire du lettrage entre "
"factures et paiements."
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_search
msgid "Code"
msgstr ""
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_filter
msgid "Commercial Partner"
msgstr "Partenaire commercial"
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_res_company
msgid "Companies"
msgstr "Sociétés"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__company_id
msgid "Company"
msgstr "Société"
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_res_partner
msgid "Contact"
msgstr ""
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__create_uid
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent__create_uid
msgid "Created by"
msgstr "Créé par"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__create_date
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent__create_date
msgid "Created on"
msgstr "Créé le"
#. module: account_usability_akretion
#: model:ir.model.fields,help:account_usability_akretion.field_account_move_line__matched_credit_ids
msgid "Credit journal items that are matched with this journal item."
msgstr ""
"Écritures comptables au crédit qui sont lettrées avec cette écriture comptable."
#. module: account_usability_akretion
#: model:ir.model.fields,help:account_usability_akretion.field_account_move_line__matched_debit_ids
msgid "Debit journal items that are matched with this journal item."
msgstr ""
"Écritures comptables au débit qui sont lettrées avec cette écriture comptable."
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_move_line_filter
msgid "Debit or Credit"
msgstr "Débit ou crédit"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__display_name
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent__display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__blocked
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__blocked
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__blocked
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_filter
msgid "Dispute"
msgstr "Litige"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__invoice_date_due
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__invoice_date_due
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__invoice_date_due
msgid "Due Date"
msgstr "Date d'échéance"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__fiscal_position_id
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__fiscal_position_id
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__fiscal_position_id
#: model:ir.model.fields,field_description:account_usability_akretion.field_res_partner__property_account_position_id
#: model:ir.model.fields,field_description:account_usability_akretion.field_res_users__property_account_position_id
msgid "Fiscal Position"
msgstr "Position fiscale"
#. module: account_usability_akretion
#: model:ir.model.fields,help:account_usability_akretion.field_account_bank_statement_line__fiscal_position_id
#: model:ir.model.fields,help:account_usability_akretion.field_account_move__fiscal_position_id
#: model:ir.model.fields,help:account_usability_akretion.field_account_payment__fiscal_position_id
msgid ""
"Fiscal positions are used to adapt taxes and accounts for particular "
"customers or sales orders/invoices. The default value comes from the "
"customer."
msgstr ""
"Les positions fiscales sont utilisées pour adapter les taxes et les comptes "
"à des clients spécifiques ou à des bons de commande/factures. La valeur par"
" défaut provient de la fiche client."
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move_line__full_reconcile_id
msgid "Full Reconcile"
msgstr "Lettrage total"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_move_line_filter
msgid "Fully Reconciled"
msgstr "Lettré totalement"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_group_generate_form
msgid "Generate"
msgstr "Générer"
#. module: account_usability_akretion
#: model:ir.actions.act_window,name:account_usability_akretion.account_group_generate_action
#: model:ir.model,name:account_usability_akretion.model_account_group_generate
#: model:ir.ui.menu,name:account_usability_akretion.account_group_generate_menu
msgid "Generate Account Groups"
msgstr "Générer les groupes de comptes"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_search
msgid "Group"
msgstr "Groupe"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_journal_search
msgid "Group By"
msgstr "Regrouper par"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__has_attachment
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__has_attachment
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__has_attachment
msgid "Has Attachment"
msgstr "Possède une pièce jointe"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__has_discount
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__has_discount
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__has_discount
msgid "Has Discount"
msgstr "A une remise"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_journal__hide_bank_statement_balance
msgid "Hide and Disable Bank Statement Balance"
msgstr "Masquer et désactiver le solde du relevé de compte"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__id
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent__id
msgid "ID"
msgstr ""
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_account_incoterms
msgid "Incoterms"
msgstr ""
#. module: account_usability_akretion
#: model:ir.model.fields,help:account_usability_akretion.field_account_move_line__product_barcode
msgid "International Article Number used for product identification."
msgstr ""
"Numéro d'article international utilisé pour identifier cet article."
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_res_partner__invoice_warn
#: model:ir.model.fields,field_description:account_usability_akretion.field_res_users__invoice_warn
msgid "Invoice"
msgstr "Facture"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_company_form
msgid "Invoice Legal Terms"
msgstr "Mentions légales sur les factures"
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_account_invoice_report
msgid "Invoices Statistics"
msgstr "Statistiques de facturation"
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_account_journal
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__journal_id
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__journal_id
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__journal_id
msgid "Journal"
msgstr ""
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_account_move
msgid "Journal Entry"
msgstr "Pièce comptable"
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_account_move_line
msgid "Journal Item"
msgstr "Écriture comptable"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_move_line_filter
msgid "Label, Reference, Account or Partner"
msgstr "Libellé, Référence, Compte ou Partenaire"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate____last_update
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent____last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__write_uid
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent__write_uid
msgid "Last Updated by"
msgstr "Mis à jour par"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__write_date
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent__write_date
msgid "Last Updated on"
msgstr "Mis à jour le"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_company_form
msgid "Legal Terms"
msgstr "Mentions légales"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_res_company__static_invoice_terms
msgid "Legal Terms on Invoice"
msgstr "Mentions légales sur les factures"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__level
msgid "Level"
msgstr "Niveau"
#. module: account_usability_akretion
#: model:ir.actions.act_window,name:account_usability_akretion.account_invoice_mark_sent_action
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_invoice_mark_sent_form
msgid "Mark as Sent"
msgstr "Marquer comme envoyé"
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_account_invoice_mark_sent
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_invoice_mark_sent_form
msgid "Mark invoices as sent"
msgstr "Marquer les factures comme envoyées"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_journal_form
msgid "Misc"
msgstr "Divers"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_filter
msgid "Missing Attachment"
msgstr "Pièce jointe manquante"
#. module: account_usability_akretion
#: model:ir.model,name:account_usability_akretion.model_account_partial_reconcile
msgid "Partial Reconcile"
msgstr "Lettrage partiel"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move_line__matched_credit_ids
msgid "Partial Reconcile Credit"
msgstr "Crédit de lettrage partiel"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move_line__matched_debit_ids
msgid "Partial Reconcile Debit"
msgstr "Débit de lettrage partiel"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_report__industry_id
msgid "Partner Industry"
msgstr "Secteur dactivité du partenaire"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_filter
msgid "Payment Status"
msgstr "État de paiement"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__invoice_payment_term_id
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__invoice_payment_term_id
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__invoice_payment_term_id
msgid "Payment Terms"
msgstr "Conditions de paiement"
#. module: account_usability_akretion
#. odoo-python
#: code:addons/account_usability_akretion/models/account_move.py:0
#, python-format
msgid "Please post the following entries before reconciliation :"
msgstr "Veuillez comptabiliser les pièces suivantes avant le lettrage :"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__name_prefix
msgid "Prefix"
msgstr "Préfixe"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_move_form
msgid "Print"
msgstr "Imprimer"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_report_search
msgid "Product"
msgstr "Produit"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move_line__product_barcode
msgid "Product Barcode"
msgstr "Code barre du produit"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__ref
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__ref
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__ref
msgid "Reference"
msgstr "Référence"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__sale_dates
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__sale_dates
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__sale_dates
msgid "Sale Dates"
msgstr "Dates de vente"
#. module: account_usability_akretion
#: model:ir.model.fields,help:account_usability_akretion.field_res_partner__invoice_warn
#: model:ir.model.fields,help:account_usability_akretion.field_res_users__invoice_warn
msgid ""
"Selecting the \"Warning\" option will notify user with the message, "
"Selecting \"Blocking Message\" will throw an exception with the message and "
"block the flow. The Message has to be written in the next field."
msgstr ""
"Sélectionner l'option 'Avertissement' notifiera l'utilisateur avec le "
"message. Sélectionner 'Message Bloquant' lancera une exception avec le "
"message et bloquera le flux. Le Message doit être encodé dans le champ "
"suivant."
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_filter
msgid "Sent"
msgstr "Envoyé"
#. module: account_usability_akretion
#. odoo-python
#: code:addons/account_usability_akretion/models/product.py:0
#, python-format
msgid "Tax excl."
msgstr "HT"
#. module: account_usability_akretion
#. odoo-python
#: code:addons/account_usability_akretion/models/product.py:0
#, python-format
msgid "Tax incl."
msgstr "TTC"
#. module: account_usability_akretion
#. odoo-python
#: code:addons/account_usability_akretion/wizard/account_group_generate.py:0
#, python-format
msgid ""
"The code of account '%s' is %d caracters. It cannot be inferior to level "
"(%d)."
msgstr ""
"Le code du compte '%s' fait %d caractères. Il ne peut pas être "
"inférieur au niveau (%d)."
#. module: account_usability_akretion
#: model:ir.model.fields,help:account_usability_akretion.field_res_partner__property_account_position_id
#: model:ir.model.fields,help:account_usability_akretion.field_res_users__property_account_position_id
msgid ""
"The fiscal position determines the taxes/accounts used for this contact."
msgstr ""
"La position fiscale détermine les taxes / comptes utilisés pour ce contact."
#. module: account_usability_akretion
#. odoo-python
#: code:addons/account_usability_akretion/wizard/account_group_generate.py:0
#, python-format
msgid "The level must be >= 1."
msgstr "Le niveau doit être >= 1."
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_move_form
msgid "This"
msgstr "Ce"
#. module: account_usability_akretion
#: model:ir.model.constraint,message:account_usability_akretion.constraint_account_incoterms_code_unique
msgid "This incoterm code already exists."
msgstr "Ce code incoterm existe déjà."
#. module: account_usability_akretion
#: model:ir.model.fields,help:account_usability_akretion.field_account_bank_statement_line__sale_dates
#: model:ir.model.fields,help:account_usability_akretion.field_account_move__sale_dates
#: model:ir.model.fields,help:account_usability_akretion.field_account_payment__sale_dates
msgid ""
"This information appear on invoice qweb report (you may use it for your own "
"report)"
msgstr ""
"Cette information apparait sur le rapport qweb de la facture (vous pouvez "
"les utiliser pour votre propre rapport)"
#. module: account_usability_akretion
#. odoo-python
#: code:addons/account_usability_akretion/models/account_move.py:0
#, python-format
msgid ""
"This journal entry has been generated as the reverse of <a href=# data-oe-"
"model=account.move data-oe-id=%d>%s</a>."
msgstr ""
"Cette pièce comptable a été générée comme extourne de <a href=# data-oe-"
"model=account.move data-oe-id=%d>%s</a>."
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_group_generate_form
msgid ""
"This wizard is designed to auto-generate account groups from the chart of "
"account."
msgstr ""
"Cet assistant est conçu pour générer automatiquement les groupes de comptes "
"à partir du plan comptable."
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_invoice_mark_sent_form
msgid "This wizard will mark as <i>sent</i> all the selected posted invoices."
msgstr ""
"Cet assistant marquera comme <i>envoyées</i> toutes les factures "
"sélectionnées et comptabilisées."
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_filter
msgid "To Send"
msgstr "À envoyer"
#. module: account_usability_akretion
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__amount_total
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__amount_total
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__amount_total
msgid "Total"
msgstr ""
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_journal_search
msgid "Type"
msgstr ""
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_move_line_filter
msgid "Unreconciled or Partially Reconciled"
msgstr "Non lettré ou partiellement lettré"
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_move_line_tree
msgid "View Journal Entry Form"
msgstr "Voir la pièce comptable en vue formulaire"
#. module: account_usability_akretion
#: model:ir.model.fields,help:account_usability_akretion.field_account_journal__hide_bank_statement_balance
msgid ""
"When this option is enabled, the start and end balance is not displayed on "
"the bank statement form view, and the check of the end balance vs the real "
"end balance is disabled. When you enable this option, you process the "
"statement lines without considering the start/end balance and you regularly "
"check the accounting balance of the bank account vs the amount of your bank "
"account."
msgstr ""
"Lorsque cette option est activée, le solde de début et de fin ne s'affiche "
"pas sur la vue du formulaire du relevé de compte, et la vérification du solde"
" final vs le solde final réel est désactivée. Lorsque vous activez cette "
"option, vous traitez les lignes de relevé de compte sans tenir compte du solde de "
"début/fin et vous vérifiez régulièrement le solde du compte "
"bancaire vs le montant sur votre compte en banque."
#. module: account_usability_akretion
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_move_form
msgid "is marked as <b>disputed</b>."
msgstr "est marquée <b>en litige</b>."

View File

@@ -0,0 +1,9 @@
# Copyright 2020 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import SUPERUSER_ID, api
def migrate(cr, version):
env = api.Environment(cr, SUPERUSER_ID, {})
env["account.move.line"].update_matching_number()

View File

@@ -1,9 +1,12 @@
from . import account_account from . import account_account
from . import account_analytic_account from . import account_analytic_account
from . import account_bank_statement #from . import account_bank_statement
from . import account_incoterms from . import account_incoterms
from . import account_journal from . import account_journal
from . import account_move from . import account_move
from . import account_partial_reconcile from . import account_partial_reconcile
from . import res_partner from . import res_partner
from . import product from . import res_company
#from . import product
from . import account_invoice_report
from . import res_partner_bank

View File

@@ -0,0 +1,19 @@
# Copyright 2015-2022 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, models
class AccountAccount(models.Model):
_inherit = 'account.account'
@api.depends('name', 'code')
def name_get(self):
if self._context.get('account_account_show_code_only'):
res = []
for record in self:
res.append((record.id, record.code))
return res
else:
return super().name_get()

View File

@@ -1,4 +1,4 @@
# Copyright 2015-2020 Akretion (http://www.akretion.com) # Copyright 2015-2022 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com> # @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

View File

@@ -10,11 +10,11 @@ class AccountBankStatement(models.Model):
_inherit = 'account.bank.statement' _inherit = 'account.bank.statement'
start_date = fields.Date( start_date = fields.Date(
compute='_compute_dates', string='Start Date', readonly=True, compute='_compute_dates', string='Start Date', store=True)
store=True)
end_date = fields.Date( end_date = fields.Date(
compute='_compute_dates', string='End Date', readonly=True, compute='_compute_dates', string='End Date', store=True)
store=True) line_count = fields.Integer(
compute='_compute_dates', string='# of Lines', store=True)
hide_bank_statement_balance = fields.Boolean( hide_bank_statement_balance = fields.Boolean(
related='journal_id.hide_bank_statement_balance', readonly=True) related='journal_id.hide_bank_statement_balance', readonly=True)
@@ -24,12 +24,11 @@ class AccountBankStatement(models.Model):
dates = [line.date for line in st.line_ids] dates = [line.date for line in st.line_ids]
st.start_date = dates and min(dates) or False st.start_date = dates and min(dates) or False
st.end_date = dates and max(dates) or False st.end_date = dates and max(dates) or False
st.line_count = len(dates)
def _check_balance_end_real_same_as_computed(self): def _check_balance_end_real_same_as_computed(self):
for stmt in self: for stmt in self:
if stmt.hide_bank_statement_balance: if not stmt.hide_bank_statement_balance:
continue
else:
super(AccountBankStatement, stmt)._check_balance_end_real_same_as_computed() super(AccountBankStatement, stmt)._check_balance_end_real_same_as_computed()
return True return True
@@ -44,6 +43,13 @@ class AccountBankStatement(models.Model):
res.append((statement.id, name)) res.append((statement.id, name))
return res return res
def button_reopen(self):
self = self.with_context(skip_undo_reconciliation=True)
return super().button_reopen()
def button_undo_reconciliation(self):
self.line_ids.button_undo_reconciliation()
class AccountBankStatementLine(models.Model): class AccountBankStatementLine(models.Model):
_inherit = 'account.bank.statement.line' _inherit = 'account.bank.statement.line'
@@ -80,7 +86,8 @@ class AccountBankStatementLine(models.Model):
def show_account_move(self): def show_account_move(self):
self.ensure_one() self.ensure_one()
action = self.env.ref('account.action_move_line_form').read()[0] action = self.env["ir.actions.actions"]._for_xml_id(
'account.action_move_line_form')
# Note: this action is on account.move, not account.move.line ! # Note: this action is on account.move, not account.move.line !
action.update({ action.update({
'views': False, 'views': False,
@@ -89,3 +96,9 @@ class AccountBankStatementLine(models.Model):
'res_id': self.move_id.id, 'res_id': self.move_id.id,
}) })
return action return action
def button_undo_reconciliation(self):
if self._context.get("skip_undo_reconciliation"):
return
else:
return super().button_undo_reconciliation()

View File

@@ -0,0 +1,31 @@
# Copyright 2015-2022 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, models
class AccountIncoterms(models.Model):
_inherit = 'account.incoterms'
_sql_constraints = [(
'code_unique',
'unique(code)',
'This incoterm code already exists.')]
@api.depends('code', 'name')
def name_get(self):
res = []
for rec in self:
res.append((rec.id, '[%s] %s' % (rec.code, rec.name)))
return res
@api.model
def name_search(self, name='', args=None, operator='ilike', limit=100):
if args is None:
args = []
if name and operator == 'ilike':
recs = self.search([('code', '=ilike', name + '%')] + args, limit=limit)
if recs:
return recs.name_get()
return super().name_search(name=name, args=args, operator=operator, limit=limit)

View File

@@ -0,0 +1,17 @@
# Copyright 2022 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class AccountInvoiceReport(models.Model):
_inherit = 'account.invoice.report'
industry_id = fields.Many2one('res.partner.industry', string='Partner Industry', readonly=True)
@api.model
def _select(self):
res = super()._select()
res += ", COALESCE(partner.industry_id, commercial_partner.industry_id) AS industry_id"
return res

View File

@@ -0,0 +1,57 @@
# Copyright 2015-2022 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class AccountJournal(models.Model):
_inherit = 'account.journal'
hide_bank_statement_balance = fields.Boolean(
string='Hide and Disable Bank Statement Balance',
help="When this option is enabled, the start and end balance is "
"not displayed on the bank statement form view, and the check of "
"the end balance vs the real end balance is disabled. When you enable "
"this option, you process the statement lines without considering "
"the start/end balance and you regularly check the accounting balance "
"of the bank account vs the amount of your bank account."
)
# Used to set default user_type_id on account fields via context
# account_type_current_assets_id = fields.Many2one(
# 'account.account.type',
# default=lambda self: self.env.ref('account.data_account_type_current_assets').id)
@api.depends(
'name', 'currency_id', 'company_id', 'company_id.currency_id', 'code')
def name_get(self):
res = []
if self._context.get('journal_show_code_only'):
for journal in self:
res.append((journal.id, journal.code))
return res
else:
for journal in self:
name = "[%s] %s" % (journal.code, journal.name)
if (
journal.currency_id and
journal.currency_id != journal.company_id.currency_id):
name = "%s (%s)" % (name, journal.currency_id.name)
res.append((journal.id, name))
return res
def open_outstanding_payments(self):
self.ensure_one()
action = self.env["ir.actions.actions"]._for_xml_id(
"account.action_account_moves_all")
action['domain'] = [
('account_id', 'in', (self.payment_debit_account_id.id, self.payment_credit_account_id.id)),
('journal_id', '=', self.id),
('display_type', 'not in', ('line_section', 'line_note')),
('parent_state', '!=', 'cancel'),
]
action['context'] = {
'search_default_unreconciled': True,
'search_default_posted': True,
}
return action

View File

@@ -1,48 +1,80 @@
# Copyright 2015-2020 Akretion (http://www.akretion.com) # Copyright 2015-2022 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com> # @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models from datetime import timedelta
from collections import defaultdict
import logging
from odoo import api, fields, models, _
from odoo.exceptions import UserError
from odoo.osv import expression
from odoo.tools import float_is_zero from odoo.tools import float_is_zero
from odoo.tools.misc import format_date from odoo.tools.misc import format_date
from odoo.osv import expression from odoo.tools.safe_eval import safe_eval, time
_logger = logging.getLogger(__name__)
class AccountMove(models.Model): class AccountMove(models.Model):
_inherit = 'account.move' _inherit = 'account.move'
default_move_line_name = fields.Char(
string='Default Label', states={'posted': [('readonly', True)]})
# By default, we can still modify "ref" when account move is posted # By default, we can still modify "ref" when account move is posted
# which seems a bit lazy for me... # which seems a bit lazy for me...
ref = fields.Char(states={'posted': [('readonly', True)]}) ref = fields.Char(states={'posted': [('readonly', True)]})
date = fields.Date(tracking=True)
invoice_date_due = fields.Date(tracking=True) invoice_date_due = fields.Date(tracking=True)
invoice_payment_term_id = fields.Many2one(tracking=True) invoice_payment_term_id = fields.Many2one(tracking=True)
journal_id = fields.Many2one(tracking=True) journal_id = fields.Many2one(tracking=True)
partner_bank_id = fields.Many2one(tracking=True)
fiscal_position_id = fields.Many2one(tracking=True) fiscal_position_id = fields.Many2one(tracking=True)
amount_total = fields.Monetary(tracking=True) amount_total = fields.Monetary(tracking=True)
# for invoice report # for invoice report
has_discount = fields.Boolean( has_discount = fields.Boolean(compute='_compute_has_discount')
compute='_compute_has_discount', readonly=True)
# has_attachment is useful for those who use attachment to archive # has_attachment is useful for those who use attachment to archive
# supplier invoices. It allows them to find supplier invoices # supplier invoices. It allows them to find supplier invoices
# that don't have any attachment # that don't have any attachment
has_attachment = fields.Boolean( has_attachment = fields.Boolean(
compute='_compute_has_attachment', compute='_compute_has_attachment', search='_search_has_attachment')
search='_search_has_attachment', readonly=True)
sale_dates = fields.Char( sale_dates = fields.Char(
compute="_compute_sales_dates", readonly=True, compute="_compute_sales_dates",
help="This information appears on invoice qweb report " help="This information appear on invoice qweb report "
"(you may use it for your own report)") "(you may use it for your own report)")
# There is a native "blocked" field (bool) on account.move.line
# We want to have that field on invoices to improve usability
# while keeping compatibility with the standard Odoo datamodel
blocked = fields.Boolean(
compute="_compute_blocked",
inverse="_inverse_blocked",
store=True,
string="Dispute",
tracking=True,
)
# Field search_account_id is just for search view
search_account_id = fields.Many2one(related='line_ids.account_id')
@api.depends("line_ids", "line_ids.blocked")
def _compute_blocked(self):
for move in self:
move.blocked = any(
[
l.blocked
for l in move.line_ids
if l.account_id.account_type in ("liability_payable", "asset_receivable")
]
)
def _inverse_blocked(self):
for move in self:
for line in move.line_ids.filtered(
lambda l: l.account_id.account_type in ("liability_payable", "asset_receivable")
):
line.blocked = move.blocked
def _compute_has_discount(self): def _compute_has_discount(self):
prec = self.env['decimal.precision'].precision_get('Discount') prec = self.env['decimal.precision'].precision_get('Discount')
for inv in self: for inv in self:
has_discount = False has_discount = False
for line in inv.invoice_line_ids: for line in inv.invoice_line_ids:
if not line.display_type and not float_is_zero(line.discount, precision_digits=prec): if line.display_type == 'product' and not float_is_zero(line.discount, precision_digits=prec):
has_discount = True has_discount = True
break break
inv.has_discount = has_discount inv.has_discount = has_discount
@@ -90,27 +122,19 @@ class AccountMove(models.Model):
res.append((old_re[0], name)) res.append((old_re[0], name))
return res return res
# I really hate to see a "/" in the 'name' field of the account.move.line def _reverse_moves(self, default_values_list=None, cancel=False):
# generated from customer invoices linked to the partners' account because: reverse_moves = super()._reverse_moves(
# 1) the label of an account move line is an important field, we can't default_values_list=default_values_list, cancel=cancel)
# write a rubbish '/' in it ! # In the simple scenario 1 invoice -> 1 refund, we add a message in the chatter
# 2) the 'name' field of the account.move.line is used in the overdue # of the invoice and in the chatter of the refund
# letter, and '/' is not meaningful for our customer ! if len(self) == 1 and len(reverse_moves) == 1:
# TODO mig to v12 self.message_post(body=_("A reverse journal entry <a href=# data-oe-model=account.move data-oe-id=%d>%s</a> has been generated.") % (reverse_moves.id, reverse_moves.display_name))
# def action_move_create(self): reverse_moves.message_post(body=_("This journal entry has been generated as the reverse of <a href=# data-oe-model=account.move data-oe-id=%d>%s</a>.") % (self.id, self.display_name))
# res = super().action_move_create() return reverse_moves
# for inv in self:
# self._cr.execute(
# "UPDATE account_move_line SET name= "
# "CASE WHEN name='/' THEN %s "
# "ELSE %s||' - '||name END "
# "WHERE move_id=%s", (inv.number, inv.number, inv.move_id.id))
# self.invalidate_cache()
# return res
def delete_lines_qty_zero(self): def delete_lines_qty_zero(self):
lines = self.env['account.move.line'].search([ lines = self.env['account.move.line'].search([
('display_type', '=', False), ('display_type', '=', 'product'),
('move_id', 'in', self.ids), ('move_id', 'in', self.ids),
('quantity', '=', 0)]) ('quantity', '=', 0)])
lines.unlink() lines.unlink()
@@ -126,7 +150,7 @@ class AccountMove(models.Model):
# Warning: the order of invoice line is forced in the view # Warning: the order of invoice line is forced in the view
# <tree editable="bottom" default_order="sequence, date desc, move_name desc, id" # <tree editable="bottom" default_order="sequence, date desc, move_name desc, id"
# it's not the same as the _order in the class AccountMoveLine # it's not the same as the _order in the class AccountMoveLine
lines = self.env['account.move.line'].search([('exclude_from_invoice_tab', '=', False), ('move_id', '=', self.id)], order="sequence, date desc, move_name desc, id") lines = self.env['account.move.line'].search([('display_type', 'in', ('product', 'line_section', 'line_note')), ('move_id', '=', self.id)], order="sequence, date desc, move_name desc, id")
for line in lines: for line in lines:
if line.display_type == 'line_section': if line.display_type == 'line_section':
# insert line # insert line
@@ -135,7 +159,7 @@ class AccountMove(models.Model):
subtotal = 0.0 # reset counter subtotal = 0.0 # reset counter
has_sections = True has_sections = True
else: else:
if not line.display_type: if line.display_type == 'product':
subtotal += line.price_subtotal * sign subtotal += line.price_subtotal * sign
res.append({'line': line}) res.append({'line': line})
if has_sections: # insert last subtotal line if has_sections: # insert last subtotal line
@@ -143,8 +167,8 @@ class AccountMove(models.Model):
# res: # res:
# [ # [
# {'line': account_invoice_line(1) with display_type=='line_section'}, # {'line': account_invoice_line(1) with display_type=='line_section'},
# {'line': account_invoice_line(2) without display_type}, # {'line': account_invoice_line(2) with display_type=='product'},
# {'line': account_invoice_line(3) without display_type}, # {'line': account_invoice_line(3) with display_type=='product'},
# {'line': account_invoice_line(4) with display_type=='line_note'}, # {'line': account_invoice_line(4) with display_type=='line_note'},
# {'subtotal': 8932.23}, # {'subtotal': 8932.23},
# ] # ]
@@ -154,13 +178,13 @@ class AccountMove(models.Model):
""" French law requires to set sale order dates into invoice """ French law requires to set sale order dates into invoice
returned string: "sale1 (date1), sale2 (date2) ..." returned string: "sale1 (date1), sale2 (date2) ..."
""" """
for inv in self: for move in self:
sales = inv.invoice_line_ids.mapped( sales = move.invoice_line_ids.mapped(
'sale_line_ids').mapped('order_id') 'sale_line_ids').mapped('order_id')
dates = ["%s (%s)" % ( dates = ["%s (%s)" % (
x.name, format_date(inv.env, self.date_order)) x.name, format_date(move.env, x.date_order))
for x in sales] for x in sales]
inv.sale_dates = ", ".join(dates) move.sale_dates = ", ".join(dates)
# allow to manually create moves not only in general journals, # allow to manually create moves not only in general journals,
# but also in cash journal and check journals (= bank journals not linked to a bank account) # but also in cash journal and check journals (= bank journals not linked to a bank account)
@@ -180,6 +204,28 @@ class AccountMove(models.Model):
]) ])
move.suitable_journal_ids = self.env['account.journal'].search(domain) move.suitable_journal_ids = self.env['account.journal'].search(domain)
def button_draft(self):
# Delete attached pdf invoice
for move in self.filtered(lambda x: x.move_type in ('out_invoice', 'out_refund')):
for report_xmlid in ('account.account_invoices', 'account.account_invoices_without_payment'):
report = self.env.ref(report_xmlid)
attach = report.retrieve_attachment(move)
if attach:
attach.unlink()
super().button_draft()
def _get_accounting_date(self, invoice_date, has_tax):
# On vendor bills/refunds, we want date = invoice_date unless
# we have a company tax_lock_date and the invoice has taxes
# and invoice_date <= tax_lock_date
date = super()._get_accounting_date(invoice_date, has_tax)
if self.is_purchase_document(include_receipts=True):
tax_lock_date = self.company_id.tax_lock_date
if invoice_date and tax_lock_date and has_tax and invoice_date <= tax_lock_date:
invoice_date = tax_lock_date + timedelta(days=1)
date = invoice_date
return date
class AccountMoveLine(models.Model): class AccountMoveLine(models.Model):
_inherit = 'account.move.line' _inherit = 'account.move.line'
@@ -197,14 +243,13 @@ class AccountMoveLine(models.Model):
full_reconcile_id = fields.Many2one(string='Full Reconcile') full_reconcile_id = fields.Many2one(string='Full Reconcile')
matched_debit_ids = fields.One2many(string='Partial Reconcile Debit') matched_debit_ids = fields.One2many(string='Partial Reconcile Debit')
matched_credit_ids = fields.One2many(string='Partial Reconcile Credit') matched_credit_ids = fields.One2many(string='Partial Reconcile Credit')
reconcile_string = fields.Char(
compute='_compute_reconcile_string', string='Reconcile', store=True)
# for optional display in tree view # for optional display in tree view
product_barcode = fields.Char(related='product_id.barcode', string="Product Barcode") product_barcode = fields.Char(related='product_id.barcode', string="Product Barcode")
def show_account_move_form(self): def show_account_move_form(self):
self.ensure_one() self.ensure_one()
action = self.env.ref('account.action_move_line_form').read()[0] action = self.env["ir.actions.actions"]._for_xml_id(
'account.action_move_line_form')
action.update({ action.update({
'res_id': self.move_id.id, 'res_id': self.move_id.id,
'view_id': False, 'view_id': False,
@@ -213,14 +258,40 @@ class AccountMoveLine(models.Model):
}) })
return action return action
@api.depends( def update_matching_number(self):
'full_reconcile_id', 'matched_debit_ids', 'matched_credit_ids') records = self.search([("matching_number", "=", "P")])
def _compute_reconcile_string(self): _logger.info(f"Update partial reconcile number for {len(records)} lines")
for line in self: records._compute_matching_number()
rec_str = False
if line.full_reconcile_id: # def _compute_matching_number(self):
rec_str = line.full_reconcile_id.name # TODO maybe it will be better to have the same maching_number for
else: # all partial so it will be easier to group by
rec_str = ', '.join([ # super()._compute_matching_number()
'a%d' % pr.id for pr in line.matched_debit_ids + line.matched_credit_ids]) # for record in self:
line.reconcile_string = rec_str # if record.matching_number == "P":
# record.matching_number = ", ".join([
# "a%d" % pr.id
# for pr in record.matched_debit_ids + record.matched_credit_ids
# ])
def _compute_name(self):
# This is useful when you want to have the product code in a dedicated
# column in your customer invoice report
# The same ir.config_parameter is used in sale_usability,
# purchase_usability and account_usability
no_product_code_param = self.env['ir.config_parameter'].sudo().get_param(
'usability.line_name_no_product_code')
if no_product_code_param and no_product_code_param == 'True':
self = self.with_context(display_default_code=False)
return super()._compute_name()
def reconcile(self):
"""Explicit error message if unposted lines"""
unposted_ids = self.filtered(lambda l: l.move_id.state != "posted")
if unposted_ids:
m = _("Please post the following entries before reconciliation :")
sep = "\n - "
unpost = sep.join([am.display_name for am in unposted_ids.move_id])
raise UserError(m + sep + unpost)
return super().reconcile()

View File

@@ -1,4 +1,4 @@
# Copyright 2015-2020 Akretion (http://www.akretion.com) # Copyright 2015-2022 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com> # @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

View File

@@ -0,0 +1,21 @@
# Copyright 2021 Akretion France (https://akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ResCompany(models.Model):
_inherit = 'res.company'
# There is a native field invoice_terms which is displayed on res.config.settings
# when the ir.config_parameter account.use_invoice_terms is True
# But there are several problems with this native field:
# - it is copied on the 'narration' field of account.move => we don't want that
# - the text block is very small on the form view of res.config.settings
# So I decided to have our own field "fixed_invoice_terms"
# The native field can still be used when you need to customise some
# terms and conditions on each invoice (not very common, but...)
# To underline this different with the native field, I prefix it with 'static_'
static_invoice_terms = fields.Text(
translate=True, string="Legal Terms on Invoice")

View File

@@ -1,4 +1,4 @@
# Copyright 2017-2020 Akretion France (https://akretion.com/) # Copyright 2017-2022 Akretion France (https://akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com> # @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

View File

@@ -0,0 +1,21 @@
# Copyright 2015-2022 Akretion France (http://www.akretion.com/)
# @author: Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models
class ResPartnerBank(models.Model):
_inherit = 'res.partner.bank'
def name_get(self):
res = []
for acc in self:
name = acc.acc_number
if acc.currency_id:
name = "%s (%s)" % (name, acc.currency_id.name)
if acc.bank_id.name:
name = "%s - %s" % (name, acc.bank_id.name)
res += [(acc.id, name)]
return res

View File

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<templates id="template" xml:space="preserve">
<!-- Requires https://github.com/odoo/odoo/pull/84180 -->
<t t-extend="ShowPaymentInfo" >
<t t-jquery="td:first" t-operation="after">
<td style="max-width: 25em;" id="outstanding-date">
<div class="oe_form_field" style="margin-right: 5px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;"><t t-esc="line.date"></t></div>
</td>
</t>
</t>
</templates>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright 2015-2021 Akretion France (http://www.akretion.com/) Copyright 2015-2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com> @author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
--> -->
@@ -14,23 +14,23 @@
<field name="inherit_id" ref="account.view_account_form"/> <field name="inherit_id" ref="account.view_account_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="deprecated" position="before"> <field name="deprecated" position="before">
<field name="reconcile" attrs="{'invisible': ['|', ('internal_type','=','liquidity'), ('internal_group', '=', 'off_balance')]}"/> <field name="reconcile" attrs="{'invisible': ['|', ('account_type', 'in', ('asset_cash', 'liability_credit_card')), ('internal_group', '=', 'off_balance')]}" widget="boolean_toggle"/>
</field> </field>
</field> </field>
</record> </record>
<record id="view_account_search" model="ir.ui.view"> <record id="view_account_search" model="ir.ui.view">
<field name="name">account.account.search</field> <field name="name">account.account.search</field>
<field name="model">account.account</field> <field name="model">account.account</field>
<field name="inherit_id" ref="account.view_account_search"/> <field name="inherit_id" ref="account.view_account_search"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<!-- The native "name" filter uses a domain ['|', ('name','ilike',self), ('code','=like',str(self)+'%')]
This is good because it uses '=like' on 'code', but sometimes there are digits in account names,
so you get additionnal unexpected accounts in the result of the search -->
<field name="name" position="after"> <field name="name" position="after">
<field name="code" filter_domain="[('code', '=like', str(self)+'%')]" string="Code"/> <field name="code" filter_domain="[('code', '=like', self + '%')]" string="Code"/>
</field> </field>
<filter name="accounttype" position="after">
<filter name="group_groupby" string="Group" context="{'group_by': 'group_id'}"/>
</filter>
</field> </field>
</record> </record>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_account_analytic_line_tree_inherit_account" model="ir.ui.view">
<field name="model">account.analytic.line</field>
<field name="inherit_id" ref="account.view_account_analytic_line_tree_inherit_account"/>
<field name="arch" type="xml">
<field name="general_account_id" position="attributes">
<attribute name="optional">show</attribute>
</field>
</field>
</record>
</odoo>

View File

@@ -13,19 +13,31 @@
<field name="model">account.bank.statement</field> <field name="model">account.bank.statement</field>
<field name="inherit_id" ref="account.view_bank_statement_form"/> <field name="inherit_id" ref="account.view_bank_statement_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<button name="button_reopen" position="after">
<button
name="button_undo_reconciliation"
type="object"
confirm="Are you sure to unreconcile all the entries of the bank statement?"
states="open"
string="Unreconcile All"/>
</button>
<xpath expr="//field[@name='line_ids']/tree/button[@name='button_undo_reconciliation']" position="after"> <xpath expr="//field[@name='line_ids']/tree/button[@name='button_undo_reconciliation']" position="after">
<field name="move_id" invisible="1"/> <field name="move_id" invisible="1"/>
<button name="show_account_move" type="object" <button name="show_account_move" type="object"
title="View Journal Entry" icon="fa-arrow-right"/> title="View Journal Entry" icon="fa-arrow-right"/>
</xpath> </xpath>
<field name="date" position="after"> <xpath expr="//field[@name='balance_end_real']/.." position="after">
<field name="start_date"/> <field name="start_date"/>
<field name="end_date"/> <field name="end_date"/>
<field name="hide_bank_statement_balance" invisible="1"/> <field name="hide_bank_statement_balance" invisible="1"/>
</field> <field name="line_count"/>
</xpath>
<field name="date" position="attributes"> <field name="date" position="attributes">
<attribute name="invisible">1</attribute> <attribute name="invisible">1</attribute>
</field> </field>
<field name="journal_id" position="attributes">
<attribute name="widget"></attribute>
</field>
<label for="balance_start" position="attributes"> <label for="balance_start" position="attributes">
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute> <attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
</label> </label>
@@ -41,6 +53,9 @@
<group name="sale_total" position="attributes"> <group name="sale_total" position="attributes">
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute> <attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
</group> </group>
<div role="alert" position="attributes">
<attribute name="attrs">{'invisible': ['|', '|', ('hide_bank_statement_balance', '=', True), ('previous_statement_id', '=', False), ('is_valid_balance_start', '=', True)]}</attribute>
</div>
</field> </field>
</record> </record>
@@ -49,12 +64,30 @@
<field name="model">account.bank.statement</field> <field name="model">account.bank.statement</field>
<field name="inherit_id" ref="account.view_bank_statement_tree"/> <field name="inherit_id" ref="account.view_bank_statement_tree"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree position="attributes">
<!-- Remove is_difference_zero condition for colors -->
<attribute name="decoration-danger"></attribute>
<attribute name="decoration-info">state == 'open'</attribute>
</tree>
<field name="date" position="attributes"> <field name="date" position="attributes">
<attribute name="invisible">1</attribute> <attribute name="invisible">1</attribute>
</field> </field>
<field name="journal_id" position="after"> <field name="journal_id" position="after">
<field name="start_date"/> <field name="start_date"/>
<field name="end_date"/> <field name="end_date"/>
<field name="line_count" optional="show"/>
</field>
<field name="balance_start" position="attributes">
<attribute name="optional">show</attribute>
</field>
<field name="balance_end_real" position="attributes">
<attribute name="optional">show</attribute>
</field>
<field name="state" position="attributes">
<attribute name="widget">badge</attribute>
<attribute name="decoration-info">state == 'open'</attribute>
<attribute name="decoration-warning">state == 'posted'</attribute>
<attribute name="decoration-success">state == 'confirm'</attribute>
</field> </field>
</field> </field>
</record> </record>

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2021-2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_account_group_form" model="ir.ui.view">
<field name="model">account.group</field>
<field name="inherit_id" ref="account.view_account_group_form"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="parent_id"/>
</field>
</field>
</record>
<record id="view_account_group_tree" model="ir.ui.view">
<field name="model">account.group</field>
<field name="inherit_id" ref="account.view_account_group_tree"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="parent_id" optional="show"/>
</field>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2018-2024 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="account_invoice_report_view_tree" model="ir.ui.view">
<field name="name">usability.account.invoice.report.tree</field>
<field name="model">account.invoice.report</field>
<field name="inherit_id" ref="account.account_invoice_report_view_tree"/>
<field name="arch" type="xml">
<field name="partner_id" position="after">
<field name="commercial_partner_id" optional="hide"/>
<field name="country_id" optional="hide"/>
<field name="industry_id" optional="hide"/>
<field name="fiscal_position_id" optional="hide"/>
</field>
<field name="quantity" position="after">
<field name="product_uom_id" groups="uom.group_uom" optional="hide"/>
</field>
</field>
</record>
<record id="view_account_invoice_report_search" model="ir.ui.view">
<field name="model">account.invoice.report</field>
<field name="inherit_id" ref="account.view_account_invoice_report_search"/>
<field name="arch" type="xml">
<filter name="category_product" position="after">
<filter string="Product" name="product_groupby" context="{'group_by': 'product_id', 'residual_invisible':True}"/>
</filter>
</field>
</record>
<record id="account.action_account_invoice_report_all_supp" model="ir.actions.act_window">
<field name="view_mode">pivot,graph</field>
</record>
<record id="account.action_account_invoice_report_all" model="ir.actions.act_window">
<field name="view_mode">pivot,graph</field>
</record>
</odoo>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright 2015-2020 Akretion France (http://www.akretion.com/) Copyright 2015-2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com> @author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
--> -->
@@ -12,12 +12,31 @@
<field name="model">account.journal</field> <field name="model">account.journal</field>
<field name="inherit_id" ref="account.view_account_journal_form"/> <field name="inherit_id" ref="account.view_account_journal_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="bank_statements_source" position="after"> <xpath expr="//field[@name='account_control_ids']/.." position="after">
<field name="hide_bank_statement_balance" groups="account.group_account_readonly"/> <group name="usability" string="Misc" attrs="{'invisible': [('type', '!=', 'bank')]}">
<field name="hide_bank_statement_balance" groups="account.group_account_readonly"/>
</group>
</xpath>
<xpath expr="//field[@name='inbound_payment_method_line_ids']/tree/field[@name='payment_account_id']" position="attributes">
<attribute name="optional">show</attribute>
</xpath>
<xpath expr="//field[@name='outbound_payment_method_line_ids']/tree/field[@name='payment_account_id']" position="attributes">
<attribute name="optional">show</attribute>
</xpath>
<!--
<field name="suspense_account_id" position="attributes">
<attribute name="context">{'default_user_type_id': account_type_current_assets_id, 'default_reconcile': False}</attribute>
</field> </field>
<field name="payment_debit_account_id" position="attributes">
<attribute name="context">{'default_user_type_id': account_type_current_assets_id, 'default_reconcile': True}</attribute>
</field>
<field name="payment_credit_account_id" position="attributes">
<attribute name="context">{'default_user_type_id': account_type_current_assets_id, 'default_reconcile': True}</attribute>
</field> -->
</field> </field>
</record> </record>
<!-- TODO
<record id="account_journal_dashboard_kanban_view" model="ir.ui.view"> <record id="account_journal_dashboard_kanban_view" model="ir.ui.view">
<field name="name">usability.account.journal.dashboard</field> <field name="name">usability.account.journal.dashboard</field>
<field name="model">account.journal</field> <field name="model">account.journal</field>
@@ -29,19 +48,12 @@
<xpath expr="//div[@name='latest_statement']/.." position="attributes"> <xpath expr="//div[@name='latest_statement']/.." position="attributes">
<attribute name="t-if">dashboard.has_at_least_one_statement and dashboard.account_balance != dashboard.last_balance and !record.hide_bank_statement_balance.raw_value</attribute> <attribute name="t-if">dashboard.has_at_least_one_statement and dashboard.account_balance != dashboard.last_balance and !record.hide_bank_statement_balance.raw_value</attribute>
</xpath> </xpath>
<t t-esc="dashboard.outstanding_pay_account_balance" position="replace">
<a name="open_outstanding_payments" type="object" title="Outstanding Payments/Receipts"><t t-esc="dashboard.outstanding_pay_account_balance"/></a>
</t>
</field> </field>
</record> </record>
-->
<record id="view_account_journal_tree" model="ir.ui.view">
<field name="name">usability.account.journal.tree</field>
<field name="model">account.journal</field>
<field name="inherit_id" ref="account.view_account_journal_tree"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="code" optional="show"/>
</field>
</field>
</record>
<record id="view_account_journal_search" model="ir.ui.view"> <record id="view_account_journal_search" model="ir.ui.view">
<field name="name">usability.account.journal.search</field> <field name="name">usability.account.journal.search</field>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright 2015-2020 Akretion France (http://www.akretion.com/) Copyright 2015-2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com> @author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
--> -->

View File

@@ -0,0 +1,178 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2015-2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_move_form" model="ir.ui.view">
<field name="name">account_usability.account.move.form</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<!--
<field name="fiscal_position_id" position="attributes">
<attribute name="widget">selection</attribute>
</field>
<field name="invoice_incoterm_id" position="attributes">
<attribute name="widget">selection</attribute>
</field> -->
<button id="account_invoice_payment_btn" position="attributes">
<attribute name="class">btn-default</attribute>
</button>
<button name="action_register_payment" position="before">
<button name="%(account.account_invoices)d" type="action" string="Print" attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
</button>
<button name="preview_invoice" position="attributes">
<attribute name="attrs">{}</attribute>
<attribute name="invisible">1</attribute>
</button>
<!-- move sent field and make it visible -->
<field name="is_move_sent" position="replace"/>
<field name="invoice_origin" position="attributes">
<attribute name="invisible">0</attribute>
</field>
<field name="invoice_origin" position="after">
<field name="is_move_sent" attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
</field>
<xpath expr="//field[@name='line_ids']/tree/field[@name='tax_tag_ids']" position="after">
<field name="matching_number" optional="show"/>
</xpath>
<xpath expr="//field[@name='invoice_line_ids']/tree/field[@name='product_id']" position="after">
<field name="product_barcode" optional="hide"/>
</xpath>
<field name="invoice_source_email" position="after">
<field name="blocked"/>
</field>
<div role="alert" position="after">
<div id="warn_blocked" groups="account.group_account_invoice,account.group_account_readonly"
class="alert alert-warning" role="alert" style="margin-bottom:0px;"
attrs="{'invisible': ['|', ('move_type', 'not in', ('in_invoice', 'in_refund', 'out_invoice', 'out_refund')), ('blocked', '=', False)]}">
This <field name="move_type"/> is marked as <b>disputed</b>.
</div>
</div>
<xpath expr="//button[@name='open_duplicated_ref_bill_view']/.." position="attributes">
<!-- show duplicate warning not only in draft state, but also in posted state -->
<attribute name="attrs">{'invisible': ['|', ('state', '=', 'cancel'), ('duplicated_ref_ids', '=', [])]}</attribute>
</xpath>
<button name="button_cancel" attrs="{'invisible' : ['|', '|', ('id', '=', False), ('state', '!=', 'draft'),('move_type', '!=', 'entry')]}" position="attributes">
<attribute name="confirm">Are you sure you want to cancel this journal entry?</attribute>
</button>
<button name="button_cancel" attrs="{'invisible' : ['|', '|', ('id', '=', False), ('state', '!=', 'draft'),('move_type', '==', 'entry')]}" position="attributes">
<attribute name="confirm">Are you sure you want to cancel this invoice?</attribute>
</button>
</field>
</record>
<record id="view_invoice_tree" model="ir.ui.view">
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_invoice_tree"/>
<field name="arch" type="xml">
<field name="amount_residual_signed" position="attributes">
<attribute name="optional">show</attribute>
</field>
</field>
</record>
<record id="view_account_invoice_filter" model="ir.ui.view">
<field name="name">account_usability.account.move.search</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_account_invoice_filter"/>
<field name="arch" type="xml">
<filter name="due_date" position="after">
<separator/>
<filter name="to_send" string="To Send" domain="[('is_move_sent', '=', False), ('state', '=', 'posted'), ('move_type', 'in', ('out_invoice', 'out_refund'))]"/>
<filter name="sent" string="Sent" domain="[('is_move_sent', '=', True), ('move_type', 'in', ('out_invoice', 'out_refund'))]"/>
<separator/>
<filter name="no_attachment" string="Missing Attachment" domain="[('has_attachment', '=', False)]"/>
<separator/>
<filter name="dispute" string="Dispute" domain="[('blocked', '=', True)]"/>
</filter>
<filter name="salesperson" position="before">
<filter name="commercial_partner_groupby" string="Commercial Partner" context="{'group_by': 'commercial_partner_id'}"/>
</filter>
<filter name="status" position="after">
<filter name="payment_state_groupby" string="Payment Status" context="{'group_by': 'payment_state'}"/>
</filter>
</field>
</record>
<record id="view_account_move_filter" model="ir.ui.view">
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_account_move_filter"/>
<field name="arch" type="xml">
<field name="journal_id" position="after">
<field name="search_account_id"/>
</field>
</field>
</record>
<record id="view_move_line_form" model="ir.ui.view">
<field name="model">account.move.line</field>
<field name="inherit_id" ref="account.view_move_line_form"/>
<field name="arch" type="xml">
<!-- The field 'blocked' is alone in it's block
We don't want to display an empty block, so we put the attrs on the group
The drawback of this is that, if someone added a field in that group,
he won't see the field when internal_type is not payable/receivable -->
<xpath expr="//field[@name='blocked']/.." position="attributes">
<attribute name="attrs">{'invisible': [('account_type', 'not in', ('liability_payable', 'asset_receivable'))]}</attribute>
</xpath>
<field name="account_id" position="after">
<field name="account_type" invisible="1"/>
</field>
</field>
</record>
<record id="view_move_line_tree" model="ir.ui.view">
<field name="model">account.move.line</field>
<field name="inherit_id" ref="account.view_move_line_tree"/>
<field name="arch" type="xml">
<field name="analytic_distribution" position="after">
<button title="View Journal Entry Form" type="object" name="show_account_move_form" icon="fa-arrow-right"/>
</field>
<!-- balance is already present
<field name="credit" position="after">
<field name="balance" sum="Balance" optional="show"/>
</field> -->
</field>
</record>
<record id="view_account_move_line_filter" model="ir.ui.view">
<field name="name">account_usability.account_move_line_search</field>
<field name="model">account.move.line</field>
<field name="inherit_id" ref="account.view_account_move_line_filter"/>
<field name="arch" type="xml">
<field name="partner_id" position="after">
<field name="matching_number" />
<field name="debit" filter_domain="['|', ('debit', '=', self), ('credit', '=', self)]" string="Debit or Credit"/>
</field>
<filter name="unreconciled" position="before">
<filter name="reconciled" string="Fully Reconciled" domain="[('account_id.reconcile', '=', True), ('full_reconcile_id', '!=', False)]"/>
</filter>
<filter name="unreconciled" position="attributes">
<attribute name="string">Unreconciled or Partially Reconciled</attribute>
</filter>
<field name="name" position="attributes">
<attribute name="string">Label, Reference, Account or Partner</attribute>
</field>
<field name="name" position="before">
<field name="move_id" position="move"/>
</field>
<field name="partner_id" position="attributes">
<attribute name="domain">['|', ('parent_id', '=', False), ('is_company', '=', True)]</attribute>
</field>
</field>
</record>
<!-- Inherit action called from button of account.account form view
Make it similar to standard "Journal Items" menu account.action_account_moves_all_a -->
<record id="account.action_move_line_select" model="ir.actions.act_window">
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="account.view_move_line_tree"/>
<field name="view_mode">tree,pivot,graph,kanban</field>
</record>
</odoo>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright 2018-2020 Akretion (http://www.akretion.com/) Copyright 2018-2022 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com> @author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
--> -->

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright 2015-2020 Akretion France (http://www.akretion.com/) Copyright 2015-2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com> @author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
--> -->
@@ -11,7 +11,7 @@
<field name="model">account.tax</field> <field name="model">account.tax</field>
<field name="inherit_id" ref="account.view_tax_tree"/> <field name="inherit_id" ref="account.view_tax_tree"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="description" position="after"> <field name="type_tax_use" position="after">
<field name="price_include" optional="show"/> <field name="price_include" optional="show"/>
</field> </field>
</field> </field>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright 2017-2020 Akretion (http://www.akretion.com/) Copyright 2017-2022 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com> @author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
--> -->
@@ -27,7 +27,7 @@ Here, we set all those fields on account.group_account_invoice
</field> </field>
<field name="list_price" position="replace"> <field name="list_price" position="replace">
<div name="list_price"> <div name="list_price">
<field name="list_price" widget='monetary' options="{'currency_field': 'currency_id'}" class="oe_inline"/> <field name="list_price" widget='monetary' options="{'currency_field': 'currency_id', 'field_digits': True}" class="oe_inline"/>
<label for="sale_price_type" string=" "/> <label for="sale_price_type" string=" "/>
<field name="sale_price_type"/> <field name="sale_price_type"/>
</div> </div>

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2021-2022 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_company_form" model="ir.ui.view">
<field name="name">account_usability.res.company.form</field>
<field name="model">res.company</field>
<field name="inherit_id" ref="base.view_company_form"/>
<field name="arch" type="xml">
<notebook position="inside">
<page string="Legal Terms" name="legal_terms">
<group string="Invoice Legal Terms" name="static_invoice_terms">
<field name="static_invoice_terms" nolabel="1" colspan="2"/>
</group>
</page>
</notebook>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2014-2024 Akretion (http://www.akretion.com/)
@author: Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_partner_simple_form" model="ir.ui.view">
<field name="name">base_usability.title.on.partner.simplified.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="account.view_partner_property_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='bank_ids']//field[@name='acc_number']" position="after">
<field name="currency_id" optional="hide"/>
</xpath>
</field>
</record>
</odoo>

View File

@@ -1,4 +1,3 @@
from . import account_invoice_mark_sent from . import account_invoice_mark_sent
from . import account_move_reversal from . import account_move_reversal
from . import res_config_settings
from . import account_group_generate from . import account_group_generate

View File

@@ -1,4 +1,4 @@
# Copyright 2015-2020 Akretion (http://www.akretion.com) # Copyright 2015-2022 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com> # @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
@@ -10,6 +10,9 @@ class AccountGroupGenerate(models.TransientModel):
_name = 'account.group.generate' _name = 'account.group.generate'
_description = 'Generate Account Groups' _description = 'Generate Account Groups'
company_id = fields.Many2one(
'res.company', string='Company', required=True,
default=lambda self: self.env.company)
name_prefix = fields.Char(string='Prefix', required=True, default='Comptes') name_prefix = fields.Char(string='Prefix', required=True, default='Comptes')
level = fields.Integer(default=2, required=True) level = fields.Integer(default=2, required=True)
@@ -18,7 +21,7 @@ class AccountGroupGenerate(models.TransientModel):
raise UserError(_("The level must be >= 1.")) raise UserError(_("The level must be >= 1."))
ago = self.env['account.group'] ago = self.env['account.group']
aao = self.env['account.account'] aao = self.env['account.account']
company = self.env.company company = self.company_id
groups = ago.search([('company_id', '=', company.id)]) groups = ago.search([('company_id', '=', company.id)])
if groups: if groups:
raise UserError(_( raise UserError(_(

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright 2020 Akretion France (http://www.akretion.com/) Copyright 2020-2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com> @author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
--> -->
@@ -11,11 +11,12 @@
<field name="name">account.group.generate.form</field> <field name="name">account.group.generate.form</field>
<field name="model">account.group.generate</field> <field name="model">account.group.generate</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Generate account groups"> <form>
<p> <p>
This wizard is designed to auto-generate account groups from the chart of account. This wizard is designed to auto-generate account groups from the chart of account.
</p> </p>
<group name="main"> <group name="main">
<field name="company_id" groups="base.group_multi_company"/>
<field name="name_prefix"/> <field name="name_prefix"/>
<field name="level"/> <field name="level"/>
</group> </group>

View File

@@ -1,4 +1,4 @@
# Copyright 2017-2020 Akretion France (https://akretion.com/en) # Copyright 2017-2022 Akretion France (https://akretion.com/en)
# @author: Alexis de Lattre <alexis.delattre@akretion.com> # @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright 2017-2020 Akretion France Copyright 2017-2022 Akretion France
@author: Alexis de Lattre <alexis.delattre@akretion.com> @author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
--> -->
@@ -13,7 +13,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Mark invoices as sent"> <form string="Mark invoices as sent">
<p> <p>
This wizard will mark as <i>sent</i> all the selected invoices in open or paid state. This wizard will mark as <i>sent</i> all the selected posted invoices.
</p> </p>
<footer> <footer>
<button type="object" name="run" string="Mark as Sent" class="btn-primary"/> <button type="object" name="run" string="Mark as Sent" class="btn-primary"/>

View File

@@ -0,0 +1,40 @@
# Copyright 2018-2022 Akretion France (https://akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models, _
from dateutil.relativedelta import relativedelta
from odoo.exceptions import UserError
class AccountMoveReversal(models.TransientModel):
_inherit = 'account.move.reversal'
already_reversed_warning = fields.Text(compute="_compute_already_reversed_warning")
@api.depends("move_ids")
def _compute_already_reversed_warning(self):
for wizard in self:
moves = wizard.move_ids or self.env["account.move"].browse(self._context['active_ids'])
reversed_moves = self.env["account.move"].search([('reversed_entry_id', 'in', moves.ids)])
warning = ""
for already_reversed_move in reversed_moves.reversed_entry_id:
if warning:
warning += "\n"
reversed_by = " ; ".join(already_reversed_move.reversal_move_id.mapped("display_name"))
move_detail = _("%s reversed by %s") % (already_reversed_move.display_name, reversed_by)
warning += move_detail
wizard.already_reversed_warning = warning or False
# Set default reversal date to original move + 1 day
# and raise error if original move has already been reversed
@api.model
def default_get(self, fields_list):
res = super().default_get(fields_list)
assert self._context.get('active_model') == 'account.move'
amo = self.env['account.move']
moves = amo.browse(self._context['active_ids'])
if len(moves) == 1:
res['date'] = moves.date + relativedelta(days=1)
return res

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_account_move_reversal" model="ir.ui.view">
<field name="model">account.move.reversal</field>
<field name="inherit_id" ref="account.view_account_move_reversal"/>
<field name="arch" type="xml">
<field name="residual" position="before">
<div
class="alert alert-warning"
role="alert"
attrs="{'invisible': [('already_reversed_warning', '=', False)]}"
>
You are about to reverse entries that have already been reversed or partially reversed (refund). Make sure it is intented.
Already reversed entries are the following :
<field
name="already_reversed_warning"
/>
</div>
</field>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2021-2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<!-- When you change the date, it resets the amount via the onchange
So, in the view, the date should be BEFORE the amount -->
<record id="view_account_payment_register_form" model="ir.ui.view">
<field name="model">account.payment.register</field>
<field name="inherit_id" ref="account.view_account_payment_register_form"/>
<field name="arch" type="xml">
<label for="amount" position="before">
<field name="payment_date" position="move"/>
</label>
</field>
</record>
</odoo>

View File

@@ -1 +1 @@
from . import company from . import models

View File

@@ -1,17 +1,17 @@
# Copyright 2014-2020 Akretion (http://www.akretion.com) # Copyright 2014-2022 Akretion (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com> # @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{ {
'name': 'Base Company Extension', 'name': 'Base Company Extension',
'version': '14.0.1.0.0', 'version': '16.0.1.0.0',
'category': 'Partner', 'category': 'Partner',
'license': 'AGPL-3', 'license': 'AGPL-3',
'summary': 'Adds capital and title on company', 'summary': 'Adds capital and title on company',
'author': 'Akretion', 'author': 'Akretion',
'website': 'http://www.akretion.com', 'website': 'https://github.com/akretion/odoo-usability',
# I depend on base_usability only for _report_company_legal_name() # I depend on base_usability only for _report_company_legal_name()
'depends': ['base_usability'], 'depends': ['base_usability'],
'data': ['company_view.xml'], 'data': ['views/res_company.xml'],
'installable': True, 'installable': True,
} }

View File

@@ -0,0 +1 @@
from . import res_company

Some files were not shown because too many files have changed in this diff Show More