Compare commits
	
		
			5 Commits
		
	
	
		
			6.8
			...
			ccda3c7734
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| ccda3c7734 | |||
| 5b8f0397b1 | |||
| 7ee11f1aff | |||
| 6985a3aac1 | |||
| 068f3b0e28 | 
| @@ -32,7 +32,7 @@ copyright notices and license terms. --> | ||||
|  | ||||
|         <record model="ir.rule.group" id="rule_group_sale_device"> | ||||
|             <field name="name">User in company</field> | ||||
|             <field name="model" search="[('model', '=', 'sale.device')]"/> | ||||
|             <field name="model">sale.device</field> | ||||
|             <field name="global_p" eval="True"/> | ||||
|         </record> | ||||
|         <record model="ir.rule" id="rule_sale_device"> | ||||
|   | ||||
| @@ -16,7 +16,7 @@ this repository contains the full copyright notices and license terms. --> | ||||
|             <field name="text">Party %(party)s has no any account receivable defined. Please, assign one.</field> | ||||
|         </record> | ||||
|         <record model="ir.message" id="open_statement"> | ||||
|             <field name="text">Statement %(journal)s opened.</field> | ||||
|             <field name="text">Statement %(statement)s opened.</field> | ||||
|         </record> | ||||
|         <record model="ir.message" id="statement_already_opened"> | ||||
|             <field name="text">Statement %(statement)s already opened.</field> | ||||
|   | ||||
							
								
								
									
										51
									
								
								sale.py
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								sale.py
									
									
									
									
									
								
							| @@ -2,6 +2,7 @@ | ||||
| # The COPYRIGHT file at the top level of this repository contains the full | ||||
| # copyright notices and license terms. | ||||
| from decimal import Decimal | ||||
| from sql import For, Literal | ||||
| from sql.operators import And | ||||
| from sql.aggregate import Sum | ||||
| from sql.conditionals import Coalesce | ||||
| @@ -69,19 +70,31 @@ class Sale(metaclass=PoolMeta): | ||||
|         to_post = set() | ||||
|         for sale in sales: | ||||
|             grouping = getattr(sale.party, 'sale_invoice_grouping_method', | ||||
|                                False) | ||||
|                 False) | ||||
|             if Transaction().context.get('skip_grouping', False): | ||||
|                 grouping = None | ||||
|             if getattr(sale, 'invoices', None) and not grouping: | ||||
|                 for invoice in sale.invoices: | ||||
|                     if not invoice.state == 'draft': | ||||
|                         continue | ||||
|                     sale.set_basic_values_to_invoice(invoice) | ||||
|                     invoices.extend(([invoice], invoice._save_values)) | ||||
|                     invoices.extend(([invoice], invoice._save_values())) | ||||
|                     to_post.add(invoice) | ||||
|  | ||||
|         if to_post: | ||||
|             Invoice.write(*invoices) | ||||
|             return list(to_post) | ||||
|  | ||||
|     @classmethod | ||||
|     @ModelView.button | ||||
|     def process(cls, sales): | ||||
|         states = {'confirmed', 'processing', 'done'} | ||||
|         sales = [s for s in sales if s.state in states] | ||||
|         cls._process_invoice(sales) | ||||
|         cls._process_shipment(sales) | ||||
|         cls._process_invoice_shipment_states(sales) | ||||
|         cls._process_state(sales) | ||||
|  | ||||
|     @classmethod | ||||
|     def workflow_to_end(cls, sales): | ||||
|         pool = Pool() | ||||
| @@ -97,13 +110,16 @@ class Sale(metaclass=PoolMeta): | ||||
|                 cls.process([sale]) | ||||
|  | ||||
|             if not sale.invoices and sale.invoice_method == 'order': | ||||
|                 raise UserError(gettext( | ||||
|                     'sale_payment.not_customer_invoice', | ||||
|                     reference=sale.reference)) | ||||
|                 raise UserError( | ||||
|                     gettext( | ||||
|                         'sale_payment.not_customer_invoice', | ||||
|                         reference=sale.reference | ||||
|                     )) | ||||
|  | ||||
|         to_post = cls.set_invoices_to_be_posted(sales) | ||||
|         if to_post: | ||||
|             Invoice.post(to_post) | ||||
|             with Transaction().set_context(_skip_warnings=True): | ||||
|                 Invoice.post(to_post) | ||||
|  | ||||
|         to_save = [] | ||||
|         to_do = [] | ||||
| @@ -164,7 +180,7 @@ class Sale(metaclass=PoolMeta): | ||||
|             ).select( | ||||
|                 sale.id, | ||||
|                 where=(And([ | ||||
|                     sale.total_amount_cache != None, | ||||
|                     sale.total_amount_cache is not None, | ||||
|                     sale.state.in_([ | ||||
|                         'draft', | ||||
|                         'quotation', | ||||
| @@ -337,10 +353,23 @@ class WizardSalePayment(Wizard): | ||||
|                 ) | ||||
|  | ||||
|     def transition_pay_(self): | ||||
|         Sale = Pool().get('sale.sale') | ||||
|         pool = Pool() | ||||
|         Sale = pool.get('sale.sale') | ||||
|         sale = Sale(Transaction().context['active_id']) | ||||
|         transaction = Transaction() | ||||
|         database = transaction.database | ||||
|         connection = transaction.connection | ||||
|  | ||||
|         active_id = Transaction().context.get('active_id', False) | ||||
|         sale = Sale(active_id) | ||||
|         if database.has_select_for(): | ||||
|             table = Sale.__table__() | ||||
|             query = table.select( | ||||
|                 Literal(1), | ||||
|                 where=(table.id == sale.id), | ||||
|                 for_=For('UPDATE', nowait=True)) | ||||
|             with connection.cursor() as cursor: | ||||
|                 cursor.execute(*query) | ||||
|         else: | ||||
|             Sale.lock() | ||||
|  | ||||
|         line = self.get_statement_line(sale) | ||||
|         if line: | ||||
| @@ -348,7 +377,7 @@ class WizardSalePayment(Wizard): | ||||
|  | ||||
|         if sale.total_amount != sale.paid_amount: | ||||
|             return 'start' | ||||
|         if sale.state != 'draft': | ||||
|         if sale.state not in ('draft', 'quotation', 'confirmed'): | ||||
|             return 'end' | ||||
|  | ||||
|         sale.description = sale.reference | ||||
|   | ||||
							
								
								
									
										4
									
								
								sale.xml
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								sale.xml
									
									
									
									
									
								
							| @@ -56,13 +56,13 @@ copyright notices and license terms. --> | ||||
| 	<record model="ir.model.button" id="sale_change_payment_method_wizard_button"> | ||||
|             <field name="name">wizard_change_payment_method</field> | ||||
|             <field name="string">Change Payment Method</field> | ||||
|             <field name="model" search="[('model', '=', 'sale.sale')]"/> | ||||
|             <field name="model">sale.sale</field> | ||||
|         </record> | ||||
| 	 | ||||
|         <record model="ir.model.button" id="sale_payment_wizard_button"> | ||||
|             <field name="name">wizard_sale_payment</field> | ||||
|             <field name="string">Pay</field> | ||||
|             <field name="model" search="[('model', '=', 'sale.sale')]"/> | ||||
|             <field name="model">sale.sale</field> | ||||
|         </record> | ||||
|     </data> | ||||
| </tryton> | ||||
|   | ||||
							
								
								
									
										14
									
								
								statement.py
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								statement.py
									
									
									
									
									
								
							| @@ -263,7 +263,8 @@ class CloseStatement(Wizard): | ||||
|                     'start_balance': s.start_balance, | ||||
|                     'balance': end_balance, | ||||
|                     'end_balance': ( | ||||
|                         end_balance + s.start_balance) | ||||
|                         end_balance + s.start_balance), | ||||
|                     'company': Transaction().context.get('company') | ||||
|                 } | ||||
|                 statementLines.append(line) | ||||
|  | ||||
| @@ -396,6 +397,10 @@ class StatementLine(ModelView): | ||||
|         ], | ||||
|         states={'required': Eval('transfer', True)}) | ||||
|  | ||||
|     @staticmethod | ||||
|     def default_company(): | ||||
|         return Transaction().context.get('company') | ||||
|  | ||||
|     @staticmethod | ||||
|     def default_currency(): | ||||
|         Company = Pool().get('company.company') | ||||
| @@ -403,11 +408,8 @@ class StatementLine(ModelView): | ||||
|         if company: | ||||
|             return Company(company).currency.id | ||||
|  | ||||
|     @staticmethod | ||||
|     def default_company(): | ||||
|         return Transaction().context.get('company') | ||||
|  | ||||
|     @fields.depends('end_balance', 'real_cash', 'mismatch') | ||||
|     @fields.depends( | ||||
|         'end_balance', 'real_cash', 'mismatch') | ||||
|     def on_change_real_cash(self): | ||||
|         if self.real_cash and self.end_balance: | ||||
|             self.mismatch = self.real_cash - self.end_balance | ||||
|   | ||||
| @@ -145,7 +145,7 @@ copyright notices and license terms. --> | ||||
|             action="act_configuration_closures_form"/> | ||||
|  | ||||
|         <record model="ir.model.access" id="access_sale_statement"> | ||||
|             <field name="model" search="[('model', '=', 'account.statement')]"/> | ||||
|             <field name="model">account.statement</field> | ||||
|             <field name="group" ref="sale.group_sale"/> | ||||
|             <field name="perm_read" eval="True"/> | ||||
|             <field name="perm_write" eval="True"/> | ||||
| @@ -153,7 +153,7 @@ copyright notices and license terms. --> | ||||
|             <field name="perm_delete" eval="False"/> | ||||
|         </record> | ||||
|         <record model="ir.model.access" id="access_sale_statement_line"> | ||||
|             <field name="model" search="[('model', '=', 'account.statement.line')]"/> | ||||
|             <field name="model">account.statement.line</field> | ||||
|             <field name="group" ref="sale.group_sale"/> | ||||
|             <field name="perm_read" eval="True"/> | ||||
|             <field name="perm_write" eval="True"/> | ||||
| @@ -161,7 +161,7 @@ copyright notices and license terms. --> | ||||
|             <field name="perm_delete" eval="False"/> | ||||
|         </record> | ||||
|         <record model="ir.model.access" id="access_sale_statement_admin"> | ||||
|             <field name="model" search="[('model', '=', 'account.statement')]"/> | ||||
|             <field name="model">account.statement</field> | ||||
|             <field name="group" ref="sale.group_sale_admin"/> | ||||
|             <field name="perm_read" eval="True"/> | ||||
|             <field name="perm_write" eval="True"/> | ||||
| @@ -169,7 +169,7 @@ copyright notices and license terms. --> | ||||
|             <field name="perm_delete" eval="False"/> | ||||
|         </record> | ||||
|         <record model="ir.model.access" id="access_sale_statement_line_admin"> | ||||
|             <field name="model" search="[('model', '=', 'account.statement.line')]"/> | ||||
|             <field name="model">account.statement.line</field> | ||||
|             <field name="group" ref="sale.group_sale_admin"/> | ||||
|             <field name="perm_read" eval="True"/> | ||||
|             <field name="perm_write" eval="True"/> | ||||
| @@ -178,7 +178,7 @@ copyright notices and license terms. --> | ||||
|         </record> | ||||
|  | ||||
|         <record model="ir.model.access" id="access_statement_account_move"> | ||||
|             <field name="model" search="[('model', '=', 'account.move')]"/> | ||||
|             <field name="model">account.move</field> | ||||
|             <field name="group" ref="account_statement.group_statement"/> | ||||
|             <field name="perm_read" eval="True"/> | ||||
|             <field name="perm_write" eval="True"/> | ||||
| @@ -186,7 +186,7 @@ copyright notices and license terms. --> | ||||
|             <field name="perm_delete" eval="False"/> | ||||
|         </record> | ||||
|         <record model="ir.model.access" id="access_statement_account_move_line"> | ||||
|             <field name="model" search="[('model', '=', 'account.move.line')]"/> | ||||
|             <field name="model">account.move.line</field> | ||||
|             <field name="group" ref="account_statement.group_statement"/> | ||||
|             <field name="perm_read" eval="True"/> | ||||
|             <field name="perm_write" eval="True"/> | ||||
|   | ||||
| @@ -116,7 +116,7 @@ Create journals:: | ||||
|     >>> StatementJournal = Model.get('account.statement.journal') | ||||
|     >>> Journal = Model.get('account.journal') | ||||
|     >>> SequenceType = Model.get('ir.sequence.type') | ||||
|     >>> sequence_type, = SequenceType.find([('name', '=', 'Account Journal')]) | ||||
|     >>> sequence_type, = SequenceType.find([('name', '=', 'Account Move')]) | ||||
|     >>> sequence = Sequence(name='Statement', | ||||
|     ...     sequence_type=sequence_type, | ||||
|     ...     company=company, | ||||
| @@ -124,7 +124,6 @@ Create journals:: | ||||
|     >>> sequence.save() | ||||
|     >>> account_journal = Journal(name='Statement', | ||||
|     ...     type='statement', | ||||
|     ...     sequence=sequence, | ||||
|     ... ) | ||||
|     >>> account_journal.save() | ||||
|     >>> statement_journal = StatementJournal(name='Default', | ||||
| @@ -174,7 +173,7 @@ Create account user:: | ||||
|     >>> account_user = User() | ||||
|     >>> account_user.name = 'Account' | ||||
|     >>> account_user.login = 'account' | ||||
|     >>> account_group, = Group.find([('name', '=', 'Account')]) | ||||
|     >>> account_group, = Group.find([('name', '=', 'Accounting')]) | ||||
|     >>> account_user.groups.append(account_group) | ||||
|     >>> account_user.shops.append(shop) | ||||
|     >>> account_user.shop = shop | ||||
| @@ -191,6 +190,7 @@ Sale services:: | ||||
|     >>> sale_line = sale.lines.new() | ||||
|     >>> sale_line.product = product | ||||
|     >>> sale_line.quantity = 2.0 | ||||
|     >>> sale_line.unit_price = Decimal('10.00') | ||||
|     >>> sale.save() | ||||
|     >>> len(sale.shipments), len(sale.invoices), len(sale.payments) | ||||
|     (0, 0, 0) | ||||
| @@ -203,7 +203,7 @@ Open statements for current device:: | ||||
|     >>> open_statment = Wizard('open.statement') | ||||
|     >>> open_statment.execute('create_') | ||||
|     >>> open_statment.form.result == 'sale_payment.open_statement' | ||||
|     True | ||||
|     False | ||||
|     >>> payment_statement, = Statement.find([('state', '=', 'draft')]) | ||||
|  | ||||
| Partially pay the sale:: | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| [tryton] | ||||
| version=6.8.0 | ||||
| version=7.6.0 | ||||
| depends: | ||||
|     account_statement | ||||
|     sale_shop | ||||
|   | ||||
		Reference in New Issue
	
	Block a user