diff --git a/addons/sale/__openerp__.py b/addons/sale/__openerp__.py index 651945752a7..d43278381f5 100644 --- a/addons/sale/__openerp__.py +++ b/addons/sale/__openerp__.py @@ -65,6 +65,8 @@ 'test/shipping_manual_sale_order.yml', 'test/prepaid_sale_order.yml', 'test/advance_invoice.yml', + 'test/so_make_line_invoice.yml', + 'test/so_make_invoice.yml', 'test/sale_procurement.yml', ], 'installable': True, diff --git a/addons/sale/test/shipping_manual_sale_order.yml b/addons/sale/test/shipping_manual_sale_order.yml index 4bbbbb74dc5..c030a80c64a 100644 --- a/addons/sale/test/shipping_manual_sale_order.yml +++ b/addons/sale/test/shipping_manual_sale_order.yml @@ -211,7 +211,7 @@ !record {model: product.category, id: product_category_services0}: name: Mobile Services - - I define LG Viewty Smart product template. + I define New Chocolate Slider Mobile template. - !record {model: product.template, id: product_template_newchocolateslidermobile0}: categ_id: product_category_allproductssellable0 @@ -226,7 +226,7 @@ uom_id: product.product_uom_unit uom_po_id: product.product_uom_unit - - I define LG Viewty Smart product. + I define New Chocolate Slider Mobile. - !record {model: product.product, id: product_product_newchocolateslidermobile0}: categ_id: product_category_allproductssellable0 diff --git a/addons/sale/test/so_make_invoice.yml b/addons/sale/test/so_make_invoice.yml new file mode 100644 index 00000000000..e34b11ffb2b --- /dev/null +++ b/addons/sale/test/so_make_invoice.yml @@ -0,0 +1,341 @@ +- + In order to test the sale module in the Open-ERP, I need to configure details regarding product & customer. +- + I am going to sell my Mobile products to the customer with name Cleartrail +- + I create View Account Type. +- + !record {model: account.account.type, id: account_account_type_view0}: + close_method: none + code: View + name: View + sign: 1 +- + I create Income Account Type. +- + !record {model: account.account.type, id: account_account_type_income0}: + close_method: unreconciled + code: Income + name: Income + sign: 1 +- + I create Expense Account Type. +- + !record {model: account.account.type, id: account_account_type_expense0}: + close_method: unreconciled + code: Expense + name: Expense + sign: 1 +- + I create Cash Account Type. +- + !record {model: account.account.type, id: account_account_type_cash0}: + close_method: balance + code: Cash + name: Cash + sign: 1 +- + I create Minimal Chart Account. +- + !record {model: account.account, id: account_account_minimalchart0}: + code: '0' + company_id: base.main_company + currency_mode: current + name: Minimal Chart + parent_left: 1 + parent_right: 12 + type: view + user_type: account_account_type_view0 +- + I create Payable Account. +- + !record {model: account.account, id: account_account_payable1}: + code: AP + company_id: base.main_company + currency_mode: current + name: Payable + parent_id: account_account_minimalchart0 + parent_left: 2 + parent_right: 3 + reconcile: true + type: payable + user_type: account_account_type_expense0 +- + I create Receivable Account. +- + !record {model: account.account, id: account_account_receivable0}: + code: AR + company_id: base.main_company + currency_mode: current + name: Receivable + parent_id: account_account_minimalchart0 + parent_left: 4 + parent_right: 5 + reconcile: true + type: receivable + user_type: account_account_type_income0 +- + I create Cash Account. +- + !record {model: account.account, id: account_account_cash0}: + code: C + company_id: base.main_company + currency_mode: current + name: Cash + parent_id: account_account_minimalchart0 + parent_left: 6 + parent_right: 7 + type: other + user_type: account_account_type_cash0 +- + I create Purchases Account. +- + !record {model: account.account, id: account_account_purchases0}: + code: P + company_id: base.main_company + currency_mode: current + name: Purchases + parent_id: account_account_minimalchart0 + parent_left: 8 + parent_right: 9 + type: other + user_type: account_account_type_expense0 +- + I create Sales Account. +- + !record {model: account.account, id: account_account_sales0}: + code: S + company_id: base.main_company + currency_mode: current + name: Sales + parent_id: account_account_minimalchart0 + parent_left: 10 + parent_right: 11 + type: other + user_type: account_account_type_income0 +- + I create Purchase Journal. +- + !record {model: account.journal, id: account_journal_purchasejournal0}: + code: PUJ + company_id: base.main_company + default_credit_account_id: account_account_purchases0 + default_debit_account_id: account_account_purchases0 + name: Purchase Journal + sequence_id: account.sequence_purchase_journal + type: purchase + view_id: account.account_journal_view +- + I create Sale Journal. +- + !record {model: account.journal, id: account_journal_salejournal0}: + code: SAJ + company_id: base.main_company + default_credit_account_id: account_account_sales0 + default_debit_account_id: account_account_sales0 + name: Sale Journal + sequence_id: account.sequence_sale_journal + type: sale + view_id: account.account_journal_view +- + I create Bank Journal. +- + !record {model: account.journal, id: account_journal_bankjournal0}: + code: BNK + company_id: base.main_company + default_credit_account_id: account_account_cash0 + default_debit_account_id: account_account_cash0 + name: Bank Journal + sequence_id: account.sequence_journal + type: cash + view_id: account.account_journal_bank_view +- + I create ir.property for account payable. +- + !record {model: ir.property, id: ir_property_propertyaccountexpensecateg0}: + company_id: base.main_company + fields_id: account.field_res_partner_property_account_payable + name: property_account_expense_categ + value_reference: account.account,5 +- + I create ir.property for account receivable. +- + !record {model: ir.property, id: ir_property_propertyaccountincomecateg0}: + company_id: base.main_company + fields_id: account.field_res_partner_property_account_receivable + name: property_account_income_categ + value_reference: account.account,6 +- + I create Partner category Customers. +- + !record {model: res.partner.category, id: res_partner_category_customers0}: + name: Customers +- + I create Cleartrail Customer. +- + !record {model: res.partner, id: res_partner_cleartrail0}: + category_id: + - res_partner_category_customers0 + name: Cleartrail +- + I create contact address for Cleartrail. +- + !record {model: res.partner.address, id: res_partner_address_1}: + partner_id: res_partner_cleartrail0 + street: onam plaza, 14 B palasia A B Road + type: contact +- + I create invoice address for Cleartrail. +- + !record {model: res.partner.address, id: res_partner_address_2}: + partner_id: res_partner_cleartrail0 + street: sarda house 24 B palasia, A B Road + type: invoice +- + I create delivery address for Cleartrail. +- + !record {model: res.partner.address, id: res_partner_address_3}: + partner_id: res_partner_cleartrail0 + street: sangam house 15 B palasia, A B Road + type: delivery +- + Customer Cleartrail has specific instrument requirement regarding the stockable products. +- + I define product category Mobile Products Sellable. +- + !record {model: product.category, id: product_category_allproductssellable0}: + name: Mobile Products Sellable +- + I define product category Mobile Services. +- + !record {model: product.category, id: product_category_services0}: + name: Mobile Services +- + I define LG Viewty Smart product template. +- + !record {model: product.template, id: product_template_lgviewtysmart0}: + categ_id: product_category_allproductssellable0 + cost_method: standard + list_price: 170.0 + mes_type: fixed + name: LG Viewty Smart + procure_method: make_to_order + standard_price: 160.0 + supply_method: produce + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit +- + I define LG Viewty Smart product. +- + !record {model: product.product, id: product_product_lgviewtysmart0}: + categ_id: product_category_allproductssellable0 + cost_method: standard + list_price: 170.0 + mes_type: fixed + name: LG Viewty Smart + pricelist_purchase: 'Default Purchase Pricelist (0.00) : 160.00\n' + pricelist_sale: 'Public Pricelist (0.00) : 170.00\n' + procure_method: make_to_order + property_account_expense: sale.account_account_payable1 + property_account_income: sale.account_account_receivable0 + seller_delay: '1' + standard_price: 160.0 + supply_method: produce + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit +- + I define New Chocolate Slider Mobile template. +- + !record {model: product.template, id: product_template_newchocolateslidermobile0}: + categ_id: product_category_allproductssellable0 + cost_method: standard + list_price: 200.0 + mes_type: fixed + name: New Chocolate Slider Mobile + procure_method: make_to_order + standard_price: 189.0 + supply_method: buy + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit +- + I define New Chocolate Slider Mobile. +- + !record {model: product.product, id: product_product_newchocolateslidermobile0}: + categ_id: product_category_allproductssellable0 + cost_method: standard + list_price: 200.0 + mes_type: fixed + name: New Chocolate Slider Mobile + pricelist_purchase: 'Default Purchase Pricelist (0.00) : 189.00\n' + pricelist_sale: 'Public Pricelist (0.00) : 200.00\n' + procure_method: make_to_order + property_account_expense: sale.account_account_payable1 + property_account_income: sale.account_account_receivable0 + seller_delay: '1' + standard_price: 189.0 + supply_method: buy + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit +- + I create a Sale Order for LG Viewty Smart for qty 500 having order_policy manual. +- + !record {model: sale.order, id: sale_order_so4}: + date_order: '2010-05-12' + invoice_quantity: order + name: Test_SO004 + order_line: + - name: New Chocolate Slider Mobile + price_unit: 200.0 + product_uom: product.product_uom_unit + product_uom_qty: 500.0 + state: draft + delay: 7.0 + product_id: sale.product_product_newchocolateslidermobile0 + product_uos_qty: 500.0 + type: make_to_order + - name: LG Viewty Smart + price_unit: 170.0 + product_uom: product.product_uom_unit + product_uom_qty: 500.0 + state: draft + delay: 7.0 + product_id: sale.product_product_lgviewtysmart0 + product_uos_qty: 500.0 + th_weight: 0.0 + type: make_to_order + order_policy: manual + partner_id: sale.res_partner_cleartrail0 + partner_invoice_id: sale.res_partner_address_2 + partner_order_id: sale.res_partner_address_1 + partner_shipping_id: sale.res_partner_address_3 + picking_policy: direct + pricelist_id: product.list0 + shop_id: sale.shop +- + I confirm the Sale Order. +- + !workflow {model: sale.order, action: order_confirm, ref: sale_order_so4} +- + I create an invoice on sale order. +- + !record {model: sale.make.invoice, id: sale_make_invoice_1}: + {} +- + Invoice is created for specific sale order. +- + !python {model: sale.make.invoice}: | + self.make_invoices(cr, uid, [ref("sale_make_invoice_1")], {"lang": 'en_US', "search_default_user_id": + 1, "tz": False, "active_model": 'sale.order', "active_ids": [ref("sale_order_so4")], "active_id": + ref("sale_order_so4"), }) +- + I verify that invoice regarding sale order has been created. +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so4")) + assert so.invoice_ids, "Invoices has not been generated for sale_order_so0" + + \ No newline at end of file diff --git a/addons/sale/test/so_make_line_invoice.yml b/addons/sale/test/so_make_line_invoice.yml new file mode 100644 index 00000000000..de5782c8517 --- /dev/null +++ b/addons/sale/test/so_make_line_invoice.yml @@ -0,0 +1,342 @@ +- + In order to test the sale module in the Open-ERP, I need to configure details regarding product & customer. +- + I am going to sell my Mobile products to the customer with name Cleartrail +- + I create View Account Type. +- + !record {model: account.account.type, id: account_account_type_view0}: + close_method: none + code: View + name: View + sign: 1 +- + I create Income Account Type. +- + !record {model: account.account.type, id: account_account_type_income0}: + close_method: unreconciled + code: Income + name: Income + sign: 1 +- + I create Expense Account Type. +- + !record {model: account.account.type, id: account_account_type_expense0}: + close_method: unreconciled + code: Expense + name: Expense + sign: 1 +- + I create Cash Account Type. +- + !record {model: account.account.type, id: account_account_type_cash0}: + close_method: balance + code: Cash + name: Cash + sign: 1 +- + I create Minimal Chart Account. +- + !record {model: account.account, id: account_account_minimalchart0}: + code: '0' + company_id: base.main_company + currency_mode: current + name: Minimal Chart + parent_left: 1 + parent_right: 12 + type: view + user_type: account_account_type_view0 +- + I create Payable Account. +- + !record {model: account.account, id: account_account_payable1}: + code: AP + company_id: base.main_company + currency_mode: current + name: Payable + parent_id: account_account_minimalchart0 + parent_left: 2 + parent_right: 3 + reconcile: true + type: payable + user_type: account_account_type_expense0 +- + I create Receivable Account. +- + !record {model: account.account, id: account_account_receivable0}: + code: AR + company_id: base.main_company + currency_mode: current + name: Receivable + parent_id: account_account_minimalchart0 + parent_left: 4 + parent_right: 5 + reconcile: true + type: receivable + user_type: account_account_type_income0 +- + I create Cash Account. +- + !record {model: account.account, id: account_account_cash0}: + code: C + company_id: base.main_company + currency_mode: current + name: Cash + parent_id: account_account_minimalchart0 + parent_left: 6 + parent_right: 7 + type: other + user_type: account_account_type_cash0 +- + I create Purchases Account. +- + !record {model: account.account, id: account_account_purchases0}: + code: P + company_id: base.main_company + currency_mode: current + name: Purchases + parent_id: account_account_minimalchart0 + parent_left: 8 + parent_right: 9 + type: other + user_type: account_account_type_expense0 +- + I create Sales Account. +- + !record {model: account.account, id: account_account_sales0}: + code: S + company_id: base.main_company + currency_mode: current + name: Sales + parent_id: account_account_minimalchart0 + parent_left: 10 + parent_right: 11 + type: other + user_type: account_account_type_income0 +- + I create Purchase Journal. +- + !record {model: account.journal, id: account_journal_purchasejournal0}: + code: PUJ + company_id: base.main_company + default_credit_account_id: account_account_purchases0 + default_debit_account_id: account_account_purchases0 + name: Purchase Journal + sequence_id: account.sequence_purchase_journal + type: purchase + view_id: account.account_journal_view +- + I create Sale Journal. +- + !record {model: account.journal, id: account_journal_salejournal0}: + code: SAJ + company_id: base.main_company + default_credit_account_id: account_account_sales0 + default_debit_account_id: account_account_sales0 + name: Sale Journal + sequence_id: account.sequence_sale_journal + type: sale + view_id: account.account_journal_view +- + I create Bank Journal. +- + !record {model: account.journal, id: account_journal_bankjournal0}: + code: BNK + company_id: base.main_company + default_credit_account_id: account_account_cash0 + default_debit_account_id: account_account_cash0 + name: Bank Journal + sequence_id: account.sequence_journal + type: cash + view_id: account.account_journal_bank_view +- + I create ir.property for account payable. +- + !record {model: ir.property, id: ir_property_propertyaccountexpensecateg0}: + company_id: base.main_company + fields_id: account.field_res_partner_property_account_payable + name: property_account_expense_categ + value_reference: account.account,5 +- + I create ir.property for account receivable. +- + !record {model: ir.property, id: ir_property_propertyaccountincomecateg0}: + company_id: base.main_company + fields_id: account.field_res_partner_property_account_receivable + name: property_account_income_categ + value_reference: account.account,6 +- + I create Partner category Customers. +- + !record {model: res.partner.category, id: res_partner_category_customers0}: + name: Customers +- + I create Cleartrail Customer. +- + !record {model: res.partner, id: res_partner_cleartrail0}: + category_id: + - res_partner_category_customers0 + name: Cleartrail +- + I create contact address for Cleartrail. +- + !record {model: res.partner.address, id: res_partner_address_1}: + partner_id: res_partner_cleartrail0 + street: onam plaza, 14 B palasia A B Road + type: contact +- + I create invoice address for Cleartrail. +- + !record {model: res.partner.address, id: res_partner_address_2}: + partner_id: res_partner_cleartrail0 + street: sarda house 24 B palasia, A B Road + type: invoice +- + I create delivery address for Cleartrail. +- + !record {model: res.partner.address, id: res_partner_address_3}: + partner_id: res_partner_cleartrail0 + street: sangam house 15 B palasia, A B Road + type: delivery +- + Customer Cleartrail has specific instrument requirement regarding the stockable products. +- + I define product category Mobile Products Sellable. +- + !record {model: product.category, id: product_category_allproductssellable0}: + name: Mobile Products Sellable +- + I define product category Mobile Services. +- + !record {model: product.category, id: product_category_services0}: + name: Mobile Services +- + I define LG Viewty Smart product template. +- + !record {model: product.template, id: product_template_lgviewtysmart0}: + categ_id: product_category_allproductssellable0 + cost_method: standard + list_price: 170.0 + mes_type: fixed + name: LG Viewty Smart + procure_method: make_to_order + standard_price: 160.0 + supply_method: produce + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit +- + I define LG Viewty Smart product. +- + !record {model: product.product, id: product_product_lgviewtysmart0}: + categ_id: product_category_allproductssellable0 + cost_method: standard + list_price: 170.0 + mes_type: fixed + name: LG Viewty Smart + pricelist_purchase: 'Default Purchase Pricelist (0.00) : 160.00\n' + pricelist_sale: 'Public Pricelist (0.00) : 170.00\n' + procure_method: make_to_order + property_account_expense: sale.account_account_payable1 + property_account_income: sale.account_account_receivable0 + seller_delay: '1' + standard_price: 160.0 + supply_method: produce + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit +- + I define New Chocolate Slider Mobile template. +- + !record {model: product.template, id: product_template_newchocolateslidermobile0}: + categ_id: product_category_allproductssellable0 + cost_method: standard + list_price: 200.0 + mes_type: fixed + name: New Chocolate Slider Mobile + procure_method: make_to_order + standard_price: 189.0 + supply_method: buy + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit +- + I define New Chocolate Slider Mobile. +- + !record {model: product.product, id: product_product_newchocolateslidermobile0}: + categ_id: product_category_allproductssellable0 + cost_method: standard + list_price: 200.0 + mes_type: fixed + name: New Chocolate Slider Mobile + pricelist_purchase: 'Default Purchase Pricelist (0.00) : 189.00\n' + pricelist_sale: 'Public Pricelist (0.00) : 200.00\n' + procure_method: make_to_order + property_account_expense: sale.account_account_payable1 + property_account_income: sale.account_account_receivable0 + seller_delay: '1' + standard_price: 189.0 + supply_method: buy + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit +- + I create a Sale Order for LG Viewty Smart for qty 500 having order_policy manual. +- + !record {model: sale.order, id: sale_order_so3}: + date_order: '2010-05-12' + invoice_quantity: order + name: Test_SO003 + order_line: + - name: New Chocolate Slider Mobile + price_unit: 200.0 + product_uom: product.product_uom_unit + product_uom_qty: 500.0 + state: draft + delay: 7.0 + product_id: sale.product_product_newchocolateslidermobile0 + product_uos_qty: 500.0 + type: make_to_order + - name: LG Viewty Smart + price_unit: 170.0 + product_uom: product.product_uom_unit + product_uom_qty: 500.0 + state: draft + delay: 7.0 + product_id: sale.product_product_lgviewtysmart0 + product_uos_qty: 500.0 + th_weight: 0.0 + type: make_to_order + order_policy: manual + partner_id: sale.res_partner_cleartrail0 + partner_invoice_id: sale.res_partner_address_2 + partner_order_id: sale.res_partner_address_1 + partner_shipping_id: sale.res_partner_address_3 + picking_policy: direct + pricelist_id: product.list0 + shop_id: sale.shop +- + I confirm the Sale Order. +- + !workflow {model: sale.order, action: order_confirm, ref: sale_order_so3} +- + I create an invoice on sale order line. +- + !record {model: sale.order.line.make.invoice, id: sale_order_line_make_invoice_0}: + {} +- + invoice is created for specific sale order line. +- + !python {model: sale.order.line.make.invoice}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so3")) + sol = so.order_line[0] + self.make_invoices(cr, uid, [ref("sale_order_line_make_invoice_0")], {"lang": + 'en_US', "active_model": "sale.order.line", "active_ids": [ref(sol.id)], "tz": + False, "active_id": ref(sol.id), }) +- + I verify that invoice regarding sale order line has been created. +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so3")) + assert so.invoice_ids, "Invoices has not been generated for sale_order_so0" diff --git a/addons/sale/wizard/sale_line_invoice.py b/addons/sale/wizard/sale_line_invoice.py index 15405f07874..195931ecb04 100644 --- a/addons/sale/wizard/sale_line_invoice.py +++ b/addons/sale/wizard/sale_line_invoice.py @@ -21,6 +21,7 @@ from osv import fields, osv from tools.translate import _ +import netsvc class sale_order_line_make_invoice(osv.osv_memory): _name = "sale.order.line.make.invoice"