874
875
# all draft packing are validated (done state) - the state of shipment is automatically updated -> function
878
def shipment_create_invoice(self, cr, uid, ids, context=None):
880
Create invoices for validated shipment
882
invoice_obj = self.pool.get('account.invoice')
883
line_obj = self.pool.get('account.invoice.line')
884
partner_obj = self.pool.get('res.partner')
885
distrib_obj = self.pool.get('analytic.distribution')
886
sale_line_obj = self.pool.get('sale.order.line')
887
sale_obj = self.pool.get('sale.order')
888
company = self.pool.get('res.users').browse(cr, uid, uid, context).company_id
893
if isinstance(ids, (int, long)):
896
for shipment in self.browse(cr, uid, ids, context=context):
898
for pack in shipment.pack_family_memory_ids:
899
for move in pack.move_lines:
900
if move.state != 'cancel' and (not move.sale_line_id or move.sale_line_id.order_id.order_policy == 'picking'):
906
payment_term_id = False
907
partner = shipment.partner_id2
909
raise osv.except_osv(_('Error, no partner !'),
910
_('Please put a partner on the shipment if you want to generate invoice.'))
912
inv_type = 'out_invoice'
914
if inv_type in ('out_invoice', 'out_refund'):
915
account_id = partner.property_account_receivable.id
916
payment_term_id = partner.property_payment_term and partner.property_payment_term.id or False
918
account_id = partner.property_account_payable.id
920
addresses = partner_obj.address_get(cr, uid, [partner.id], ['contact', 'invoice'])
923
'name': shipment.name,
924
'origin': shipment.name or '',
926
'account_id': account_id,
927
'partner_id': partner.id,
928
'address_invoice_id': addresses['invoice'],
929
'address_contact_id': addresses['contact'],
930
'payment_term': payment_term_id,
931
'fiscal_position': partner.property_account_position.id,
932
'date_invoice': context.get('date_inv',False),
935
cur_id = shipment.pack_family_memory_ids[0].currency_id.id
937
invoice_vals['currency_id'] = cur_id
939
journal_type = 'sale'
940
# Disturb journal for invoice only on intermission partner type
941
if shipment.partner_id2.partner_type == 'intermission':
942
if not company.intermission_default_counterpart or not company.intermission_default_counterpart.id:
943
raise osv.except_osv(_('Error'), _('Please configure a default intermission account in Company configuration.'))
944
invoice_vals['is_intermission'] = True
945
invoice_vals['account_id'] = company.intermission_default_counterpart.id
946
journal_type = 'intermission'
947
journal_ids = self.pool.get('account.journal').search(cr, uid, [('type', '=', journal_type)])
949
raise osv.except_osv(_('Warning'), _('No %s journal found!' % (journal_type,)))
950
invoice_vals['journal_id'] = journal_ids[0]
952
invoice_id = invoice_obj.create(cr, uid, invoice_vals,
955
# Change currency for the intermission invoice
956
if shipment.partner_id2.partner_type == 'intermission':
957
company_currency = company.currency_id and company.currency_id.id or False
958
if not company_currency:
959
raise osv.except_osv(_('Warning'), _('No company currency found!'))
960
wiz_account_change = self.pool.get('account.change.currency').create(cr, uid, {'currency_id': company_currency})
961
self.pool.get('account.change.currency').change_currency(cr, uid, [wiz_account_change], context={'active_id': invoice_id})
963
# Link the invoice to the shipment
964
self.write(cr, uid, [shipment.id], {'invoice_id': invoice_id}, context=context)
966
# For each stock moves, create an invoice line
967
for pack in shipment.pack_family_memory_ids:
968
for move in pack.move_lines:
969
if move.state == 'cancel':
972
if move.sale_line_id and move.sale_line_id.order_id.order_policy != 'picking':
975
origin = move.picking_id.name or ''
976
if move.picking_id.origin:
977
origin += ':' + move.picking_id.origin
979
if inv_type in ('out_invoice', 'out_refund'):
980
account_id = move.product_id.product_tmpl_id.\
981
property_account_income.id
983
account_id = move.product_id.categ_id.\
984
property_account_income_categ.id
986
account_id = move.product_id.product_tmpl_id.\
987
property_account_expense.id
989
account_id = move.product_id.categ_id.\
990
property_account_expense_categ.id
992
# Compute unit price from FO line if the move is linked to
993
price_unit = move.product_id.list_price
994
if move.sale_line_id and move.sale_line_id.product_id.id == move.product_id.id:
995
uom_id = move.product_id.uom_id.id
996
uos_id = move.product_id.uos_id and move.product_id.uos_id.id or False
997
price = move.sale_line_id.price_unit
998
coeff = move.product_id.uos_coeff
999
if uom_id != uos_id and coeff != 0:
1000
price_unit = price / coeff
1002
price_unit = move.sale_line_id.price_unit
1004
# Get discount from FO line
1006
if move.sale_line_id and move.sale_line_id.product_id.id == move.product_id.id:
1007
discount = move.sale_line_id.discount
1009
# Get taxes from FO line
1010
taxes = move.product_id.taxes_id
1011
if move.sale_line_id and move.sale_line_id.product_id.id == move.product_id.id:
1012
taxes = [x.id for x in move.sale_line_id.tax_id]
1014
if shipment.partner_id2:
1015
tax_ids = self.pool.get('account.fiscal.position').map_tax(cr, uid, shipment.partner_id2.property_account_position, taxes)
1017
tax_ids = map(lambda x: x.id, taxes)
1020
if move.sale_line_id:
1021
sol_ana_dist_id = move.sale_line_id.analytic_distribution_id or move.sale_line_id.order_id.analytic_distribution_id
1023
distrib_id = distrib_obj.copy(cr, uid, sol_ana_dist_id.id, context=context)
1025
#set UoS if it's a sale and the picking doesn't have one
1026
uos_id = move.product_uos and move.product_uos.id or False
1027
if not uos_id and inv_type in ('out_invoice', 'out_refund'):
1028
uos_id = move.product_uom.id
1029
account_id = self.pool.get('account.fiscal.position').map_account(cr, uid, partner.property_account_position, account_id)
1031
line_id = line_obj.create(cr, uid, {'name': move.name,
1033
'invoice_id': invoice_id,
1035
'product_id': move.product_id.id,
1036
'account_id': account_id,
1037
'price_unit': price_unit,
1038
'discount': discount,
1039
'quantity': move.product_qty or move.product_uos_qty,
1040
'invoice_line_tax_id': [(6, 0, tax_ids)],
1041
'analytic_distribution_id': distrib_id,
1044
self.pool.get('stock.move').write(cr, uid, [shipment.id], {'invoice_id': invoice_id}, context=context)
1045
if move.sale_line_id:
1046
sale_obj.write(cr, uid, [move.sale_line_id.order_id.id], {'invoice_ids': [(4, invoice_id)],})
1047
sale_line_obj.write(cr, uid, [move.sale_line_id.id], {'invoiced': True,
1048
'invoice_lines': [(4, line_id)],})
877
1052
def validate(self, cr, uid, ids, context=None):