diff --git a/addons/sale/__openerp__.py b/addons/sale/__openerp__.py index d60b132a827..7c125a806a3 100644 --- a/addons/sale/__openerp__.py +++ b/addons/sale/__openerp__.py @@ -70,7 +70,9 @@ 'demo_xml': ['sale_demo.xml','board_sale_demo.xml'], 'test': [ 'test/shipping_manual_sale_order.yml', + 'test/postpaid_sale_order.yml', 'test/prepaid_sale_order.yml', + 'test/invoice_from_picking.yml', 'test/advance_invoice.yml', 'test/so_make_line_invoice.yml', 'test/so_make_invoice.yml', diff --git a/addons/sale/test/invoice_from_picking.yml b/addons/sale/test/invoice_from_picking.yml new file mode 100644 index 00000000000..c5ba349b69a --- /dev/null +++ b/addons/sale/test/invoice_from_picking.yml @@ -0,0 +1,508 @@ +- + In order to test the sale module, 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_receivable1}: + code: AR1 + 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_cash2}: + code: C2 + 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_bankjournal2}: + code: BNK + company_id: base.main_company + default_credit_account_id: account_account_cash2 + default_debit_account_id: account_account_cash2 + 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 Slider Mobile template. +- + !record {model: product.template, id: product_template_slidermobile0}: + categ_id: product_category_allproductssellable0 + cost_method: standard + list_price: 510.0 + mes_type: fixed + name: Slider Mobile + procure_method: make_to_order + standard_price: 500.0 + supply_method: buy + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit +- + I define Slider Mobile. +- + !record {model: product.product, id: product_product_slidermobile0}: + categ_id: product_category_allproductssellable0 + cost_method: standard + list_price: 510.0 + mes_type: fixed + name: Slider Mobile + pricelist_purchase: 'Default Purchase Pricelist (0.00) : 500.0.00\n' + pricelist_sale: 'Public Pricelist (0.00) : 510.00\n' + procure_method: make_to_order + property_account_expense: sale.account_account_payable1 + property_account_income: sale.account_account_receivable1 + seller_delay: '1' + seller_ids: + - delay: 1 + name: base.res_partner_agrolait + qty: 5.0 + standard_price: 500.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 Slider Mobile for qty 500 having Shipping Policy is 'Invoice from Picking' +- + !record {model: sale.order, id: sale_order_so7}: + date_order: '2010-07-15' + invoice_quantity: order + name: Test_SO007 + order_line: + - name: Slider Mobile + price_unit: 510.0 + product_uom: product.product_uom_unit + product_uom_qty: 500.0 + state: draft + delay: 7.0 + product_id: sale.product_product_slidermobile0 + product_uos_qty: 500.0 + th_weight: 0.0 + type: make_to_order + order_policy: picking + 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_so7} +- + I verify that picking has been generated for the sale order. +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so7")) + assert so.picking_ids,"Picking has not been generated for sale_order_so0" +- + Then I done the picking +- + !python {model: stock.picking }: | + import time + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')]) + if picking_id: + pick=self.browse(cr,uid,picking_id[0]) + pick.force_assign(cr, uid) + partial_datas = { + 'partner_id':pick.address_id.partner_id.id, + 'address_id': pick.address_id.id, + 'delivery_date' : time.strftime('%Y-%m-%d'), + } + move = pick.move_lines[0] + partial_datas['move%s'%(move.id)]= { + 'product_id': move.product_id.id, + 'product_qty': move.product_qty, + 'product_uom': move.product_uom.id, + } + self.do_partial(cr, uid, [pick.id],partial_datas) +- + Then I create invoice from picking +- + !record {model: stock.invoice.onshipping, id: stock_invoice_onshipping_0}: + invoice_date: '2010-07-15' + journal_id: account.sales_journal + type: out_invoice +- + Then I click on 'Create Invoices' button +- + !python {model: stock.invoice.onshipping}: | + sale_obj=self.pool.get('sale.order') + sale_id=sale_obj.browse(cr, uid, ref("sale_order_so7")) + picking_obj = self.pool.get('stock.picking') + ids = picking_obj.search(cr, uid, [('origin', '=', sale_id.name)]) + self.create_invoice(cr, uid, [ref("stock_invoice_onshipping_0")], {"lang": "en_US", + "search_default_available": 1, "tz": False, "active_model": "stock.picking", + "contact_display": "partner", "active_ids": ids, "active_id": ids[0]}) +- + I check that an invoice has been created. +- + !python {model: sale.order}: | + sale_id=self.browse(cr, uid, ref("sale_order_so7")) + assert(sale_id.invoice_ids), "Invoice has not been created" +- + I open the Invoice for the SO. +- + !python {model: account.invoice}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + import netsvc + wf_service = netsvc.LocalService("workflow") + invoice_ids = so.invoice_ids + for invoice in invoice_ids: + wf_service.trg_validate(uid, 'account.invoice',invoice.id,'invoice_open', cr) +- + Creating a account invoice pay entry. +- + !record {model: account.invoice.pay, id: account_invoice_pay_tst1}: + amount: 255000.0 + date: '2010-07-15' + journal_id: sale.account_journal_bankjournal2 + name: tst + period_id: account.period_5 +- + I pay the invoice. +- + !python {model: account.invoice.pay}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + self.wo_check(cr, uid, [ref("account_invoice_pay_tst1")], {"lang": "en_US", "tz": + False, "active_model": 'account.invoice', "active_ids": [so.invoice_ids[0].id], "type": + "out_invoice", "active_id": so.invoice_ids[0].id, }) +- + Creating an account invoice pay writeoff entry. +- + !record {model: account.invoice.pay.writeoff, id: account_invoice_pay_writeoff_0}: + analytic_id: account.analytic_customers + comment: Write-Off + writeoff_acc_id: account.a_sale + writeoff_journal_id: sale.account_journal_bankjournal2 +- + Pay and Reconcile the Invoice. +- + !python {model: account.invoice.pay.writeoff}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + self.pay_and_reconcile_writeoff(cr, uid, [ref("account_invoice_pay_writeoff_0")], + {"lang": 'en_US', "tz": False, "active_model": 'account.invoice', "active_ids": + [so.invoice_ids[0].id], "type": "out_invoice", "active_id": so.invoice_ids[0].id }) +- + I verify the invoice are in paid state or not. +- + !python {model: account.invoice}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + invoice_ids = so.invoice_ids + for invoice in invoice_ids: + assert (invoice.state) =='paid', "Invoice for SO is not in done state." +- + I check that Paid has been set to true. +- + !python {model: sale.order}: | + sale_id=self.browse(cr, uid, ref("sale_order_so7")) + assert(sale_id.invoiced == True), "Paid has not been set to true" +- + I verify that a procurement has been generated for so +- + !python {model: procurement.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + proc_ids = self.search(cr, uid, [('origin','=',so.name)]) + assert proc_ids, _('No Procurements!') +- + Then I click on the "Run Procurement" button +- + !python {model: procurement.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + import netsvc + wf_service = netsvc.LocalService("workflow") + proc_ids = self.search(cr, uid, [('origin','=',so.name)]) + for proc in proc_ids: + wf_service.trg_validate(uid, 'procurement.order',proc,'button_check', cr) +- + I verify that a procurement state is "running" +- + !python {model: procurement.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + proc_ids = self.search(cr, uid, [('origin','=',so.name) and ('state','=','running')]) + assert proc_ids, _('Procurement is not in the running state!') +- + I verify that a purchase order has been generated +- + !python {model: purchase.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + proc_ids = self.search(cr, uid, [('origin','=',so.name)]) + assert proc_ids, _('Purchase order has not been generated') +- + I click on the "Confirm" button to confirm the purchase order +- + !python {model: purchase.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + import netsvc + wf_service = netsvc.LocalService("workflow") + pur_ids = self.search(cr, uid, [('origin','=',so.name)]) + for pur in pur_ids: + wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_confirm', cr) +- + I click on the "Approved by supplier" button to approve the purchase order +- + !python {model: purchase.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + import netsvc + wf_service = netsvc.LocalService("workflow") + pur_ids = self.search(cr, uid, [('origin','=',so.name)]) + for pur in pur_ids: + wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr) +- + I verify that a picking related to purchase order has been generated. +- + !python {model: purchase.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + ids = self.search(cr, uid, [('origin','=',so.name)]) + po = self.browse(cr, uid, ids)[0] + assert(po.picking_ids) +- + Then I click on the "Products Received" button of Incoming Shipments +- + !record {model: stock.partial.picking, id: stock_partial_picking_0}: + date: '2010-07-15 17:52:09' +- + I click on the "Validate" button +- + !python {model: stock.picking}: | + sale_order_obj = self.pool.get('sale.order') + pur_obj = self.pool.get('purchase.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) + po = pur_obj.browse(cr, uid, pur_id)[0] + pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )]) + import netsvc + wf_service = netsvc.LocalService("workflow") + for pick in pick_ser_id: + wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr) +- + I verify that picking state is done +- + !python {model: purchase.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) + pur_id = self.search(cr, uid, [('origin','=',so.name)]) + po = self.browse(cr, uid, pur_id)[0] + picking_obj = self.pool.get('stock.picking') + ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ) and ('state', '=', 'done')]) + assert ids, _('Picking is not in the done state!') +- + I verify that a "Picked" has been set to true +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so7")) + assert (so.shipped == True), "Picking is not done." +- + I verify that a sale order is in done state +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so7")) + assert (so.state == 'done'), "Sale order is not in the done state." + diff --git a/addons/sale/test/postpaid_sale_order.yml b/addons/sale/test/postpaid_sale_order.yml new file mode 100644 index 00000000000..9e35a7a3730 --- /dev/null +++ b/addons/sale/test/postpaid_sale_order.yml @@ -0,0 +1,509 @@ +- + In order to test the sale module, 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_payable2}: + code: AP2 + 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_receivable2}: + code: AR2 + 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_cash1}: + code: CASH + 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_bankjournal1}: + code: BNK + company_id: base.main_company + default_credit_account_id: account_account_cash1 + default_debit_account_id: account_account_cash1 + 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 New Slider Mobile template. +- + !record {model: product.template, id: product_template_newslidermobile0}: + categ_id: product_category_allproductssellable0 + cost_method: standard + list_price: 200.0 + mes_type: fixed + name: New 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 Slider Mobile. +- + !record {model: product.product, id: product_product_newslidermobile0}: + categ_id: product_category_allproductssellable0 + cost_method: standard + list_price: 200.0 + mes_type: fixed + name: New 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_payable2 + property_account_income: sale.account_account_receivable2 + seller_delay: '1' + seller_ids: + - delay: 1 + name: base.res_partner_agrolait + qty: 5.0 + 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 New Slider Mobile for qty 500 having Shipping Policy is 'Invoice on order after Delivery' +- + !record {model: sale.order, id: sale_order_so8}: + date_order: '2010-07-15' + invoice_quantity: order + name: Test_SO008 + order_line: + - name: New 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_newslidermobile0 + product_uos_qty: 500.0 + type: make_to_order + order_policy: postpaid + 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_so8} +- + I verify that the picking has been generated for the sale order +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so8")) + assert so.picking_ids,"Picking has not been generated for sale_order_so8" +- + Products are delivered to the Cleartrail Customer. +- + !python {model: stock.picking }: | + import time + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')]) + if picking_id: + pick=self.browse(cr,uid,picking_id[0]) + pick.force_assign(cr, uid) + partial_datas = { + 'partner_id':pick.address_id.partner_id.id, + 'address_id': pick.address_id.id, + 'delivery_date' : time.strftime('%Y-%m-%d'), + } + move = pick.move_lines[0] + partial_datas['move%s'%(move.id)]= { + 'product_id': move.product_id.id, + 'product_qty': move.product_qty, + 'product_uom': move.product_uom.id, + } + self.do_partial(cr, uid, [pick.id],partial_datas) +- + I click on the "Validate" button +- + !python {model: stock.picking}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + import netsvc + wf_service = netsvc.LocalService("workflow") + picking_id = self.search(cr, uid, [('origin','=',so.name)]) + for pick in picking_id: + wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr) +- + I verify that picking order is in done state. +- + !python {model: stock.picking }: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')]) + if picking_id: + pick = self.browse(cr,uid,picking_id[0]) + assert (pick.state == 'done'), "Picking for SO is not in done state." +- + I verify that a procurement has been generated for so +- + !python {model: procurement.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + proc_ids = self.search(cr, uid, [('origin','=',so.name)]) + assert proc_ids, _('No Procurements!') +- + Then I click on the "Run Procurement" button +- + !python {model: procurement.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + import netsvc + wf_service = netsvc.LocalService("workflow") + proc_ids = self.search(cr, uid, [('origin','=',so.name)]) + for proc in proc_ids: + wf_service.trg_validate(uid, 'procurement.order',proc,'button_check', cr) +- + I verify that a procurement state is "running" +- + !python {model: procurement.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + proc_ids = self.search(cr, uid, [('origin','=',so.name) and ('state','=','running')]) + assert proc_ids, _('Procurement is not in the running state!') +- + I verify that a purchase order has been generated +- + !python {model: purchase.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + proc_ids = self.search(cr, uid, [('origin','=',so.name)]) + assert proc_ids, _('Purchase order has not been generated') +- + I click on the "Confirm" button to confirm the purchase order +- + !python {model: purchase.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + import netsvc + wf_service = netsvc.LocalService("workflow") + pur_ids = self.search(cr, uid, [('origin','=',so.name)]) + for pur in pur_ids: + wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_confirm', cr) +- + I click on the "Approved by supplier" button to approve the purchase order +- + !python {model: purchase.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + import netsvc + wf_service = netsvc.LocalService("workflow") + pur_ids = self.search(cr, uid, [('origin','=',so.name)]) + for pur in pur_ids: + wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr) +- + I verify that a picking related to purchase order has been generated. +- + !python {model: purchase.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + ids = self.search(cr, uid, [('origin','=',so.name)]) + po = self.browse(cr, uid, ids)[0] + assert(po.picking_ids) +- + Then I click on the "Products Received" button of Incoming Shipments +- + !record {model: stock.partial.picking, id: stock_partial_picking_0}: + date: '2010-07-15 17:52:09' +- + I click on the "Validate" button +- + !python {model: stock.picking}: | + sale_order_obj = self.pool.get('sale.order') + pur_obj = self.pool.get('purchase.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) + po = pur_obj.browse(cr, uid, pur_id)[0] + pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )]) + import netsvc + wf_service = netsvc.LocalService("workflow") + for pick in pick_ser_id: + wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr) +- + I verify that picking state is done +- + !python {model: purchase.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + pur_id = self.search(cr, uid, [('origin','=',so.name)]) + po = self.browse(cr, uid, pur_id)[0] + picking_obj = self.pool.get('stock.picking') + ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ) and ('state', '=', 'done')]) + assert ids, _('Picking is not in the done state!') +- + I verify that a "Picked" has been set to true +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so8")) + assert (so.shipped == True), "Picking is not done." +- + I verify that an invoice has been generated for SO +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so8")) + assert so.invoice_ids, "Invoices has not been generated for sale_order_so8" +- + I open the Invoice for the SO. +- + !python {model: account.invoice}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + import netsvc + wf_service = netsvc.LocalService("workflow") + invoice_ids = so.invoice_ids + for invoice in invoice_ids: + wf_service.trg_validate(uid, 'account.invoice',invoice.id,'invoice_open', cr) +- + Creating a account invoice pay entry. +- + !record {model: account.invoice.pay, id: account_invoice_pay_tst0}: + amount: 100000.0 + date: '2010-07-15' + journal_id: sale.account_journal_bankjournal1 + name: test + period_id: account.period_5 +- + I pay the invoice. +- + !python {model: account.invoice.pay}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + self.wo_check(cr, uid, [ref("account_invoice_pay_tst0")], {"lang": "en_US", "tz": + False, "active_model": 'account.invoice', "active_ids": [so.invoice_ids[0].id], "type": + "out_invoice", "active_id": so.invoice_ids[0].id}) +- + Creating an account invoice pay writeoff entry. +- + !record {model: account.invoice.pay.writeoff, id: account_invoice_pay_writeoff_0}: + analytic_id: account.analytic_customers + comment: Write-Off + writeoff_acc_id: account.a_sale + writeoff_journal_id: sale.account_journal_bankjournal1 +- + Pay and Reconcile the Invoice. +- + !python {model: account.invoice.pay.writeoff}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + self.pay_and_reconcile_writeoff(cr, uid, [ref("account_invoice_pay_writeoff_0")], + {"lang": 'en_US', "tz": False, "active_model": 'account.invoice', "active_ids": + [so.invoice_ids[0].id], "type": "out_invoice", "active_id": so.invoice_ids[0].id, }) +- + I verify the invoice are in paid state or not. +- + !python {model: account.invoice}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) + invoice_ids = so.invoice_ids + for invoice in invoice_ids: + assert (invoice.state) =='paid', "Invoice for SO is not in done state." +- + I verify that Paid has been set to true. +- + !python {model: sale.order}: | + sale_id=self.browse(cr, uid, ref("sale_order_so8")) + assert(sale_id.invoiced == True), "Paid has not been set to true" +- + I verify that sale order is in done state +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so8")) + assert (so.state == 'done'), "Sale order is not in the done state." \ No newline at end of file diff --git a/addons/sale/test/prepaid_sale_order.yml b/addons/sale/test/prepaid_sale_order.yml index ce344bb23ae..e1595aa6142 100644 --- a/addons/sale/test/prepaid_sale_order.yml +++ b/addons/sale/test/prepaid_sale_order.yml @@ -239,13 +239,30 @@ property_account_expense: sale.account_account_payable1 property_account_income: sale.account_account_receivable0 seller_delay: '1' + seller_ids: + - delay: 1 + name: base.res_partner_agrolait + qty: 5.0 standard_price: 160.0 supply_method: produce 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 prepaid. + I create a Bill of Material record for LG Viewty Smart +- + !record {model: mrp.bom, id: mrp_bom_lgviewtysmart0}: + company_id: base.main_company + name: LG Viewty Smart + product_efficiency: 1.0 + product_id: sale.product_product_lgviewtysmart0 + product_qty: 1.0 + product_uom: product.product_uom_unit + product_uos_qty: 0.0 + sequence: 0.0 + type: normal +- + I create a Sale Order for LG Viewty Smart for qty 500 having Shipping Policy is 'Payment Before Delivery' - !record {model: sale.order, id: sale_order_so1}: date_order: '2010-05-03' @@ -270,14 +287,12 @@ 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_so1} - - I will verify whether the invoice has been generated for SO since Shipping policy is 'Payment Before Delivery' + I verify whether the invoice has been generated for SO since Shipping policy is 'Payment Before Delivery' - !python {model: sale.order}: | so = self.browse(cr, uid, ref("sale_order_so1")) @@ -311,8 +326,6 @@ self.wo_check(cr, uid, [ref("account_invoice_pay_tst1")], {"lang": "en_US", "tz": False, "active_model": 'account.invoice', "active_ids": [so.invoice_ids[0].id], "type": "out_invoice", "active_id": so.invoice_ids[0].id, }) - - - Creating an account invoice pay writeoff entry. - @@ -321,8 +334,6 @@ comment: Write-Off writeoff_acc_id: account.a_sale writeoff_journal_id: sale.account_journal_bankjournal0 - - - Pay and Reconcile the Invoice. - @@ -332,10 +343,14 @@ self.pay_and_reconcile_writeoff(cr, uid, [ref("account_invoice_pay_writeoff_0")], {"lang": 'en_US', "tz": False, "active_model": 'account.invoice', "active_ids": [so.invoice_ids[0].id], "type": "out_invoice", "active_id": so.invoice_ids[0].id }) - - - - I will verify the picking associated with the sale order sale_order_so1 + I check that Paid has been set to true. +- + !python {model: sale.order}: | + sale_id=self.browse(cr, uid, ref("sale_order_so1")) + assert(sale_id.invoiced == True), "Paid has not been set to true" +- + I verify the picking associated with the sale order sale_order_so1 - !python {model: sale.order}: | so = self.browse(cr, uid, ref("sale_order_so1")) @@ -374,3 +389,90 @@ if picking_id: pick = self.browse(cr,uid,picking_id[0]) assert (pick.state) =='done', "Picking for SO is not in done state." +- + I verify that a procurement has been generated for so +- + !python {model: procurement.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so1")) + proc_ids = self.search(cr, uid, [('origin','=',so.name)]) + assert proc_ids, _('No Procurements!') +- + Then I click on the "Run Procurement" button +- + !python {model: procurement.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so1")) + import netsvc + wf_service = netsvc.LocalService("workflow") + proc_ids = self.search(cr, uid, [('origin','=',so.name)]) + for proc in proc_ids: + wf_service.trg_validate(uid, 'procurement.order',proc,'button_check', cr) +- + I verify that a procurement state is "running" +- + !python {model: procurement.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so1")) + proc_ids = self.search(cr, uid, [('origin','=',so.name) and ('state','=','running')]) + assert proc_ids, _('Procurement is not in the running state!') +- + I verify that a manufacturing order has been generated +- + !python {model: mrp.production}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so1")) + mnf_ids = self.search(cr, uid, [('origin','=',so.name)]) + assert mnf_ids, _('Manufacturing order has not been generated') +- + Manufacturing order has been generated +- + !python {model: mrp.production}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so1")) + import netsvc + wf_service = netsvc.LocalService("workflow") + mnf_ids = self.search(cr, uid, [('origin','=',so.name)]) + for mnf in mnf_ids: + wf_service.trg_validate(uid, 'mrp.production',mnf,'button_produce', cr) +- + Creating a mrp.product.produce record +- + !record {model: mrp.product.produce, id: mrp_product_produce_0}: + mode: consume_produce + product_qty: 500.0 +- + Then I click on the "Confirm" button +- + !python {model: mrp.production}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so1")) + import netsvc + wf_service = netsvc.LocalService("workflow") + mnf_ids = self.search(cr, uid, [('origin','=',so.name)]) + for mnf in mnf_ids: + wf_service.trg_validate(uid, 'mrp.production',mnf,'button_produce_done', cr) +- + I verify that the manufacturing state is "done". +- + !python {model: mrp.production}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so1")) + mnf_ids = self.search(cr, uid, [('origin','=',so.name) and ('state','=','done')]) + assert mnf_ids, _('manufacturing is not done!') +- + I verify that a "Picked" has been set to true +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so1")) + assert (so.shipped == True), "Picking is not done." +- + I verify that a sale order is in done state +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so1")) + assert (so.state == 'done'), "Sale order is not in the done state." diff --git a/addons/sale/test/shipping_manual_sale_order.yml b/addons/sale/test/shipping_manual_sale_order.yml index 1f5bc5fe10a..7389b2d891e 100644 --- a/addons/sale/test/shipping_manual_sale_order.yml +++ b/addons/sale/test/shipping_manual_sale_order.yml @@ -240,13 +240,17 @@ property_account_expense: sale.account_account_payable1 property_account_income: sale.account_account_receivable0 seller_delay: '1' + seller_ids: + - delay: 1 + name: base.res_partner_agrolait + qty: 5.0 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. + I create a Sale Order for New Chocolate Slider Mobile for qty 500 having Shipping Policy is 'Shipping & Manual Invoice' - !record {model: sale.order, id: sale_order_so0}: date_order: '2010-05-12' @@ -313,8 +317,6 @@ self.wo_check(cr, uid, [ref("account_invoice_pay_tst0")], {"lang": "en_US", "tz": False, "active_model": 'account.invoice', "active_ids": [so.invoice_ids[0].id], "type": "out_invoice", "active_id": so.invoice_ids[0].id}) - - - Creating an account invoice pay writeoff entry. - @@ -323,8 +325,6 @@ comment: Write-Off writeoff_acc_id: account.a_sale writeoff_journal_id: sale.account_journal_bankjournal0 - - - Pay and Reconcile the Invoice. - @@ -343,8 +343,14 @@ invoice_ids = so.invoice_ids for invoice in invoice_ids: assert (invoice.state) =='paid', "Invoice for SO is not in done state." -- - I verify the picking associated with the sale order sale_order_so0. +- + I verify that Paid has been set to true. +- + !python {model: sale.order}: | + sale_id=self.browse(cr, uid, ref("sale_order_so0")) + assert(sale_id.invoiced == True), "Paid has not been set to true" +- + I verify that the picking has been generated for the sale order - !python {model: sale.order}: | so = self.browse(cr, uid, ref("sale_order_so0")) @@ -382,3 +388,116 @@ if picking_id: pick = self.browse(cr,uid,picking_id[0]) assert (pick.state) =='done', "Picking for SO is not in done state." +- + I verify that a procurement has been generated for so +- + !python {model: procurement.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) + proc_ids = self.search(cr, uid, [('origin','=',so.name)]) + assert proc_ids, _('No Procurements!') +- + Then I click on the "Run Procurement" button +- + !python {model: procurement.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) + import netsvc + wf_service = netsvc.LocalService("workflow") + proc_ids = self.search(cr, uid, [('origin','=',so.name)]) + for proc in proc_ids: + wf_service.trg_validate(uid, 'procurement.order',proc,'button_check', cr) +- + I verify that a procurement state is "running" +- + !python {model: procurement.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) + proc_ids = self.search(cr, uid, [('origin','=',so.name) and ('state','=','running')]) + assert proc_ids, _('Procurement is not in the running state!') +- + I verify that a purchase order has been generated +- + !python {model: purchase.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) + proc_ids = self.search(cr, uid, [('origin','=',so.name)]) + assert proc_ids, _('Purchase order has not been generated') +- + I click on the "Confirm" button to confirm the purchase order +- + !python {model: purchase.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) + import netsvc + wf_service = netsvc.LocalService("workflow") + pur_ids = self.search(cr, uid, [('origin','=',so.name)]) + for pur in pur_ids: + wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_confirm', cr) +- + I click on the "Approved by supplier" button to approve the purchase order +- + !python {model: purchase.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) + import netsvc + wf_service = netsvc.LocalService("workflow") + pur_ids = self.search(cr, uid, [('origin','=',so.name)]) + for pur in pur_ids: + wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr) +- + I verify that a picking related to purchase order has been generated. +- + !python {model: purchase.order}: | + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) + ids = self.search(cr, uid, [('origin','=',so.name)]) + po = self.browse(cr, uid, ids)[0] + assert(po.picking_ids) +- + Then I click on the "Products Received" button of Incoming Shipments +- + !record {model: stock.partial.picking, id: stock_partial_picking_0}: + date: '2010-07-13 17:52:09' +- + I click on the "Validate" button +- + !python {model: stock.picking}: | + sale_order_obj = self.pool.get('sale.order') + pur_obj = self.pool.get('purchase.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) + pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) + po = pur_obj.browse(cr, uid, pur_id)[0] + pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )]) + import netsvc + wf_service = netsvc.LocalService("workflow") + for pick in pick_ser_id: + wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr) +- + I verify that picking state is done +- + !python {model: purchase.order}: | + from tools.translate import _ + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) + pur_id = self.search(cr, uid, [('origin','=',so.name)]) + po = self.browse(cr, uid, pur_id)[0] + picking_obj = self.pool.get('stock.picking') + ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ) and ('state', '=', 'done')]) + assert ids, _('Picking is not in the done state!') +- + I verify that a "Picked" has been set to true +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so0")) + assert (so.shipped == True), "Picking is not done." +- + I verify that a sale order is in done state +- + !python {model: sale.order}: | + so = self.browse(cr, uid, ref("sale_order_so0")) + assert (so.state == 'done'), "Sale order is not in the done state." +