I found a bug in inter transfer payment entry
it works fine in customer and vendor payment because there will be only one journal entry created.When it comes to inter transfer payment it works fine till posting.After posting the entry, you try to cancel and repost the entry it will assign same move name(which is created at first time posting and stored in move_name field) to two journal entries it should not happen.
This is happening because it is not storing the destination journal move name in payment form.
It may be useful for you..
destination_move_name = fields.Char(string='Destination Journal Entry Name', readonly=True,
default=False, copy=False)
def _create_transfer_entry(self, amount): """ Create the journal entry corresponding to the 'incoming money' part of an internal transfer, return the reconciliable move line """ aml_obj = self.env['account.move.line'].with_context(check_move_validity=False) debit, credit, amount_currency, dummy = aml_obj.with_context(date=self.payment_date).compute_amount_fields(amount, self.currency_id, self.company_id.currency_id) amount_currency = self.destination_journal_id.currency_id and self.currency_id.with_context(date=self.payment_date).compute(amount, self.destination_journal_id.currency_id) or 0 dst_move = self.env['account.move'].create(self._get_move_vals(self.destination_journal_id)) dst_liquidity_aml_dict = self._get_shared_move_line_vals(debit, credit, amount_currency, dst_move.id) dst_liquidity_aml_dict.update({ 'name': _('Transfer from %s') % self.journal_id.name, 'account_id': self.destination_journal_id.default_credit_account_id.id, 'currency_id': self.destination_journal_id.currency_id.id, 'payment_id': self.id, 'journal_id': self.destination_journal_id.id}) aml_obj.create(dst_liquidity_aml_dict) transfer_debit_aml_dict = self._get_shared_move_line_vals(credit, debit, 0, dst_move.id) transfer_debit_aml_dict.update({ 'name': self.name, 'payment_id': self.id, 'account_id': self.company_id.transfer_account_id.id, 'journal_id': self.destination_journal_id.id}) if self.currency_id != self.company_id.currency_id: transfer_debit_aml_dict.update({ 'currency_id': self.currency_id.id, 'amount_currency': -self.amount, }) transfer_debit_aml = aml_obj.create(transfer_debit_aml_dict) dst_move.post() self.write({'destination_move_name': dst_move.name}) return transfer_debit_aml def _get_move_vals(self, journal=None): """ Return dict to create the payment move """ #journal = journal or self.journal_id if journal: if not journal.sequence_id: raise UserError(_('Configuration Error !'), _('The journal %s does not have a sequence, please specify one.') % journal.name) if not journal.sequence_id.active: raise UserError(_('Configuration Error !'), _('The sequence of journal %s is deactivated.') % journal.name) name = self.destination_move_name or journal.with_context(ir_sequence_date=self.payment_date).sequence_id.next_by_id() return { 'name': name, 'date': self.payment_date, 'ref': self.communication or '', 'company_id': self.company_id.id, 'journal_id': journal.id, } else: if not self.journal_id.sequence_id: raise UserError(_('Configuration Error !'), _('The journal %s does not have a sequence, please specify one.') % self.journal_id.name) if not self.journal_id.sequence_id.active: raise UserError(_('Configuration Error !'), _('The sequence of journal %s is deactivated.') % self.journal_id.name) name = self.move_name or self.journal_id.with_context(ir_sequence_date=self.payment_date).sequence_id.next_by_id() return { 'name': name, 'date': self.payment_date, 'ref': self.communication or '', 'company_id': self.company_id.id, 'journal_id': self.journal_id.id, }