diff --git a/README.md b/README.md index 99198398..be22fc7c 100644 --- a/README.md +++ b/README.md @@ -50,4 +50,7 @@ Deployment scripts using fabric are located in the `Deployment` folder. 10. Create the database tables managed by south with `python manage.py migrate` 11. Run the development server with `python manage.py runserver` 12. Go to `http://localhost:8000/` and log in with Tequila -13. Give your user superuser rights with `echo "update users_truffeuser set is_superuser=1 where id=1;" | sqlite3 db.sqlite3` \ No newline at end of file +13. Give your user superuser rights with `echo "update users_truffeuser set is_superuser=1 where id=1;" | sqlite3 db.sqlite3` + +## Software dependencies + * librsvg2-bin \ No newline at end of file diff --git a/truffe2/accounting_tools/migrations/0042_auto__add_field_invoice_client_name__chg_field_invoice_title__chg_fiel.py b/truffe2/accounting_tools/migrations/0042_auto__add_field_invoice_client_name__chg_field_invoice_title__chg_fiel.py new file mode 100644 index 00000000..2e619511 --- /dev/null +++ b/truffe2/accounting_tools/migrations/0042_auto__add_field_invoice_client_name__chg_field_invoice_title__chg_fiel.py @@ -0,0 +1,556 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Invoice.client_name' + db.add_column(u'accounting_tools_invoice', 'client_name', + self.gf('django.db.models.fields.CharField')(default='cf adresse', max_length=70), + keep_default=False) + + # Truncating fields too long for qr facture. + + db.execute("UPDATE accounting_tools_invoice inv2 " + "INNER JOIN accounting_tools_invoice inv ON inv2.id=inv.id " + "SET inv2.title = (SUBSTRING(inv.title, 1, 140)) " + "WHERE LENGTH(inv.title) > 140;") + + db.execute("UPDATE accounting_tools_invoice inv2 " + "INNER JOIN accounting_tools_invoice inv ON inv2.id=inv.id " + "SET inv2.address = (SUBSTRING(inv.address, 1, 140)) " + "WHERE LENGTH(inv.address) > 140;") + + # Changing field 'Invoice.title' + db.alter_column(u'accounting_tools_invoice', 'title', self.gf('django.db.models.fields.CharField')(max_length=140)) + + # Changing field 'Invoice.address' + db.alter_column(u'accounting_tools_invoice', 'address', self.gf('django.db.models.fields.CharField')(max_length=140, null=True)) + + def backwards(self, orm): + # Deleting field 'Invoice.client_name' + db.delete_column(u'accounting_tools_invoice', 'client_name') + + + # Changing field 'Invoice.title' + db.alter_column(u'accounting_tools_invoice', 'title', self.gf('django.db.models.fields.CharField')(max_length=255)) + + # Changing field 'Invoice.address' + db.alter_column(u'accounting_tools_invoice', 'address', self.gf('django.db.models.fields.TextField')(null=True)) + + models = { + u'accounting_core.account': { + 'Meta': {'unique_together': "(('name', 'accounting_year'), ('account_number', 'accounting_year'))", 'object_name': 'Account'}, + 'account_number': ('django.db.models.fields.CharField', [], {'max_length': '10'}), + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountCategory']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'visibility': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'accounting_core.accountcategory': { + 'Meta': {'unique_together': "(('name', 'accounting_year'),)", 'object_name': 'AccountCategory'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'parent_hierarchique': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'accounting_core.accountingyear': { + 'Meta': {'object_name': 'AccountingYear'}, + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_accounting_import': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'start_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_preparing'", 'max_length': '255'}), + 'subvention_deadline': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + u'accounting_core.costcenter': { + 'Meta': {'unique_together': "(('name', 'accounting_year'), ('account_number', 'accounting_year'))", 'object_name': 'CostCenter'}, + 'account_number': ('django.db.models.fields.CharField', [], {'max_length': '10'}), + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'unit': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['units.Unit']"}) + }, + u'accounting_main.budget': { + 'Meta': {'object_name': 'Budget'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'costcenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.CostCenter']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'unit': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['units.Unit']"}) + }, + u'accounting_tools.cashbook': { + 'Meta': {'object_name': 'CashBook'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}), + 'costcenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.CostCenter']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'nb_proofs': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.cashbookfile': { + 'Meta': {'object_name': 'CashBookFile'}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'to': u"orm['accounting_tools.CashBook']"}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'uploader': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.cashbookline': { + 'Meta': {'object_name': 'CashBookLine'}, + 'account': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.Account']"}), + 'cashbook': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'lines'", 'to': u"orm['accounting_tools.CashBook']"}), + 'date': ('django.db.models.fields.DateField', [], {}), + 'helper': ('django.db.models.fields.CharField', [], {'max_length': '15'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'proof': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'tva': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value_ttc': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}) + }, + u'accounting_tools.cashbooklogging': { + 'Meta': {'object_name': 'CashBookLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.CashBook']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.cashbooktag': { + 'Meta': {'object_name': 'CashBookTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': u"orm['accounting_tools.CashBook']"}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'accounting_tools.cashbookviews': { + 'Meta': {'object_name': 'CashBookViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.CashBook']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.expenseclaim': { + 'Meta': {'object_name': 'ExpenseClaim'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'costcenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.CostCenter']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'nb_proofs': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.expenseclaimfile': { + 'Meta': {'object_name': 'ExpenseClaimFile'}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'to': u"orm['accounting_tools.ExpenseClaim']"}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'uploader': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.expenseclaimline': { + 'Meta': {'object_name': 'ExpenseClaimLine'}, + 'account': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.Account']"}), + 'expense_claim': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'lines'", 'to': u"orm['accounting_tools.ExpenseClaim']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'proof': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'tva': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value_ttc': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}) + }, + u'accounting_tools.expenseclaimlogging': { + 'Meta': {'object_name': 'ExpenseClaimLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.ExpenseClaim']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.expenseclaimtag': { + 'Meta': {'object_name': 'ExpenseClaimTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': u"orm['accounting_tools.ExpenseClaim']"}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'accounting_tools.expenseclaimviews': { + 'Meta': {'object_name': 'ExpenseClaimViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.ExpenseClaim']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.financialprovider': { + 'Meta': {'object_name': 'FinancialProvider'}, + 'address': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'bic': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'iban_ou_ccp': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'remarks': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'tva_number': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) + }, + u'accounting_tools.financialproviderlogging': { + 'Meta': {'object_name': 'FinancialProviderLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.FinancialProvider']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.financialproviderviews': { + 'Meta': {'object_name': 'FinancialProviderViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.FinancialProvider']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.internaltransfer': { + 'Meta': {'object_name': 'InternalTransfer'}, + 'account': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.Account']"}), + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'cost_center_from': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'internal_transfer_from'", 'to': u"orm['accounting_core.CostCenter']"}), + 'cost_center_to': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'internal_transfer_to'", 'to': u"orm['accounting_core.CostCenter']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'transfert_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}) + }, + u'accounting_tools.internaltransferlogging': { + 'Meta': {'object_name': 'InternalTransferLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.InternalTransfer']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.internaltransfertag': { + 'Meta': {'object_name': 'InternalTransferTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': u"orm['accounting_tools.InternalTransfer']"}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'accounting_tools.internaltransferviews': { + 'Meta': {'object_name': 'InternalTransferViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.InternalTransfer']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.invoice': { + 'Meta': {'object_name': 'Invoice'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'add_to': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'address': ('django.db.models.fields.CharField', [], {'max_length': '140', 'null': 'True', 'blank': 'True'}), + 'annex': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'client_name': ('django.db.models.fields.CharField', [], {'max_length': '70'}), + 'costcenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.CostCenter']"}), + 'custom_bvr_number': ('django.db.models.fields.CharField', [], {'max_length': '59', 'null': 'True', 'blank': 'True'}), + 'date_and_place': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}), + 'delay': ('django.db.models.fields.SmallIntegerField', [], {'default': '30'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'display_account': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'display_bvr': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'ending': ('django.db.models.fields.TextField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'english': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'greetings': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'preface': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'reception_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'sign': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_preparing'", 'max_length': '255'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '140'}) + }, + u'accounting_tools.invoiceline': { + 'Meta': {'object_name': 'InvoiceLine'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invoice': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'lines'", 'to': u"orm['accounting_tools.Invoice']"}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'quantity': ('django.db.models.fields.DecimalField', [], {'default': '1', 'max_digits': '20', 'decimal_places': '0'}), + 'tva': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value_ttc': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}) + }, + u'accounting_tools.invoicelogging': { + 'Meta': {'object_name': 'InvoiceLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.Invoice']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.invoicetag': { + 'Meta': {'object_name': 'InvoiceTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': u"orm['accounting_tools.Invoice']"}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'accounting_tools.invoiceviews': { + 'Meta': {'object_name': 'InvoiceViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.Invoice']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.linkedinfo': { + 'Meta': {'object_name': 'LinkedInfo'}, + 'address': ('django.db.models.fields.TextField', [], {}), + 'bank': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'iban_ccp': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'phone': ('django.db.models.fields.CharField', [], {'max_length': '20'}), + 'user_pk': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + u'accounting_tools.providerinvoice': { + 'Meta': {'object_name': 'ProviderInvoice'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'costcenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.CostCenter']"}), + 'currency': ('django.db.models.fields.CharField', [], {'default': "'CHF'", 'max_length': '3'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'provider': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_tools.FinancialProvider']"}), + 'raw_pay_code': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'reference_number': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.providerinvoicefile': { + 'Meta': {'object_name': 'ProviderInvoiceFile'}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'to': u"orm['accounting_tools.ProviderInvoice']"}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'uploader': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.providerinvoiceline': { + 'Meta': {'object_name': 'ProviderInvoiceLine'}, + 'account': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.Account']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'providerInvoice': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'lines'", 'to': u"orm['accounting_tools.ProviderInvoice']"}), + 'tva': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value_ttc': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}) + }, + u'accounting_tools.providerinvoicelogging': { + 'Meta': {'object_name': 'ProviderInvoiceLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.ProviderInvoice']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.providerinvoicetag': { + 'Meta': {'object_name': 'ProviderInvoiceTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': u"orm['accounting_tools.ProviderInvoice']"}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'accounting_tools.providerinvoiceviews': { + 'Meta': {'object_name': 'ProviderInvoiceViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.ProviderInvoice']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.subvention': { + 'Meta': {'object_name': 'Subvention'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'amount_asked': ('django.db.models.fields.IntegerField', [], {}), + 'amount_given': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'comment_root': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'kind': ('django.db.models.fields.CharField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}), + 'linked_budget': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_main.Budget']", 'null': 'True', 'blank': 'True'}), + 'mobility_asked': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'mobility_given': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'unit': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['units.Unit']", 'null': 'True', 'blank': 'True'}), + 'unit_blank_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'unit_blank_user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']", 'null': 'True', 'blank': 'True'}) + }, + u'accounting_tools.subventionfile': { + 'Meta': {'object_name': 'SubventionFile'}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'to': u"orm['accounting_tools.Subvention']"}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'uploader': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.subventionline': { + 'Meta': {'object_name': 'SubventionLine'}, + 'end_date': ('django.db.models.fields.DateField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'nb_spec': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'order': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'place': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'start_date': ('django.db.models.fields.DateField', [], {}), + 'subvention': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'events'", 'to': u"orm['accounting_tools.Subvention']"}) + }, + u'accounting_tools.subventionlogging': { + 'Meta': {'object_name': 'SubventionLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.Subvention']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.subventionviews': { + 'Meta': {'object_name': 'SubventionViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.Subvention']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.withdrawal': { + 'Meta': {'object_name': 'Withdrawal'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'costcenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.CostCenter']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'desired_date': ('django.db.models.fields.DateField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}), + 'withdrawn_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}) + }, + u'accounting_tools.withdrawalfile': { + 'Meta': {'object_name': 'WithdrawalFile'}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'to': u"orm['accounting_tools.Withdrawal']"}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'uploader': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.withdrawallogging': { + 'Meta': {'object_name': 'WithdrawalLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.Withdrawal']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.withdrawaltag': { + 'Meta': {'object_name': 'WithdrawalTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': u"orm['accounting_tools.Withdrawal']"}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'accounting_tools.withdrawalviews': { + 'Meta': {'object_name': 'WithdrawalViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.Withdrawal']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'units.unit': { + 'Meta': {'object_name': 'Unit'}, + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'id_epfl': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'is_commission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_equipe': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'parent_hierarchique': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['units.Unit']", 'null': 'True', 'blank': 'True'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + u'users.truffeuser': { + 'Meta': {'object_name': 'TruffeUser'}, + 'adresse': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'avatar': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'body': ('django.db.models.fields.CharField', [], {'default': "'.'", 'max_length': '1'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '255'}), + 'email_perso': ('django.db.models.fields.EmailField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + 'homepage': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'iban_ou_ccp': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_betatester': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'mobile': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}), + 'nom_banque': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + } + } + + complete_apps = ['accounting_tools'] \ No newline at end of file diff --git a/truffe2/accounting_tools/migrations/0043_auto__del_field_invoice_display_account__del_field_invoice_display_bvr.py b/truffe2/accounting_tools/migrations/0043_auto__del_field_invoice_display_account__del_field_invoice_display_bvr.py new file mode 100644 index 00000000..7034d6e5 --- /dev/null +++ b/truffe2/accounting_tools/migrations/0043_auto__del_field_invoice_display_account__del_field_invoice_display_bvr.py @@ -0,0 +1,555 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting field 'Invoice.display_account' + db.delete_column(u'accounting_tools_invoice', 'display_account') + + # Deleting field 'Invoice.display_bvr' + db.delete_column(u'accounting_tools_invoice', 'display_bvr') + + # Deleting field 'Invoice.custom_bvr_number' + db.delete_column(u'accounting_tools_invoice', 'custom_bvr_number') + + # Adding field 'Invoice.display_qr' + db.add_column(u'accounting_tools_invoice', 'display_qr', + self.gf('django.db.models.fields.BooleanField')(default=True), + keep_default=False) + + + def backwards(self, orm): + # Adding field 'Invoice.display_account' + db.add_column(u'accounting_tools_invoice', 'display_account', + self.gf('django.db.models.fields.BooleanField')(default=True), + keep_default=False) + + # Adding field 'Invoice.display_bvr' + db.add_column(u'accounting_tools_invoice', 'display_bvr', + self.gf('django.db.models.fields.BooleanField')(default=True), + keep_default=False) + + # Adding field 'Invoice.custom_bvr_number' + db.add_column(u'accounting_tools_invoice', 'custom_bvr_number', + self.gf('django.db.models.fields.CharField')(max_length=59, null=True, blank=True), + keep_default=False) + + # Deleting field 'Invoice.display_qr' + db.delete_column(u'accounting_tools_invoice', 'display_qr') + + + models = { + u'accounting_core.account': { + 'Meta': {'unique_together': "(('name', 'accounting_year'), ('account_number', 'accounting_year'))", 'object_name': 'Account'}, + 'account_number': ('django.db.models.fields.CharField', [], {'max_length': '10'}), + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountCategory']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'visibility': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'accounting_core.accountcategory': { + 'Meta': {'unique_together': "(('name', 'accounting_year'),)", 'object_name': 'AccountCategory'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'parent_hierarchique': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'accounting_core.accountingyear': { + 'Meta': {'object_name': 'AccountingYear'}, + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_accounting_import': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'start_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_preparing'", 'max_length': '255'}), + 'subvention_deadline': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + u'accounting_core.costcenter': { + 'Meta': {'unique_together': "(('name', 'accounting_year'), ('account_number', 'accounting_year'))", 'object_name': 'CostCenter'}, + 'account_number': ('django.db.models.fields.CharField', [], {'max_length': '10'}), + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'unit': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['units.Unit']"}) + }, + u'accounting_main.budget': { + 'Meta': {'object_name': 'Budget'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'costcenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.CostCenter']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'unit': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['units.Unit']"}) + }, + u'accounting_tools.cashbook': { + 'Meta': {'object_name': 'CashBook'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}), + 'costcenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.CostCenter']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'nb_proofs': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.cashbookfile': { + 'Meta': {'object_name': 'CashBookFile'}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'to': u"orm['accounting_tools.CashBook']"}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'uploader': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.cashbookline': { + 'Meta': {'object_name': 'CashBookLine'}, + 'account': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.Account']"}), + 'cashbook': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'lines'", 'to': u"orm['accounting_tools.CashBook']"}), + 'date': ('django.db.models.fields.DateField', [], {}), + 'helper': ('django.db.models.fields.CharField', [], {'max_length': '15'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'proof': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'tva': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value_ttc': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}) + }, + u'accounting_tools.cashbooklogging': { + 'Meta': {'object_name': 'CashBookLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.CashBook']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.cashbooktag': { + 'Meta': {'object_name': 'CashBookTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': u"orm['accounting_tools.CashBook']"}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'accounting_tools.cashbookviews': { + 'Meta': {'object_name': 'CashBookViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.CashBook']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.expenseclaim': { + 'Meta': {'object_name': 'ExpenseClaim'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'costcenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.CostCenter']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'nb_proofs': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.expenseclaimfile': { + 'Meta': {'object_name': 'ExpenseClaimFile'}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'to': u"orm['accounting_tools.ExpenseClaim']"}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'uploader': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.expenseclaimline': { + 'Meta': {'object_name': 'ExpenseClaimLine'}, + 'account': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.Account']"}), + 'expense_claim': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'lines'", 'to': u"orm['accounting_tools.ExpenseClaim']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'proof': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'tva': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value_ttc': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}) + }, + u'accounting_tools.expenseclaimlogging': { + 'Meta': {'object_name': 'ExpenseClaimLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.ExpenseClaim']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.expenseclaimtag': { + 'Meta': {'object_name': 'ExpenseClaimTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': u"orm['accounting_tools.ExpenseClaim']"}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'accounting_tools.expenseclaimviews': { + 'Meta': {'object_name': 'ExpenseClaimViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.ExpenseClaim']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.financialprovider': { + 'Meta': {'object_name': 'FinancialProvider'}, + 'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'bic': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'iban_ou_ccp': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'remarks': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'tva_number': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) + }, + u'accounting_tools.financialproviderlogging': { + 'Meta': {'object_name': 'FinancialProviderLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.FinancialProvider']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.financialproviderviews': { + 'Meta': {'object_name': 'FinancialProviderViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.FinancialProvider']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.internaltransfer': { + 'Meta': {'object_name': 'InternalTransfer'}, + 'account': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.Account']"}), + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'cost_center_from': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'internal_transfer_from'", 'to': u"orm['accounting_core.CostCenter']"}), + 'cost_center_to': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'internal_transfer_to'", 'to': u"orm['accounting_core.CostCenter']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'transfert_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}) + }, + u'accounting_tools.internaltransferlogging': { + 'Meta': {'object_name': 'InternalTransferLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.InternalTransfer']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.internaltransfertag': { + 'Meta': {'object_name': 'InternalTransferTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': u"orm['accounting_tools.InternalTransfer']"}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'accounting_tools.internaltransferviews': { + 'Meta': {'object_name': 'InternalTransferViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.InternalTransfer']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.invoice': { + 'Meta': {'object_name': 'Invoice'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'add_to': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'address': ('django.db.models.fields.CharField', [], {'max_length': '140', 'null': 'True', 'blank': 'True'}), + 'annex': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'client_name': ('django.db.models.fields.CharField', [], {'max_length': '70'}), + 'costcenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.CostCenter']"}), + 'date_and_place': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}), + 'delay': ('django.db.models.fields.SmallIntegerField', [], {'default': '30'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'display_qr': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'ending': ('django.db.models.fields.TextField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'english': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'greetings': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'preface': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'reception_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'sign': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_preparing'", 'max_length': '255'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '140'}) + }, + u'accounting_tools.invoiceline': { + 'Meta': {'object_name': 'InvoiceLine'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invoice': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'lines'", 'to': u"orm['accounting_tools.Invoice']"}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'quantity': ('django.db.models.fields.DecimalField', [], {'default': '1', 'max_digits': '20', 'decimal_places': '0'}), + 'tva': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value_ttc': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}) + }, + u'accounting_tools.invoicelogging': { + 'Meta': {'object_name': 'InvoiceLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.Invoice']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.invoicetag': { + 'Meta': {'object_name': 'InvoiceTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': u"orm['accounting_tools.Invoice']"}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'accounting_tools.invoiceviews': { + 'Meta': {'object_name': 'InvoiceViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.Invoice']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.linkedinfo': { + 'Meta': {'object_name': 'LinkedInfo'}, + 'address': ('django.db.models.fields.TextField', [], {}), + 'bank': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'iban_ccp': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'phone': ('django.db.models.fields.CharField', [], {'max_length': '20'}), + 'user_pk': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + u'accounting_tools.providerinvoice': { + 'Meta': {'object_name': 'ProviderInvoice'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'costcenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.CostCenter']"}), + 'currency': ('django.db.models.fields.CharField', [], {'default': "'CHF'", 'max_length': '3'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'provider': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_tools.FinancialProvider']"}), + 'raw_pay_code': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'reference_number': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.providerinvoicefile': { + 'Meta': {'object_name': 'ProviderInvoiceFile'}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'to': u"orm['accounting_tools.ProviderInvoice']"}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'uploader': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.providerinvoiceline': { + 'Meta': {'object_name': 'ProviderInvoiceLine'}, + 'account': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.Account']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'order': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'providerInvoice': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'lines'", 'to': u"orm['accounting_tools.ProviderInvoice']"}), + 'tva': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'value_ttc': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}) + }, + u'accounting_tools.providerinvoicelogging': { + 'Meta': {'object_name': 'ProviderInvoiceLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.ProviderInvoice']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.providerinvoicetag': { + 'Meta': {'object_name': 'ProviderInvoiceTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': u"orm['accounting_tools.ProviderInvoice']"}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'accounting_tools.providerinvoiceviews': { + 'Meta': {'object_name': 'ProviderInvoiceViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.ProviderInvoice']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.subvention': { + 'Meta': {'object_name': 'Subvention'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'amount_asked': ('django.db.models.fields.IntegerField', [], {}), + 'amount_given': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'comment_root': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'kind': ('django.db.models.fields.CharField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}), + 'linked_budget': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_main.Budget']", 'null': 'True', 'blank': 'True'}), + 'mobility_asked': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'mobility_given': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'unit': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['units.Unit']", 'null': 'True', 'blank': 'True'}), + 'unit_blank_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'unit_blank_user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']", 'null': 'True', 'blank': 'True'}) + }, + u'accounting_tools.subventionfile': { + 'Meta': {'object_name': 'SubventionFile'}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'to': u"orm['accounting_tools.Subvention']"}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'uploader': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.subventionline': { + 'Meta': {'object_name': 'SubventionLine'}, + 'end_date': ('django.db.models.fields.DateField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'nb_spec': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'order': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'place': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'start_date': ('django.db.models.fields.DateField', [], {}), + 'subvention': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'events'", 'to': u"orm['accounting_tools.Subvention']"}) + }, + u'accounting_tools.subventionlogging': { + 'Meta': {'object_name': 'SubventionLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.Subvention']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.subventionviews': { + 'Meta': {'object_name': 'SubventionViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.Subvention']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.withdrawal': { + 'Meta': {'object_name': 'Withdrawal'}, + 'accounting_year': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.AccountingYear']"}), + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '20', 'decimal_places': '2'}), + 'costcenter': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounting_core.CostCenter']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'desired_date': ('django.db.models.fields.DateField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'0_draft'", 'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}), + 'withdrawn_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}) + }, + u'accounting_tools.withdrawalfile': { + 'Meta': {'object_name': 'WithdrawalFile'}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'to': u"orm['accounting_tools.Withdrawal']"}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'uploader': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.withdrawallogging': { + 'Meta': {'object_name': 'WithdrawalLogging'}, + 'extra_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': u"orm['accounting_tools.Withdrawal']"}), + 'what': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'accounting_tools.withdrawaltag': { + 'Meta': {'object_name': 'WithdrawalTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': u"orm['accounting_tools.Withdrawal']"}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'accounting_tools.withdrawalviews': { + 'Meta': {'object_name': 'WithdrawalViews'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'views'", 'to': u"orm['accounting_tools.Withdrawal']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.TruffeUser']"}) + }, + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'units.unit': { + 'Meta': {'object_name': 'Unit'}, + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'id_epfl': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'is_commission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_equipe': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'parent_hierarchique': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['units.Unit']", 'null': 'True', 'blank': 'True'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + u'users.truffeuser': { + 'Meta': {'object_name': 'TruffeUser'}, + 'adresse': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'avatar': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'body': ('django.db.models.fields.CharField', [], {'default': "'.'", 'max_length': '1'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '255'}), + 'email_perso': ('django.db.models.fields.EmailField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + 'homepage': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'iban_ou_ccp': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_betatester': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'mobile': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}), + 'nom_banque': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + } + } + + complete_apps = ['accounting_tools'] \ No newline at end of file diff --git a/truffe2/accounting_tools/models.py b/truffe2/accounting_tools/models.py index 5a033302..31136474 100644 --- a/truffe2/accounting_tools/models.py +++ b/truffe2/accounting_tools/models.py @@ -21,6 +21,8 @@ from PIL import Image, ImageDraw, ImageFont import os from iso4217 import Currency +from accounting_tools.qrbill import QRBill # Python 2 +# from qrbill.bill import QRBill # Python 3 from accounting_core.models import AccountingGroupModels from accounting_core.utils import AccountingYearLinked, CostCenterLinked @@ -325,16 +327,15 @@ def __init__(self, *args, **kwargs): 'DOWNLOAD_PDF': _(u'Peut exporter la facture en PDF'), }) - title = models.CharField(max_length=255) + title = models.CharField(max_length=140) - custom_bvr_number = models.CharField(_(u'Numéro de BVR manuel'), help_text=_(u'Ne PAS utiliser un numéro aléatoire, mais utiliser un VRAI et UNIQUE numéro de BVR. Seulement pour des BVR physiques. Si pas renseigné, un numéro sera généré automatiquement. Il est possible de demander des BVR à Marianne.'), max_length=59, blank=True, null=True) + client_name = models.CharField(_('Nom du client'), help_text=_(u'Exemple: \'Licorne SA - Monsieur Poney\''), max_length=70) + address = models.CharField(_('Adresse'), help_text=_(u'Format: \'Rue Des Arc en Ciel 25 - Case Postale 2, CH-1015 Lausanne\''), max_length=140, blank=True, null=True) - address = models.TextField(_('Adresse'), help_text=_(u'Exemple: \'Monsieur Poney - Rue Des Canard 19 - 1015 Lausanne\''), blank=True, null=True) date_and_place = models.CharField(_(u'Lieu et date'), max_length=512, blank=True, null=True) preface = models.TextField(_(u'Introduction'), help_text=_(u'Texte affiché avant la liste. Exemple: \'Pour l\'achat du Yearbook 2014\' ou \'Chère Madame, - Par la présente, je me permets de vous remettre notre facture pour le financement de nos activités associatives pour l\'année académique 2014-2015.\''), blank=True, null=True) ending = models.TextField(_(u'Conclusion'), help_text=_(u'Affiché après la liste, avant les moyens de paiements'), max_length=1024, blank=True, null=True) - display_bvr = models.BooleanField(_(u'Afficher paiement via BVR'), help_text=_(u'Affiche un BVR et le texte corespondant dans le PDF. Attention, le BVR généré n\'est pas utilisable à la poste ! (Il est possible d\'obtenir un \'vrai\' BVR via Marianne.)'), default=True) - display_account = models.BooleanField(_(u'Afficher paiement via compte'), help_text=_(u'Affiche le texte pour le paiement via le compte de l\'AGEPoly.'), default=True) + display_qr = models.BooleanField(_(u'Afficher la QR Facture'), help_text=_(u'Affiche la QR Facture dans le PDF.'), default=True) greetings = models.CharField(_(u'Salutations'), default='', max_length=1024, blank=True, null=True) sign = models.TextField(_(u'Signature'), help_text=_(u'Titre de la zone de signature'), blank=True, null=True) annex = models.BooleanField(_(u'Annexes'), help_text=_(u'Affiche \'Annexe(s): ment.\' en bas de la facture'), default=False) @@ -350,17 +351,16 @@ class MetaData: ('reception_date', _(u'Date valeur banque')), ('status', _('Statut')), ('costcenter', _(u'Centre de coût')), - ('get_reference', _(u'Référence')), - ('get_bvr_number', _(u'Numéro de BVR')), + ('get_qr_ref', _(u'Référence')), ('get_total_display', _(u'Total')), ] details_display = list_display + [ + ('client_name', _('Nom Client')), ('address', _('Adresse')), ('date_and_place', _(u'Lieu et date')), ('preface', _(u'Introduction')), ('ending', _(u'Conclusion')), - ('display_bvr', _(u'Afficher paiement via BVR')), - ('display_account', _(u'Afficher paiement via compte')), + ('display_qr', _(u'Afficher la QR Facture')), ('delay', _(u'Délai de paiement en jours')), ('greetings', _(u'Salutations')), ('sign', _(u'Signature')), @@ -369,7 +369,7 @@ class MetaData: ('add_to', _(u'Rajouter "À l\'attention de"')), ] - filter_fields = ('title', ) + filter_fields = ('title', 'client_name') base_title = _(u'Facture (client)') list_title = _(u'Liste de toutes les factures (client)') @@ -382,14 +382,12 @@ class MetaData: has_unit = True - help_list = _(u"""Les factures te permettent de demander de l'argent à, par exemple, une entreprise. Tu DOIS déclarer toutes les factures que tu envoies via cet outil (tu n'es pas obligé d'utiliser le PDF généré, à condition qu'il contienne TOUTES LES INFORMATIONS NÉCESSAIRES). - -Tu peux utiliser le numéro de BVR généré, ou demander à Marianne un 'vrai' BVR. NE GENERE JAMAIS UN NUMÉRO DE BVR ALÉATOIRE OU DE TON CHOIX.""") + help_list = _(u"""Les factures te permettent de demander de l'argent à, par exemple, une entreprise. Tu DOIS déclarer toutes les factures que tu envoies via cet outil (tu n'es pas obligé d'utiliser le PDF généré, à condition qu'il contienne TOUTES LES INFORMATIONS NÉCESSAIRES).""") trans_sort = {'get_creation_date': 'pk'} - not_sortable_columns = ['get_reference', 'get_bvr_number', 'get_total_display'] - yes_or_no_fields = ['display_bvr', 'display_account', 'annex', 'english', 'add_to'] + not_sortable_columns = ['get_reference', 'get_total_display'] + yes_or_no_fields = ['display_qr', 'annex', 'english', 'add_to'] datetime_fields = ['get_creation_date', 'reception_date'] class MetaEdit: @@ -438,7 +436,8 @@ class MetaSearch(SearchableModel.MetaSearch): 'preface', 'sign', 'title', - 'get_bvr_number', + 'get_reference', + 'get_qr_ref', 'reception_date', ] @@ -451,7 +450,6 @@ class MetaState: states = { '0_preparing': _(u'En préparation'), '0_correct': _(u'Corrections nécessaires'), - '1_need_bvr': _(u'En attente d\'un numéro BVR'), '2_ask_accord': _(u'Attente Accord AGEPoly'), '2_accord': _(u'Attente Envoi'), '3_sent': _(u'Envoyée / paiement en attente'), @@ -464,7 +462,6 @@ class MetaState: states_texts = { '0_preparing': _(u'La facture est en cours de rédaction'), '0_correct': _(u'La facture doit être corrigée'), - '1_need_bvr': _(u'La facture nécessite un vrai BVR, en attente d\'attribution'), '2_ask_accord': _(u'Il faut attendre l\'accord de l\'AGEPoly'), '2_accord': _(u'Il faut envoyer la facture'), '3_sent': _(u'La facture a été envoyée, le paiement est en attente. La facture n\'est plus éditable !'), @@ -473,9 +470,8 @@ class MetaState: } states_links = { - '0_preparing': ['1_need_bvr', '2_ask_accord', '5_canceled'], - '0_correct': ['1_need_bvr', '2_ask_accord', '5_canceled'], - '1_need_bvr': ['0_correct'], + '0_preparing': ['2_ask_accord', '5_canceled'], + '0_correct': ['2_ask_accord', '5_canceled'], '2_ask_accord': ['0_correct', '2_accord', '5_canceled'], '2_accord': ['0_correct', '3_sent', '4_archived', '5_canceled'], '3_sent': ['0_correct', '4_archived', '5_canceled'], @@ -486,7 +482,6 @@ class MetaState: states_colors = { '0_preparing': 'primary', '0_correct': 'danger', - '1_need_bvr': 'danger', '2_ask_accord': 'primary', '2_accord': 'info', '3_sent': 'warning', @@ -498,38 +493,31 @@ class MetaState: } list_quick_switch = { - '0_preparing': [('2_ask_accord', 'fa fa-question', _(u'Demande accord AGEPoly')), - ('1_need_bvr', 'fa fa-question', _(u'Demander un BVR'))], - '0_correct': [('2_ask_accord', 'fa fa-question', _(u'Demande accord AGEPoly')), - ('1_need_bvr', 'fa fa-question', _(u'Demander un BVR'))], - '1_need_bvr': [], + '0_preparing': [('2_ask_accord', 'fa fa-question', _(u'Demande accord AGEPoly'))], + '0_correct': [('2_ask_accord', 'fa fa-question', _(u'Demande accord AGEPoly'))], '2_ask_accord': [('2_accord', 'fa fa-check', _(u'Donner l\'accord')),], - '2_accord': [('3_sent', 'fa fa-check', _(u'Marquer comme envoyée'))], - '3_sent': [('4_archived', 'fa fa-check', _(u'Marquer comme terminée')), ], + '2_accord': [('3_sent', 'fa fa-check', _(u'Marquer comme envoyée')),], + '3_sent': [('4_archived', 'fa fa-check', _(u'Marquer comme terminée')),], '4_archived': [], '5_canceled': [], } states_quick_switch = { - '0_preparing': [('2_ask_accord', _(u'Demande accord AGEPoly')), - ('1_need_bvr', _(u'Demander un BVR'))], - '0_correct': [('2_ask_accord', _(u'Demande accord AGEPoly')), - ('1_need_bvr', _(u'Demander un BVR'))], - '1_need_bvr': [], + '0_preparing': [('2_ask_accord', _(u'Demande accord AGEPoly'))], + '0_correct': [('2_ask_accord', _(u'Demande accord AGEPoly'))], '2_ask_accord': [('2_accord', _(u'Donner l\'accord'))], '2_accord': [('3_sent', _(u'Marquer comme envoyée'))], '3_sent': [('4_archived', _(u'Marquer comme terminée')), ], '4_archived': [], '5_canceled': [], } - states_default_filter = '0_preparing,1_need_bvr,2_ask_accord,2_accord,3_sent' - states_default_filter_related = '0_preparing,1_need_bvr,2_ask_accord,2_accord,3_sent' + states_default_filter = '0_preparing,2_ask_accord,2_accord,3_sent' + states_default_filter_related = '0_preparing,2_ask_accord,2_accord,3_sent' status_col_id = 1 forced_pos = { '0_preparing': (0.1, 0.15), '0_correct': (0.5, 0.85), - '1_need_bvr': (0.1, 0.85), '2_ask_accord': (0.26, 0.15), '2_accord': (0.5, 0.15), '3_sent': (0.7, 0.35), @@ -537,9 +525,6 @@ class MetaState: '5_canceled': (0.9, 0.85), } - class FormBVR(forms.Form): - bvr = forms.CharField(label=_('BVR'), help_text=_(u'Soit le numéro complet, soit la fin, 94 42100 0...0 étant rajouté automatiquement'), required=False) - def build_form_date(request, obj): class FormDate(forms.Form): date = forms.DateField(label=_('Date valeur banque'), required=False, initial=now()) @@ -553,8 +538,6 @@ def __init__(self, *args, **kwargs): return FormDate states_bonus_form = { - '0_preparing': FormBVR, - '0_correct': FormBVR, '4_archived': build_form_date } @@ -565,37 +548,6 @@ def switch_status_signal(self, request, old_status, dest_status): if hasattr(s, 'switch_status_signal'): s.switch_status_signal(request, old_status, dest_status) - if dest_status == '1_need_bvr': - notify_people(request, '%s.need_bvr' % (self.__class__.__name__,), 'invoices_bvr_needed', self, self.people_in_root_unit('SECRETARIAT')) - - if dest_status == '0_preparing': - - if request.POST.get('bvr'): - - bvr = ''.join(filter(lambda x: x in string.digits, request.POST.get('bvr'))) - - while len(bvr) < 27 - len('94421'): - bvr = '0{}'.format(bvr) - - if len(bvr) < 27: - bvr = '94421{}'.format(bvr) - - if len(bvr) != 27: - messages.warning(request, _(u'Numéro BVR invalide (Ne contenant pas 27 chiffres)')) - - elif bvr != self._add_checksum(bvr[:-1]): - messages.warning(request, _(u'Numéro BVR invalide (Checksum)')) - - elif not bvr.startswith('9442100'): - messages.warning(request, _(u'Numéro BVR invalide (Doit commencer par 94 42100)')) - - else: - self.custom_bvr_number = "{} {} {} {} {} {}".format(bvr[:2], bvr[2:7], bvr[7:12], bvr[12:17], bvr[17:22], bvr[22:]) - self.save() - - unotify_people('%s.need_bvr' % (self.__class__.__name__,), self) - notify_people(request, '%s.bvr_set' % (self.__class__.__name__,), 'invoices_bvr_set', self, self.build_group_members_for_editors()) - if dest_status == '0_correct': notify_people(request, '%s.to_correct' % (self.__class__.__name__,), 'invoices_to_correct', self, self.build_group_members_for_editors()) @@ -651,7 +603,7 @@ def rights_can_EDIT(self, user): if self.status == '2_accord' and (user.is_superuser or self.rights_in_root_unit(user, 'SECRETARIAT')): return True - if self.status in ['0_preparing', '0_correct', '1_need_bvr']: + if self.status in ['0_preparing', '0_correct']: return super(_Invoice, self).rights_can_EDIT(user) return False @@ -679,29 +631,24 @@ class Meta: def __unicode__(self): return u'{} ({})'.format(self.title, self.get_reference()) - def get_reference(self): - return 'T2-{}-{}'.format(self.costcenter.account_number, self.pk) + @property + def multiline_address(self): + return self.address.replace(u',', u'\n') - def _add_checksum(self, part_validation): - """ - Ajoute les modulo 10 a une string pour vérification bvr poste - https://www.credit-suisse.com/media/production/pb/docs/unternehmen/kmugrossunternehmen/besr_technische_dokumentation_fr.pdf - http://fr.wikipedia.org/wiki/Bulletin_de_versement_avec_num%C3%A9ro_de_r%C3%A9f%C3%A9rence + def get_reference(self): + return 'TR2-{}-{}'.format(self.costcenter.account_number, self.pk) - (Stolen from PolyLAN) - """ - nTab = [0, 9, 4, 6, 8, 2, 7, 1, 3, 5] - resultnumber = 0 - for number in part_validation.replace(" ", ""): - resultnumber = nTab[(resultnumber + int(number)) % 10] - return '{}{}'.format(part_validation, (10 - resultnumber) % 10) + def get_qr_ref(self): + ref = '{0:06d}{1:06d}{2:06d}'.format(int(self.costcenter.account_number.replace('.', '')) % 100000, int(self.pk / 100000), self.pk % 100000) - def get_bvr_number(self): - return self.custom_bvr_number or \ - self._add_checksum('94 42100 08402 {0:05d} {1:05d} {2:04d}'.format(int(self.costcenter.account_number.replace('.', '')) % 10000, int(self.pk / 10000), self.pk % 10000)) # Note: 84=T => 08402~T2~Truffe2 + # modulo 97-10 (same as iban) + checkdigits = 98 - int('29272{0}271500'.format(ref)) % 97 # TR2 -> 29272 et RF00 -> 271500 + if (checkdigits < 10): + checkdigits = '0{}'.format(checkdigits) + else: + checkdigits = unicode(checkdigits) - def get_esr(self): - return '{}>{}+ 010025703>'.format(self._add_checksum("01{0:010d}".format(int(self.get_total() * 100))), self.get_bvr_number().replace(' ', '')) + return 'RF{0} TR2{1} {2} {3} {4} {5} {6}'.format(checkdigits, ref[0], ref[1:5], ref[5:9], ref[9:13], ref[13:17], ref[17]) def get_lines(self): return self.lines.order_by('order').all() @@ -715,73 +662,28 @@ def get_total_ht(self): def get_total_display(self): return '{} CHF'.format(intcomma(floatformat(self.get_total(), 2))) - def generate_bvr(self): - - F = 4.72 - - ocr_b = ImageFont.truetype(os.path.join(settings.DJANGO_ROOT, 'media/fonts/OCR_BB.TTF'), int(42 * F)) - - img = Image.open(os.path.join(settings.DJANGO_ROOT, 'media/img/base_bvr.png')) - - draw = ImageDraw.Draw(img) - - # Partie gauche - - # # CS Line - draw.text((25 * F, 84 * F), "CREDIT SUISSE", font=ocr_b, fill=(0, 0, 0)) - # # CS Line 2 - draw.text((25 * F, 127 * F), "1002 LAUSANNE (0425)", font=ocr_b, fill=(0, 0, 0)) - - # # AGEP Line 1 - draw.text((25 * F, 211 * F), u"Ass. Gén d. Etudiants", font=ocr_b, fill=(0, 0, 0)) - - # # AGEP Line 2 - draw.text((25 * F, 254 * F), "de l'EPFL / AGEPoly", font=ocr_b, fill=(0, 0, 0)) - - # # AGEP Line 3 - draw.text((25 * F, 296 * F), "1024 Ecublens VD", font=ocr_b, fill=(0, 0, 0)) - - # # Compte - draw.text((279 * F, 423 * F), "01-2570-3", font=ocr_b, fill=(0, 0, 0)) - - # # Montant - total = '{0:10.2f}'.format(self.get_total()) - - current_x = 88.9 - inc_x = 50.8 - - for d in total: - if d != "." and d != ",": - draw.text((current_x * F, 508 * F), d, font=ocr_b, fill=(0, 0, 0)) - current_x += inc_x - - # Partie droite - - # # Référence - draw.text((635 * F, 338 * F), self.get_bvr_number(), font=ocr_b, fill=(0, 0, 0)) - - # Zone blanche en bas - - # # Code ESR - draw.text((76 * F, 846 * F), self.get_esr(), font=ocr_b, fill=(0, 0, 0)) # If len(ESR)=43 - - return img - - def genericFormExtraClean(self, data, form): - - if 'custom_bvr_number' in data and data['custom_bvr_number']: - bvr = ''.join(filter(lambda x: x in string.digits, data['custom_bvr_number'])) - - if len(bvr) != 27: - raise forms.ValidationError(_(u'Numéro BVR invalide (ne contenant pas 27 chiffres)')) - - if bvr != self._add_checksum(bvr[:-1]): - raise forms.ValidationError(_(u'Numéro BVR invalide (Checksum)')) - - if not bvr.startswith('9442100'): - raise forms.ValidationError(_(u'Numéro BVR invalide (Doit commencer par 94 42100)')) - - data['custom_bvr_number'] = "{} {} {} {} {} {}".format(bvr[:2], bvr[2:7], bvr[7:12], bvr[12:17], bvr[17:22], bvr[22:]) + def generate_QR(self): + address = self.multiline_address.splitlines() + bill = QRBill( + account='CH1904835028789771000', + amount=unicode(self.get_total()), + currency='CHF', + debtor={ + 'name': self.client_name, + 'line1': address[0][0:70], + 'line2': address[1][0:70] if len(address) > 1 else '', + 'country': 'CH', #otherwise not accepted by some banks + }, + creditor={ + 'name': u'Ass. Genérale Des Etudiants de l\'EPFL', 'street': u'Case Postale', 'house_num': u'16', 'pcode': u'1015', 'city': u'Lausanne', u'country': u'CH', + }, + ref_number=self.get_qr_ref(), + extra_infos=self.title, + language='en' if self.english else 'fr', + top_line=True, + extra_auto_infos='//S1/10/{ref}/11/{date}/30/{tvauid}/40/0:{delay}/'.format(ref=self.get_reference(), date=now().strftime('%y%m%d'), tvauid='113397612', delay=self.delay) + ) + return bill def get_language(self): diff --git a/truffe2/accounting_tools/qrbill.py b/truffe2/accounting_tools/qrbill.py new file mode 100644 index 00000000..e87018f3 --- /dev/null +++ b/truffe2/accounting_tools/qrbill.py @@ -0,0 +1,561 @@ +# -*-coding:utf-8 -* +# This file should be removed when switching to python3 +from __future__ import absolute_import +import re +from datetime import date +from decimal import Decimal +from io import BytesIO + +import qrcode +import qrcode.image.svg +import svgwrite +from iso3166 import countries +from stdnum import iban, iso11649 +from stdnum.ch import esr + +IBAN_ALLOWED_COUNTRIES = [u'CH', u'LI'] +QR_IID = {u"start": 30000, u"end": 31999} +AMOUNT_REGEX = u'^\d{1,9}\.\d{2}$' +DATE_REGEX = u'(\d{4})-(\d{2})-(\d{2})' +MM_TO_UU = 3.543307 + +# Annex D: Multilingual headings +LABELS = { + u'Payment part': {u'de': u'Zahlteil', u'fr': u'Section paiement', u'it': u'Sezione pagamento'}, + u'Account / Payable to': { + u'de': u'Konto / Zahlbar an', + u'fr': u'Compte / Payable à', + u'it': u'Conto / Pagabile a', + }, + u'Reference': {u'de': u'Referenz', u'fr': u'Référence', u'it': u'Riferimento'}, + u'Additional information': { + u'de': u'Zusätzliche Informationen', + u'fr': u'Informations supplémentaires', + u'it': u'Informazioni supplementari', + }, + u'Currency': {u'de': u'Währung', u'fr': u'Monnaie', u'it': u'Valuta'}, + u'Amount': {u'de': u'Betrag', u'fr': u'Montant', u'it': u'Importo'}, + u'Receipt': {u'de': u'Empfangsschein', u'fr': u'Récépissé', u'it': u'Ricevuta'}, + u'Acceptance point': {u'de': u'Annahmestelle', u'fr': u'Point de dépôt', u'it': u'Punto di accettazione'}, + u'Separate before paying in': { + u'de': u'Vor der Einzahlung abzutrennen', + u'fr': u'A détacher avant le versement', + u'it': u'Da staccare prima del versamento', + }, + u'Payable by': {u'de': u'Zahlbar durch', u'fr': u'Payable par', u'it': u'Pagabile da'}, + u'Payable by (name/address)': { + u'de': u'Zahlbar durch (Name/Adresse)', + u'fr': u'Payable par (nom/adresse)', + u'it': u'Pagabile da (nome/indirizzo)', + }, + # The extra ending space allows to differentiate from the other 'Payable by' above. + u'Payable by ': {u'de': u'Zahlbar bis', u'fr': u'Payable jusqu’au', u'it': u'Pagabile fino al'}, + u'In favour of': {u'de': u'Zugunsten', u'fr': u'En faveur de', u'it': u'A favore di'}, +} + + +class Address(object): + def __init__(self, **_3to2kwargs): + if 'country' in _3to2kwargs: country = _3to2kwargs['country']; del _3to2kwargs['country'] + else: country = None + if 'city' in _3to2kwargs: city = _3to2kwargs['city']; del _3to2kwargs['city'] + else: city = None + if 'pcode' in _3to2kwargs: pcode = _3to2kwargs['pcode']; del _3to2kwargs['pcode'] + else: pcode = None + if 'house_num' in _3to2kwargs: house_num = _3to2kwargs['house_num']; del _3to2kwargs['house_num'] + else: house_num = None + if 'street' in _3to2kwargs: street = _3to2kwargs['street']; del _3to2kwargs['street'] + else: street = None + if 'name' in _3to2kwargs: name = _3to2kwargs['name']; del _3to2kwargs['name'] + else: name = None + if 'line1' in _3to2kwargs: line1 = _3to2kwargs['line1']; del _3to2kwargs['line1'] + else: line1 = None + if 'line2' in _3to2kwargs: line2 = _3to2kwargs['line2']; del _3to2kwargs['line2'] + else: line2 = None + + self.name = (name or u'').strip() + if not (1 <= len(self.name) <= 70): + raise ValueError(u"An address name should have between 1 and 70 characters.") + + if line1 is not None: + self.line1 = (line1 or u'').strip() + if not (0 <= len(self.line1) <= 70): + raise ValueError(u"An address line should have between 0 and 70 characters.") + self.line2 = (line2 or u'').strip() + if not (0 <= len(self.line2) <= 70): + raise ValueError(u"An address line2 should have between 0 and 70 characters.") + self.combined = True + + else: + self.street = (street or u'').strip() + if len(self.street) > 70: + raise ValueError(u"A street cannot have more than 70 characters.") + self.house_num = (house_num or u'').strip() + if len(self.house_num) > 16: + raise ValueError(u"A house number cannot have more than 16 characters.") + self.pcode = (pcode or u'').strip() + if not self.pcode: + raise ValueError(u"Postal code is mandatory") + elif len(self.pcode) > 16: + raise ValueError(u"A postal code cannot have more than 16 characters.") + self.city = (city or u'').strip() + if not self.city: + raise ValueError(u"City is mandatory") + elif len(self.city) > 35: + raise ValueError(u"A city cannot have more than 35 characters.") + self.combined = False + + country = (country or u'').strip() + # allow users to write the country as if used in an address in the local language + if not country or country.lower() in [u'schweiz', u'suisse', u'svizzera', u'svizra']: + country = u'CH' + if country.lower() in [u'fürstentum liechtenstein']: + country = u'LI' + try: + self.country = countries.get(country).alpha2 + except KeyError: + raise ValueError(u"The country code '%s' is not valid" % country) + + def data_list(self): + u"""Return address values as a list, appropriate for qr generation.""" + # 'S': structured address + if self.combined: + return [ + u'K', self.name, self.line1, self.line2, '', '', self.country + ] + else: + return [ + u'S', self.name, self.street, self.house_num, self.pcode, + self.city, self.country + ] + + def as_paragraph(self): + if self.combined: + lines = [self.name, self.line1, self.line2] + else: + lines = [self.name, u"%s-%s %s" % (self.country, self.pcode, self.city)] + if self.street: + if self.house_num: + lines.insert(1, u" ".join([self.street, self.house_num])) + else: + lines.insert(1, self.street) + return lines + + +class QRBill(object): + u"""This class represents a Swiss QR Bill.""" + # Header fields + qr_type = u'SPC' # Swiss Payments Code + version = u'0200' + coding = 1 # Latin character set + allowed_currencies = (u'CHF', u'EUR') + # QR reference, Creditor Reference (ISO 11649), without reference + reference_types = (u'QRR', u'SCOR', u'NON') + + def __init__( + self, account=None, creditor=None, final_creditor=None, amount=None, + currency=u'CHF', due_date=None, debtor=None, ref_number=None, extra_infos=u'', + language=u'en', top_line=False, extra_auto_infos=None): + # Account (IBAN) validation + if not account: + raise ValueError(u"The account parameter is mandatory") + if not iban.is_valid(account): + raise ValueError(u"Sorry, the IBAN is not valid") + self.account = iban.validate(account) + if self.account[:2] not in IBAN_ALLOWED_COUNTRIES: + raise ValueError(u"IBAN must start with: %s" % u", ".join(IBAN_ALLOWED_COUNTRIES)) + iban_iid = int(self.account[4:9]) + if QR_IID[u"start"] <= iban_iid <= QR_IID[u"end"]: + self.account_is_qriban = True + else: + self.account_is_qriban = False + + if amount is not None: + if isinstance(amount, Decimal): + amount = unicode(amount) + elif not isinstance(amount, unicode): + raise ValueError(u"Amount can only be specified as str or Decimal.") + # remove commonly used thousands separators + amount = amount.replace(u"'", u"").strip() + # people often don't add .00 for amounts without cents/rappen + if u"." not in amount: + amount = amount + u".00" + # support lazy people who write 12.1 instead of 12.10 + if amount[-2] == u'.': + amount = amount + u'0' + # strip leading zeros + amount = amount.lstrip(u"0") + # some people tend to strip the leading zero on amounts below 1 CHF/EUR + # and with removing leading zeros, we would have removed the zero before + # the decimal delimiter anyway + if amount[0] == u".": + amount = u"0" + amount + m = re.match(AMOUNT_REGEX, amount) + if not m: + raise ValueError( + u"If provided, the amount must match the pattern '###.##'" + u" and cannot be larger than 999'999'999.99" + ) + self.amount = amount + if currency not in self.allowed_currencies: + raise ValueError(u"Currency can only contain: %s" % u", ".join(self.allowed_currencies)) + self.currency = currency + if due_date: + m = re.match(DATE_REGEX, due_date) + if not m: + raise ValueError(u"The date must match the pattern 'YYYY-MM-DD'") + due_date = date(*[int(g)for g in m.groups()]) + self.due_date = due_date + if not creditor: + raise ValueError(u"Creditor information is mandatory") + try: + self.creditor = Address(**creditor) + except ValueError as err: + raise ValueError(u"The creditor address is invalid: %s" % err) + if final_creditor is not None: + # The standard says ultimate creditor is reserved for future use. + # The online validator does not properly validate QR-codes where + # this is set, saying it must not (yet) be used. + raise ValueError(u"final creditor is reserved for future use, must not be used") + else: + self.final_creditor = final_creditor + if debtor is not None: + try: + self.debtor = Address(**debtor) + except ValueError as err: + raise ValueError(u"The debtor address is invalid: %s" % err) + else: + self.debtor = debtor + + if not ref_number: + self.ref_type = u'NON' + self.ref_number = None + elif ref_number.strip()[:2].upper() == u"RF": + if iso11649.is_valid(ref_number): + self.ref_type = u'SCOR' + self.ref_number = iso11649.validate(ref_number) + else: + raise ValueError(u"The reference number is invalid") + elif esr.is_valid(ref_number): + self.ref_type = u'QRR' + self.ref_number = esr.format(ref_number).replace(u" ", u"") + else: + raise ValueError(u"The reference number is invalid") + + # A QRR reference number must only be used with a QR-IBAN and + # with a QR-IBAN, a QRR reference number must be used + if self.account_is_qriban: + if self.ref_type != u'QRR': + raise ValueError(u"A QR-IBAN requires a QRR reference number") + else: + if self.ref_type == u'QRR': + raise ValueError(u"A QRR reference number is only allowed for a QR-IBAN") + + self.extra_infos = u'' + if extra_infos and len(extra_infos) > 140: + raise ValueError(u"Additional information cannot contain more than 140 characters") + self.extra_infos = extra_infos + + if language not in [u'en', u'de', u'fr', u'it']: + raise ValueError(u"Language should be 'en', 'de', 'fr', or 'it'") + self.language = language + self.top_line = top_line + + self.extra_auto_infos = u'' + if extra_auto_infos and len(extra_auto_infos) > 140: + raise ValueError(u"Additional information cannot contain more than 140 characters") + self.extra_auto_infos = extra_auto_infos + + def qr_data(self): + u"""Return data to be encoded in the QR code.""" + values = [self.qr_type or u'', self.version or u'', self.coding or u'', self.account or u''] + values.extend(self.creditor.data_list()) + values.extend(self.final_creditor.data_list() if self.final_creditor else [u''] * 7) + values.extend([self.amount or u'', self.currency or u'']) + values.extend(self.debtor.data_list() if self.debtor else [u''] * 7) + values.extend([self.ref_type or u'', self.ref_number or u'', self.extra_infos or u'', u'EPD', self.extra_auto_infos]) + return u"\r\n".join([unicode(v) for v in values]) + + def qr_image(self): + factory = qrcode.image.svg.SvgPathImage + return qrcode.make( + self.qr_data(), + image_factory=factory, + error_correction=qrcode.constants.ERROR_CORRECT_L, + ) + + def draw_swiss_cross(self, dwg, qr_width): + group = dwg.add(dwg.g(id=u"swiss-cross")) + group.add( + dwg.polygon(points=[ + (18.3, 0.7), (1.6, 0.7), (0.7, 0.7), (0.7, 1.6), (0.7, 18.3), (0.7, 19.1), + (1.6, 19.1), (18.3, 19.1), (19.1, 19.1), (19.1, 18.3), (19.1, 1.6), (19.1, 0.7) + ]) + ) + group.add( + dwg.rect(insert=(8.3, 4), size=(3.3, 11), fill=u'white') + ) + group.add( + dwg.rect(insert=(4.4, 7.9), size=(11, 3.3), fill=u'white') + ) + group.add( + dwg.polygon(points=[ + (0.7, 1.6), (0.7, 18.3), (0.7, 19.1), (1.6, 19.1), (18.3, 19.1), (19.1, 19.1), + (19.1, 18.3), (19.1, 1.6), (19.1, 0.7), (18.3, 0.7), (1.6, 0.7), (0.7, 0.7)], + fill=u'none', stroke=u'white', stroke_width=1.4357, + ) + ) + x = 250 + (qr_width * 0.52) + y = 58 + (qr_width * 0.52) + group.translate(tx=x, ty=y) + + def draw_blank_rect(self, dwg, x, y, width, height): + u"""Draw a empty blank rect with corners (e.g. amount, debtor)""" + stroke_info = {u'stroke': u'black', u'stroke_width': u'0.7mm', u'stroke_linecap': u'square'} + grp = dwg.add(dwg.g()) + grp.add(dwg.line((x, y), (x, add_mm(y, u'2mm')), **stroke_info)) + grp.add(dwg.line((x, y), (add_mm(x, u'3mm'), y), **stroke_info)) + grp.add(dwg.line((x, add_mm(y, height)), (x, add_mm(y, height, u'-2mm')), **stroke_info)) + grp.add(dwg.line((x, add_mm(y, height)), (add_mm(x, u'3mm'), add_mm(y, height)), **stroke_info)) + grp.add(dwg.line((add_mm(x, width, u'-3mm'), y), (add_mm(x, width), y), **stroke_info)) + grp.add(dwg.line((add_mm(x, width), y), (add_mm(x, width), add_mm(y, u'2mm')), **stroke_info)) + grp.add(dwg.line( + (add_mm(x, width, u'-3mm'), add_mm(y, height)), (add_mm(x, width), add_mm(y, height)), + **stroke_info + )) + grp.add(dwg.line( + (add_mm(x, width), add_mm(y, height)), (add_mm(x, width), add_mm(y, height, u'-2mm')), + **stroke_info + )) + + def label(self, txt): + return txt if self.language == u'en' else LABELS[txt][self.language] + + def as_svg(self, file_name, file_obj=None): + bill_height = u'105mm' + receipt_width = u'62mm' + payment_width = u'148mm' + margin = u'5mm' + payment_left = add_mm(receipt_width, margin) + payment_detail_left = add_mm(payment_left, u'70mm') + title_font_info = {u'font_size': 11, u'font_family': u'helvetica', u'font_weight': u'bold'} + font_info = {u'font_size': 10, u'font_family': u'helvetica'} + head_font_info = {u'font_size': 8, u'font_family': u'helvetica', u'font_weight': u'bold'} + + dwg = svgwrite.Drawing( + size=(add_mm(receipt_width, payment_width), bill_height), # A4 width, A6 height. + filename=file_name, + ) + dwg.add(dwg.rect(insert=(0, 0), size=(u'100%', u'100%'), fill=u'white')) # Force white background + + # Receipt + y_pos = 15 + line_space = 3.5 + dwg.add(dwg.text(self.label(u"Receipt"), (margin, u'10mm'), **title_font_info)) + dwg.add(dwg.text(self.label(u"Account / Payable to"), (margin, u'%smm' % y_pos), **head_font_info)) + y_pos += line_space + dwg.add(dwg.text( + iban.format(self.account), (margin, u'%smm' % y_pos), **font_info + )) + y_pos += line_space + for line_text in self.creditor.as_paragraph(): + dwg.add(dwg.text(line_text, (margin, u'%smm' % y_pos), **font_info)) + y_pos += line_space + + if self.ref_number: + y_pos += 1 + dwg.add(dwg.text(self.label(u"Reference"), (margin, u'%smm' % y_pos), **head_font_info)) + y_pos += line_space + dwg.add(dwg.text(format_ref_number(self), (margin, u'%smm' % y_pos), **font_info)) + y_pos += line_space + + y_pos += 1 + dwg.add(dwg.text( + self.label(u"Payable by") if self.debtor else self.label(u"Payable by (name/address)"), + (margin, u'%smm' % y_pos), **head_font_info + )) + y_pos += line_space + if self.debtor: + for line_text in self.debtor.as_paragraph(): + dwg.add(dwg.text(line_text, (margin, u'%smm' % y_pos), **font_info)) + y_pos += line_space + else: + self.draw_blank_rect( + dwg, x=margin, y=u'%smm' % y_pos, + width=u'52mm', height=u'25mm' + ) + y_pos += 28 + + dwg.add(dwg.text(self.label(u"Currency"), (margin, u'80mm'), **head_font_info)) + dwg.add(dwg.text(self.label(u"Amount"), (add_mm(margin, u'12mm'), u'80mm'), **head_font_info)) + dwg.add(dwg.text(self.currency, (margin, u'85mm'), **font_info)) + if self.amount: + dwg.add(dwg.text(format_amount(self.amount), (add_mm(margin, u'12mm'), u'85mm'), **font_info)) + else: + self.draw_blank_rect( + dwg, x=add_mm(margin, u'25mm'), y=u'77mm', + width=u'27mm', height=u'11mm' + ) + + # Right-aligned + dwg.add(dwg.text( + self.label(u"Acceptance point"), (add_mm(receipt_width, u'-' + margin), u'91mm'), + text_anchor=u'end', **head_font_info + )) + + # Top separation line + if self.top_line: + dwg.add(dwg.line( + start=(0, 0), end=(u'100%', 0), + stroke=u'black', stroke_dasharray=u'2 2' + )) + # Separation line between receipt and payment parts + dwg.add(dwg.line( + start=(receipt_width, 0), end=(receipt_width, bill_height), + stroke=u'black', stroke_dasharray=u'2 2' + )) + dwg.add(dwg.text( + u"✂", insert=(add_mm(receipt_width, u'-1.5mm'), 40), + font_size=16, font_family=u'helvetica', rotate=[90] + )) + + # Payment part + dwg.add(dwg.text(self.label(u"Payment part"), (payment_left, u'10mm'), **title_font_info)) + + # Get QR code SVG from qrcode lib, read it and redraw path in svgwrite drawing. + buff = BytesIO() + im = self.qr_image() + im.save(buff) + m = re.search(ur']*>', buff.getvalue().decode()) + if not m: + raise Exception(u"Unable to extract path data from the QR code SVG image") + m = re.search(ur' d=\"([^\"]*)\"', m.group()) + if not m: + raise Exception(u"Unable to extract path d attributes from the SVG QR code source") + path_data = m.groups()[0] + path = dwg.path( + d=path_data, + style=u"fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none", + ) + path.translate(tx=250, ty=60) + # Limit scaling to some max dimensions + scale_factor = 3 - (max(im.width - 60, 0) * 0.05) + path.scale(sx=scale_factor, sy=scale_factor) + dwg.add(path) + + self.draw_swiss_cross(dwg, im.width * scale_factor) + + dwg.add(dwg.text(self.label(u"Currency"), (payment_left, u'80mm'), **head_font_info)) + dwg.add(dwg.text(self.label(u"Amount"), (add_mm(payment_left, u'12mm'), u'80mm'), **head_font_info)) + dwg.add(dwg.text(self.currency, (payment_left, u'85mm'), **font_info)) + if self.amount: + dwg.add(dwg.text(format_amount(self.amount), (add_mm(payment_left, u'12mm'), u'85mm'), **font_info)) + else: + self.draw_blank_rect( + dwg, x=add_mm(receipt_width, margin, u'12mm'), y=u'83mm', + width=u'40mm', height=u'15mm' + ) + + # Right side of the bill + y_pos = 10 + line_space = 3.5 + + def add_header(dwg, payment_detail_left, y_pos, text): + y_pos += 1 + dwg.add(dwg.text(text, (payment_detail_left, u'%smm' % y_pos), **head_font_info)) + y_pos += line_space + return y_pos + + y_pos = add_header(dwg, payment_detail_left, y_pos, self.label(u"Account / Payable to")) + dwg.add(dwg.text( + iban.format(self.account), (payment_detail_left, u'%smm' % y_pos), **font_info + )) + y_pos += line_space + + for line_text in self.creditor.as_paragraph(): + dwg.add(dwg.text(line_text, (payment_detail_left, u'%smm' % y_pos), **font_info)) + y_pos += line_space + + if self.ref_number: + y_pos = add_header(dwg, payment_detail_left, y_pos, self.label(u"Reference")) + dwg.add(dwg.text( + format_ref_number(self), (payment_detail_left, u'%smm' % y_pos), **font_info + )) + y_pos += line_space + + if self.extra_infos: + y_pos = add_header(dwg, payment_detail_left, y_pos, self.label(u"Additional information")) + if u'##' in self.extra_infos: + extra_infos = self.extra_infos.split(u'##') + extra_infos[1] = u'##' + extra_infos[1] + else: + extra_infos = [self.extra_infos] + # TODO: handle line breaks for long infos (mandatory 5mm margin) + for info in wrap_infos(extra_infos): + dwg.add(dwg.text(info, (payment_detail_left, u'%smm' % y_pos), **font_info)) + y_pos += line_space + + if self.debtor: + y_pos = add_header(dwg, payment_detail_left, y_pos, self.label(u"Payable by")) + for line_text in self.debtor.as_paragraph(): + dwg.add(dwg.text(line_text, (payment_detail_left, u'%smm' % y_pos), **font_info)) + y_pos += line_space + else: + y_pos = add_header(dwg, payment_detail_left, y_pos, self.label(u"Payable by (name/address)")) + # The specs recomment at least 2.5 x 6.5 cm + self.draw_blank_rect( + dwg, x=payment_detail_left, y=u'%smm' % y_pos, + width=u'65mm', height=u'25mm' + ) + y_pos += 28 + + if self.final_creditor: + y_pos = add_header(dwg, payment_detail_left, y_pos, self.label(u"In favor of")) + for line_text in self.final_creditor.as_paragraph(): + dwg.add(dwg.text(line_text, (payment_detail_left, u'%smm' % y_pos), **font_info)) + y_pos += line_space + + if self.due_date: + y_pos = add_header(dwg, payment_detail_left, y_pos, self.label(u"Payable by ")) + dwg.add(dwg.text( + format_date(self.due_date), (payment_detail_left, u'%smm' % y_pos), **font_info + )) + y_pos += line_space + + if file_obj: + dwg.write(file_obj) + else: + dwg.save() + +def add_mm(*mms): + u"""Utility to allow additions of '23mm'-type strings.""" + return u'%smm' % unicode(sum(float(mm[:-2]) for mm in mms)) + + +def format_ref_number(bill): + if not bill.ref_number: + return u'' + num = bill.ref_number + if bill.ref_type == u"QRR": + return esr.format(num) + elif bill.ref_type == u"SCOR": + return iso11649.format(num) + else: + return num + + +def format_date(date_): + if not date_: + return u'' + return date_.strftime(u'%d.%m.%Y') + + +def format_amount(amount_): + return u'{:,.2f}'.format(float(amount_)).replace(u",", u" ") + + +def wrap_infos(infos): + for text in infos: + while(text): + yield text[:42] + text = text[42:] diff --git a/truffe2/accounting_tools/templates/accounting_tools/invoice/pdf.html b/truffe2/accounting_tools/templates/accounting_tools/invoice/pdf.html index cc2bda57..d9a43d49 100644 --- a/truffe2/accounting_tools/templates/accounting_tools/invoice/pdf.html +++ b/truffe2/accounting_tools/templates/accounting_tools/invoice/pdf.html @@ -4,16 +4,36 @@ {% block bonus_css_pdf %} @page { size: a4 portrait; - margin: 1cm; - margin-bottom: 2cm; - margin-top: 5cm; + @frame { + margin-left: 1cm; + margin-right: 1cm; + margin-bottom: 2cm; + margin-top: 5cm; + } - @frame footer { - -pdf-frame-content: footerContent; - bottom: 0cm; + @frame logoFrame { + -pdf-frame-content: logoFrameContent; + top: 1.0cm; + right: 1.2cm; + width: 35%; + } + + @frame headerFrame { + -pdf-frame-content: headerFrameContent; + top: 1.1cm; + left: 1.2cm; + width: 50%; + } + + } + + @page qr { + size: a4 portrait; + @frame { margin-left: 1cm; margin-right: 1cm; - height: 1cm; + margin-bottom: 107.5mm; + margin-top: 5cm; } @frame logoFrame { @@ -29,6 +49,23 @@ left: 1.2cm; width: 50%; } + + @frame qr { + -pdf-frame-content: qr; + bottom: 0cm; + left: 0cm; + width: 100%; + height: 105.5mm; + } + + @frame qr_comments { + -pdf-frame-content: qr_comments; + margin-left: 1cm; + margin-right: 1cm; + margin-bottom: 115.5mm; + margin-top: 5cm; + } + } .maintable .tr-a { @@ -69,6 +106,16 @@ body { font-size: 12px; } + + #qr img { + zoom: 150%; + } + + .pay_title + { + -pdf-keep-with-next: true; + font-size: 120%; + } {% endblock %} {% block content %} @@ -83,56 +130,68 @@ Générale des - Fax : - +41 21 693 2097 + Email : + contact@agepoly.ch Etudiants de l’école - Email : - agepoly@epfl.ch + Web : + agepoly.ch Polytechnique Fédérale - Web : - http://agepoly.epfl.ch + IBAN : + CH19 0483 5028 7897 7100 0 de Lausanne - Banque : - Credit Suisse - Zürich + TVA : + CHE-113.397.612 - CASE POSTALE 16 - Compte : - 0425-287897-71 + + Addr : + Case Postale 16 - CH - 1015 LAUSANNE EPFL - TVA : - CHE-113.397.612 + + + CH-1015 LAUSANNE EPFL
+
+ {% if invoice.costcenter.unit.pk != 1 %}{{ invoice.costcenter.unit }} {% endif %} +
-
- - {% if invoice.add_to %} - {% trans "À l'attention de" %}
- {% endif %} - {{invoice.address|linebreaksbr}} - - {% if invoice.date_and_place %} - {% if invoice.address %}

{% endif %} - - {{invoice.date_and_place}} - {% endif %} -
+ + + + + +
+ +
+ {% if invoice.add_to %} + {% trans "À l'attention de" %}
+ {% endif %} + + {{ invoice.client_name }} +
+ {{invoice.multiline_address|linebreaksbr}} +
+
+ {% if invoice.date_and_place %} + {{invoice.date_and_place}} + {% endif %} +
+
-

{% trans "Facture" %}
{% trans "N°" %} {{invoice.get_reference}}

+

{% trans "Facture" %} {% trans "N°" %}{{invoice.get_reference}}

{{invoice.preface|linebreaksbr}} @@ -140,11 +199,11 @@

{% trans "Facture" %}
{% t - + - + {% for line in invoice.get_lines %} @@ -174,65 +233,51 @@

{% trans "Facture" %}
{% t {% if invoice.ending %} {{invoice.ending}} -

+
{% endif %} - {% if invoice.display_bvr %} + {% if invoice.display_qr %} +

{% if invoice.delay > 0 %} - {% blocktrans with d=invoice.delay %} - Nous vous remercions de bien vouloir payer ce montant à {{d}} jours sur le compte de l'AGEPoly au moyen de bulletin de versement annexé. - {% endblocktrans %} + {% blocktrans with d=invoice.delay %}Nous vous remercions de bien vouloir payer ce montant à {{d}} jours avec les informations de paiement à la page suivante.{% endblocktrans %} {% else %} - {% trans "Nous vous remercions de bien vouloir payer ce montant sur le compte de l'AGEPoly au moyen de bulletin de versement annexé." %} + {% trans "Nous vous remercions de bien vouloir payer ce montant avec les informations de paiement à la page suivante." %} {% endif %} -

+

+
{% endif %} - - {% if invoice.display_account %} - {% if invoice.display_bvr %} - {% trans "Vous pouvez aussi effectuer le paiement sur le compte suivant :" %}
- {% else %} - + {% if not invoice.display_qr %} +

{% if invoice.delay > 0 %} - {% blocktrans with d=invoice.delay %} - Nous vous remercions de bien vouloir payer ce montant à {{d}} jours sur le compte suivant : - {% endblocktrans %} + {% blocktrans with d=invoice.delay %}Nous vous remercions de bien vouloir payer ce montant à {{d}} jours sur le compte suivant :{% endblocktrans %} {% else %} {% trans "Nous vous remercions de bien vouloir payer ce montant sur le compte suivant :" %} {% endif %} - {% endif %} +

-
+
-

  {% trans "Description" %}  {% trans "Description" %} {% trans "Prix unitaire" %} {% trans "% TVA" %} {% trans "TVA" %}{% trans "Total" %}{% trans "Total" %}
- - - - - - - - - - - - +
{% trans "Banque" %} :Credit Suisse - Zürich
CCP :80 500 4
{% trans "Compte" %} :No. 0425-287897-71
- - + + + + + + - +
Clearing :4835{% trans "Banque" %} :Credit Suisse - Zürich
IBAN : CH19 0483 5028 7897 7100 0
BIC/SWIFT : CRESCHZZ80A
{% trans "Mention/Référence" %} :{{invoice.get_reference}}{{invoice.get_qr_ref}}
@@ -240,7 +285,7 @@

{% trans "Facture" %}
{% t

{% endif %} - + {% if invoice.greetings %} {{invoice.greetings|linebreaksbr}}

@@ -262,35 +307,72 @@

{% trans "Facture" %}
{% t {% trans "Annexe(s): ment." %} {% endif %} + {% if invoice.display_qr %} + + +
+ +
+

{% trans "Facture" %} {% trans "N°" %} {{invoice.get_reference}}

+
+ +


+ +
+

+ {% trans "Virement Bancaire" %} +

+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
{% trans "Banque" %} :Credit Suisse - Zürich
IBAN :CH19 0483 5028 7897 7100 0
BIC/SWIFT :CRESCHZZ80A
{% trans "Mention/Référence" %} :{{invoice.get_qr_ref}}
{% trans "Adresse" %} :Case Postale 16
CH-1015 LAUSANNE EPFL
+
+ +








+ +

+ {% trans "QR Facture" %} +

+
+
- {% if invoice.display_bvr %} - - -
-
-
-
-
-
-
-
-
-
-
-

-
- -
- - {% trans "Attention: Ce BVR ne peut pas être utilisé pour un paiement aux guichets de la poste ou d'une banque" %} -
+

This is a fake placeholder

+
+ +
+ {% endif %} {% endlanguage %} {% endblock %} {% block footer %} -
{% trans "Page" %} - {% trans "Généré le" %} {{cdate|date:"d/m/Y"}} [{{user.pk}}]
{% endblock %} diff --git a/truffe2/accounting_tools/templates/accounting_tools/invoice/show.html b/truffe2/accounting_tools/templates/accounting_tools/invoice/show.html index f6b65592..3624929a 100644 --- a/truffe2/accounting_tools/templates/accounting_tools/invoice/show.html +++ b/truffe2/accounting_tools/templates/accounting_tools/invoice/show.html @@ -3,6 +3,7 @@ {% block bonus_buttons %} {% ifhasright obj user 'DOWNLOAD_PDF' %} + QR-Facture PDF {% endifhasright %} {% endblock %} diff --git a/truffe2/accounting_tools/urls.py b/truffe2/accounting_tools/urls.py index 743a2ebc..24915f47 100644 --- a/truffe2/accounting_tools/urls.py +++ b/truffe2/accounting_tools/urls.py @@ -10,7 +10,7 @@ url(r'^subvention/export_all$', 'export_all_demands'), url(r'^invoice/(?P[0-9]+)/pdf/', 'invoice_pdf'), - url(r'^invoice/(?P[0-9]+)/bvr/', 'invoice_bvr'), + url(r'^invoice/(?P[0-9]+)/qr/', 'invoice_qr'), url(r'^withdrawal/(?P[0-9]+)/pdf/', 'withdrawal_pdf'), url(r'^withdrawal/list/', 'withdrawal_available_list'), diff --git a/truffe2/accounting_tools/views.py b/truffe2/accounting_tools/views.py index 1cd2e065..4023404a 100644 --- a/truffe2/accounting_tools/views.py +++ b/truffe2/accounting_tools/views.py @@ -91,15 +91,17 @@ def invoice_pdf(request, pk): if not invoice.rights_can('DOWNLOAD_PDF', request.user): raise Http404 - img = invoice.generate_bvr() - img = img.resize((1414, 1000), Image.LANCZOS) - img.save(os.path.join(settings.MEDIA_ROOT, 'cache/bvr/{}.png').format(invoice.pk)) + qr = invoice.generate_QR() + qr.as_svg(os.path.join(settings.MEDIA_ROOT, 'cache/bvr/qr-{}.svg'.format(invoice.pk))) + + os.system("rsvg-convert -y 4 -x 4 {} -o {}".format(os.path.join(settings.MEDIA_ROOT, 'cache/bvr/qr-{}.svg'.format(invoice.pk)), + os.path.join(settings.MEDIA_ROOT, 'cache/bvr/qr-{}.png'.format(invoice.pk)))) return generate_pdf("accounting_tools/invoice/pdf.html", request, {'invoice': invoice}) @login_required -def invoice_bvr(request, pk): +def invoice_qr(request, pk): from accounting_tools.models import Invoice @@ -108,10 +110,11 @@ def invoice_bvr(request, pk): if not invoice.rights_can('SHOW', request.user): raise Http404 - img = invoice.generate_bvr() + response = HttpResponse(mimetype="image/svg") + + qr = invoice.generate_QR() + qr.as_svg('Facture - {}.svg'.format(invoice.get_qr_ref()), response) - response = HttpResponse(mimetype="image/png") - img.save(response, 'png') return response diff --git a/truffe2/data/pip-reqs.txt b/truffe2/data/pip-reqs.txt index 7d22803e..27fe487e 100644 --- a/truffe2/data/pip-reqs.txt +++ b/truffe2/data/pip-reqs.txt @@ -27,4 +27,10 @@ pypdf pyyaml wand schwifty -iso4217 # currency list \ No newline at end of file +svglib +iso4217 # currency list +# qrbill # python3 +iso3166 # qrbill python2.7 backport +python-stdnum>=1.13 # qrbill python2.7 backport +qrcode # qrbill python2.7 backport +svgwrite # qrbill python2.7 backport diff --git a/truffe2/locale/en_US/LC_MESSAGES/django.mo b/truffe2/locale/en_US/LC_MESSAGES/django.mo index 77ae2784..f6b5a11b 100644 Binary files a/truffe2/locale/en_US/LC_MESSAGES/django.mo and b/truffe2/locale/en_US/LC_MESSAGES/django.mo differ diff --git a/truffe2/locale/en_US/LC_MESSAGES/django.po b/truffe2/locale/en_US/LC_MESSAGES/django.po index 9d87466f..09f700ef 100644 --- a/truffe2/locale/en_US/LC_MESSAGES/django.po +++ b/truffe2/locale/en_US/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-21 15:08+0200\n" +"POT-Creation-Date: 2020-06-08 17:15+0200\n" "PO-Revision-Date: 2016-05-21 15:09+0200\n" "Last-Translator: Maximilien Cuony \n" "Language-Team: \n" @@ -17,12 +17,12 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.7.1\n" -#: accounting_core/models.py:19 accounting_core/models.py:435 +#: accounting_core/models.py:19 accounting_core/models.py:438 #: accounting_core/templates/accounting_core/account/sub_ac_pdf.html:21 #: accounting_core/templates/accounting_core/costcenter/liste_pdf.html:10 #: accounting_main/templates/accounting_main/accountingline/_budget_view_account.html:23 -#: communication/models.py:149 members/models.py:19 units/models.py:36 -#: units/models.py:45 units/models.py:307 units/models.py:314 +#: communication/models.py:151 members/models.py:19 units/models.py:36 +#: units/models.py:45 units/models.py:321 units/models.py:328 #: users/templates/users/users/list.html:26 #: users/templates/users/users/myunit_list.html:26 #: users/templates/users/users/myunit_pdf.html:25 @@ -33,13 +33,13 @@ msgstr "" msgid "Nom" msgstr "" -#: accounting_core/models.py:20 communication/models.py:85 -#: logistics/models.py:104 logistics/models.py:361 +#: accounting_core/models.py:20 communication/models.py:88 +#: communication/models.py:283 logistics/models.py:102 logistics/models.py:378 msgid "Date de début" msgstr "" -#: accounting_core/models.py:21 communication/models.py:86 -#: logistics/models.py:105 logistics/models.py:362 +#: accounting_core/models.py:21 communication/models.py:89 +#: communication/models.py:284 logistics/models.py:103 logistics/models.py:379 msgid "Date de fin" msgstr "" @@ -55,33 +55,34 @@ msgstr "" msgid "Nom de l'année comptable" msgstr "" -#: accounting_core/models.py:28 communication/models.py:23 -#: communication/models.py:29 communication/models.py:91 -#: logistics/models.py:115 logistics/models.py:372 main/models.py:46 -#: vehicles/models.py:243 +#: accounting_core/models.py:28 communication/models.py:27 +#: communication/models.py:33 communication/models.py:94 +#: communication/models.py:294 logistics/models.py:113 logistics/models.py:391 +#: main/models.py:50 vehicles/models.py:243 msgid "Date début" msgstr "" -#: accounting_core/models.py:29 communication/models.py:24 -#: communication/models.py:30 communication/models.py:92 -#: logistics/models.py:116 logistics/models.py:373 main/models.py:47 -#: vehicles/models.py:244 +#: accounting_core/models.py:29 communication/models.py:28 +#: communication/models.py:34 communication/models.py:95 +#: communication/models.py:295 logistics/models.py:114 logistics/models.py:392 +#: main/models.py:51 vehicles/models.py:244 msgid "Date fin" msgstr "" #: accounting_core/models.py:30 accounting_main/models.py:63 #: accounting_main/models.py:321 accounting_main/models.py:534 -#: accounting_tools/models.py:78 accounting_tools/models.py:342 -#: accounting_tools/models.py:753 accounting_tools/models.py:945 -#: accounting_tools/models.py:1181 accounting_tools/models.py:1350 -#: communication/models.py:31 communication/models.py:93 -#: logistics/models.py:117 logistics/models.py:374 main/models.py:48 -#: members/models.py:32 vehicles/models.py:247 -#: vehicles/templates/vehicles/booking/pdf.html:16 +#: accounting_tools/models.py:82 accounting_tools/models.py:345 +#: accounting_tools/models.py:720 accounting_tools/models.py:940 +#: accounting_tools/models.py:1182 accounting_tools/models.py:1431 +#: accounting_tools/models.py:1442 accounting_tools/models.py:1611 +#: communication/models.py:35 communication/models.py:96 +#: communication/models.py:296 logistics/models.py:115 logistics/models.py:393 +#: main/models.py:52 members/models.py:34 vehicles/models.py:247 +#: vehicles/templates/vehicles/booking/pdf.html:19 msgid "Statut" msgstr "" -#: accounting_core/models.py:39 templates/base.html:455 +#: accounting_core/models.py:39 templates/base.html:514 msgid "Années Comptables" msgstr "" @@ -95,8 +96,8 @@ msgid "" "documents comptables." msgstr "" -#: accounting_core/models.py:53 accounting_tools/models.py:443 -#: members/models.py:59 +#: accounting_core/models.py:53 accounting_tools/models.py:444 +#: members/models.py:61 msgid "En préparation" msgstr "" @@ -140,21 +141,21 @@ msgstr "" msgid "Archiver l'année" msgstr "" -#: accounting_core/models.py:122 generic/models.py:581 main/models.py:31 -#: members/models.py:143 +#: accounting_core/models.py:122 generic/models.py:588 main/models.py:35 +#: members/models.py:150 msgid "Seul un super utilisateur peut sortir cet élément de l'état archivé" msgstr "" #: accounting_core/models.py:125 accounting_main/models.py:739 -#: accounting_tools/models.py:248 members/models.py:146 +#: accounting_tools/models.py:252 members/models.py:153 msgid "Seul un super utilisateur peut sauter des étapes ou revenir en arrière." msgstr "" #: accounting_core/models.py:128 accounting_main/models.py:200 #: accounting_main/models.py:414 accounting_main/models.py:745 -#: accounting_tools/models.py:254 accounting_tools/models.py:575 -#: accounting_tools/models.py:869 accounting_tools/models.py:1088 -#: generic/models.py:599 generic/models.py:890 members/models.py:149 +#: accounting_tools/models.py:258 accounting_tools/models.py:580 +#: accounting_tools/models.py:860 accounting_tools/models.py:1088 +#: generic/models.py:606 generic/models.py:929 members/models.py:156 msgid "Pas les droits." msgstr "" @@ -175,19 +176,21 @@ msgstr "" #: accounting_core/models.py:339 accounting_core/models.py:354 #: accounting_core/templates/accounting_core/account/sub_ac_pdf.html:22 #: accounting_core/templates/accounting_core/costcenter/liste_pdf.html:11 -#: accounting_tools/models.py:48 accounting_tools/models.py:84 -#: accounting_tools/models.py:740 accounting_tools/models.py:756 -#: accounting_tools/models.py:935 accounting_tools/models.py:948 -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:143 -#: generic/templates/generic/generic/directory.html:40 logistics/models.py:44 -#: logistics/models.py:301 +#: accounting_tools/models.py:51 accounting_tools/models.py:88 +#: accounting_tools/models.py:706 accounting_tools/models.py:723 +#: accounting_tools/models.py:930 accounting_tools/models.py:943 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:202 +#: communication/models.py:226 +#: communication/templates/communication/displayreservation/show.html:8 +#: generic/templates/generic/generic/directory.html:40 logistics/models.py:42 +#: logistics/models.py:307 #: logistics/templates/logistics/roomreservation/show.html:8 -#: logistics/templates/logistics/supplyreservation/show.html:8 -#: main/models.py:131 main/models.py:165 main/models.py:236 main/models.py:261 -#: units/models.py:52 units/models.py:315 vehicles/models.py:21 -#: vehicles/models.py:28 vehicles/models.py:74 vehicles/models.py:82 -#: vehicles/models.py:124 vehicles/models.py:134 vehicles/models.py:177 -#: vehicles/models.py:185 +#: logistics/templates/logistics/supplyreservation/show.html:12 +#: main/models.py:135 main/models.py:169 main/models.py:240 main/models.py:255 +#: main/models.py:339 main/models.py:364 units/models.py:52 units/models.py:329 +#: vehicles/models.py:21 vehicles/models.py:28 vehicles/models.py:74 +#: vehicles/models.py:82 vehicles/models.py:124 vehicles/models.py:134 +#: vehicles/models.py:177 vehicles/models.py:185 msgid "Description" msgstr "Description" @@ -198,13 +201,13 @@ msgstr "" #: accounting_core/models.py:201 accounting_core/models.py:354 #: accounting_core/utils.py:15 accounting_main/models.py:537 -#: accounting_tools/models.py:84 accounting_tools/models.py:756 -#: accounting_tools/models.py:948 accounting_tools/models.py:1184 -#: accounting_tools/models.py:1353 +#: accounting_tools/models.py:88 accounting_tools/models.py:723 +#: accounting_tools/models.py:943 accounting_tools/models.py:1185 +#: accounting_tools/models.py:1443 accounting_tools/models.py:1614 msgid "Année comptable" msgstr "" -#: accounting_core/models.py:204 templates/base.html:460 +#: accounting_core/models.py:204 templates/base.html:519 msgid "Centres de coût" msgstr "" @@ -307,7 +310,7 @@ msgstr "" msgid "Catégorie" msgstr "" -#: accounting_core/models.py:354 communication/models.py:151 +#: accounting_core/models.py:354 communication/models.py:153 #: rights/utils.py:340 users/templates/users/users/edit.html:48 msgid "Visibilité" msgstr "" @@ -345,7 +348,7 @@ msgstr "" msgid "Nom de la TVA" msgstr "" -#: accounting_core/models.py:427 accounting_core/models.py:436 +#: accounting_core/models.py:427 accounting_core/models.py:439 msgid "Valeur (%)" msgstr "" @@ -353,25 +356,35 @@ msgstr "" msgid "Limiter l'usage au comité de l'AGEPoly" msgstr "" -#: accounting_core/models.py:437 +#: accounting_core/models.py:429 +msgid "Compte de TVA" +msgstr "TVA Account" + +#: accounting_core/models.py:430 +msgid "Code de TVA" +msgstr "TVA Code" + +#: accounting_core/models.py:440 msgid "Limité AGEPoly ?" msgstr "" -#: accounting_core/models.py:445 accounting_main/models.py:39 -#: accounting_tools/models.py:415 accounting_tools/models.py:713 -#: accounting_tools/models.py:1241 accounting_tools/models.py:1312 -#: accounting_tools/models.py:1406 accounting_tools/models.py:1515 +#: accounting_core/models.py:448 accounting_main/models.py:39 +#: accounting_tools/models.py:415 accounting_tools/models.py:679 +#: accounting_tools/models.py:1242 accounting_tools/models.py:1313 +#: accounting_tools/models.py:1502 accounting_tools/models.py:1572 +#: accounting_tools/models.py:1667 accounting_tools/models.py:1779 #: accounting_tools/templates/accounting_tools/cashbook/pdf.html:28 #: accounting_tools/templates/accounting_tools/expenseclaim/pdf.html:18 -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:146 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:205 +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:18 msgid "TVA" msgstr "VAT" -#: accounting_core/models.py:446 +#: accounting_core/models.py:449 msgid "Liste des taux de TVA" msgstr "" -#: accounting_core/models.py:454 +#: accounting_core/models.py:457 msgid "" "Les TVA sélectionnables dans les champs de TVA. Il est possible de " "restrainre l'usage de certaines TVA au CDD.\n" @@ -380,28 +393,36 @@ msgid "" "les modifier à tout moment sans risques." msgstr "" -#: accounting_core/models.py:472 +#: accounting_core/models.py:475 msgid "Peut utiliser n'importe quelle valeure de TVA." msgstr "" -#: accounting_core/models.py:505 +#: accounting_core/models.py:508 msgid "L'administrateur de l'AGEPoly" msgstr "" -#: accounting_core/models.py:506 +#: accounting_core/models.py:509 msgid "Les secrétaires de l'AGEPoly" msgstr "" -#: accounting_core/models.py:507 +#: accounting_core/models.py:510 msgid "Le trésorier de l'unité liée" msgstr "" -#: accounting_core/models.py:508 +#: accounting_core/models.py:511 msgid "" "Toutes les personnes liées via la compta (Admin et secrétaires AGEP, " "trésorier unité, éditeurs de l'objet)" msgstr "" +#: accounting_core/utils.py:52 accounting_tools/models.py:346 +msgid "Centre de coût" +msgstr "" + +#: accounting_core/views.py:64 accounting_main/views.py:82 +msgid "Copie terminée avec succès" +msgstr "" + #: accounting_core/templates/accounting_core/account/list.html:8 msgid "Plan comptable" msgstr "" @@ -453,14 +474,6 @@ msgid "" "tu sur de vouloir l'utiliser ?" msgstr "" -#: accounting_core/utils.py:52 accounting_tools/models.py:343 -msgid "Centre de coût" -msgstr "" - -#: accounting_core/views.py:64 accounting_main/views.py:95 -msgid "Copie terminée avec succès" -msgstr "" - #: accounting_main/forms2.py:12 msgid "L'année comptable" msgstr "" @@ -481,6 +494,22 @@ msgstr "" msgid "Format CSV 2014" msgstr "" +#: accounting_main/forms2.py:21 +msgid "Filtrer du" +msgstr "" + +#: accounting_main/forms2.py:22 +#: accounting_main/templates/accounting_main/accountingline/budget_view.html:20 +#: users/templates/users/users/profile.html:89 +#: vehicles/templates/vehicles/booking/switch_status.html:20 +msgid "au" +msgstr "" + +#: accounting_main/forms2.py:29 communication/models.py:400 +#: logistics/models.py:225 logistics/models.py:570 +msgid "La date de fin ne peut pas être avant la date de début !" +msgstr "" + #: accounting_main/models.py:37 accounting_main/models.py:56 msgid "Compte de CG" msgstr "" @@ -508,8 +537,10 @@ msgstr "" #: accounting_main/templates/accounting_main/import/step2.html:72 #: accounting_main/templates/accounting_main/import/step2.html:117 #: accounting_main/templates/accounting_main/import/step2.html:154 -#: accounting_tools/models.py:1400 accounting_tools/models.py:1508 +#: accounting_tools/models.py:1661 accounting_tools/models.py:1772 #: accounting_tools/templates/accounting_tools/cashbook/pdf.html:24 +#: main/templates/main/signabledocument/sign.html:41 +#: main/templates/main/signabledocument/signs.html:65 #: notifications/templates/notifications/center/index.html:41 msgid "Date" msgstr "" @@ -536,8 +567,9 @@ msgstr "VAT %" #: accounting_main/templates/accounting_main/import/step2.html:71 #: accounting_main/templates/accounting_main/import/step2.html:116 #: accounting_main/templates/accounting_main/import/step2.html:153 -#: accounting_tools/models.py:944 accounting_tools/models.py:1178 -#: accounting_tools/models.py:1347 +#: accounting_tools/models.py:939 accounting_tools/models.py:1178 +#: accounting_tools/models.py:1427 accounting_tools/models.py:1436 +#: accounting_tools/models.py:1607 #: accounting_tools/templates/accounting_tools/internaltransfer/multiple_pdf.html:56 msgid "Centre de coûts" msgstr "" @@ -545,7 +577,7 @@ msgstr "" #: accounting_main/models.py:85 #: accounting_main/templates/accounting_main/import/step1.html:4 #: accounting_main/templates/accounting_main/import/step2.html:4 -#: templates/base.html:375 +#: templates/base.html:420 msgid "Comptabilité" msgstr "" @@ -565,7 +597,7 @@ msgstr "" msgid "En attente" msgstr "" -#: accounting_main/models.py:126 generic/models.py:733 +#: accounting_main/models.py:126 generic/models.py:748 msgid "Validé" msgstr "" @@ -636,7 +668,7 @@ msgstr "" #: accounting_main/models.py:331 #: accounting_main/templates/accounting_main/accountingline/show.html:6 -#: templates/base.html:384 +#: templates/base.html:429 msgid "Erreurs" msgstr "" @@ -712,22 +744,27 @@ msgstr "" msgid "Titre du budget" msgstr "" -#: accounting_main/models.py:532 accounting_tools/models.py:122 -#: accounting_tools/models.py:339 accounting_tools/models.py:412 -#: accounting_tools/models.py:710 accounting_tools/models.py:1177 -#: accounting_tools/models.py:1237 accounting_tools/models.py:1346 -#: accounting_tools/models.py:1402 communication/models.py:16 -#: communication/models.py:28 communication/models.py:81 -#: communication/models.py:90 logistics/models.py:22 logistics/models.py:38 -#: logistics/models.py:102 logistics/models.py:113 logistics/models.py:276 -#: logistics/models.py:294 logistics/models.py:359 logistics/models.py:370 -#: main/models.py:45 main/models.py:130 main/models.py:161 main/models.py:235 -#: main/models.py:256 units/models.py:370 vehicles/models.py:226 -#: vehicles/models.py:242 +#: accounting_main/models.py:532 accounting_tools/models.py:126 +#: accounting_tools/models.py:342 accounting_tools/models.py:412 +#: accounting_tools/models.py:676 accounting_tools/models.py:1177 +#: accounting_tools/models.py:1238 accounting_tools/models.py:1426 +#: accounting_tools/models.py:1435 accounting_tools/models.py:1499 +#: accounting_tools/models.py:1606 accounting_tools/models.py:1663 +#: communication/models.py:20 communication/models.py:32 +#: communication/models.py:84 communication/models.py:93 +#: communication/models.py:204 communication/models.py:220 +#: communication/models.py:281 communication/models.py:292 +#: logistics/models.py:20 logistics/models.py:36 logistics/models.py:100 +#: logistics/models.py:111 logistics/models.py:280 logistics/models.py:299 +#: logistics/models.py:389 main/models.py:49 main/models.py:134 +#: main/models.py:165 main/models.py:239 main/models.py:251 main/models.py:338 +#: main/models.py:359 main/templates/main/signabledocument/signs.html:19 +#: main/templates/main/signabledocument/signs.html:63 units/models.py:384 +#: vehicles/models.py:226 vehicles/models.py:242 msgid "Titre" msgstr "" -#: accounting_main/models.py:542 templates/base.html:418 +#: accounting_main/models.py:542 templates/base.html:476 msgid "Budgets" msgstr "" @@ -747,14 +784,14 @@ msgstr "" msgid "Le compte de CG {} n'existe pas dans cette année comptable." msgstr "" -#: accounting_main/models.py:658 accounting_tools/models.py:134 -#: accounting_tools/models.py:790 accounting_tools/models.py:981 -#: generic/models.py:701 generic/models.py:731 generic/models.py:784 -#: main/models.py:71 +#: accounting_main/models.py:658 accounting_tools/models.py:138 +#: accounting_tools/models.py:760 accounting_tools/models.py:976 +#: generic/models.py:714 generic/models.py:746 generic/models.py:811 +#: main/models.py:75 msgid "Brouillon" msgstr "" -#: accounting_main/models.py:659 accounting_tools/models.py:135 +#: accounting_main/models.py:659 accounting_tools/models.py:139 msgid "A corriger" msgstr "" @@ -798,8 +835,9 @@ msgstr "" msgid "Marquer le budget comme validé" msgstr "" -#: accounting_main/models.py:702 accounting_tools/models.py:173 -#: generic/models.py:825 generic/models.py:826 +#: accounting_main/models.py:702 accounting_tools/models.py:177 +#: generic/models.py:864 generic/models.py:865 generic/models.py:866 +#: generic/models.py:867 msgid "Demander des corrections" msgstr "" @@ -807,7 +845,7 @@ msgstr "" msgid "Remodifier" msgstr "" -#: accounting_main/models.py:735 accounting_tools/models.py:244 +#: accounting_main/models.py:735 accounting_tools/models.py:248 msgid "Seul un super utilisateur peut sortir cet élément de l'état traité" msgstr "" @@ -825,23 +863,35 @@ msgstr "" msgid "Budget" msgstr "" -#: accounting_main/models.py:786 accounting_tools/models.py:749 -#: accounting_tools/models.py:1239 accounting_tools/models.py:1310 -#: accounting_tools/models.py:1404 accounting_tools/models.py:1513 +#: accounting_main/models.py:786 accounting_tools/models.py:716 +#: accounting_tools/models.py:1240 accounting_tools/models.py:1311 +#: accounting_tools/models.py:1500 accounting_tools/models.py:1570 +#: accounting_tools/models.py:1665 accounting_tools/models.py:1777 #: accounting_tools/templates/accounting_tools/internaltransfer/multiple_pdf.html:56 -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:218 msgid "Compte" msgstr "Account" #: accounting_main/models.py:788 #: accounting_main/templates/accounting_main/accountingline/_budget_view_account.html:24 -#: accounting_tools/models.py:744 accounting_tools/models.py:750 -#: accounting_tools/models.py:936 accounting_tools/models.py:943 +#: accounting_tools/models.py:710 accounting_tools/models.py:717 +#: accounting_tools/models.py:931 accounting_tools/models.py:938 #: accounting_tools/templates/accounting_tools/expenseclaim/pdf.html:19 #: accounting_tools/templates/accounting_tools/internaltransfer/multiple_pdf.html:53 msgid "Montant" msgstr "" +#: accounting_main/views.py:57 +msgid "Message ajouté !" +msgstr "" + +#: accounting_main/views.py:152 +msgid "Session d'importation invalide." +msgstr "" + +#: accounting_main/views.py:482 +msgid "Compta importée ! Si tout est ok, n'oublie pas de notifier les gens." +msgstr "" + #: accounting_main/templates/accounting_main/accountingerror/show.html:37 msgid "Nouveau message" msgstr "" @@ -852,15 +902,33 @@ msgstr "" msgid "Envoyer" msgstr "" +#: accounting_main/templates/accounting_main/accountingline/_budget_view_account.html:45 +msgid "Total: " +msgstr "Sub total" + #: accounting_main/templates/accounting_main/accountingline/budget_view.html:9 msgid "Vue en budget de la compta" msgstr "" -#: accounting_main/templates/accounting_main/accountingline/budget_view.html:27 +#: accounting_main/templates/accounting_main/accountingline/budget_view.html:20 +msgid "Filtrage des entrées du " +msgstr "" + +#: accounting_main/templates/accounting_main/accountingline/budget_view.html:20 +msgid "inclus." +msgstr "" + +#: accounting_main/templates/accounting_main/accountingline/budget_view.html:41 +msgid "Filter" +msgstr "" + +#: accounting_main/templates/accounting_main/accountingline/budget_view.html:44 #: accounting_main/templates/accounting_main/accountingline/graph.html:19 +#: members/templates/members/memberset/info_api.html:103 #: members/templates/members/membership/add.html:27 #: members/templates/members/membership/add.html:46 #: members/templates/members/membership/import.html:30 +#: members/templates/members/membership/import_list.html:30 msgid "Fermer" msgstr "" @@ -884,20 +952,19 @@ msgstr "" #: generic/templates/generic/generic/show.html:175 #: generic/templates/generic/generic/show_deleted.html:21 #: notifications/templates/notifications/mails/new_notifs_html.html:19 -#: notifications/templates/notifications/mails/new_notifs_plain.txt:9 msgid "à" msgstr "" #: accounting_main/templates/accounting_main/budget/edit.html:15 #: generic/templates/generic/generic/directory.html:76 +#: generic/templates/generic/generic/show.html:4 #: generic/templates/generic/generic/mail/contact_html.html:22 #: generic/templates/generic/generic/mail/contact_html.html:24 -#: generic/templates/generic/generic/show.html:4 #: notifications/templates/notifications/mails/new_notif_html.html:18 #: notifications/templates/notifications/mails/new_notif_html.html:20 #: notifications/templates/notifications/mails/new_notifs_html.html:32 #: notifications/templates/notifications/mails/new_notifs_html.html:34 -#: notifications/templates/notifications/species/accounting_base.html:30 +#: notifications/templates/notifications/species/accounting_base.html:32 #: notifications/templates/notifications/species/accounting_error_created.html:15 #: notifications/templates/notifications/species/accounting_error_fixed.html:15 #: notifications/templates/notifications/species/accounting_error_message.html:15 @@ -908,6 +975,16 @@ msgstr "" #: notifications/templates/notifications/species/accreds_tovalidate.html:19 #: notifications/templates/notifications/species/accreds_validated.html:19 #: notifications/templates/notifications/species/accreds_warning.html:21 +#: notifications/templates/notifications/species/canceled.html:15 +#: notifications/templates/notifications/species/deleted.html:15 +#: notifications/templates/notifications/species/drafted.html:15 +#: notifications/templates/notifications/species/invoices_done.html:15 +#: notifications/templates/notifications/species/invoices_sent.html:15 +#: notifications/templates/notifications/species/invoices_to_correct.html:15 +#: notifications/templates/notifications/species/moderation.html:15 +#: notifications/templates/notifications/species/online.html:15 +#: notifications/templates/notifications/species/refused.html:15 +#: notifications/templates/notifications/species/validated.html:15 #: notifications/templates/notifications/species/center/buttons/accounting_accepted.html:6 #: notifications/templates/notifications/species/center/buttons/accounting_accountable.html:6 #: notifications/templates/notifications/species/center/buttons/accounting_canceled.html:6 @@ -924,26 +1001,15 @@ msgstr "" #: notifications/templates/notifications/species/center/buttons/accreds_tovalidate.html:6 #: notifications/templates/notifications/species/center/buttons/accreds_validated.html:6 #: notifications/templates/notifications/species/center/buttons/accreds_warning.html:6 +#: notifications/templates/notifications/species/center/buttons/canceled.html:6 #: notifications/templates/notifications/species/center/buttons/deleted.html:6 #: notifications/templates/notifications/species/center/buttons/drafted.html:6 -#: notifications/templates/notifications/species/center/buttons/invoices_bvr_needed.html:6 -#: notifications/templates/notifications/species/center/buttons/invoices_bvr_set.html:6 #: notifications/templates/notifications/species/center/buttons/invoices_done.html:6 #: notifications/templates/notifications/species/center/buttons/invoices_sent.html:6 #: notifications/templates/notifications/species/center/buttons/moderation.html:6 #: notifications/templates/notifications/species/center/buttons/online.html:6 #: notifications/templates/notifications/species/center/buttons/refused.html:6 #: notifications/templates/notifications/species/center/buttons/validated.html:6 -#: notifications/templates/notifications/species/deleted.html:15 -#: notifications/templates/notifications/species/drafted.html:15 -#: notifications/templates/notifications/species/invoices_bvr_needed.html:15 -#: notifications/templates/notifications/species/invoices_bvr_set.html:15 -#: notifications/templates/notifications/species/invoices_done.html:15 -#: notifications/templates/notifications/species/invoices_sent.html:15 -#: notifications/templates/notifications/species/moderation.html:15 -#: notifications/templates/notifications/species/online.html:15 -#: notifications/templates/notifications/species/refused.html:15 -#: notifications/templates/notifications/species/validated.html:15 #: units/templates/units/accreds/logs_list.html:27 msgid "Détails" msgstr "" @@ -969,11 +1035,10 @@ msgid "Ajouter une recette" msgstr "" #: accounting_main/templates/accounting_main/budget/edit.html:21 -#: accounting_tools/models.py:346 accounting_tools/models.py:1180 -#: accounting_tools/models.py:1349 -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:147 +#: accounting_tools/models.py:348 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:206 msgid "Total" -msgstr "" +msgstr "Total" #: accounting_main/templates/accounting_main/budget/edit.html:52 msgid "Es-tu sûr de vouloir quitter cette page ?" @@ -987,7 +1052,8 @@ msgstr "" #: accounting_tools/templates/accounting_tools/cashbook/list_json.html:5 #: accounting_tools/templates/accounting_tools/expenseclaim/list_json.html:5 #: accounting_tools/templates/accounting_tools/internaltransfer/list_json.html:5 -#: accounting_tools/templates/accounting_tools/invoice/list_json.html:5 +#: accounting_tools/templates/accounting_tools/invoice/list_json.html:6 +#: accounting_tools/templates/accounting_tools/providerinvoice/list_json.html:5 #: accounting_tools/templates/accounting_tools/withdrawal/list_json.html:5 msgid "PDF" msgstr "" @@ -1101,75 +1167,63 @@ msgstr "" msgid "Appliquer les changements" msgstr "" -#: accounting_main/views.py:70 -msgid "Message ajouté !" -msgstr "" - -#: accounting_main/views.py:165 -msgid "Session d'importation invalide." -msgstr "" - -#: accounting_main/views.py:495 -msgid "Compta importée ! Si tout est ok, n'oublie pas de notifier les gens." -msgstr "" - -#: accounting_tools/models.py:35 accounting_tools/models.py:90 +#: accounting_tools/models.py:38 accounting_tools/models.py:94 msgid "Subvention" msgstr "" -#: accounting_tools/models.py:36 +#: accounting_tools/models.py:39 msgid "Sponsoring" msgstr "" -#: accounting_tools/models.py:43 +#: accounting_tools/models.py:46 msgid "Nom du projet" msgstr "" -#: accounting_tools/models.py:44 accounting_tools/models.py:76 +#: accounting_tools/models.py:47 accounting_tools/models.py:80 msgid "Montant demandé" msgstr "" -#: accounting_tools/models.py:45 accounting_tools/models.py:85 +#: accounting_tools/models.py:48 accounting_tools/models.py:89 msgid "Montant attribué" msgstr "" -#: accounting_tools/models.py:46 +#: accounting_tools/models.py:49 msgid "Montant mobilité demandé" msgstr "" -#: accounting_tools/models.py:47 accounting_tools/models.py:86 +#: accounting_tools/models.py:50 accounting_tools/models.py:90 msgid "Montant mobilité attribué" msgstr "" -#: accounting_tools/models.py:49 +#: accounting_tools/models.py:52 msgid "Commentaire AGEPoly" msgstr "" -#: accounting_tools/models.py:50 +#: accounting_tools/models.py:53 #: accounting_tools/templates/accounting_tools/subvention/subventions_pdf.html:29 msgid "Type de soutien" msgstr "" -#: accounting_tools/models.py:51 +#: accounting_tools/models.py:54 msgid "Budget annuel lié" msgstr "" -#: accounting_tools/models.py:62 accounting_tools/models.py:89 -#: communication/models.py:156 communication/models.py:173 main/models.py:269 -#: templates/base.html:487 templates/base.html.py:502 templates/base.html:529 +#: accounting_tools/models.py:65 accounting_tools/models.py:93 +#: communication/models.py:158 communication/models.py:173 main/models.py:372 +#: templates/base.html:546 templates/base.html.py:561 templates/base.html:588 msgid "Fichiers" msgstr "" -#: accounting_tools/models.py:63 +#: accounting_tools/models.py:66 msgid "" -"Envoie les fichiers nécessaires pour ta demande de subvention.
\n" +"Envoie les fichiers nécessaires pour ta demande de subvention, les demandes " +"incomplètes ne seront pas considérées.
\n" +"En cas de question, merci de contacter administration@agepoly.ch.

\n" "Vous devez inclure dans votre demande au moins :\n" "
    \n" -"
  • Budget du projet. Merci d'utiliser le système de " -"budgets dans le menu latéral, ou ce modèle pour les externes à " -"l'AGEPoly. Un document complémentaire détaillant et expliquant le budget est " -"vivement recommandé.
  • \n" +"
  • Budget du projet. Un document complémentaire " +"détaillant et expliquant le budget est vivement recommandé.
  • \n" "
  • Bilans et comptes des d'activité des années précédentes
  • \n" "
  • Documents officiels (pour les Association hors AGEPoly) : statuts, " "liste des membres du comité, PV de la dernière AG
  • \n" @@ -1178,164 +1232,164 @@ msgid "" "possible, afin d'éviter les problèmes d'ouvertures et de mise en page." msgstr "" -#: accounting_tools/models.py:74 +#: accounting_tools/models.py:78 #: accounting_tools/templates/accounting_tools/subvention/subventions_pdf.html:27 msgid "Projet" msgstr "" -#: accounting_tools/models.py:75 +#: accounting_tools/models.py:79 msgid "Association / Commission" msgstr "" -#: accounting_tools/models.py:77 +#: accounting_tools/models.py:81 msgid "Mobilité demandé" msgstr "" -#: accounting_tools/models.py:91 +#: accounting_tools/models.py:95 msgid "Liste des demandes de subvention" msgstr "" -#: accounting_tools/models.py:106 +#: accounting_tools/models.py:110 msgid "" "Les demandes de subvention peuvent être faites par toutes les commissions ou " "associations auprès de l'AGEPoly." msgstr "" -#: accounting_tools/models.py:114 +#: accounting_tools/models.py:118 msgid "Evènements" msgstr "" -#: accounting_tools/models.py:123 +#: accounting_tools/models.py:127 msgid "Du" msgstr "" -#: accounting_tools/models.py:124 +#: accounting_tools/models.py:128 msgid "Au" msgstr "" -#: accounting_tools/models.py:125 vehicles/models.py:235 vehicles/models.py:255 -#: vehicles/models.py:322 vehicles/templates/vehicles/booking/pdf.html:32 +#: accounting_tools/models.py:129 vehicles/models.py:235 vehicles/models.py:255 +#: vehicles/models.py:335 vehicles/templates/vehicles/booking/pdf.html:35 msgid "Lieu" msgstr "" -#: accounting_tools/models.py:126 +#: accounting_tools/models.py:130 msgid "Nb personnes attendues" msgstr "" -#: accounting_tools/models.py:136 +#: accounting_tools/models.py:140 msgid "Demande soumise" msgstr "" -#: accounting_tools/models.py:137 +#: accounting_tools/models.py:141 msgid "Demande traitée" msgstr "" -#: accounting_tools/models.py:143 +#: accounting_tools/models.py:147 msgid "La demande est en cours de création et n'est pas publique." msgstr "" -#: accounting_tools/models.py:144 +#: accounting_tools/models.py:148 msgid "La demande a été soumise." msgstr "" -#: accounting_tools/models.py:145 +#: accounting_tools/models.py:149 msgid "La demande doit être corrigée." msgstr "" -#: accounting_tools/models.py:146 +#: accounting_tools/models.py:150 msgid "La demande a été traitée." msgstr "" -#: accounting_tools/models.py:171 accounting_tools/models.py:172 +#: accounting_tools/models.py:175 accounting_tools/models.py:176 msgid "Soumettre la demande" msgstr "" -#: accounting_tools/models.py:173 +#: accounting_tools/models.py:177 msgid "Marquer la demande comme traitée" msgstr "" -#: accounting_tools/models.py:188 +#: accounting_tools/models.py:192 msgid "Montant accordé" msgstr "" -#: accounting_tools/models.py:189 +#: accounting_tools/models.py:193 msgid "Montant mobilité accordé" msgstr "" -#: accounting_tools/models.py:220 +#: accounting_tools/models.py:224 msgid "Peut exporter les éléments" msgstr "" -#: accounting_tools/models.py:241 +#: accounting_tools/models.py:245 msgid "Le délait est dépassé pour les subventions !" msgstr "" -#: accounting_tools/models.py:251 +#: accounting_tools/models.py:255 msgid "" "Seul un membre du Comité de Direction peut marquer la demande comme traitée " "ou à corriger." msgstr "" -#: accounting_tools/models.py:266 +#: accounting_tools/models.py:270 msgid "" "Une demande de subvention pour cette unité existe déjà pour cette année " "comptable." msgstr "" -#: accounting_tools/models.py:298 +#: accounting_tools/models.py:302 msgid "Nom de l'évènement" msgstr "" -#: accounting_tools/models.py:299 +#: accounting_tools/models.py:303 msgid "Début de l'évènement" msgstr "" -#: accounting_tools/models.py:300 +#: accounting_tools/models.py:304 msgid "Fin de l'évènement" msgstr "" -#: accounting_tools/models.py:301 +#: accounting_tools/models.py:305 msgid "Lieu de l'évènement" msgstr "" -#: accounting_tools/models.py:302 +#: accounting_tools/models.py:306 msgid "Nombre de personnes attendues" msgstr "" -#: accounting_tools/models.py:304 +#: accounting_tools/models.py:308 msgid "Subvention/sponsoring" msgstr "" -#: accounting_tools/models.py:321 -msgid "Numéro de BVR manuel" +#: accounting_tools/models.py:325 +msgid "Nom du client" msgstr "" -#: accounting_tools/models.py:321 -msgid "" -"Ne PAS utiliser un numéro aléatoire, mais utiliser un VRAI et UNIQUE numéro " -"de BVR. Seulement pour des BVR physiques. Si pas renseigné, un numéro sera " -"généré automatiquement. Il est possible de demander des BVR à Marianne." +#: accounting_tools/models.py:325 +msgid "Exemple: 'Licorne SA - Monsieur Poney'" msgstr "" -#: accounting_tools/models.py:323 accounting_tools/models.py:349 -#: accounting_tools/models.py:1155 users/models.py:195 -#: users/templates/users/users/profile.html:56 +#: accounting_tools/models.py:326 accounting_tools/models.py:352 +#: accounting_tools/models.py:1155 accounting_tools/models.py:1335 +#: accounting_tools/models.py:1345 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:347 +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:56 +#: users/models.py:220 users/templates/users/users/profile.html:56 msgid "Adresse" -msgstr "" +msgstr "Address" -#: accounting_tools/models.py:323 -msgid "Exemple: 'Monsieur Poney - Rue Des Canard 19 - 1015 Lausanne'" +#: accounting_tools/models.py:326 accounting_tools/models.py:1335 +msgid "Exemple: 'Rue Des Arc en Ciel 25 - Case Postale 2, CH-1015 Lausanne'" msgstr "" -#: accounting_tools/models.py:324 accounting_tools/models.py:350 +#: accounting_tools/models.py:328 accounting_tools/models.py:353 msgid "Lieu et date" msgstr "" -#: accounting_tools/models.py:325 accounting_tools/models.py:351 +#: accounting_tools/models.py:329 accounting_tools/models.py:354 msgid "Introduction" msgstr "" -#: accounting_tools/models.py:325 +#: accounting_tools/models.py:329 msgid "" "Texte affiché avant la liste. Exemple: 'Pour l'achat du Yearbook 2014' ou " "'Chère Madame, - Par la présente, je me permets de vous remettre notre " @@ -1343,260 +1397,259 @@ msgid "" "académique 2014-2015.'" msgstr "" -#: accounting_tools/models.py:326 accounting_tools/models.py:352 +#: accounting_tools/models.py:330 accounting_tools/models.py:355 msgid "Conclusion" msgstr "" -#: accounting_tools/models.py:326 +#: accounting_tools/models.py:330 msgid "Affiché après la liste, avant les moyens de paiements" msgstr "" -#: accounting_tools/models.py:327 accounting_tools/models.py:353 -msgid "Afficher paiement via BVR" -msgstr "" - -#: accounting_tools/models.py:327 -msgid "" -"Affiche un BVR et le texte corespondant dans le PDF. Attention, le BVR " -"généré n'est pas utilisable à la poste ! (Il est possible d'obtenir un " -"'vrai' BVR via Marianne.)" -msgstr "" - -#: accounting_tools/models.py:328 accounting_tools/models.py:354 -msgid "Afficher paiement via compte" +#: accounting_tools/models.py:331 accounting_tools/models.py:356 +msgid "Afficher la QR Facture" msgstr "" -#: accounting_tools/models.py:328 -msgid "Affiche le texte pour le paiement via le compte de l'AGEPoly." +#: accounting_tools/models.py:331 +msgid "Affiche la QR Facture dans le PDF." msgstr "" -#: accounting_tools/models.py:329 accounting_tools/models.py:356 +#: accounting_tools/models.py:332 accounting_tools/models.py:358 msgid "Salutations" msgstr "" -#: accounting_tools/models.py:330 accounting_tools/models.py:357 +#: accounting_tools/models.py:333 accounting_tools/models.py:359 msgid "Signature" msgstr "" -#: accounting_tools/models.py:330 +#: accounting_tools/models.py:333 msgid "Titre de la zone de signature" msgstr "" -#: accounting_tools/models.py:331 accounting_tools/models.py:358 +#: accounting_tools/models.py:334 accounting_tools/models.py:360 msgid "Annexes" msgstr "" -#: accounting_tools/models.py:331 +#: accounting_tools/models.py:334 msgid "Affiche 'Annexe(s): ment.' en bas de la facture" msgstr "" -#: accounting_tools/models.py:332 accounting_tools/models.py:355 +#: accounting_tools/models.py:335 accounting_tools/models.py:357 msgid "Délai de paiement en jours" msgstr "" -#: accounting_tools/models.py:332 +#: accounting_tools/models.py:335 msgid "" "Mettre zéro pour cacher le texte. Il s'agit du nombre de jours de délai pour " "le paiement." msgstr "" -#: accounting_tools/models.py:333 app/settings.py:35 +#: accounting_tools/models.py:336 app/settings.py:35 msgid "Anglais" msgstr "" -#: accounting_tools/models.py:333 +#: accounting_tools/models.py:336 msgid "Génére la facture en anglais" msgstr "" -#: accounting_tools/models.py:334 accounting_tools/models.py:341 -#: accounting_tools/models.py:504 +#: accounting_tools/models.py:337 accounting_tools/models.py:344 +#: accounting_tools/models.py:523 msgid "Date valeur banque" msgstr "" -#: accounting_tools/models.py:334 +#: accounting_tools/models.py:337 msgid "Date de la réception du paiement au niveau de la banque" msgstr "" -#: accounting_tools/models.py:335 accounting_tools/models.py:360 +#: accounting_tools/models.py:338 accounting_tools/models.py:362 msgid "Rajouter \"À l'attention de\"" msgstr "Add \"To the attention of\"" -#: accounting_tools/models.py:340 +#: accounting_tools/models.py:343 msgid "Date de création" msgstr "" -#: accounting_tools/models.py:344 +#: accounting_tools/models.py:347 msgid "Référence" msgstr "" -#: accounting_tools/models.py:345 -msgid "Numéro de BVR" +#: accounting_tools/models.py:351 +msgid "Nom Client" msgstr "" -#: accounting_tools/models.py:359 +#: accounting_tools/models.py:361 msgid "Facture en anglais" msgstr "" -#: accounting_tools/models.py:365 -#: accounting_tools/templates/accounting_tools/invoice/list_json.html:5 -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:135 -#: accounting_tools/templates/accounting_tools/invoice/show.html:5 -msgid "Facture" -msgstr "Invoice" +#: accounting_tools/models.py:367 +msgid "Facture (client)" +msgstr "Invoice (inbound)" -#: accounting_tools/models.py:366 -msgid "Liste de toutes les factures" +#: accounting_tools/models.py:368 +msgid "Liste de toutes les factures (client)" msgstr "" -#: accounting_tools/models.py:376 +#: accounting_tools/models.py:378 msgid "" "Les factures te permettent de demander de l'argent à, par exemple, une " "entreprise. Tu DOIS déclarer toutes les factures que tu envoies via cet " "outil (tu n'es pas obligé d'utiliser le PDF généré, à condition qu'il " -"contienne TOUTES LES INFORMATIONS NÉCESSAIRES).\n" -"\n" -"Tu peux utiliser le numéro de BVR généré, ou demander à Marianne un 'vrai' " -"BVR. NE GENERE JAMAIS UN NUMÉRO DE BVR ALÉATOIRE OU DE TON CHOIX." +"contienne TOUTES LES INFORMATIONS NÉCESSAIRES)." msgstr "" -#: accounting_tools/models.py:404 accounting_tools/models.py:1229 -#: accounting_tools/models.py:1391 +#: accounting_tools/models.py:404 accounting_tools/models.py:1230 +#: accounting_tools/models.py:1491 accounting_tools/models.py:1652 msgid "Lignes" msgstr "" -#: accounting_tools/models.py:413 accounting_tools/models.py:711 -#: logistics/models.py:280 logistics/models.py:300 +#: accounting_tools/models.py:413 accounting_tools/models.py:677 +#: logistics/models.py:284 logistics/models.py:306 logistics/models.py:361 msgid "Quantité" msgstr "" -#: accounting_tools/models.py:414 accounting_tools/models.py:712 +#: accounting_tools/models.py:414 accounting_tools/models.py:678 msgid "Montant unitaire (HT)" msgstr "" -#: accounting_tools/models.py:416 accounting_tools/models.py:714 -#: accounting_tools/models.py:1242 accounting_tools/models.py:1313 -#: accounting_tools/models.py:1407 accounting_tools/models.py:1516 +#: accounting_tools/models.py:416 accounting_tools/models.py:680 +#: accounting_tools/models.py:1243 accounting_tools/models.py:1314 +#: accounting_tools/models.py:1503 accounting_tools/models.py:1573 +#: accounting_tools/models.py:1668 accounting_tools/models.py:1780 msgid "Montant (TTC)" msgstr "" -#: accounting_tools/models.py:444 -msgid "En attente d'un numéro BVR" +#: accounting_tools/models.py:445 generic/models.py:812 +msgid "Corrections nécessaires" +msgstr "" + +#: accounting_tools/models.py:446 +msgid "Attente Accord AGEPoly" +msgstr "" + +#: accounting_tools/models.py:447 +msgid "Attente Envoi" msgstr "" -#: accounting_tools/models.py:445 +#: accounting_tools/models.py:448 msgid "Envoyée / paiement en attente" msgstr "" -#: accounting_tools/models.py:446 +#: accounting_tools/models.py:449 msgid "Archivée / Paiement reçu" msgstr "" -#: accounting_tools/models.py:447 +#: accounting_tools/models.py:450 msgid "Annulée" msgstr "" -#: accounting_tools/models.py:453 +#: accounting_tools/models.py:456 msgid "La facture est en cours de rédaction" msgstr "" -#: accounting_tools/models.py:454 -msgid "La facture nécessite un vrai BVR, en attente d'attribution" +#: accounting_tools/models.py:457 +msgid "La facture doit être corrigée" +msgstr "" + +#: accounting_tools/models.py:458 +msgid "Il faut attendre l'accord de l'AGEPoly" +msgstr "" + +#: accounting_tools/models.py:459 +msgid "Il faut envoyez la facture" msgstr "" -#: accounting_tools/models.py:455 +#: accounting_tools/models.py:460 msgid "" "La facture a été envoyée, le paiement est en attente. La facture n'est plus " "éditable !" msgstr "" -#: accounting_tools/models.py:456 +#: accounting_tools/models.py:461 msgid "" "Le paiement de la facture a été reçu, le processus de facturation est " "terminé." msgstr "" -#: accounting_tools/models.py:457 +#: accounting_tools/models.py:462 msgid "La facture a été annulée" msgstr "" -#: accounting_tools/models.py:480 -msgid "Marquer comme envoyée" +#: accounting_tools/models.py:489 accounting_tools/models.py:490 +#: accounting_tools/models.py:499 accounting_tools/models.py:500 +msgid "Demande accord AGEPoly" msgstr "" -#: accounting_tools/models.py:480 -msgid "Demander un BVR" +#: accounting_tools/models.py:491 accounting_tools/models.py:501 +msgid "Donner l'accord" msgstr "" -#: accounting_tools/models.py:482 -msgid "Marquer comme terminée" +#: accounting_tools/models.py:492 accounting_tools/models.py:502 +msgid "Marquer comme envoyée" msgstr "" -#: accounting_tools/models.py:500 -msgid "BVR" +#: accounting_tools/models.py:493 accounting_tools/models.py:503 +msgid "Marquer comme terminée" msgstr "" -#: accounting_tools/models.py:500 +#: accounting_tools/models.py:583 msgid "" -"Soit le numéro complet, soit la fin, 94 42100 0...0 étant rajouté " -"automatiquement" -msgstr "" - -#: accounting_tools/models.py:542 -msgid "Numéro BVR invalide (Ne contenant pas 27 chiffres)" -msgstr "" - -#: accounting_tools/models.py:545 accounting_tools/models.py:694 -msgid "Numéro BVR invalide (Checksum)" +"Seul l'AGEPoly peut modifier une facture une fois qu'elle a été envoyée." msgstr "" -#: accounting_tools/models.py:548 accounting_tools/models.py:697 -msgid "Numéro BVR invalide (Doit commencer par 94 42100)" +#: accounting_tools/models.py:586 +msgid "Seul l'AGEPoly peut valider une facture." msgstr "" -#: accounting_tools/models.py:691 -msgid "Numéro BVR invalide (ne contenant pas 27 chiffres)" +#: accounting_tools/models.py:589 +msgid "Seul l'AGEPoly peut archiver une facture." msgstr "" -#: accounting_tools/models.py:739 +#: accounting_tools/models.py:705 msgid "Raison du transfert" msgstr "" -#: accounting_tools/models.py:741 +#: accounting_tools/models.py:707 msgid "Compte concerné" msgstr "" -#: accounting_tools/models.py:742 +#: accounting_tools/models.py:708 msgid "Centre de coûts prélevé" msgstr "" -#: accounting_tools/models.py:743 +#: accounting_tools/models.py:709 msgid "Centre de coûts versé" msgstr "" -#: accounting_tools/models.py:748 accounting_tools/models.py:942 -#: logistics/models.py:138 logistics/models.py:395 +#: accounting_tools/models.py:711 accounting_tools/models.py:723 +#: accounting_tools/models.py:819 +msgid "Date effective" +msgstr "" + +#: accounting_tools/models.py:715 accounting_tools/models.py:937 +#: communication/models.py:286 communication/models.py:317 +#: logistics/models.py:105 logistics/models.py:136 logistics/models.py:383 +#: logistics/models.py:414 msgid "Raison" msgstr "" -#: accounting_tools/models.py:751 +#: accounting_tools/models.py:718 msgid "De" msgstr "" -#: accounting_tools/models.py:752 +#: accounting_tools/models.py:719 msgid "Vers" msgstr "" -#: accounting_tools/models.py:759 +#: accounting_tools/models.py:726 #: accounting_tools/templates/accounting_tools/internaltransfer/multiple_pdf.html:48 -#: templates/base.html:403 +#: templates/base.html:448 msgid "Transferts internes" msgstr "" -#: accounting_tools/models.py:760 +#: accounting_tools/models.py:727 msgid "Liste des transferts internes" msgstr "" -#: accounting_tools/models.py:766 +#: accounting_tools/models.py:733 msgid "" "Les transferts internes permettent de déplacer de l'argent entre les " "entitées de l'AGEPoly sur un même compte.\n" @@ -1605,65 +1658,63 @@ msgid "" "remboursement d'une unité vers l'autre." msgstr "" -#: accounting_tools/models.py:791 accounting_tools/models.py:982 -#: generic/models.py:787 +#: accounting_tools/models.py:761 accounting_tools/models.py:977 msgid "Attente accord AGEPoly" msgstr "" -#: accounting_tools/models.py:792 generic/models.py:788 -#: main/templates/main/box/cashbooks.html:20 -#: main/templates/main/box/expenseclaims.html:20 +#: accounting_tools/models.py:762 generic/models.py:817 #: main/templates/main/box/internaltransfers.html:22 msgid "A comptabiliser" msgstr "" -#: accounting_tools/models.py:793 accounting_tools/models.py:985 -#: generic/models.py:704 generic/models.py:734 generic/models.py:789 -#: main/models.py:73 members/models.py:61 +#: accounting_tools/models.py:763 accounting_tools/models.py:980 +#: generic/models.py:717 generic/models.py:749 generic/models.py:819 +#: main/models.py:77 members/models.py:63 msgid "Archivé" msgstr "" -#: accounting_tools/models.py:794 accounting_tools/models.py:986 -#: generic/models.py:790 +#: accounting_tools/models.py:764 accounting_tools/models.py:981 +#: generic/models.py:719 generic/models.py:751 generic/models.py:820 msgid "Annulé" msgstr "" -#: accounting_tools/models.py:799 generic/models.py:795 +#: accounting_tools/models.py:769 generic/models.py:825 msgid "L'objet est en cours de création." msgstr "" -#: accounting_tools/models.py:800 generic/models.py:798 +#: accounting_tools/models.py:770 msgid "L'objet doit être accepté par l'AGEPoly." msgstr "" -#: accounting_tools/models.py:801 generic/models.py:799 +#: accounting_tools/models.py:771 generic/models.py:831 msgid "L'objet est en attente d'être comptabilisé." msgstr "" -#: accounting_tools/models.py:802 generic/models.py:713 generic/models.py:800 +#: accounting_tools/models.py:772 generic/models.py:727 msgid "L'objet est archivé. Il n'est plus modifiable." msgstr "" -#: accounting_tools/models.py:803 generic/models.py:801 +#: accounting_tools/models.py:773 generic/models.py:729 generic/models.py:834 #: notifications/templates/notifications/species/center/message/accounting_canceled.html:3 msgid "L'objet a été annulé." msgstr "" -#: accounting_tools/models.py:815 accounting_tools/models.py:1009 -#: generic/models.py:817 generic/models.py:825 +#: accounting_tools/models.py:785 accounting_tools/models.py:1004 +#: generic/models.py:853 generic/models.py:864 msgid "Demander accord AGEPoly" msgstr "" -#: accounting_tools/models.py:815 accounting_tools/models.py:816 -#: accounting_tools/models.py:817 -#: generic/templates/generic/generic/contact.html:21 +#: accounting_tools/models.py:785 accounting_tools/models.py:786 +#: accounting_tools/models.py:787 generic/models.py:556 generic/models.py:735 +#: generic/models.py:767 generic/templates/generic/generic/contact.html:21 #: generic/templates/generic/generic/delete.html:56 #: generic/templates/generic/generic/delete.html:74 #: generic/templates/generic/generic/edit.html:288 #: generic/templates/generic/generic/file_upload.html:187 #: generic/templates/generic/generic/switch_status.html:40 -#: members/templates/members/membership/import.html:48 templates/base.html:86 -#: units/templates/units/accreds/add.html:31 +#: members/templates/members/membership/import.html:48 +#: members/templates/members/membership/import_list.html:48 +#: templates/base.html:86 units/templates/units/accreds/add.html:31 #: units/templates/units/accreds/edit.html:29 #: users/templates/registration/password_change_form.html:27 #: users/templates/users/users/create_external.html:26 @@ -1671,60 +1722,60 @@ msgstr "" msgid "Annuler" msgstr "" -#: accounting_tools/models.py:816 generic/models.py:818 generic/models.py:826 +#: accounting_tools/models.py:786 msgid "Demander à comptabiliser" msgstr "" -#: accounting_tools/models.py:817 accounting_tools/models.py:1012 -#: generic/models.py:551 generic/models.py:720 generic/models.py:750 -#: generic/models.py:819 generic/models.py:827 +#: accounting_tools/models.py:787 accounting_tools/models.py:1007 +#: generic/models.py:556 generic/models.py:735 generic/models.py:767 +#: generic/models.py:858 generic/models.py:869 msgid "Archiver" msgstr "" -#: accounting_tools/models.py:863 generic/models.py:878 +#: accounting_tools/models.py:854 generic/models.py:932 msgid "" "Seul un super utilisateur peut sortir cet élément de l'état archivé/annulé" msgstr "" -#: accounting_tools/models.py:921 +#: accounting_tools/models.py:916 msgid "Les deux centres de coûts doivent être différents." msgstr "" -#: accounting_tools/models.py:933 +#: accounting_tools/models.py:928 msgid "Raison du retrait" msgstr "" -#: accounting_tools/models.py:934 accounting_tools/models.py:948 +#: accounting_tools/models.py:929 accounting_tools/models.py:943 #: vehicles/models.py:227 vehicles/models.py:250 -#: vehicles/templates/vehicles/booking/pdf.html:24 +#: vehicles/templates/vehicles/booking/pdf.html:27 msgid "Responsable" msgstr "" -#: accounting_tools/models.py:937 accounting_tools/models.py:948 +#: accounting_tools/models.py:932 accounting_tools/models.py:943 msgid "Date souhaitée" msgstr "" -#: accounting_tools/models.py:938 +#: accounting_tools/models.py:933 msgid "Date réelle de retrait" msgstr "" -#: accounting_tools/models.py:948 +#: accounting_tools/models.py:943 msgid "Date retrait" msgstr "" -#: accounting_tools/models.py:954 templates/base.html:408 +#: accounting_tools/models.py:949 templates/base.html:453 msgid "Retraits cash" msgstr "" -#: accounting_tools/models.py:955 +#: accounting_tools/models.py:950 msgid "Liste des retraits cash" msgstr "" -#: accounting_tools/models.py:956 accounting_tools/models.py:972 +#: accounting_tools/models.py:951 accounting_tools/models.py:967 msgid "Pièces comptables" msgstr "" -#: accounting_tools/models.py:964 +#: accounting_tools/models.py:959 msgid "" "Les demandes de retrait cash doivent impérativement être remplies pour " "pouvoir retirer de l'argent depuis le compte d'une unité.\n" @@ -1732,55 +1783,55 @@ msgid "" "L'argent doit ensuite être justifié au moyen d'un journal de caisse." msgstr "" -#: accounting_tools/models.py:973 +#: accounting_tools/models.py:968 msgid "Pièces comptables liées au retrait cash." msgstr "" -#: accounting_tools/models.py:983 +#: accounting_tools/models.py:978 msgid "Prêt à être récupéré" msgstr "" -#: accounting_tools/models.py:984 +#: accounting_tools/models.py:979 msgid "Récupéré / A justifier" msgstr "" -#: accounting_tools/models.py:991 +#: accounting_tools/models.py:986 msgid "La demande est en cours de création." msgstr "" -#: accounting_tools/models.py:992 +#: accounting_tools/models.py:987 msgid "La demande doit être acceptée par l'AGEPoly." msgstr "" -#: accounting_tools/models.py:993 +#: accounting_tools/models.py:988 msgid "La somme est prête à être récupérée au secrétariat." msgstr "" -#: accounting_tools/models.py:994 +#: accounting_tools/models.py:989 msgid "La somme a été retirée et doit maintenant être justifiée." msgstr "" -#: accounting_tools/models.py:995 +#: accounting_tools/models.py:990 msgid "La demande est archivée. Elle n'est plus modifiable." msgstr "" -#: accounting_tools/models.py:996 +#: accounting_tools/models.py:991 msgid "La demande a été annulée, potentiellement par refus." msgstr "" -#: accounting_tools/models.py:1010 +#: accounting_tools/models.py:1005 msgid "Marquer comme retiré" msgstr "" -#: accounting_tools/models.py:1011 +#: accounting_tools/models.py:1006 msgid "Demander justification" msgstr "" -#: accounting_tools/models.py:1048 +#: accounting_tools/models.py:1043 msgid "Date retrait banque" msgstr "" -#: accounting_tools/models.py:1048 +#: accounting_tools/models.py:1043 msgid "La date de retrait à la banque" msgstr "" @@ -1797,7 +1848,7 @@ msgstr "" msgid "Il faut renseigner la date réelle du retrait avant de poursuivre." msgstr "" -#: accounting_tools/models.py:1153 users/models.py:41 +#: accounting_tools/models.py:1153 users/models.py:42 #: users/templates/users/users/list.html:25 #: users/templates/users/users/myunit_list.html:25 #: users/templates/users/users/myunit_pdf.html:26 @@ -1805,7 +1856,7 @@ msgstr "" msgid "Prénom" msgstr "" -#: accounting_tools/models.py:1154 users/models.py:42 +#: accounting_tools/models.py:1154 users/models.py:43 msgid "Nom de famille" msgstr "" @@ -1825,35 +1876,50 @@ msgstr "" msgid "Titre de la note de frais" msgstr "" -#: accounting_tools/models.py:1172 accounting_tools/models.py:1184 -#: accounting_tools/models.py:1337 accounting_tools/models.py:1353 +#: accounting_tools/models.py:1172 accounting_tools/models.py:1185 +#: accounting_tools/models.py:1597 accounting_tools/models.py:1614 msgid "Nombre de justificatifs" msgstr "" -#: accounting_tools/models.py:1173 accounting_tools/models.py:1184 -#: accounting_tools/models.py:1338 accounting_tools/models.py:1353 +#: accounting_tools/models.py:1173 accounting_tools/models.py:1185 +#: accounting_tools/models.py:1415 accounting_tools/models.py:1444 +#: accounting_tools/models.py:1598 accounting_tools/models.py:1614 msgid "Commentaire" msgstr "" -#: accounting_tools/models.py:1179 accounting_tools/models.py:1348 +#: accounting_tools/models.py:1179 accounting_tools/models.py:1608 #: units/templates/units/accreds/list.html:23 +#: units/templates/units/role/users.html:24 msgid "Personne" msgstr "" -#: accounting_tools/models.py:1191 templates/base.html:431 +#: accounting_tools/models.py:1180 accounting_tools/models.py:1429 +#: accounting_tools/models.py:1439 accounting_tools/models.py:1609 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:220 +msgid "Total (HT)" +msgstr "Total (Excl. VAT)" + +#: accounting_tools/models.py:1181 accounting_tools/models.py:1430 +#: accounting_tools/models.py:1440 accounting_tools/models.py:1610 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:226 +msgid "Total (TTC)" +msgstr "Total (With VAT)" + +#: accounting_tools/models.py:1192 templates/base.html:490 msgid "Notes de frais" msgstr "" -#: accounting_tools/models.py:1192 +#: accounting_tools/models.py:1193 msgid "Liste des notes de frais" msgstr "" -#: accounting_tools/models.py:1193 accounting_tools/models.py:1221 -#: accounting_tools/models.py:1362 accounting_tools/models.py:1383 +#: accounting_tools/models.py:1194 accounting_tools/models.py:1222 +#: accounting_tools/models.py:1456 accounting_tools/models.py:1623 +#: accounting_tools/models.py:1644 msgid "Justificatifs" msgstr "" -#: accounting_tools/models.py:1212 +#: accounting_tools/models.py:1213 msgid "" "Les notes de frais permettent de se faire rembourser des frais avancés pour " "une unité.\n" @@ -1865,51 +1931,189 @@ msgid "" "en 2 lignes." msgstr "" -#: accounting_tools/models.py:1222 +#: accounting_tools/models.py:1223 msgid "Justificatifs pour le remboursement de la note de frais." msgstr "" -#: accounting_tools/models.py:1238 accounting_tools/models.py:1308 -#: accounting_tools/models.py:1403 accounting_tools/models.py:1511 +#: accounting_tools/models.py:1239 accounting_tools/models.py:1309 +#: accounting_tools/models.py:1664 accounting_tools/models.py:1775 #: accounting_tools/templates/accounting_tools/cashbook/pdf.html:26 #: accounting_tools/templates/accounting_tools/expenseclaim/pdf.html:16 msgid "Justificatif" msgstr "" -#: accounting_tools/models.py:1240 accounting_tools/models.py:1311 -#: accounting_tools/models.py:1405 accounting_tools/models.py:1514 +#: accounting_tools/models.py:1241 accounting_tools/models.py:1312 +#: accounting_tools/models.py:1501 accounting_tools/models.py:1571 +#: accounting_tools/models.py:1666 accounting_tools/models.py:1778 msgid "Montant (HT)" msgstr "" -#: accounting_tools/models.py:1282 accounting_tools/models.py:1460 +#: accounting_tools/models.py:1283 accounting_tools/models.py:1721 msgid "Le profil de cet utilisateur doit d'abord être completé." msgstr "" -#: accounting_tools/models.py:1286 accounting_tools/models.py:1464 +#: accounting_tools/models.py:1287 accounting_tools/models.py:1725 msgid "" "Il faut plus de droits pour pouvoir faire une note de frais pour quelqu'un " "d'autre." msgstr "" -#: accounting_tools/models.py:1307 accounting_tools/models.py:1510 +#: accounting_tools/models.py:1308 accounting_tools/models.py:1569 +#: accounting_tools/models.py:1774 #: accounting_tools/templates/accounting_tools/cashbook/pdf.html:25 #: accounting_tools/templates/accounting_tools/expenseclaim/pdf.html:15 +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:15 msgid "Concerne" msgstr "" -#: accounting_tools/models.py:1335 +#: accounting_tools/models.py:1329 +msgid "Nom du fournisseur" +msgstr "" + +#: accounting_tools/models.py:1330 +msgid "Numéro de TVA du fournisseur" +msgstr "" + +#: accounting_tools/models.py:1330 +msgid "" +"CHE-XXX.XXX.XXX (Recherche)" +msgstr "" + +#: accounting_tools/models.py:1332 +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:59 +msgid "IBAN" +msgstr "" + +#: accounting_tools/models.py:1332 +msgid "" +"(Convertir un numéro " +"de compte en IBAN)
    Si la convertion ne fonctionne pas, noter CH00 " +"et mettre le numéro de compte en remarque." +msgstr "" + +#: accounting_tools/models.py:1333 +msgid "BIC/SWIFT" +msgstr "" + +#: accounting_tools/models.py:1333 +msgid "Obligatoire si le fournisseur est étranger" +msgstr "" + +#: accounting_tools/models.py:1337 communication/models.py:287 +#: communication/models.py:317 logistics/models.py:106 logistics/models.py:136 +#: logistics/models.py:384 logistics/models.py:414 vehicles/models.py:229 +#: vehicles/models.py:252 vehicles/templates/vehicles/booking/edit.html:18 +msgid "Remarques" +msgstr "" + +#: accounting_tools/models.py:1341 +msgid "Société" +msgstr "" + +#: accounting_tools/models.py:1342 +msgid "Numéro TVA" +msgstr "" + +#: accounting_tools/models.py:1343 +msgid "IBAN/CCP" +msgstr "" + +#: accounting_tools/models.py:1344 +msgid "BIC" +msgstr "" + +#: accounting_tools/models.py:1353 accounting_tools/models.py:1370 +#: accounting_tools/models.py:1422 accounting_tools/models.py:1428 +#: accounting_tools/models.py:1437 +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:55 +#: vehicles/models.py:72 vehicles/models.py:79 vehicles/models.py:121 +#: vehicles/models.py:130 vehicles/models.py:232 vehicles/models.py:245 +#: vehicles/templates/vehicles/booking/pdf.html:32 +msgid "Fournisseur" +msgstr "" + +#: accounting_tools/models.py:1354 +msgid "Liste des Fournisseur" +msgstr "" + +#: accounting_tools/models.py:1364 +msgid "Les Fournisseurs sont liés aux facture fournisseurs." +msgstr "" + +#: accounting_tools/models.py:1393 +msgid "IBAN invalide" +msgstr "" + +#: accounting_tools/models.py:1398 +msgid "Le fournisseur {} ({}) est déja dans la base de donnée !" +msgstr "" + +#: accounting_tools/models.py:1402 +msgid "BIC/SWIFT obligatoire pour un fournisseur étranger !" +msgstr "" + +#: accounting_tools/models.py:1414 +msgid "Titre de la facture fournisseur" +msgstr "" + +#: accounting_tools/models.py:1418 +msgid "Numéro de Référence" +msgstr "" + +#: accounting_tools/models.py:1419 +msgid "Raw Swiss Payment Code" +msgstr "" + +#: accounting_tools/models.py:1420 accounting_tools/models.py:1441 +msgid "Devise" +msgstr "" + +#: accounting_tools/models.py:1438 +msgid "Numéro de référence" +msgstr "" + +#: accounting_tools/models.py:1445 +msgid "SPC" +msgstr "" + +#: accounting_tools/models.py:1454 +msgid "Factures (fournisseur)" +msgstr "" + +#: accounting_tools/models.py:1455 +msgid "Liste des factures (fournisseur)" +msgstr "" + +#: accounting_tools/models.py:1475 +msgid "" +"Les factures fournisseurs permettent à une unité de payer des factures.\n" +"\n" +"Il est nécéssaire de fournir la facture" +msgstr "" + +#: accounting_tools/models.py:1483 +msgid "Scan" +msgstr "" + +#: accounting_tools/models.py:1484 +msgid "scan de la facture" +msgstr "" + +#: accounting_tools/models.py:1595 msgid "Titre du journal de caisse" msgstr "" -#: accounting_tools/models.py:1360 templates/base.html:436 +#: accounting_tools/models.py:1621 templates/base.html:495 msgid "Journaux de caisse" msgstr "" -#: accounting_tools/models.py:1361 +#: accounting_tools/models.py:1622 msgid "Liste des journaux de caisse" msgstr "" -#: accounting_tools/models.py:1374 +#: accounting_tools/models.py:1635 msgid "" "Les journaux de caisse servent à justifier des dépenses et des recettes " "liées à des versements à la banque ou des retraits cash.\n" @@ -1921,63 +2125,87 @@ msgid "" "en 2 lignes." msgstr "" -#: accounting_tools/models.py:1384 +#: accounting_tools/models.py:1645 msgid "Justificatifs liés aux lignes du journal de caisse." msgstr "" -#: accounting_tools/models.py:1401 +#: accounting_tools/models.py:1662 #: main/templates/main/last_100_logging_entries.html:18 #: main/templates/main/search.html:41 #: notifications/templates/notifications/center/index.html:42 msgid "Type" msgstr "" -#: accounting_tools/models.py:1418 +#: accounting_tools/models.py:1679 msgid "Archiver le retrait cash lié?" msgstr "" -#: accounting_tools/models.py:1450 +#: accounting_tools/models.py:1711 msgid "" "L'utilisateur responsable et/ou le centre de coûts ne correspondent pas au " "retrait cash lié." msgstr "" -#: accounting_tools/models.py:1471 +#: accounting_tools/models.py:1732 msgid "Retrait cash lié" msgstr "" -#: accounting_tools/models.py:1496 +#: accounting_tools/models.py:1760 msgid "J'ai fait un retrait cash : " msgstr "" -#: accounting_tools/models.py:1497 +#: accounting_tools/models.py:1761 msgid "J'ai fait un versement à la banque : " msgstr "" -#: accounting_tools/models.py:1498 +#: accounting_tools/models.py:1762 msgid "J'ai vendu quelque chose : " msgstr "" -#: accounting_tools/models.py:1499 +#: accounting_tools/models.py:1763 msgid "J'ai payé une facture avec la caisse : " msgstr "" -#: accounting_tools/models.py:1500 +#: accounting_tools/models.py:1764 msgid "J'ai acheté quelque chose avec la caisse : " msgstr "" -#: accounting_tools/models.py:1501 +#: accounting_tools/models.py:1765 msgid "J'ai remboursé quelqu'un avec la caisse : " msgstr "" -#: accounting_tools/models.py:1502 +#: accounting_tools/models.py:1766 msgid "Je fais un Crédit manuel : " msgstr "" -#: accounting_tools/models.py:1503 +#: accounting_tools/models.py:1767 msgid "Je fais un Débit manuel : " msgstr "" +#: accounting_tools/views.py:47 +msgid "Période inconnue" +msgstr "" + +#: accounting_tools/views.py:172 +#, python-brace-format +msgid "Internal Transfer {0} pas à l'état à comptabiliser" +msgstr "" + +#: accounting_tools/views.py:218 +#, python-brace-format +msgid "NDF {0} pas à l'état à comptabiliser" +msgstr "" + +#: accounting_tools/views.py:309 +#, python-brace-format +msgid "JDC {0} pas à l'état à comptabiliser" +msgstr "" + +#: accounting_tools/views.py:311 +#, python-brace-format +msgid "JDC {0} pas a 0, merci de le mettre a 0" +msgstr "" + #: accounting_tools/templates/accounting_tools/cashbook/edit.html:229 msgid "" "En l'état, l'AGEPoly devra rembourser ce montant à l'utilisateur responsable." @@ -1996,13 +2224,21 @@ msgid "Le total de ton journal de caisse fait" msgstr "" #: accounting_tools/templates/accounting_tools/cashbook/list_json.html:5 +#: accounting_tools/templates/accounting_tools/cashbook/list_json.html:6 #: notifications/templates/notifications/species/accounting_base.html:18 #: notifications/templates/notifications/species/mails/accounting_base.html:11 msgid "Journal de Caisse" msgstr "" +#: accounting_tools/templates/accounting_tools/cashbook/list_json.html:6 +#: accounting_tools/templates/accounting_tools/expenseclaim/list_json.html:6 +#: accounting_tools/templates/accounting_tools/internaltransfer/list_json.html:6 +msgid "CSV" +msgstr "" + #: accounting_tools/templates/accounting_tools/cashbook/pdf.html:5 #: accounting_tools/templates/accounting_tools/cashbook/show.html:5 +#: accounting_tools/templates/accounting_tools/cashbook/show.html:6 msgid "Journal de caisse" msgstr "" @@ -2024,6 +2260,7 @@ msgstr "" #: accounting_tools/templates/accounting_tools/cashbook/pdf.html:27 #: accounting_tools/templates/accounting_tools/expenseclaim/pdf.html:17 +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:16 msgid "Numéro de compte" msgstr "" @@ -2053,36 +2290,40 @@ msgid "Nombre de justificatifs : " msgstr "" #: accounting_tools/templates/accounting_tools/cashbook/pdf.html:78 -#: accounting_tools/templates/accounting_tools/expenseclaim/pdf.html:40 -#: accounting_tools/templates/accounting_tools/withdrawal/pdf.html:23 -msgid "Visa de la personne : " +#: accounting_tools/templates/accounting_tools/expenseclaim/pdf.html:41 +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:35 +msgid "Visa de l'unité : " msgstr "" #: accounting_tools/templates/accounting_tools/cashbook/pdf.html:84 -#: accounting_tools/templates/accounting_tools/expenseclaim/pdf.html:43 -#: accounting_tools/templates/accounting_tools/internaltransfer/multiple_pdf.html:73 -#: accounting_tools/templates/accounting_tools/internaltransfer/single_pdf.html:29 -#: accounting_tools/templates/accounting_tools/withdrawal/pdf.html:26 -msgid "Visa president(e) AGEPoly : " +#: accounting_tools/templates/accounting_tools/expenseclaim/pdf.html:47 +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:41 +msgid "Visa AGEPoly (1): " msgstr "" #: accounting_tools/templates/accounting_tools/cashbook/pdf.html:90 -#: accounting_tools/templates/accounting_tools/expenseclaim/pdf.html:46 -#: accounting_tools/templates/accounting_tools/internaltransfer/multiple_pdf.html:76 -#: accounting_tools/templates/accounting_tools/internaltransfer/single_pdf.html:32 -#: accounting_tools/templates/accounting_tools/withdrawal/pdf.html:29 -msgid "Visa administrateur(trice) AGEPoly : " +#: accounting_tools/templates/accounting_tools/expenseclaim/pdf.html:53 +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:47 +msgid "Visa AGEPoly (2): " msgstr "" -#: accounting_tools/templates/accounting_tools/cashbook/show.html:9 -#: accounting_tools/templates/accounting_tools/expenseclaim/show.html:9 -#: accounting_tools/templates/accounting_tools/invoice/show.html:9 -msgid "Total : " -msgstr "" +#: accounting_tools/templates/accounting_tools/cashbook/show.html:11 +#: accounting_tools/templates/accounting_tools/expenseclaim/show.html:11 +#: accounting_tools/templates/accounting_tools/providerinvoice/show.html:10 +msgid "Total (HT) : " +msgstr "Total (Excl. VAT) : " + +#: accounting_tools/templates/accounting_tools/cashbook/show.html:12 +#: accounting_tools/templates/accounting_tools/expenseclaim/show.html:12 +#: accounting_tools/templates/accounting_tools/providerinvoice/show.html:11 +msgid "Total (TTC) : " +msgstr "Total (With VAT)" #: accounting_tools/templates/accounting_tools/expenseclaim/list_json.html:5 +#: accounting_tools/templates/accounting_tools/expenseclaim/list_json.html:6 #: accounting_tools/templates/accounting_tools/expenseclaim/pdf.html:5 #: accounting_tools/templates/accounting_tools/expenseclaim/show.html:5 +#: accounting_tools/templates/accounting_tools/expenseclaim/show.html:6 #: notifications/templates/notifications/species/accounting_base.html:16 #: notifications/templates/notifications/species/mails/accounting_base.html:9 #: templates/base_pdf.html:112 @@ -2098,6 +2339,7 @@ msgid "Solde en ma faveur : " msgstr "" #: accounting_tools/templates/accounting_tools/internaltransfer/list_json.html:5 +#: accounting_tools/templates/accounting_tools/internaltransfer/list_json.html:6 #: accounting_tools/templates/accounting_tools/internaltransfer/single_pdf.html:5 msgid "Transfert interne" msgstr "" @@ -2106,12 +2348,29 @@ msgstr "" msgid "Libellé" msgstr "" -#: accounting_tools/templates/accounting_tools/internaltransfer/show.html:5 -msgid "Transfert" +#: accounting_tools/templates/accounting_tools/internaltransfer/multiple_pdf.html:73 +#: accounting_tools/templates/accounting_tools/internaltransfer/single_pdf.html:29 +#: accounting_tools/templates/accounting_tools/withdrawal/pdf.html:26 +msgid "Visa president(e) AGEPoly : " msgstr "" -#: accounting_tools/templates/accounting_tools/internaltransfer/single_pdf.html:9 -msgid "Titre du transfert : " +#: accounting_tools/templates/accounting_tools/internaltransfer/multiple_pdf.html:76 +#: accounting_tools/templates/accounting_tools/internaltransfer/single_pdf.html:32 +#: accounting_tools/templates/accounting_tools/withdrawal/pdf.html:29 +msgid "Visa administrateur(trice) AGEPoly : " +msgstr "" + +#: accounting_tools/templates/accounting_tools/internaltransfer/show.html:5 +#: accounting_tools/templates/accounting_tools/internaltransfer/show.html:6 +msgid "Transfert" +msgstr "" + +#: accounting_tools/templates/accounting_tools/internaltransfer/show.html:6 +msgid "Export CSV" +msgstr "" + +#: accounting_tools/templates/accounting_tools/internaltransfer/single_pdf.html:9 +msgid "Titre du transfert : " msgstr "" #: accounting_tools/templates/accounting_tools/internaltransfer/single_pdf.html:10 @@ -2135,99 +2394,122 @@ msgstr "" msgid "Montant : " msgstr "" -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:124 +#: accounting_tools/templates/accounting_tools/invoice/list_json.html:6 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:194 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:316 +#: accounting_tools/templates/accounting_tools/invoice/show.html:6 +#: accounting_tools/templates/accounting_tools/invoice/show.html:9 +#: notifications/templates/notifications/species/invoices_accepted.html:4 +#: notifications/templates/notifications/species/mails/invoices_accepted.html:4 +msgid "Facture" +msgstr "Invoice" + +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:178 msgid "À l'attention de" msgstr "To the attention of" -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:135 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:194 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:316 msgid "N°" msgstr "#" -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:144 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:203 msgid "Prix unitaire" msgstr "Unit price" -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:145 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:204 #, python-format msgid "%% TVA" -msgstr "" - -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:161 -msgid "Total (HT)" -msgstr "Sub total" +msgstr "%% VAT" -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:167 -msgid "Total (TTC)" -msgstr "Total (With VAT)" - -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:182 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:242 #, python-format msgid "" -"\n" -" Nous vous remercions de bien vouloir payer ce montant à " -"%(d)s jours sur le compte de l'AGEPoly au moyen de bulletin de versement " -"annexé.\n" -" " -msgstr "" -"\n" -"Please pay that amount within %(d)s days to AGEPoly's account with the " -"enclosed payment slip." +"Nous vous remercions de bien vouloir payer ce montant à %(d)s jours avec les " +"informations de paiement à la page suivante." +msgstr "Please pay that amount within %(d)s days. Payment details are on next page." -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:186 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:244 msgid "" -"Nous vous remercions de bien vouloir payer ce montant sur le compte de " -"l'AGEPoly au moyen de bulletin de versement annexé." -msgstr "" -"Please pay that amount to AGEPoly's account with the enclosed payment slip." +"Nous vous remercions de bien vouloir payer ce montant avec les informations " +"de paiement à la page suivante." +msgstr "Please pay that amount with payment details on next page." -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:194 -msgid "Vous pouvez aussi effectuer le paiement sur le compte suivant :" -msgstr "You can also make the payment to the following account:" - -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:198 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:253 #, python-format msgid "" -"\n" -" Nous vous remercions de bien vouloir payer ce " -"montant à %(d)s jours sur le compte suivant :\n" -" " -msgstr "" -"\n" -"Please pay that amount within %(d)s days to the following account:" +"Nous vous remercions de bien vouloir payer ce montant à %(d)s jours sur le " +"compte suivant :" +msgstr "Please pay that amount within %(d)s days to the following account:" -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:202 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:255 msgid "" "Nous vous remercions de bien vouloir payer ce montant sur le compte suivant :" msgstr "Please pay that amount to the following account:" -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:210 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:264 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:331 msgid "Banque" msgstr "Bank" -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:234 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:279 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:343 msgid "Mention/Référence" msgstr "Reference" -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:262 +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:307 msgid "Annexe(s): ment." msgstr "Enclosed: as mentioned" -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:287 -msgid "" -"Attention: Ce BVR ne peut pas être utilisé pour un paiement aux guichets de " -"la poste ou d'une banque" +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:323 +msgid "Virement Bancaire" +msgstr "Bank Transfer" + +#: accounting_tools/templates/accounting_tools/invoice/pdf.html:360 +msgid "QR Facture" +msgstr "QR Invoice" + +#: accounting_tools/templates/accounting_tools/invoice/show.html:14 +msgid "Total : " msgstr "" -"Warning: This BVR cannot be used to pay at post offices' counters or a bank" -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:295 -#: main/templates/main/search.html:96 templates/base_pdf.html:155 -msgid "Page" -msgstr "Page" +#: accounting_tools/templates/accounting_tools/providerinvoice/list_json.html:5 +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:5 +msgid "Facture Fournisseur" +msgstr "" -#: accounting_tools/templates/accounting_tools/invoice/pdf.html:295 -#: templates/base_pdf.html:155 -msgid "Généré le" -msgstr "Generated on" +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:9 +msgid "Titre de la facture fournisseur : " +msgstr "" + +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:17 +msgid "Montant HT" +msgstr "" + +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:19 +msgid "Montant TTC" +msgstr "" + +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:57 +msgid "TVA - ID" +msgstr "" + +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:58 +msgid "DEVISE" +msgstr "" + +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:60 +msgid "BIC / SWIFT" +msgstr "" + +#: accounting_tools/templates/accounting_tools/providerinvoice/pdf.html:61 +msgid "#REFERENCE" +msgstr "" + +#: accounting_tools/templates/accounting_tools/providerinvoice/show.html:5 +#: notifications/templates/notifications/species/accounting_base.html:20 +msgid "Facture (fournisseur)" +msgstr "" #: accounting_tools/templates/accounting_tools/subvention/edit.html:21 #: accounting_tools/templates/accounting_tools/withdrawal/edit.html:14 @@ -2250,6 +2532,7 @@ msgstr "" #: accounting_tools/templates/accounting_tools/subvention/subventions_pdf.html:78 #: generic/templates/generic/generic/logs.html:24 members/models.py:20 #: units/templates/units/accreds/add.html:19 +#: units/templates/units/role/users.html:25 msgid "Unité" msgstr "" @@ -2314,6 +2597,10 @@ msgstr "" msgid "Motif du retrait : " msgstr "" +#: accounting_tools/templates/accounting_tools/withdrawal/pdf.html:23 +msgid "Visa de la personne : " +msgstr "" + #: accounting_tools/templates/accounting_tools/withdrawal/pdf.html:32 msgid "Reçu CHF." msgstr "" @@ -2323,6 +2610,7 @@ msgid "Le :" msgstr "" #: accounting_tools/templates/accounting_tools/withdrawal/pdf.html:38 +#: logistics/templates/logistics/supplyreservation/pdf.html:192 msgid "Signature :" msgstr "" @@ -2332,110 +2620,102 @@ msgid "" "le justifier dans les 2 mois." msgstr "" -#: accounting_tools/views.py:46 -msgid "Période inconnue" -msgstr "" - #: app/settings.py:36 msgid "Français" msgstr "" -#: app/utils.py:26 units/templates/units/selector/unit_selector.html:24 +#: app/utils.py:27 units/templates/units/selector/unit_selector.html:24 msgid "Unités externes" msgstr "" -#: app/utils.py:46 units/templates/units/selector/unit_selector.html:32 +#: app/utils.py:47 units/templates/units/selector/unit_selector.html:32 msgid "Toutes les unités" msgstr "" -#: app/utils.py:77 +#: app/utils.py:76 msgid "?" msgstr "" -#: communication/models.py:17 communication/models.py:33 +#: communication/models.py:21 communication/models.py:37 msgid "Titre anglais" msgstr "" -#: communication/models.py:18 communication/models.py:33 +#: communication/models.py:22 communication/models.py:37 msgid "Contenu" msgstr "" -#: communication/models.py:19 communication/models.py:33 +#: communication/models.py:23 communication/models.py:37 msgid "Contenu anglais" msgstr "" -#: communication/models.py:33 main/models.py:162 units/models.py:53 +#: communication/models.py:37 main/models.py:166 units/models.py:53 msgid "URL" msgstr "" -#: communication/models.py:36 +#: communication/models.py:40 msgid "News AGEPoly" msgstr "" -#: communication/models.py:37 +#: communication/models.py:41 msgid "Liste de toutes les news sur le site de l'AGEPoly" msgstr "" -#: communication/models.py:49 +#: communication/models.py:53 msgid "" "Les news du site de l'AGEPoly sont les nouvelles affichées sur toutes les " "pages du site de l'AGEPoly.\n" -"\n" -"Elles sont soumises à modération par le responsable communication de " -"l'AGEPoly avant d'être visibles." +" Elles sont soumises à modération par le responsable " +"communication de l'AGEPoly avant d'être visibles." msgstr "" -#: communication/models.py:82 communication/models.py:95 +#: communication/models.py:85 communication/models.py:98 msgid "Image" msgstr "" -#: communication/models.py:82 +#: communication/models.py:85 msgid "" "Pour des raisons de qualité, il est fortement recommandé d'envoyer une image " "en HD (1920x1080)" msgstr "" -#: communication/models.py:98 +#: communication/models.py:101 msgid "Slide à l'AGEPoly" msgstr "" -#: communication/models.py:99 +#: communication/models.py:102 msgid "Liste de tous les slides à l'AGEPoly" msgstr "" -#: communication/models.py:113 +#: communication/models.py:116 msgid "" "Les slides à l'AGEPoly sont affichés de manière aléatoire sur les écrans à " "l'AGEPoly.\n" -"\n" -"Ils sont soumis à modération par le responsable communication de l'AGEPoly " -"avant d'être visibles." +" Ils sont soumis à modération par le responsable communication de " +"l'AGEPoly avant d'être visibles." msgstr "" -#: communication/models.py:136 +#: communication/models.py:138 msgid "" " Les dimensions " "de l'image sont trop petites ! ({}x{} contre 1920x1080 recommandé)" msgstr "" -#: communication/models.py:154 +#: communication/models.py:156 msgid "Logo" msgstr "" -#: communication/models.py:155 +#: communication/models.py:157 msgid "Liste de tous les logos" msgstr "" -#: communication/models.py:166 +#: communication/models.py:168 msgid "" "Les logos de ton unité.\n" -"\n" -"Tu peux rendre public les logos, ce qui est recommandé afin d'aider les " -"autres unités lors de constructions graphiques (ex: agenda) ou ton propre " -"comité.\n" -"\n" -"Un logo peut comporter plusieurs fichiers : ceci te permet d'uploader " -"différents formats pour un même fichier !" +" Tu peux rendre public les logos, ce qui est recommandé afin " +"d'aider les autres unités lors de constructions graphiques (ex: agenda) ou " +"ton propre comité.\n" +" Un logo peut comporter plusieurs fichiers : ceci te permet " +"d'uploader différents formats pour un même fichier !" msgstr "" #: communication/models.py:174 @@ -2444,10 +2724,215 @@ msgid "" "plusieurs fichiers pour te permettre d'envoyer des formats différents." msgstr "" +#: communication/models.py:208 communication/models.py:221 +#: logistics/models.py:24 logistics/models.py:37 logistics/models.py:287 +#: logistics/models.py:301 main/models.py:243 members/models.py:62 +#: users/models.py:46 +msgid "Actif" +msgstr "" + +#: communication/models.py:208 logistics/models.py:24 logistics/models.py:287 +msgid "Pour désactiver temporairement la posibilité de réserver." +msgstr "" + +#: communication/models.py:210 +#: communication/templates/communication/displayreservation/show.html:11 +#: generic/templates/generic/generic/directory.html:43 logistics/models.py:26 +#: logistics/models.py:289 +#: logistics/templates/logistics/roomreservation/show.html:11 +#: logistics/templates/logistics/supplyreservation/show.html:18 +msgid "Conditions de réservation" +msgstr "" + +#: communication/models.py:210 +msgid "" +"Si tu veux préciser les conditions de réservations pour l'affichage. Tu peux " +"par exemple mettre un lien vers un contrat." +msgstr "" + +#: communication/models.py:212 communication/models.py:222 +#: logistics/models.py:28 logistics/models.py:38 logistics/models.py:291 +#: logistics/models.py:302 +msgid "Autoriser les externes" +msgstr "" + +#: communication/models.py:212 +msgid "Permet aux externes (pas dans l'AGEPoly) de réserver l'affichage." +msgstr "" + +#: communication/models.py:213 logistics/models.py:29 logistics/models.py:292 +msgid "Conditions de réservation pour les externes" +msgstr "" + +#: communication/models.py:213 +msgid "" +"Si tu veux préciser des informations sur la réservation de l'affichage pour " +"les externes. Remplace le champ 'Conditions' pour les externe si rempli." +msgstr "" + +#: communication/models.py:215 logistics/models.py:31 logistics/models.py:294 +msgid "Autoriser tout le monde à voir le calendrier" +msgstr "" + +#: communication/models.py:215 +msgid "" +"Permet à tout le monde d'afficher le calendrier des réservations de " +"l'affichage" +msgstr "" + +#: communication/models.py:216 logistics/models.py:32 logistics/models.py:295 +msgid "Autoriser les externes à voir le calendrier" +msgstr "" + +#: communication/models.py:216 +msgid "" +"Permet aux externes d'afficher le calendrier des réservations de " +"l'affichage. Le calendrier doit être visible." +msgstr "" + +#: communication/models.py:227 logistics/models.py:43 logistics/models.py:308 +msgid "Conditions" +msgstr "" + +#: communication/models.py:228 logistics/models.py:44 logistics/models.py:309 +msgid "Conditions pour les externes" +msgstr "" + +#: communication/models.py:229 generic/models.py:1141 logistics/models.py:45 +#: logistics/models.py:310 +msgid "Nombre maximum de jours de réservation" +msgstr "" + +#: communication/models.py:230 generic/models.py:1142 logistics/models.py:46 +#: logistics/models.py:311 +msgid "Nombre maximum de jours de réservation (externes)" +msgstr "" + +#: communication/models.py:231 generic/models.py:1144 logistics/models.py:47 +#: logistics/models.py:312 +msgid "Nombre de jours minimum avant réservation" +msgstr "" + +#: communication/models.py:232 generic/models.py:1145 logistics/models.py:48 +#: logistics/models.py:313 +msgid "Nombre de jours minimum avant réservation (externes)" +msgstr "" + +#: communication/models.py:233 generic/models.py:1147 logistics/models.py:49 +#: logistics/models.py:314 +msgid "Nombre de jours maximum avant réservation" +msgstr "" + +#: communication/models.py:234 generic/models.py:1148 logistics/models.py:50 +#: logistics/models.py:315 +msgid "Nombre de jours maximum avant réservation (externes)" +msgstr "" + +#: communication/models.py:238 communication/models.py:279 +#: communication/models.py:299 communication/models.py:300 +#: communication/models.py:317 communication/models.py:344 +msgid "Affichage" +msgstr "" + +#: communication/models.py:239 +msgid "Liste de tout les affichages réservables" +msgstr "" + +#: communication/models.py:252 +msgid "" +"La liste des affichages réservables, gérés par l'unité active. N'importe " +"quelle unité peut mettre à disposition des affichages et est responsable de " +"la modération des réservations." +msgstr "" + +#: communication/models.py:286 +msgid "Explique pourquoi tu as besoin (manifestation par ex.)" +msgstr "" + +#: communication/models.py:293 logistics/models.py:112 logistics/models.py:390 +msgid "Nom de l'unité" +msgstr "" + +#: communication/models.py:300 communication/models.py:317 +#: logistics/models.py:119 logistics/models.py:136 logistics/models.py:397 +#: logistics/models.py:414 +msgid "Conflits" +msgstr "" + +#: communication/models.py:320 +msgid "Réservation des affichages" +msgstr "" + +#: communication/models.py:321 +msgid "Liste de toutes les réservations d'affichage" +msgstr "" + +#: communication/models.py:322 +msgid "Liste de toutes les réservations d'affichage de mon unité" +msgstr "" + +#: communication/models.py:323 +msgid "Calendrier de mes réservations d'affichage" +msgstr "" + +#: communication/models.py:324 +msgid "Calendrier des réservations d'un affichage de mon unité" +msgstr "" + +#: communication/models.py:325 +msgid "Calendrier des réservations d'affichage" +msgstr "" + +#: communication/models.py:346 +msgid "" +"Les réservation d'affichage.\n" +" Les réservations sont soumises à modération par l'unité liée à " +"l'affichage.\n" +" Tu peux gérer ici la liste de tes réservations pour l'unité " +"active (ou une unité externe)." +msgstr "" + +#: communication/models.py:349 +msgid "" +"Les réservation d'affichage de " +"l'unité. " +"Les réservations sont soumises à modération par l'unité liée à " +"l'affichage. " +"Tu peux gérer ici la liste de réservation d'affichage de l'unité active." +msgstr "" + +#: communication/models.py:351 +msgid "Les réservation d'un type d'affichage particulier." +msgstr "" + +#: communication/models.py:392 +msgid "Affichage non disponible" +msgstr "" + +#: communication/models.py:395 +msgid "Affichage non disponible pour les externes" +msgstr "" + +#: communication/models.py:397 logistics/models.py:536 +msgid "Il ne faut pas laisser de ligne vide !" +msgstr "" + +#: communication/models.py:405 logistics/models.py:230 +msgid "gérée par" +msgstr "" + +#: communication/models.py:415 logistics/models.py:239 logistics/models.py:627 +msgid "Pas de conflits !" +msgstr "" + +#: communication/models.py:417 logistics/models.py:241 logistics/models.py:629 +msgid "Il y a d'autres réservations en même temps !" +msgstr "" + #: communication/templates/communication/logo_public_list.html:5 #: communication/templates/communication/logo_public_list.html:9 #: communication/templates/communication/logo_public_list.html:13 -#: templates/base.html:184 +#: templates/base.html:228 msgid "Logos" msgstr "" @@ -2465,308 +2950,465 @@ msgid "" "l'AGEPoly (que tu peux afficher)" msgstr "" -#: generic/forms.py:49 +#: communication/templates/communication/displayreservation/show.html:13 +#: logistics/templates/logistics/roomreservation/show.html:13 +#: logistics/templates/logistics/supplyreservation/show.html:21 +msgid "" +"La personne effectuant la réservation s'engage à respecter les conditions en " +"demandant une validation de la réservation !" +msgstr "" + +#: communication/templates/communication/displayreservation/show.html:17 +#: communication/templates/communication/displayreservation/show.html:27 +#: generic/templates/generic/generic/directory.html:47 +#: generic/templates/generic/generic/directory.html:57 +#: logistics/templates/logistics/roomreservation/show.html:17 +#: logistics/templates/logistics/roomreservation/show.html:27 +#: logistics/templates/logistics/supplyreservation/show.html:26 +#: logistics/templates/logistics/supplyreservation/show.html:36 +msgid "La réservation ne peut pas durer plus de" +msgstr "" + +#: communication/templates/communication/displayreservation/show.html:17 +#: communication/templates/communication/displayreservation/show.html:27 +#: generic/templates/generic/generic/directory.html:47 +#: generic/templates/generic/generic/directory.html:57 +#: logistics/templates/logistics/roomreservation/show.html:17 +#: logistics/templates/logistics/roomreservation/show.html:27 +#: logistics/templates/logistics/supplyreservation/show.html:26 +#: logistics/templates/logistics/supplyreservation/show.html:36 +msgid "jour(s)" +msgstr "" + +#: communication/templates/communication/displayreservation/show.html:20 +#: communication/templates/communication/displayreservation/show.html:30 +#: generic/templates/generic/generic/directory.html:50 +#: generic/templates/generic/generic/directory.html:60 +#: logistics/templates/logistics/roomreservation/show.html:20 +#: logistics/templates/logistics/roomreservation/show.html:30 +#: logistics/templates/logistics/supplyreservation/show.html:29 +#: logistics/templates/logistics/supplyreservation/show.html:39 +msgid "La réservation doit être faite au moins" +msgstr "" + +#: communication/templates/communication/displayreservation/show.html:20 +#: communication/templates/communication/displayreservation/show.html:23 +#: communication/templates/communication/displayreservation/show.html:30 +#: communication/templates/communication/displayreservation/show.html:33 +#: generic/templates/generic/generic/directory.html:50 +#: generic/templates/generic/generic/directory.html:53 +#: generic/templates/generic/generic/directory.html:60 +#: generic/templates/generic/generic/directory.html:63 +#: logistics/templates/logistics/roomreservation/show.html:20 +#: logistics/templates/logistics/roomreservation/show.html:23 +#: logistics/templates/logistics/roomreservation/show.html:30 +#: logistics/templates/logistics/roomreservation/show.html:33 +#: logistics/templates/logistics/supplyreservation/show.html:29 +#: logistics/templates/logistics/supplyreservation/show.html:32 +#: logistics/templates/logistics/supplyreservation/show.html:39 +#: logistics/templates/logistics/supplyreservation/show.html:42 +msgid "jour(s) à l'avance" +msgstr "" + +#: communication/templates/communication/displayreservation/show.html:23 +#: communication/templates/communication/displayreservation/show.html:33 +#: generic/templates/generic/generic/directory.html:53 +#: generic/templates/generic/generic/directory.html:63 +#: logistics/templates/logistics/roomreservation/show.html:23 +#: logistics/templates/logistics/roomreservation/show.html:33 +#: logistics/templates/logistics/supplyreservation/show.html:32 +#: logistics/templates/logistics/supplyreservation/show.html:42 +msgid "La réservation doit être faite au plus" +msgstr "" + +#: generic/forms.py:53 msgid "Le nom de l'entité externe est obligatoire !" msgstr "" -#: generic/forms.py:56 +#: generic/forms.py:60 msgid "Aucun centre de coûts sélectionné !" msgstr "" -#: generic/forms.py:59 +#: generic/forms.py:63 msgid "Le centre de coût n'est pas lié à l'unité !" msgstr "" -#: generic/forms.py:62 +#: generic/forms.py:66 msgid "Le centre de coût n'est pas lié à l'année comptable !" msgstr "" -#: generic/forms.py:69 +#: generic/forms.py:73 msgid "Sujet" msgstr "" -#: generic/forms.py:70 +#: generic/forms.py:74 #: notifications/templates/notifications/center/index.html:44 msgid "Message" msgstr "" -#: generic/forms.py:77 +#: generic/forms.py:75 +msgid "Recevoir une copie?" +msgstr "" + +#: generic/forms.py:82 msgid "Destinataire(s)" msgstr "" -#: generic/models.py:473 +#: generic/models.py:475 msgid "Importé depuis Truffe 1" msgstr "" -#: generic/models.py:474 +#: generic/models.py:476 msgid "Creation" msgstr "" -#: generic/models.py:475 +#: generic/models.py:477 msgid "Edité" msgstr "" -#: generic/models.py:476 +#: generic/models.py:478 msgid "Supprimé" msgstr "" -#: generic/models.py:477 +#: generic/models.py:479 msgid "Restauré" msgstr "" -#: generic/models.py:478 +#: generic/models.py:480 msgid "Statut changé" msgstr "" -#: generic/models.py:479 +#: generic/models.py:481 msgid "Fichier ajouté" msgstr "" -#: generic/models.py:480 +#: generic/models.py:482 msgid "Fichier supprimé" msgstr "" -#: generic/models.py:513 +#: generic/models.py:515 msgid "Peut modérer cet élément" msgstr "" -#: generic/models.py:549 generic/models.py:718 +#: generic/models.py:554 generic/models.py:733 msgid "Demander à modérer" msgstr "" -#: generic/models.py:550 generic/models.py:749 +#: generic/models.py:555 generic/models.py:766 #: units/templates/units/accreds/list.html:44 #: units/templates/units/accreds/list_json.html:16 #: units/templates/units/accreds/validate.html:45 msgid "Valider" msgstr "" -#: generic/models.py:550 +#: generic/models.py:555 msgid "Refuser" msgstr "" -#: generic/models.py:584 +#: generic/models.py:591 msgid "" "Seul un modérateur peut valider cet élément. Merci de passer cet élément " "dans le statut 'Modération en cours' pour demander une validation." msgstr "" -#: generic/models.py:587 +#: generic/models.py:594 msgid "Seul un modérateur peut refuser cet élément." msgstr "" -#: generic/models.py:593 +#: generic/models.py:600 msgid "" "Les modérateurs ne peuvent pas repasser en brouillon un élément qui ne leur " "appartient pas." msgstr "" -#: generic/models.py:702 +#: generic/models.py:715 msgid "Modération en cours" msgstr "" -#: generic/models.py:703 main/models.py:72 +#: generic/models.py:716 main/models.py:76 msgid "En ligne" msgstr "" -#: generic/models.py:705 generic/models.py:735 +#: generic/models.py:718 generic/models.py:750 msgid "Refusé" msgstr "" -#: generic/models.py:710 +#: generic/models.py:724 msgid "L'objet est en cours de création et n'est pas public." msgstr "" -#: generic/models.py:711 +#: generic/models.py:725 msgid "" "L'objet est en cours de modération. Il n'est pas éditable. Sélectionner ce " "statut pour demander une modération !" msgstr "" -#: generic/models.py:712 +#: generic/models.py:726 msgid "L'objet est publié. Il n'est pas éditable." msgstr "" -#: generic/models.py:714 -msgid "La modération a été refusée." +#: generic/models.py:728 +msgid "L'objet a été refusé." msgstr "" -#: generic/models.py:719 +#: generic/models.py:734 msgid "Mettre en ligne" msgstr "" -#: generic/models.py:720 generic/models.py:750 +#: generic/models.py:735 generic/models.py:767 msgid "Repasser en brouillon" msgstr "" -#: generic/models.py:732 +#: generic/models.py:747 msgid "Validation en cours" msgstr "" -#: generic/models.py:740 vehicles/models.py:309 +#: generic/models.py:756 vehicles/models.py:322 msgid "La réservation est en cours de création et n'est pas publique." msgstr "" -#: generic/models.py:741 +#: generic/models.py:757 msgid "" "La réservation est en cours de modération. Elle n'est pas éditable. " "Sélectionner ce statut pour demander une modération ! ATTENTION ! Tu " "acceptes par défaut les conditions de réservation liées !" msgstr "" -#: generic/models.py:742 vehicles/models.py:311 +#: generic/models.py:758 vehicles/models.py:324 msgid "La résevation est validée. Elle n'est pas éditable." msgstr "" -#: generic/models.py:743 vehicles/models.py:312 +#: generic/models.py:759 vehicles/models.py:325 msgid "La réservation est archivée. Elle n'est plus modifiable." msgstr "" -#: generic/models.py:744 +#: generic/models.py:760 msgid "" "La modération a été refusée. L'objet n'était probablement pas disponible " "suite à un conflit." msgstr "" -#: generic/models.py:748 +#: generic/models.py:761 +msgid "La réservation a été annulée." +msgstr "" + +#: generic/models.py:765 msgid "Demander à valider" msgstr "" -#: generic/models.py:756 vehicles/models.py:320 -#: vehicles/templates/vehicles/booking/pdf.html:37 +#: generic/models.py:773 vehicles/models.py:333 +#: vehicles/templates/vehicles/booking/pdf.html:40 msgid "Remarque" msgstr "" -#: generic/models.py:785 -msgid "Corrections nécessaires" +#: generic/models.py:813 +msgid "Attente accord unité" msgstr "" -#: generic/models.py:786 -msgid "Attente accord unité" +#: generic/models.py:814 +msgid "Attente vérification secrétariat" +msgstr "" + +#: generic/models.py:815 +msgid "Attente signature CdD 1" +msgstr "" + +#: generic/models.py:816 +msgid "Attente signature CdD 2" +msgstr "" + +#: generic/models.py:818 +msgid "En comptabilisation" msgstr "" -#: generic/models.py:796 +#: generic/models.py:826 msgid "L'objet nécessite d'être modifié avant d'être revalidé." msgstr "" -#: generic/models.py:797 +#: generic/models.py:827 msgid "" "L'objet doit être accepté au sein de l'unité. A partir de maintenant, il " "n'est plus éditable." msgstr "" -#: generic/models.py:815 generic/models.py:816 generic/models.py:823 -#: generic/models.py:824 -msgid "Demander accord unité" +#: generic/models.py:828 +msgid "L'objet doit être vérifié par le secrétariat de l'AGEPoly." +msgstr "" + +#: generic/models.py:829 +msgid "L'objet doit etre validé par un membre du CdD avec droit de signature." msgstr "" -#: generic/models.py:884 +#: generic/models.py:830 msgid "" -"Seul l'admin peut valider cet élément pour le moment. Merci de patienter." +"L'objet doit etre validé par un autre membre du CdD avec droit de signature." +msgstr "" + +#: generic/models.py:832 +msgid "L'objet est en cours de comptabilisation" +msgstr "" + +#: generic/models.py:833 +msgid "L'objet est comptabilisé et archivé. Il n'est plus modifiable." +msgstr "" + +#: generic/models.py:851 generic/models.py:852 generic/models.py:862 +#: generic/models.py:863 +msgid "Demander accord unité" +msgstr "" + +#: generic/models.py:854 +msgid "Passer en signature" +msgstr "" + +#: generic/models.py:855 generic/models.py:866 +msgid "Signer (1)" +msgstr "" + +#: generic/models.py:856 generic/models.py:867 +msgid "Signer (2)" msgstr "" -#: generic/models.py:887 +#: generic/models.py:857 generic/models.py:868 +msgid "Marquer comme en comptabilisation" +msgstr "" + +#: generic/models.py:865 +msgid "Demander à signer" +msgstr "" + +#: generic/models.py:938 msgid "Seul ton trésorier peut valider cet élément pour le moment." msgstr "" -#: generic/models.py:985 +#: generic/models.py:941 +msgid "" +"Seul le secrétariat ou le CdD) peut valider cet élément pour le moment. " +"Merci de patienter." +msgstr "" + +#: generic/models.py:944 +msgid "" +"Seul le CdD peut valider cet élément pour le moment. Merci de patienter." +msgstr "" + +#: generic/models.py:947 +msgid "Tu ne peut peut pas faire les deux signature sur un objet." +msgstr "" + +#: generic/models.py:1046 msgid "Créateur de cet élément" msgstr "" -#: generic/models.py:986 +#: generic/models.py:1047 msgid "Personnes ayant modifié cet élément (y compris le statut)" msgstr "" -#: generic/models.py:987 +#: generic/models.py:1048 msgid "Personnes pouvant éditer cet élément" msgstr "" -#: generic/models.py:1030 +#: generic/models.py:1091 msgid "Personnes pouvant modérer cet élément" msgstr "" -#: generic/models.py:1031 +#: generic/models.py:1092 msgid "Personnes pouvant valider cet élément" msgstr "" -#: generic/models.py:1062 +#: generic/models.py:1123 msgid "Nom de l'entité externe" msgstr "" -#: generic/models.py:1080 logistics/models.py:47 logistics/models.py:304 -msgid "Nombre maximum de jours de réservation" -msgstr "" - -#: generic/models.py:1080 +#: generic/models.py:1141 msgid "" "Si supérieur à zéro, empêche de demander une réservation si la longeur de la " "réservation dure plus longtemps que le nombre de jours défini." msgstr "" -#: generic/models.py:1081 logistics/models.py:48 logistics/models.py:305 -msgid "Nombre maximum de jours de réservation (externes)" -msgstr "" - -#: generic/models.py:1081 +#: generic/models.py:1142 msgid "" "Si supérieur à zéro, empêche de demander une réservation si la longeur de la " "réservation dure plus longtemps que le nombre de jours défini, pour les " "unités externes." msgstr "" -#: generic/models.py:1083 logistics/models.py:49 logistics/models.py:306 -msgid "Nombre de jours minimum avant réservation" +#: generic/models.py:1144 +msgid "" +"Si supérieur à zéro, empêche de demander une réservation si la réservation " +"n'est pas au moins dans X jours." msgstr "" -#: generic/models.py:1083 +#: generic/models.py:1145 msgid "" "Si supérieur à zéro, empêche de demander une réservation si la réservation " -"n'est pas au moins dans X jours." +"n'est pas au plus dans X jours, pour les externes." msgstr "" -#: generic/models.py:1084 logistics/models.py:50 logistics/models.py:307 -msgid "Nombre de jours minimum avant réservation (externes)" +#: generic/models.py:1147 +msgid "" +"Si supérieur à zéro, empêche de demander une réservation si la réservation " +"est dans plus de X jours." msgstr "" -#: generic/models.py:1084 +#: generic/models.py:1148 msgid "" "Si supérieur à zéro, empêche de demander une réservation si la réservation " -"n'est pas au plus dans X jours, pour les externes." +"est dans plus de X jours, pour les externes." msgstr "" -#: generic/models.py:1086 logistics/models.py:51 logistics/models.py:308 -msgid "Nombre de jours maximum avant réservation" +#: generic/models.py:1173 +msgid "La résevation pour {} est trop longue ! Maximium {} jours !" msgstr "" -#: generic/models.py:1086 +#: generic/models.py:1176 msgid "" -"Si supérieur à zéro, empêche de demander une réservation si la réservation " -"est dans plus de X jours." +"La résevation pour {} est trop proche d'aujourd'hui ! Minimum {} jours ({}) !" msgstr "" -#: generic/models.py:1087 logistics/models.py:52 logistics/models.py:309 -msgid "Nombre de jours maximum avant réservation (externes)" +#: generic/models.py:1179 +msgid "" +"La résevation pour {} est trop loin d'aujourd'hui ! Maximum {} jours ({}) !" +msgstr "" + +#: generic/views.py:487 +msgid "Tu n'as pas le droit de créer/modifier cet objet." msgstr "" -#: generic/models.py:1087 +#: generic/views.py:531 generic/views.py:666 msgid "" -"Si supérieur à zéro, empêche de demander une réservation si la réservation " -"est dans plus de X jours, pour les externes." +"Erreur lors de la récupération de la session pour la gestion des fichiers. " +"Il est possible que le formulaire aie été sauvegardé deux fois. Vérifiez si " +"l'état actuel des fichiers correspond à ce que vous désirez !" msgstr "" -#: generic/models.py:1107 -#, python-format -msgid "La résevation est trop longue ! Maximium %s jours !" +#: generic/views.py:577 +msgid "Élément sauvegardé !" msgstr "" -#: generic/models.py:1110 -#, python-format -msgid "La résevation est trop proche d'aujourd'hui ! Minimum %s jours (%s) !" +#: generic/views.py:833 +msgid "Élément supprimé !" +msgstr "" + +#: generic/views.py:895 +msgid "Élément restauré !" +msgstr "" + +#: generic/views.py:982 +msgid "Statut modifié !" +msgstr "" + +#: generic/views.py:988 +msgid "Vous avez perdu le droit de voir l'objet !" msgstr "" -#: generic/models.py:1113 +#: generic/views.py:1050 generic/views.py:1053 #, python-format -msgid "La résevation est trop loin d'aujourd'hui ! Maximum %s jours (%s) !" +msgid "Truffe :: Contact :: %s" +msgstr "" + +#: generic/views.py:1056 +msgid "Message envoyé !" msgstr "" #: generic/templates/generic/generic/calendar.html:5 @@ -2829,7 +3471,7 @@ msgstr "" #: generic/templates/generic/generic/delete.html:58 #: generic/templates/generic/generic/file_upload.html:70 #: generic/templates/generic/generic/file_upload.html:182 -#: generic/templates/generic/generic/list_json.html:43 +#: generic/templates/generic/generic/list_json.html:47 #: generic/templates/generic/generic/show.html:233 #: members/templates/members/membership/delete.html:34 #: members/templates/members/membership/list_json.html:11 @@ -2876,6 +3518,7 @@ msgstr "" #: generic/templates/generic/generic/show.html:227 #: generic/templates/generic/generic/show_deleted.html:31 #: units/templates/units/accreds/logs_list.html:39 +#: units/templates/units/role/users.html:72 msgid "Retourner sur la liste" msgstr "" @@ -2887,64 +3530,6 @@ msgstr "" msgid "Éléments diponibles" msgstr "" -#: generic/templates/generic/generic/directory.html:43 logistics/models.py:28 -#: logistics/models.py:284 -#: logistics/templates/logistics/roomreservation/show.html:11 -#: logistics/templates/logistics/supplyreservation/show.html:14 -msgid "Conditions de réservation" -msgstr "" - -#: generic/templates/generic/generic/directory.html:47 -#: generic/templates/generic/generic/directory.html:57 -#: logistics/templates/logistics/roomreservation/show.html:17 -#: logistics/templates/logistics/roomreservation/show.html:27 -#: logistics/templates/logistics/supplyreservation/show.html:20 -#: logistics/templates/logistics/supplyreservation/show.html:30 -msgid "La réservation ne peut pas durer plus de" -msgstr "" - -#: generic/templates/generic/generic/directory.html:47 -#: generic/templates/generic/generic/directory.html:57 -#: logistics/templates/logistics/roomreservation/show.html:17 -#: logistics/templates/logistics/roomreservation/show.html:27 -#: logistics/templates/logistics/supplyreservation/show.html:20 -#: logistics/templates/logistics/supplyreservation/show.html:30 -msgid "jour(s)" -msgstr "" - -#: generic/templates/generic/generic/directory.html:50 -#: generic/templates/generic/generic/directory.html:60 -#: logistics/templates/logistics/roomreservation/show.html:20 -#: logistics/templates/logistics/roomreservation/show.html:30 -#: logistics/templates/logistics/supplyreservation/show.html:23 -#: logistics/templates/logistics/supplyreservation/show.html:33 -msgid "La réservation doit être faite au moins" -msgstr "" - -#: generic/templates/generic/generic/directory.html:50 -#: generic/templates/generic/generic/directory.html:53 -#: generic/templates/generic/generic/directory.html:60 -#: generic/templates/generic/generic/directory.html:63 -#: logistics/templates/logistics/roomreservation/show.html:20 -#: logistics/templates/logistics/roomreservation/show.html:23 -#: logistics/templates/logistics/roomreservation/show.html:30 -#: logistics/templates/logistics/roomreservation/show.html:33 -#: logistics/templates/logistics/supplyreservation/show.html:23 -#: logistics/templates/logistics/supplyreservation/show.html:26 -#: logistics/templates/logistics/supplyreservation/show.html:33 -#: logistics/templates/logistics/supplyreservation/show.html:36 -msgid "jour(s) à l'avance" -msgstr "" - -#: generic/templates/generic/generic/directory.html:53 -#: generic/templates/generic/generic/directory.html:63 -#: logistics/templates/logistics/roomreservation/show.html:23 -#: logistics/templates/logistics/roomreservation/show.html:33 -#: logistics/templates/logistics/supplyreservation/show.html:26 -#: logistics/templates/logistics/supplyreservation/show.html:36 -msgid "La réservation doit être faite au plus" -msgstr "" - #: generic/templates/generic/generic/directory.html:88 msgid "Réserver" msgstr "" @@ -2973,9 +3558,10 @@ msgstr "" #: generic/templates/generic/generic/edit.html:101 #: generic/templates/generic/generic/list.html:82 -#: members/templates/members/memberset/show.html:84 +#: members/templates/members/memberset/show.html:87 #: members/templates/members/membership/add.html:48 #: members/templates/members/membership/import.html:50 +#: members/templates/members/membership/import_list.html:50 #: units/templates/units/accreds/add.html:33 msgid "Ajouter" msgstr "" @@ -3076,7 +3662,7 @@ msgstr "" msgid "(Ne plus filter)" msgstr "" -#: generic/templates/generic/generic/list_json.html:46 +#: generic/templates/generic/generic/list_json.html:50 #: main/templates/main/file/download.html:20 #: main/templates/main/link/base.html:20 #: users/templates/users/users/list_json.html:12 @@ -3123,71 +3709,6 @@ msgstr "" msgid "Quoi" msgstr "" -#: generic/templates/generic/generic/mail/base_html.html:310 -#: notifications/templates/notifications/mails/new_notif_plain.txt:2 -#: notifications/templates/notifications/mails/new_notifs_plain.txt:2 -#: users/templates/registration/password_reset_email.html:1 -#: users/templates/users/users/mail/newuser_plain.txt:1 -msgid "Bonjour," -msgstr "" - -#: generic/templates/generic/generic/mail/base_html.html:314 -msgid "" -"Tu étais sensé recevoir un mail de la part de Truffe mais les développeurs " -"n'ont pas implémenté son contenu." -msgstr "" - -#: generic/templates/generic/generic/mail/base_html.html:315 -msgid "Merci de transmettre ce problème aux gens responsables." -msgstr "" - -#: generic/templates/generic/generic/mail/base_html.html:325 -#: generic/templates/generic/generic/mail/contact_plain.txt:12 -#: notifications/templates/notifications/mails/new_notif_html.html:29 -#: notifications/templates/notifications/mails/new_notif_plain.txt:12 -#: notifications/templates/notifications/mails/new_notifs_html.html:43 -#: notifications/templates/notifications/mails/new_notifs_plain.txt:21 -#: users/templates/registration/password_reset_email.html:10 -#: users/templates/users/users/mail/newuser_plain.txt:12 -msgid "Bonne journée," -msgstr "" - -#: generic/templates/generic/generic/mail/base_html.html:326 -msgid "Le système de contact de Truffe." -msgstr "" - -#: generic/templates/generic/generic/mail/contact_html.html:6 -#, python-format -msgid "" -"\n" -" Ce mail vous a été envoyé par %(sender)s concernant l'élément " -"%(obj)s.\n" -" " -msgstr "" - -#: generic/templates/generic/generic/mail/contact_plain.txt:2 -msgid "Bonjour" -msgstr "" - -#: generic/templates/generic/generic/mail/contact_plain.txt:4 -#, python-format -msgid "" -"\n" -"Ce mail vous a été envoyé par %(sender)s concernant l'élément %(obj)s.\n" -msgstr "" - -#: generic/templates/generic/generic/mail/contact_plain.txt:8 -#: notifications/templates/notifications/mails/new_notif_plain.txt:10 -#: notifications/templates/notifications/mails/new_notifs_plain.txt:13 -msgid "Détails :" -msgstr "" - -#: generic/templates/generic/generic/mail/contact_plain.txt:14 -#: users/templates/registration/password_reset_email.html:12 -#: users/templates/users/users/mail/newuser_plain.txt:14 -msgid "Le système de contact de Truffe" -msgstr "" - #: generic/templates/generic/generic/show.html:145 #: generic/templates/generic/generic/show.html:173 msgid "Détails de la modification" @@ -3209,7 +3730,8 @@ msgstr "" msgid "Passé de " msgstr "" -#: generic/templates/generic/generic/show.html:180 main/models.py:262 +#: generic/templates/generic/generic/show.html:180 main/models.py:256 +#: main/models.py:365 msgid "Fichier" msgstr "" @@ -3220,7 +3742,7 @@ msgstr "" #: generic/templates/generic/generic/show.html:260 #: generic/templates/generic/generic/show_state_switcher.html:5 #: generic/templates/generic/generic/switch_status.html:42 -#: templates/base.html:587 units/templates/units/accreds/list_json.html:16 +#: templates/base.html:656 units/templates/units/accreds/list_json.html:16 #: users/templates/users/users/profile.html:108 msgid "Modifier" msgstr "" @@ -3257,117 +3779,78 @@ msgstr "" msgid "Impossible de modifier le statut" msgstr "" -#: generic/views.py:465 -msgid "Tu n'as pas le droit de créer/modifier cet objet." +#: generic/templates/generic/generic/mail/base_html.html:310 +#: users/templates/registration/password_reset_email.html:1 +msgid "Bonjour," msgstr "" -#: generic/views.py:506 generic/views.py:641 +#: generic/templates/generic/generic/mail/base_html.html:314 msgid "" -"Erreur lors de la récupération de la session pour la gestion des fichiers. " -"Il est possible que le formulaire aie été sauvegardé deux fois. Vérifiez si " -"l'état actuel des fichiers correspond à ce que vous désirez !" -msgstr "" - -#: generic/views.py:552 -msgid "Élément sauvegardé !" -msgstr "" - -#: generic/views.py:808 -msgid "Élément supprimé !" +"Tu étais sensé recevoir un mail de la part de Truffe mais les développeurs " +"n'ont pas implémenté son contenu." msgstr "" -#: generic/views.py:870 -msgid "Élément restauré !" +#: generic/templates/generic/generic/mail/base_html.html:315 +msgid "Merci de transmettre ce problème aux gens responsables." msgstr "" -#: generic/views.py:957 -msgid "Statut modifié !" +#: generic/templates/generic/generic/mail/base_html.html:325 +#: notifications/templates/notifications/mails/new_notif_html.html:29 +#: notifications/templates/notifications/mails/new_notifs_html.html:43 +#: users/templates/registration/password_reset_email.html:10 +msgid "Bonne journée," msgstr "" -#: generic/views.py:963 -msgid "Vous avez perdu le droit de voir l'objet !" +#: generic/templates/generic/generic/mail/base_html.html:326 +msgid "Le système de contact de Truffe." msgstr "" -#: generic/views.py:1025 +#: generic/templates/generic/generic/mail/contact_html.html:6 #, python-format -msgid "Truffe :: Contact :: %s" -msgstr "" - -#: generic/views.py:1028 -msgid "Message envoyé !" -msgstr "" - -#: logistics/models.py:26 logistics/models.py:39 logistics/models.py:282 -#: logistics/models.py:295 members/models.py:60 users/models.py:45 -msgid "Actif" -msgstr "" - -#: logistics/models.py:26 logistics/models.py:282 -msgid "Pour désactiver temporairement la posibilité de réserver." +msgid "" +"\n" +" Ce mail vous a été envoyé par %(sender)s concernant l'élément " +"%(obj)s.\n" +" " msgstr "" -#: logistics/models.py:28 +#: logistics/models.py:26 msgid "" "Si tu veux préciser les conditions de réservation pour la salle. Tu peux par " "exemple mettre un lien vers un contrat." msgstr "" -#: logistics/models.py:30 logistics/models.py:40 logistics/models.py:286 -#: logistics/models.py:296 -msgid "Autoriser les externes" -msgstr "" - -#: logistics/models.py:30 +#: logistics/models.py:28 msgid "Permet aux externes (pas dans l'AGEPoly) de réserver la salle." msgstr "" -#: logistics/models.py:31 logistics/models.py:287 -msgid "Conditions de réservation pour les externes" -msgstr "" - -#: logistics/models.py:31 +#: logistics/models.py:29 msgid "" "Si tu veux préciser des informations sur la réservation de la salle pour les " "externes. Remplace le champ 'Conditions' pour les externe si rempli." msgstr "" -#: logistics/models.py:33 logistics/models.py:289 -msgid "Autoriser tout le monde à voir le calendrier" -msgstr "" - -#: logistics/models.py:33 +#: logistics/models.py:31 msgid "" "Permet à tout le monde d'afficher le calendrier des réservations de la salle" msgstr "" -#: logistics/models.py:34 logistics/models.py:290 -msgid "Autoriser les externes à voir le calendrier" -msgstr "" - -#: logistics/models.py:34 +#: logistics/models.py:32 msgid "" "Permet aux externes d'afficher le calendrier des réservations de la salle. " "Le calendrier doit être visible." msgstr "" -#: logistics/models.py:45 logistics/models.py:302 -msgid "Conditions" -msgstr "" - -#: logistics/models.py:46 logistics/models.py:303 -msgid "Conditions pour les externes" -msgstr "" - -#: logistics/models.py:56 logistics/models.py:100 logistics/models.py:120 -#: logistics/models.py:121 logistics/models.py:138 logistics/models.py:165 +#: logistics/models.py:54 logistics/models.py:98 logistics/models.py:118 +#: logistics/models.py:119 logistics/models.py:136 logistics/models.py:163 msgid "Salle" msgstr "" -#: logistics/models.py:57 +#: logistics/models.py:55 msgid "Liste de toutes les salles réservables" msgstr "" -#: logistics/models.py:70 +#: logistics/models.py:68 msgid "" "Les salles sont la liste des salles réservables, gérés par l'unité active.\n" "\n" @@ -3375,50 +3858,35 @@ msgid "" "responsable de la modération des réservations." msgstr "" -#: logistics/models.py:107 logistics/models.py:364 -msgid "Explique pourquoi tu as besoin (manifestation par ex.)" -msgstr "" - -#: logistics/models.py:108 logistics/models.py:138 logistics/models.py:365 -#: logistics/models.py:395 vehicles/models.py:229 vehicles/models.py:252 -#: vehicles/templates/vehicles/booking/edit.html:18 -msgid "Remarques" +#: logistics/models.py:105 logistics/models.py:383 +msgid "Explique brièvement ce que tu vas faire" msgstr "" -#: logistics/models.py:114 logistics/models.py:371 -msgid "Nom de l'unité" +#: logistics/models.py:139 +msgid "Réservation de salle" msgstr "" -#: logistics/models.py:121 logistics/models.py:138 logistics/models.py:378 -#: logistics/models.py:395 -msgid "Conflits" +#: logistics/models.py:140 +msgid "Liste de toutes les réservations de salles" msgstr "" #: logistics/models.py:141 -msgid "Réservation de salle" +msgid "Liste de toutes les réservations des salles de mon unité" msgstr "" #: logistics/models.py:142 -msgid "Liste de toutes les réservations de salles" -msgstr "" - -#: logistics/models.py:143 -msgid "Liste de toutes les réservations des salles de mon unité" -msgstr "" - -#: logistics/models.py:144 msgid "Calendrier de mes réservations de salles" msgstr "" -#: logistics/models.py:145 +#: logistics/models.py:143 msgid "Calendrier des réservations des salles de mon unité" msgstr "" -#: logistics/models.py:146 +#: logistics/models.py:144 msgid "Calendrier des réservations de la salle" msgstr "" -#: logistics/models.py:167 +#: logistics/models.py:165 msgid "" "Les réservation de salles.\n" "\n" @@ -3428,7 +3896,7 @@ msgid "" "unité externe)." msgstr "" -#: logistics/models.py:173 +#: logistics/models.py:171 msgid "" "Les réservation des salles de l'unité.\n" "\n" @@ -3437,72 +3905,64 @@ msgid "" "Tu peux gérer ici la liste de réservation des salles de l'unité active." msgstr "" -#: logistics/models.py:179 +#: logistics/models.py:177 msgid "Les réservation d'un type de salle particulier." msgstr "" -#: logistics/models.py:221 logistics/models.py:224 +#: logistics/models.py:219 logistics/models.py:222 msgid "Salle non disponible" msgstr "" -#: logistics/models.py:227 logistics/models.py:484 -msgid "La date de fin ne peut pas être avant la date de début !" -msgstr "" - -#: logistics/models.py:232 -msgid "gérée par" +#: logistics/models.py:284 +msgid "Le nombre de fois que tu as l'objet à disposition" msgstr "" -#: logistics/models.py:241 logistics/models.py:501 -msgid "Pas de conflits !" +#: logistics/models.py:285 logistics/models.py:300 +msgid "Prix" msgstr "" -#: logistics/models.py:243 logistics/models.py:504 -msgid "Il y a d'autres réservations en même temps !" +#: logistics/models.py:285 +msgid "Le prix en CHF de remplacement du matériel, en cas de casse ou de perte" msgstr "" -#: logistics/models.py:280 -msgid "Le nombre de fois que tu as l'objet à disposition" -msgstr "" - -#: logistics/models.py:284 +#: logistics/models.py:289 msgid "" "Si tu veux préciser les conditions de réservations pour le matériel. Tu peux " "par exemple mettre un lien vers un contrat." msgstr "" -#: logistics/models.py:286 +#: logistics/models.py:291 msgid "Permet aux externes (pas dans l'AGEPoly) de réserver le matériel." msgstr "" -#: logistics/models.py:287 +#: logistics/models.py:292 msgid "" "Si tu veux préciser des informations sur la réservation du matériel pour les " "externes. Remplace le champ 'Conditions' pour les externe si rempli." msgstr "" -#: logistics/models.py:289 +#: logistics/models.py:294 msgid "" "Permet à tout le monde d'afficher le calendrier des réservations du matériel" msgstr "" -#: logistics/models.py:290 +#: logistics/models.py:295 msgid "" "Permet aux externes d'afficher le calendrier des réservations du matériel. " "Le calendrier doit être visible." msgstr "" -#: logistics/models.py:313 logistics/models.py:357 logistics/models.py:377 -#: logistics/models.py:378 logistics/models.py:395 logistics/models.py:422 -#: templates/base.html:290 +#: logistics/models.py:319 logistics/models.py:396 logistics/models.py:397 +#: logistics/models.py:414 logistics/models.py:441 logistics/models.py:497 +#: templates/base.html:246 msgid "Matériel" msgstr "" -#: logistics/models.py:314 +#: logistics/models.py:320 msgid "Liste de tout le matériel réservable" msgstr "" -#: logistics/models.py:327 +#: logistics/models.py:333 msgid "" "La liste du matériel réservable, gérés par l'unité active.\n" "\n" @@ -3510,210 +3970,493 @@ msgid "" "responsable de la modération des réservations." msgstr "" -#: logistics/models.py:398 +#: logistics/models.py:376 +msgid "Nom de la réservation" +msgstr "" + +#: logistics/models.py:376 +msgid "Par exemple le nom de ton événement" +msgstr "" + +#: logistics/models.py:378 +msgid "Date et heure souhaitées pour la prise du matériel" +msgstr "" + +#: logistics/models.py:379 +msgid "Date et heure souhaitées pour le retour du matériel" +msgstr "" + +#: logistics/models.py:381 +msgid "Téléphone de contact" +msgstr "" + +#: logistics/models.py:414 users/templates/users/users/myunit_pdf.html:28 +msgid "Téléphone" +msgstr "" + +#: logistics/models.py:417 msgid "Réservation de matériel" msgstr "" -#: logistics/models.py:399 +#: logistics/models.py:418 msgid "Liste de toutes les réservations de matériel" msgstr "" -#: logistics/models.py:400 +#: logistics/models.py:419 msgid "Liste de toutes les réservations du matériel de mon unité" msgstr "" -#: logistics/models.py:401 +#: logistics/models.py:420 msgid "Calendrier de mes réservations de matériel" msgstr "" -#: logistics/models.py:402 +#: logistics/models.py:421 msgid "Calendrier des réservations du matériel de mon unité" msgstr "" -#: logistics/models.py:403 +#: logistics/models.py:422 msgid "Calendrier des réservations du matériel" msgstr "" -#: logistics/models.py:424 +#: logistics/models.py:443 msgid "" "Les réservation de matériel.\n" "\n" -"Les réservations sont soumises à modération par l'unité liée au matériel.\n" +" Les réservations sont soumises à modération par l'unité liée au " +"matériel.\n" "\n" -"Tu peux gérer ici la liste de tes réservations pour l'unité active (ou une " -"unité externe)." +" Tu peux gérer ici la liste de tes réservations pour l'unité active " +"(ou une unité externe)." msgstr "" -#: logistics/models.py:430 +#: logistics/models.py:449 msgid "" "Les réservation du matériel de l'unité.\n" "\n" -"Les réservations sont soumises à modération par l'unité liée au matériel.\n" +" Les réservations sont soumises à modération par l'unité liée au " +"matériel.\n" "\n" -"Tu peux gérer ici la liste de réservation du matériel de l'unité active." +" Tu peux gérer ici la liste de réservation du matériel de l'unité " +"active." msgstr "" -#: logistics/models.py:436 +#: logistics/models.py:455 msgid "Les réservation d'un type de matériel particulier." msgstr "" -#: logistics/models.py:478 logistics/models.py:481 -msgid "Matériel non disponible" +#: logistics/models.py:539 +msgid "\"{}\" n'est pas disponible" +msgstr "" + +#: logistics/models.py:542 +msgid "" +"\"{}\" n'est pas disponible pour le moment, car probablement en réparation" +msgstr "" + +#: logistics/models.py:545 +msgid "" +"L'article \"{}\" est réservé pour les commissions. Est-ce que tu es bien en " +"train de faire la réservation depuis la bonne unité?" +msgstr "" + +#: logistics/models.py:548 +msgid "La quantité de \"{}\" doit être positive et non nulle" +msgstr "" + +#: logistics/models.py:550 +msgid "La quantité de \"{}\" doit être \"{}\" au maximum" +msgstr "" + +#: logistics/models.py:553 +msgid "Il y a plusieurs fois \"{}\" dans la liste" msgstr "" -#: logistics/models.py:492 +#: logistics/models.py:560 +msgid "" +"L'article \"{}\" appartient à l'unité {} alors que d'autres éléments " +"appartiennent à l'unité {}. Il faut faire plusieurs réservations si le " +"matériel appartient à des unités différentes." +msgstr "" + +#: logistics/models.py:563 +msgid "Il faut réserver du matériel !" +msgstr "" + +#: logistics/models.py:601 msgid "géré par" msgstr "" -#: logistics/templates/logistics/roomreservation/show.html:13 -#: logistics/templates/logistics/supplyreservation/show.html:16 +#: logistics/models.py:667 +msgid "Pas assez de" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:136 +msgid "CONVENTION DE PRÊT DE MATÉRIEL" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:138 +msgid "entre l’AGEPoly, ci-après le propriétaire, et " +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:138 +msgid ", ci-après l’emprunteur," +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:138 +msgid "pour l'événement : " +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:140 +msgid "Durée du prêt" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:142 msgid "" -"La personne effectuant la réservation s'engage à respecter les conditions en " -"demandant une validation de la réservation !" +"Le présent prêt de matériel est consenti gracieusement à titre non " +"commercial pour une durée de " +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:142 +msgid " jour" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:142 +msgid " jours" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:142 +msgid " à compter du " +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:142 +msgid " jusqu’au " +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:142 +msgid "." +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:145 +msgid "Conditions générales et responsabilités" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:147 +msgid "" +"L’emprunteur devra prendre rendez-vous avec le propriétaire du matériel pour " +"la prise de possession. Le matériel devra être testé en présence des deux " +"parties pour vérifier son bon état de fonctionnement. Cela implique que " +"l’emprunteur accepte le parfait état de fonctionnement de celui-ci. Quelles " +"que soient les modalités de transport et/ou de montage, l’emprunteur est " +"responsable du matériel dès que celui-ci quitte le propriétaire. " +"L’emprunteur qui transporte le matériel lui-même s'engage à le faire dans " +"les meilleures conditions." +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:148 +msgid "" +"L’emprunteur reconnaît expressément être le seul gardien du matériel prêté " +"durant l'intégralité du contrat et, le cas échéant, au-delà, jusqu'à la " +"restitution effective du matériel. Il s'engage à ce titre à exercer un " +"contrôle effectif et exclusif sur le matériel. Il est donc conseillé à " +"l’emprunteur de placer le matériel en sécurité afin d’éviter tous risques de " +"vol, vandalisme, catastrophes naturelles, dégâts corporels et matériels, " +"etc. Par ailleurs, l’emprunteur ne pourra ni céder, ni sous-louer, ni prêter " +"le matériel à un tiers sans l’accord du propriétaire. L’emprunteur s’engage " +"à ne donner au matériel aucune destination illégale ou contraire au bon sens " +"moral." +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:149 +msgid "" +"L’emprunteur déclare et est réputé disposer de toutes les informations " +"concernant les précautions et règles de sécurité liées à l’utilisation du " +"matériel et posséder les aptitudes, habilitations, permis, capacité " +"juridique et légale nécessaires à la détention et à l'utilisation adéquate " +"et prudente du matériel. Il lui appartient de compléter si nécessaire son " +"information. L’emprunteur sera donc tenu responsable de tout mauvais emploi. " +"En aucun cas le propriétaire ne pourra être tenu pour responsable de tous " +"dommages corporels ou matériels résultant de l'utilisation de son matériel " +"par l’emprunteur ayant accepté le parfait état de fonctionnement du matériel " +"par la signature du présent contrat." +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:150 +msgid "" +"Le matériel restitué sera testé par le propriétaire. Toute défectuosité, " +"irrégularité, ou usure exagérée par rapport à l'utilisation spécifiée, " +"constatées lors de ce contrôle sont à la charge de l’emprunteur. Sa " +"responsabilité ne peut excéder la valeur résiduelle éventuelle du matériel " +"telle que définie de bonne foi." +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:151 +msgid "" +"Le matériel manquant au retour sera facturé en fonction de la valeur de " +"remplacement du matériel. Des frais de nettoyage seront en outre appliqués " +"si le matériel est rendu sans avoir été suffisamment nettoyé." +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:152 +msgid "" +"Une caution d’au minimum 100.- sera demandée aux unités externes à l’AGEPoly " +"lors de la prise du matériel et sera restituée une fois ce dernier retourné " +"complet, propre, sec et en bon état." +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:153 +msgid "" +"Le matériel est prêté à bien plaire, cependant toute contrepartie sera " +"bienvenue." +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:157 +msgid "ÉTAT DES LIEUX DU MATÉRIEL" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:161 +msgid "Nb.
    Prêt" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:162 +msgid "Article" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:163 +msgid "Information et état" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:164 +msgid "Nb.
    Ret." +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:172 +msgid " " +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:179 +msgid "Observations :" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:183 +msgid "Signatures" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:187 +msgid "Pour le propriétaire" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:188 +msgid "Nom :" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:189 +msgid "Fonction :" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:190 +msgid "N° tél. :" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:191 +msgid "Matériel rendu le :" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:195 +msgid "Pour l'emprunteur" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:196 +#: templates/base_pdf.html:123 +msgid "Nom : " +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:197 +msgid "Fonction : " +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:198 +msgid "N° tél. : " +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:199 +msgid "Matériel prêté le :" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:200 +msgid "Signature : " +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:208 +msgid "Caution" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:211 +msgid "L'emprunteur a donné" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:213 +#: logistics/templates/logistics/supplyreservation/pdf.html:222 +msgid "CHF, le" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:216 +msgid "Signature du propriétaire :" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:220 +msgid "Le propriétaire a rendu" +msgstr "" + +#: logistics/templates/logistics/supplyreservation/pdf.html:225 +msgid "Signature de l'emprunteur :" msgstr "" -#: logistics/templates/logistics/supplyreservation/show.html:11 +#: logistics/templates/logistics/supplyreservation/show.html:15 msgid "Quantité réservable" msgstr "" -#: main/models.py:34 +#: logistics/templates/logistics/supplyreservation/show.html:65 +msgid " Convention de prêt" +msgstr "" + +#: main/models.py:38 msgid "Pas les droits" msgstr "" -#: main/models.py:50 +#: main/models.py:54 msgid "Content" msgstr "" -#: main/models.py:55 templates/base.html:170 +#: main/models.py:59 templates/base.html:170 msgid "News Truffe" msgstr "" -#: main/models.py:56 +#: main/models.py:60 msgid "Liste de toutes les news Truffe" msgstr "" -#: main/models.py:64 +#: main/models.py:68 msgid "" "Les news Truffe sont les nouvelles affichées sur la page d'accueil de Truffe." msgstr "" -#: main/models.py:96 +#: main/models.py:100 msgid "" "La news est en cours de création et n'est pas affichée sur la page d'accueil." msgstr "" -#: main/models.py:97 +#: main/models.py:101 msgid "" "La news est finalisée et sera affichée sur la page d'accueil aux dates " "prévues." msgstr "" -#: main/models.py:98 +#: main/models.py:102 msgid "" "La news est archivée et n'est plus affichée sur la page d'accueil. Elle " "n'est plus modifiable." msgstr "" -#: main/models.py:137 +#: main/models.py:141 msgid "Principal / En haut" msgstr "" -#: main/models.py:138 +#: main/models.py:142 msgid "Principal / En bas" msgstr "" -#: main/models.py:139 templates/base.html:125 +#: main/models.py:143 templates/base.html:125 msgid "Admin" msgstr "" -#: main/models.py:140 templates/base.html:146 +#: main/models.py:144 templates/base.html:146 msgid "Gens" msgstr "" -#: main/models.py:141 templates/base.html:166 units/models.py:288 +#: main/models.py:145 templates/base.html:166 units/models.py:286 msgid "Communication" msgstr "" -#: main/models.py:142 templates/base.html:198 units/models.py:291 +#: main/models.py:146 templates/base.html:242 units/models.py:289 msgid "Logistique" msgstr "" -#: main/models.py:143 +#: main/models.py:147 msgid "Logistique / Véhicules" msgstr "" -#: main/models.py:144 +#: main/models.py:148 msgid "Logistique / Salles" msgstr "" -#: main/models.py:145 +#: main/models.py:149 msgid "Logistique / Matériel" msgstr "" -#: main/models.py:146 +#: main/models.py:150 msgid "Unités et Accreds" msgstr "" -#: main/models.py:147 main/models.py:247 templates/base.html:372 +#: main/models.py:151 main/models.py:350 templates/base.html:417 msgid "Finances" msgstr "" -#: main/models.py:148 +#: main/models.py:152 msgid "Finances / Compta" msgstr "" -#: main/models.py:149 +#: main/models.py:153 msgid "Finances / Outils" msgstr "" -#: main/models.py:150 +#: main/models.py:154 msgid "Finances / Justifications" msgstr "" -#: main/models.py:151 +#: main/models.py:155 msgid "Finances / Gestion" msgstr "" -#: main/models.py:152 main/models.py:248 templates/base.html:498 -#: units/models.py:289 +#: main/models.py:156 main/models.py:351 templates/base.html:557 +#: units/models.py:287 msgid "Informatique" msgstr "" -#: main/models.py:153 main/models.py:249 templates/base.html:513 +#: main/models.py:157 main/models.py:352 templates/base.html:572 msgid "Divers" msgstr "" -#: main/models.py:156 +#: main/models.py:160 msgid "Position dans le menu de gauche" msgstr "" -#: main/models.py:156 +#: main/models.py:160 msgid "" "Laisser blanc pour faire un lien normal. Réservé au comité de l'AGEPoly. " "Attention, cache de 15 minutes !" msgstr "" -#: main/models.py:157 +#: main/models.py:161 msgid "Icone FontAwesome" msgstr "" -#: main/models.py:166 +#: main/models.py:170 msgid "Menu de gauche" msgstr "" -#: main/models.py:167 +#: main/models.py:171 msgid "Icone" msgstr "" -#: main/models.py:174 templates/base.html:517 +#: main/models.py:178 templates/base.html:576 msgid "Liens" msgstr "" -#: main/models.py:175 +#: main/models.py:179 msgid "Liste de toutes les liens" msgstr "" -#: main/models.py:183 +#: main/models.py:187 msgid "" "Les liens sont affichés dans la banque de liens pour les différentes unités. " "Tu peux par exemple lister les différents services interne à ta commission.\n" @@ -3721,34 +4464,54 @@ msgid "" "Le comité de l'AGEPoly peut aussi afficher un lien dans le menu de gauche." msgstr "" -#: main/models.py:222 +#: main/models.py:226 msgid "Peut afficher la base de liens" msgstr "" -#: main/models.py:240 +#: main/models.py:252 templates/base.html:392 units/models.py:342 +#: units/templates/units/role/users.html:4 +#: users/templates/users/users/list.html:27 +msgid "Rôles" +msgstr "" + +#: main/models.py:263 templates/base.html:605 +msgid "Documents à signer" +msgstr "" + +#: main/models.py:264 +msgid "Liste de tous les documents à signer" +msgstr "" + +#: main/models.py:270 +msgid "" +"Les différents documents à faire signer aux gens en fonction de leurs rôles." +msgstr "" + +#: main/models.py:343 msgid "Selement les membres d'une unité" msgstr "" -#: main/models.py:241 +#: main/models.py:344 msgid "Tous les utilisateurs" msgstr "" -#: main/models.py:244 main/models.py:258 units/models.py:319 -#: units/models.py:508 +#: main/models.py:347 main/models.py:361 units/models.py:333 +#: units/models.py:522 msgid "Accès" msgstr "" -#: main/models.py:252 main/models.py:257 +#: main/models.py:355 main/models.py:360 #: members/templates/members/membership/add.html:34 #: members/templates/members/membership/import.html:36 +#: members/templates/members/membership/import_list.html:36 msgid "Groupe" msgstr "" -#: main/models.py:270 +#: main/models.py:373 msgid "Liste de tous les fichiers" msgstr "" -#: main/models.py:276 +#: main/models.py:379 msgid "" "Les différents fichiers publics disponibles dans truffe 2.\n" "\n" @@ -3756,22 +4519,105 @@ msgid "" "latéral." msgstr "" -#: main/models.py:298 +#: main/models.py:401 msgid "Peut télécharger le fichier" msgstr "" -#: main/models.py:299 +#: main/models.py:402 msgid "Peut affichier la liste des fichiers pour les finances" msgstr "" -#: main/models.py:300 +#: main/models.py:403 msgid "Peut affichier la liste des fichiers pour l'informatique" msgstr "" -#: main/models.py:301 +#: main/models.py:404 msgid "Peut affichier la liste des fichiers divers" msgstr "" +#: main/views.py:418 +msgid "Document signé !" +msgstr "" + +#: main/templates/main/home.html:4 +msgid "Page d'accueil" +msgstr "" + +#: main/templates/main/home.html:7 +msgid "Bienvenue !" +msgstr "" + +#: main/templates/main/last_100_logging_entries.html:4 +msgid "Logging" +msgstr "" + +#: main/templates/main/last_100_logging_entries.html:7 +msgid "Liste des 100 dernières entrées dans les logs" +msgstr "" + +#: main/templates/main/search.html:4 main/templates/main/search.html.py:7 +msgid "Recherche" +msgstr "" + +#: main/templates/main/search.html:17 +msgid "" +"La fonctionnalité de recherche est obligée de vérifier les permissions de " +"tous les objets qui correspondent à ta recherche avant de te les proposer à " +"l'affichage." +msgstr "" + +#: main/templates/main/search.html:18 +msgid "" +"N'utilise pas des termes trop génériques, ou l'affichage des résultats " +"prendra du temps." +msgstr "" + +#: main/templates/main/search.html:19 +msgid "Seuls les 100 premiers résultats sont affichés." +msgstr "" + +#: main/templates/main/search.html:25 +msgid "Rechercher" +msgstr "" + +#: main/templates/main/search.html:34 +msgid "Résultats de la recherche" +msgstr "" + +#: main/templates/main/search.html:43 +msgid "Contexte" +msgstr "" + +#: main/templates/main/search.html:45 +msgid "Dernière modification" +msgstr "" + +#: main/templates/main/search.html:87 +msgid "Aucun résultat trouvé !" +msgstr "" + +#: main/templates/main/search.html:94 +msgid "Précédent" +msgstr "" + +#: main/templates/main/search.html:96 templates/base_pdf.html:155 +msgid "Page" +msgstr "Page" + +#: main/templates/main/search.html:98 templates/datatables.html:102 +msgid "Suivant" +msgstr "" + +#: main/templates/main/to_moderate.html:5 +msgid "Rien à faire !" +msgstr "" + +#: main/templates/main/to_moderate.html:6 +msgid "" +"Tu n'as rien à modérer, soit parce que tu as peu de droits, soit parce que " +"tu as bien fait ton travail :)" +msgstr "" + #: main/templates/main/box/accounting_errors.html:13 msgid "Aucune erreur !" msgstr "" @@ -3794,12 +4640,32 @@ msgstr "" #: main/templates/main/box/cashbooks.html:11 #: main/templates/main/box/expenseclaims.html:11 -msgid "À valider (trésorier)" +#: main/templates/main/box/providerInvoice.html:11 +msgid "À valider (Trésorier - Unité)" msgstr "" #: main/templates/main/box/cashbooks.html:11 #: main/templates/main/box/expenseclaims.html:11 -msgid "À valider (AGEPoly)" +#: main/templates/main/box/providerInvoice.html:11 +msgid "À valider (Secrétariat - AGEPoly)" +msgstr "" + +#: main/templates/main/box/cashbooks.html:11 +#: main/templates/main/box/expenseclaims.html:11 +#: main/templates/main/box/providerInvoice.html:11 +msgid "À signer (Comité - AGEPoly)" +msgstr "" + +#: main/templates/main/box/cashbooks.html:20 +#: main/templates/main/box/expenseclaims.html:20 +#: main/templates/main/box/providerInvoice.html:20 +msgid "A comptabiliser (Secrétariat - AGEPoly)" +msgstr "" + +#: main/templates/main/box/cashbooks.html:20 +#: main/templates/main/box/expenseclaims.html:20 +#: main/templates/main/box/providerInvoice.html:20 +msgid "En comptabilisation (Comptable - AGEP)" msgstr "" #: main/templates/main/box/cashbooks.html:26 @@ -3818,11 +4684,7 @@ msgstr "" msgid "Aucun transfert interne en attente !" msgstr "" -#: main/templates/main/box/invoices.html:9 -msgid "Besoin d'un BVR !" -msgstr "" - -#: main/templates/main/box/invoices.html:21 +#: main/templates/main/box/invoices.html:23 msgid "Aucune facture en attente !" msgstr "" @@ -3830,6 +4692,10 @@ msgstr "" msgid "Chargement..." msgstr "" +#: main/templates/main/box/providerInvoice.html:26 +msgid "Aucune facture fournisseur en attente !" +msgstr "" + #: main/templates/main/box/withdrawals.html:11 msgid "A valider / retirer pour le" msgstr "" @@ -3855,207 +4721,352 @@ msgstr "" msgid "Liste des fichiers" msgstr "" -#: main/templates/main/home.html:4 -msgid "Page d'accueil" +#: main/templates/main/link/base.html:4 +msgid "Base de lien" msgstr "" -#: main/templates/main/home.html:7 -msgid "Bienvenue !" +#: main/templates/main/link/base.html:8 main/templates/main/link/base.html:12 +msgid "Base de liens" msgstr "" -#: main/templates/main/last_100_logging_entries.html:4 -msgid "Logging" +#: main/templates/main/signabledocument/sign.html:4 +msgid "Signature de document" msgstr "" -#: main/templates/main/last_100_logging_entries.html:7 -msgid "Liste des 100 dernières entrées dans les logs" +#: main/templates/main/signabledocument/sign.html:8 +msgid "Signature de document: " msgstr "" -#: main/templates/main/link/base.html:4 -msgid "Base de lien" +#: main/templates/main/signabledocument/sign.html:17 +msgid "Tu dois signer le document" msgstr "" -#: main/templates/main/link/base.html:8 main/templates/main/link/base.html:12 -msgid "Base de liens" +#: main/templates/main/signabledocument/sign.html:18 +msgid "à cause de tes accréditations." msgstr "" -#: main/templates/main/search.html:4 main/templates/main/search.html.py:7 -msgid "Recherche" +#: main/templates/main/signabledocument/sign.html:29 +msgid "Télécharger le document" msgstr "" -#: main/templates/main/search.html:17 +#: main/templates/main/signabledocument/sign.html:38 +msgid "Tu as signé ce document !" +msgstr "" + +#: main/templates/main/signabledocument/sign.html:44 +msgid "IP" +msgstr "" + +#: main/templates/main/signabledocument/sign.html:47 +msgid "User agent" +msgstr "" + +#: main/templates/main/signabledocument/sign.html:50 +msgid "SHA" +msgstr "" + +#: main/templates/main/signabledocument/sign.html:61 msgid "" -"La fonctionnalité de recherche est obligée de vérifier les permissions de " -"tous les objets qui correspondent à ta recherche avant de te les proposer à " -"l'affichage." +"En cliquant sur le bouton suivant (ou en envoyant le formulaire d'une autre " +"manière), tu reconnais avoir lu et accepté le document. L'heure, ton ip, ton " +"user agent ainsi qu'un hash du document sera sauvegardé !" msgstr "" -#: main/templates/main/search.html:18 +#: main/templates/main/signabledocument/sign.html:67 +#: main/templates/main/signabledocument/signs.html:43 +msgid "Signer" +msgstr "" + +#: main/templates/main/signabledocument/signs.html:4 +#: main/templates/main/signabledocument/signs.html:8 +msgid "Signature de documents" +msgstr "" + +#: main/templates/main/signabledocument/signs.html:20 +msgid "Signé ?" +msgstr "" + +#: main/templates/main/signabledocument/signs.html:41 +#: main/templates/main/signabledocument/signs.html:89 +msgid "Voir la signature" +msgstr "" + +#: main/templates/main/signabledocument/signs.html:64 +msgid "Valide ?" +msgstr "" + +#: members/forms2.py:33 units/forms2.py:32 +msgid "Pas un username valide" +msgstr "" + +#: members/forms2.py:48 +msgid "Fichier à importer" +msgstr "" + +#: members/forms2.py:49 +msgid "Copier les cotisations ?" +msgstr "" + +#: members/forms2.py:55 msgid "" -"N'utilise pas des termes trop génériques, ou l'affichage des résultats " -"prendra du temps." +"Accepte les fichiers JSON composés de listes de username ou de listes de " +"couples (username, cotisation_payée)" msgstr "" -#: main/templates/main/search.html:19 -msgid "Seuls les 100 premiers résultats sont affichés." +#: members/forms2.py:62 +msgid "Liste de scipers, un par ligne" msgstr "" -#: main/templates/main/search.html:25 -msgid "Rechercher" +#: members/forms2.py:63 +msgid "Définir les cotisations comme payée ?" msgstr "" -#: main/templates/main/search.html:34 -msgid "Résultats de la recherche" +#: members/models.py:21 +msgid "Génère des accreds" msgstr "" -#: main/templates/main/search.html:43 -msgid "Contexte" +#: members/models.py:22 +msgid "Accréditation générée pour les membres" msgstr "" -#: main/templates/main/search.html:45 -msgid "Dernière modification" +#: members/models.py:23 +msgid "Rend les accreds visibles dans l'annuaire" msgstr "" -#: main/templates/main/search.html:87 -msgid "Aucun résultat trouvé !" +#: members/models.py:24 members/models.py:33 +msgid "Gestion des cotisations" msgstr "" -#: main/templates/main/search.html:94 -msgid "Précédent" +#: members/models.py:26 +msgid "Clé secrète pour l'API" msgstr "" -#: main/templates/main/search.html:98 templates/datatables.html:102 -msgid "Suivant" +#: members/models.py:30 +msgid "Nom du groupe de membres" +msgstr "" + +#: members/models.py:31 +msgid "Génère une accréditation" +msgstr "" + +#: members/models.py:32 +msgid "Visible dans l'annuaire EPFL" +msgstr "" + +#: members/models.py:37 +msgid "Type généré" +msgstr "" + +#: members/models.py:43 members/templates/members/membership/delete.html:8 +msgid "Groupes de Membres" +msgstr "" + +#: members/models.py:44 +msgid "Liste des groupes de membre" +msgstr "" + +#: members/models.py:54 +msgid "" +"Les groupes de membres représentent l'ensemble des membres des différentes " +"unités de l'AGEPoly.\n" +"Par exemple, ils peuvent contenir les membres d'honneurs d'une unité ou les " +"membres qui cotisent.\n" +"Les groupes peuvent générer une accréditation EPFL pour leurs membres et " +"gérer les cotisations suivant leur état." +msgstr "" + +#: members/models.py:69 +msgid "Le groupe de membres est en cours de création et n'est pas public." +msgstr "" + +#: members/models.py:70 +msgid "Le groupe de membres est actif." +msgstr "" + +#: members/models.py:71 +msgid "Le groupe de membres est archivé." +msgstr "" + +#: members/models.py:93 +msgid "Rendre le groupe de membres actif" +msgstr "" + +#: members/models.py:94 +msgid "Archiver le groupe de membres" +msgstr "" + +#: members/models.py:127 +msgid "Accréditation nécessaire pour l'attribuer aux membres." +msgstr "" + +#: members/models.py:135 +msgid "L'unité possède déjà un groupe avec ce nom." +msgstr "" + +#: members/models.py:177 +msgid "Groupe de membres" +msgstr "" + +#: members/models.py:178 +msgid "Date d'ajout au groupe" +msgstr "" + +#: members/models.py:179 +msgid "Date de retrait du groupe" +msgstr "" + +#: members/models.py:180 +msgid "A payé sa cotisation" msgstr "" -#: main/templates/main/to_moderate.html:5 -msgid "Rien à faire !" +#: members/views.py:84 +msgid "Membre retiré !" msgstr "" -#: main/templates/main/to_moderate.html:6 -msgid "" -"Tu n'as rien à modérer, soit parce que tu as peu de droits, soit parce que " -"tu as bien fait ton travail :)" +#: members/views.py:105 +msgid "Cotisation mise à jour !" msgstr "" -#: members/forms2.py:33 units/forms2.py:32 -msgid "Pas un username valide" +#: members/views.py:181 members/views.py:235 +msgid "Impossible de créer l'utilisateur" msgstr "" -#: members/forms2.py:48 -msgid "Fichier à importer" +#: members/views.py:187 members/views.py:240 +msgid "L'utilisateur est déjà membre de ce groupe" msgstr "" -#: members/forms2.py:49 -msgid "Copier les cotisations ?" +#: members/views.py:192 members/views.py:243 +msgid "Utilisateur ajouté avec succès" msgstr "" -#: members/forms2.py:55 -msgid "" -"Accepte les fichiers JSON composés de listes de username ou de listes de " -"couples (username, cotisation_payée)" +#: members/views.py:196 +msgid "ERREUR" msgstr "" -#: members/models.py:21 -msgid "Génère des accreds" +#: members/views.py:196 +msgid "Le fichier ne peut pas être lu correctement, l'import a été annulé" msgstr "" -#: members/models.py:22 -msgid "Accréditation générée pour les membres" +#: members/templates/members/memberset/info_api.html:13 +#: members/templates/members/memberset/show.html:143 +msgid "Informations sur l'API" msgstr "" -#: members/models.py:23 -msgid "Rend les accreds visibles dans l'annuaire" +#: members/templates/members/memberset/info_api.html:18 +msgid "URL de l'API" msgstr "" -#: members/models.py:24 members/models.py:31 -msgid "Gestion des cotisations" +#: members/templates/members/memberset/info_api.html:19 +msgid "L'URL de base de l'API est:" msgstr "" -#: members/models.py:28 -msgid "Nom du groupe de membres" +#: members/templates/members/memberset/info_api.html:21 +msgid "Cette url est unique par groupe de membre." msgstr "" -#: members/models.py:29 -msgid "Génère une accréditation" +#: members/templates/members/memberset/info_api.html:23 +msgid "Clé secrète" msgstr "" -#: members/models.py:30 -msgid "Visible dans l'annuaire EPFL" +#: members/templates/members/memberset/info_api.html:24 +msgid "La clé secrète de l'API est:" msgstr "" -#: members/models.py:35 -msgid "Type généré" +#: members/templates/members/memberset/info_api.html:26 +msgid "" +"Cette clé est unique par groupe de membre. Tu peux la changer avec ce " +"bouton: " msgstr "" -#: members/models.py:41 members/templates/members/membership/delete.html:8 -msgid "Groupes de Membres" +#: members/templates/members/memberset/info_api.html:27 +msgid "Générer une nouvelle clé" msgstr "" -#: members/models.py:42 -msgid "Liste des groupes de membre" +#: members/templates/members/memberset/info_api.html:29 +msgid "Usage de la clé" msgstr "" -#: members/models.py:52 +#: members/templates/members/memberset/info_api.html:30 msgid "" -"Les groupes de membres représentent l'ensemble des membres des différentes " -"unités de l'AGEPoly.\n" -"Par exemple, ils peuvent contenir les membres d'honneurs d'une unité ou les " -"membres qui cotisent.\n" -"Les groupes peuvent générer une accréditation EPFL pour leurs membres et " -"gérer les cotisations suivant leur état." +"Pour utiliser la clé, tu peux soit la passer dans l'url (non-recommandé) " +"avec le paramètre key" msgstr "" -#: members/models.py:67 -msgid "Le groupe de membres est en cours de création et n'est pas public." +#: members/templates/members/memberset/info_api.html:31 +msgid "ou la transmettre via le header HTTP X-Truffe2-Key" msgstr "" -#: members/models.py:68 -msgid "Le groupe de membres est actif." +#: members/templates/members/memberset/info_api.html:33 +msgid "Methode GET" msgstr "" -#: members/models.py:69 -msgid "Le groupe de membres est archivé." +#: members/templates/members/memberset/info_api.html:34 +msgid "" +"En faisant une requête GET sur l'URL, tu recevras une liste au format JSON " +"avec le sciper des membres, ainsi que l'éventuel statut de la cotisation. " +"Exemple:" msgstr "" -#: members/models.py:91 -msgid "Rendre le groupe de membres actif" +#: members/templates/members/memberset/info_api.html:52 +msgid "Methode PUT" msgstr "" -#: members/models.py:92 -msgid "Archiver le groupe de membres" +#: members/templates/members/memberset/info_api.html:53 +msgid "" +"En faisant une requête PUT sur l'URL, tu peux ajouter un membre et/ou " +"définir le statut de sa cotisation. Retourne 3 résultats possibles: " +"'CREATED' si le membre a été crée, 'UPDATED_FEE' si la cotisation à été mise " +"à jour ou 'ALREADY_OK' si rien n'a changé. Par défault, si rien n'est " +"spécifié, les cotisations sont misent à False. Exemple:" msgstr "" -#: members/models.py:120 -msgid "Accréditation nécessaire pour l'attribuer aux membres." +#: members/templates/members/memberset/info_api.html:68 +msgid "" +"Le système peut aussi te retourner une erreur. Par exemple si le sciper " +"n'est pas dans le LDAP de l'EPFL, 'WRONG_SCIPER' sera retourné. Si tu " +"oublies de passer des informations, 'MISSING_MEMBER' ou 'MISSING_SCIPER' " +"sera retourné." msgstr "" -#: members/models.py:128 -msgid "L'unité possède déjà un groupe avec ce nom." +#: members/templates/members/memberset/info_api.html:72 +msgid "Methode DELETE" msgstr "" -#: members/models.py:170 -msgid "Groupe de membres" +#: members/templates/members/memberset/info_api.html:73 +msgid "" +"En faisant une requête DELETE sur l'URL, tu peux supprimer un membre. " +"Retourne 2 résultats possibles: 'REMOVED' si le membre a été retiré et " +"'ALREADY_OK' si l'utilisateur n'était pas un membre. Exemple:" msgstr "" -#: members/models.py:171 -msgid "Date d'ajout au groupe" +#: members/templates/members/memberset/info_api.html:83 +msgid "" +"Le système peut aussi te retourner une erreur. Par exemple, si tu oublies de " +"passer des informations, 'MISSING_MEMBER' ou 'MISSING_SCIPER' sera retourné. " +"Si aucun utilisateur n'existe dans le LDAP avec le sciper envoyé, " +"'UNKNOWN_USER' sera retourné." msgstr "" -#: members/models.py:172 -msgid "Date de retrait du groupe" +#: members/templates/members/memberset/info_api.html:88 +msgid "Methode POST" msgstr "" -#: members/models.py:173 -msgid "A payé sa cotisation" +#: members/templates/members/memberset/info_api.html:89 +msgid "" +"En faisant une requête POST sur l'URL, tu peux définir une liste de membres. " +"Le système te retourne une liste des modifications appliquées via 5 listes: " +"'created', la liste des membres ajoutés, 'updated', la liste des membres " +"dont la cotisation a été mise à jour, 'already_ok', la liste des membres " +"sans modifications, 'removed', la liste des membres retirés et 'errors' avec " +"la liste des erreurs. Exemple:" msgstr "" -#: members/templates/members/memberset/show.html:15 templates/base.html:451 +#: members/templates/members/memberset/show.html:15 templates/base.html:510 msgid "Gestion" msgstr "" -#: members/templates/members/memberset/show.html:42 units/models.py:506 -#: units/models.py:512 users/models.py:159 +#: members/templates/members/memberset/show.html:42 units/models.py:520 +#: units/models.py:526 users/models.py:181 msgid "Utilisateur" msgstr "" @@ -4073,7 +5084,21 @@ msgid "Exporter" msgstr "" #: members/templates/members/memberset/show.html:77 -msgid "Importer" +msgid "Importer (fichier)" +msgstr "" + +#: members/templates/members/memberset/show.html:82 +msgid "Importer (Liste)" +msgstr "" + +#: members/templates/members/memberset/show.html:138 +msgid "API pour la gestion d'un groupe de membres" +msgstr "" + +#: members/templates/members/memberset/show.html:139 +msgid "" +"Il est possible de gérer avec une API un groupe de membres, pour automatiser " +"certains processus." msgstr "" #: members/templates/members/membership/add.html:12 @@ -4090,6 +5115,7 @@ msgstr "" #: members/templates/members/membership/add.html:38 #: members/templates/members/membership/import.html:40 +#: members/templates/members/membership/import_list.html:40 msgid "Ferme cette fenêtre et selectionne le bon groupe si tu veux en changer" msgstr "" @@ -4106,6 +5132,7 @@ msgid "du groupe" msgstr "" #: members/templates/members/membership/import.html:13 +#: members/templates/members/membership/import_list.html:13 msgid "Import de membres" msgstr "" @@ -4113,49 +5140,33 @@ msgstr "" msgid "Changer le statut de la cotisation" msgstr "" -#: members/views.py:81 -msgid "Membre retiré !" -msgstr "" - -#: members/views.py:102 -msgid "Cotisation mise à jour !" -msgstr "" - -#: members/views.py:178 -msgid "Impossible de créer l'utilisateur" -msgstr "" - -#: members/views.py:183 -msgid "L'utilisateur est déjà membre de ce groupe" -msgstr "" - -#: members/views.py:188 -msgid "Utilisateur ajouté avec succès" -msgstr "" - -#: members/views.py:192 -msgid "ERREUR" -msgstr "" - -#: members/views.py:192 -msgid "Le fichier ne peut pas être lu correctement, l'import a été annulé" +#: notifications/models.py:55 notifications/models.py:63 +msgid "Ne pas regrouper les notification en un seul mail" msgstr "" -#: notifications/management/commands/process_notifications.py:33 +#: notifications/management/commands/process_notifications.py:46 msgid "Truffe :: Notification :: {}" msgstr "" -#: notifications/management/commands/process_notifications.py:47 +#: notifications/management/commands/process_notifications.py:61 msgid "Truffe :: Notifications ({}) :: {}" msgstr "" +#: notifications/templates/notifications/dropdown.html:17 +msgid "Aucune notification !" +msgstr "" + +#: notifications/templates/notifications/dropdown.html:31 #: notifications/templates/notifications/center/index.html:4 #: notifications/templates/notifications/center/index.html:8 -#: notifications/templates/notifications/dropdown.html:31 -#: templates/base.html:547 +#: templates/base.html:616 msgid "Centre de notifications" msgstr "" +#: notifications/templates/notifications/dropdown.html:35 +msgid "Marquer tout comme lu" +msgstr "" + #: notifications/templates/notifications/center/index.html:13 msgid "Gestion des notifications" msgstr "" @@ -4180,42 +5191,44 @@ msgstr "" msgid "Tous les types" msgstr "" -#: notifications/templates/notifications/center/restrictions.html:4 +#: notifications/templates/notifications/center/restrictions.html:6 msgid "Pour les notifications de type" msgstr "" -#: notifications/templates/notifications/center/restrictions.html:6 +#: notifications/templates/notifications/center/restrictions.html:8 msgid "Pour toutes les notificaitons:" msgstr "" -#: notifications/templates/notifications/center/restrictions.html:9 +#: notifications/templates/notifications/center/restrictions.html:11 msgid "Désactiver les mails" msgstr "" -#: notifications/templates/notifications/center/restrictions.html:14 -#: notifications/templates/notifications/center/restrictions.html:25 +#: notifications/templates/notifications/center/restrictions.html:16 +#: notifications/templates/notifications/center/restrictions.html:27 +#: notifications/templates/notifications/center/restrictions.html:38 msgid "Oui" msgstr "" -#: notifications/templates/notifications/center/restrictions.html:14 -#: notifications/templates/notifications/center/restrictions.html:25 +#: notifications/templates/notifications/center/restrictions.html:16 +#: notifications/templates/notifications/center/restrictions.html:27 +#: notifications/templates/notifications/center/restrictions.html:38 msgid "Non" msgstr "" -#: notifications/templates/notifications/center/restrictions.html:20 +#: notifications/templates/notifications/center/restrictions.html:22 msgid "Ignorer automatiquement" msgstr "" -#: notifications/templates/notifications/center/restrictions.html:34 -msgid "Désactiver toutes les notifications est une mauvaise idée !" +#: notifications/templates/notifications/center/restrictions.html:33 +msgid "Ne jamais grouper les mails" msgstr "" -#: notifications/templates/notifications/dropdown.html:17 -msgid "Aucune notification !" +#: notifications/templates/notifications/center/restrictions.html:47 +msgid "Désactiver toutes les notifications est une mauvaise idée !" msgstr "" -#: notifications/templates/notifications/dropdown.html:35 -msgid "Marquer tout comme lu" +#: notifications/templates/notifications/center/restrictions.html:51 +msgid "Tu ne peux pas mettre de restriction sur le groupes de clé" msgstr "" #: notifications/templates/notifications/mails/new_notif_html.html:5 @@ -4223,33 +5236,18 @@ msgid "Vous avez une nouvelle notification sur Truffe !" msgstr "" #: notifications/templates/notifications/mails/new_notif_html.html:30 -#: notifications/templates/notifications/mails/new_notif_plain.txt:14 #: notifications/templates/notifications/mails/new_notifs_html.html:44 -#: notifications/templates/notifications/mails/new_notifs_plain.txt:23 msgid "Le système de notifications de Truffe" msgstr "" -#: notifications/templates/notifications/mails/new_notif_plain.txt:4 -msgid "" -"\n" -"Vous avez une nouvelle notification sur Truffe !\n" -msgstr "" - #: notifications/templates/notifications/mails/new_notifs_html.html:5 msgid "Vous avez plusieurs nouvelles notifications sur Truffe !" msgstr "" #: notifications/templates/notifications/mails/new_notifs_html.html:19 -#: notifications/templates/notifications/mails/new_notifs_plain.txt:9 msgid "Notification du " msgstr "" -#: notifications/templates/notifications/mails/new_notifs_plain.txt:4 -msgid "" -"\n" -"Vous avez plusieures nouvelles notifications sur Truffe !\n" -msgstr "" - #: notifications/templates/notifications/species/accounting_accepted.html:5 #: notifications/templates/notifications/species/accounting_accountable.html:5 #: notifications/templates/notifications/species/accounting_canceled.html:5 @@ -4266,6 +5264,7 @@ msgid "La pièce comptable \"" msgstr "" #: notifications/templates/notifications/species/accounting_accepted.html:5 +#: notifications/templates/notifications/species/invoices_accepted.html:3 msgid "\" a été validée." msgstr "" @@ -4284,13 +5283,13 @@ msgstr "" msgid "Retrait" msgstr "" -#: notifications/templates/notifications/species/accounting_base.html:20 +#: notifications/templates/notifications/species/accounting_base.html:22 #: notifications/templates/notifications/species/mails/accounting_base.html:13 #, python-format msgid "Objet non reconnu (%(class)s), contacter l'administrateur." msgstr "" -#: notifications/templates/notifications/species/accounting_base.html:27 +#: notifications/templates/notifications/species/accounting_base.html:29 #: notifications/templates/notifications/species/accounting_error_created.html:12 #: notifications/templates/notifications/species/accounting_error_fixed.html:12 #: notifications/templates/notifications/species/accounting_error_message.html:12 @@ -4301,6 +5300,16 @@ msgstr "" #: notifications/templates/notifications/species/accreds_tovalidate.html:16 #: notifications/templates/notifications/species/accreds_validated.html:16 #: notifications/templates/notifications/species/accreds_warning.html:18 +#: notifications/templates/notifications/species/canceled.html:12 +#: notifications/templates/notifications/species/deleted.html:12 +#: notifications/templates/notifications/species/drafted.html:12 +#: notifications/templates/notifications/species/invoices_done.html:12 +#: notifications/templates/notifications/species/invoices_sent.html:12 +#: notifications/templates/notifications/species/invoices_to_correct.html:12 +#: notifications/templates/notifications/species/moderation.html:12 +#: notifications/templates/notifications/species/online.html:12 +#: notifications/templates/notifications/species/refused.html:12 +#: notifications/templates/notifications/species/validated.html:12 #: notifications/templates/notifications/species/center/buttons/accounting_accepted.html:4 #: notifications/templates/notifications/species/center/buttons/accounting_accountable.html:4 #: notifications/templates/notifications/species/center/buttons/accounting_canceled.html:4 @@ -4317,26 +5326,15 @@ msgstr "" #: notifications/templates/notifications/species/center/buttons/accreds_tovalidate.html:4 #: notifications/templates/notifications/species/center/buttons/accreds_validated.html:4 #: notifications/templates/notifications/species/center/buttons/accreds_warning.html:4 +#: notifications/templates/notifications/species/center/buttons/canceled.html:4 #: notifications/templates/notifications/species/center/buttons/deleted.html:4 #: notifications/templates/notifications/species/center/buttons/drafted.html:4 -#: notifications/templates/notifications/species/center/buttons/invoices_bvr_needed.html:4 -#: notifications/templates/notifications/species/center/buttons/invoices_bvr_set.html:4 #: notifications/templates/notifications/species/center/buttons/invoices_done.html:4 #: notifications/templates/notifications/species/center/buttons/invoices_sent.html:4 #: notifications/templates/notifications/species/center/buttons/moderation.html:4 #: notifications/templates/notifications/species/center/buttons/online.html:4 #: notifications/templates/notifications/species/center/buttons/refused.html:4 #: notifications/templates/notifications/species/center/buttons/validated.html:4 -#: notifications/templates/notifications/species/deleted.html:12 -#: notifications/templates/notifications/species/drafted.html:12 -#: notifications/templates/notifications/species/invoices_bvr_needed.html:12 -#: notifications/templates/notifications/species/invoices_bvr_set.html:12 -#: notifications/templates/notifications/species/invoices_done.html:12 -#: notifications/templates/notifications/species/invoices_sent.html:12 -#: notifications/templates/notifications/species/moderation.html:12 -#: notifications/templates/notifications/species/online.html:12 -#: notifications/templates/notifications/species/refused.html:12 -#: notifications/templates/notifications/species/validated.html:12 msgid "Ignorer" msgstr "" @@ -4435,6 +5433,84 @@ msgstr "" msgid "jours !" msgstr "" +#: notifications/templates/notifications/species/canceled.html:7 +#: notifications/templates/notifications/species/deleted.html:7 +#: notifications/templates/notifications/species/drafted.html:7 +#: notifications/templates/notifications/species/online.html:7 +#: notifications/templates/notifications/species/refused.html:7 +#: notifications/templates/notifications/species/validated.html:7 +#: notifications/templates/notifications/species/mails/canceled.html:2 +#: notifications/templates/notifications/species/mails/deleted.html:2 +#: notifications/templates/notifications/species/mails/drafted.html:2 +#: notifications/templates/notifications/species/mails/online.html:2 +#: notifications/templates/notifications/species/mails/refused.html:2 +#: notifications/templates/notifications/species/mails/validated.html:2 +msgid "L'élément" +msgstr "" + +#: notifications/templates/notifications/species/canceled.html:7 +#: notifications/templates/notifications/species/mails/canceled.html:2 +msgid "a été annulé !" +msgstr "" + +#: notifications/templates/notifications/species/deleted.html:7 +#: notifications/templates/notifications/species/mails/deleted.html:2 +msgid "a été supprimé alors qu'il était validé !" +msgstr "" + +#: notifications/templates/notifications/species/drafted.html:7 +msgid "est repassé en brouillon alors qu'il était validé !" +msgstr "" + +#: notifications/templates/notifications/species/invoices_accepted.html:3 +msgid "La Facture \"" +msgstr "" + +#: notifications/templates/notifications/species/invoices_accepted.html:5 +#: notifications/templates/notifications/species/mails/invoices_accepted.html:5 +msgid "Il faut l'envoyer !" +msgstr "" + +#: notifications/templates/notifications/species/invoices_done.html:7 +#: notifications/templates/notifications/species/mails/invoices_done.html:2 +msgid "Le paiement pour la facture" +msgstr "" + +#: notifications/templates/notifications/species/invoices_done.html:7 +msgid "a été effectué !" +msgstr "" + +#: notifications/templates/notifications/species/invoices_sent.html:7 +#: notifications/templates/notifications/species/mails/invoices_sent.html:2 +msgid "Une nouvelle facture a été émise" +msgstr "" + +#: notifications/templates/notifications/species/invoices_to_correct.html:7 +#: notifications/templates/notifications/species/center/message/invoices_to_correct.html:3 +#: notifications/templates/notifications/species/mails/invoices_to_correct.html:2 +msgid "La facture contient des erreurs à corriger" +msgstr "" + +#: notifications/templates/notifications/species/moderation.html:7 +#: notifications/templates/notifications/species/mails/moderation.html:2 +msgid "Il faut modérer l'élément" +msgstr "" + +#: notifications/templates/notifications/species/online.html:7 +#: notifications/templates/notifications/species/mails/online.html:2 +msgid "est maintenant en ligne !" +msgstr "" + +#: notifications/templates/notifications/species/refused.html:7 +#: notifications/templates/notifications/species/mails/refused.html:2 +msgid "a été refusé !" +msgstr "" + +#: notifications/templates/notifications/species/validated.html:7 +#: notifications/templates/notifications/species/mails/validated.html:2 +msgid "est maintenant validé !" +msgstr "" + #: notifications/templates/notifications/species/center/message/accounting_accepted.html:3 msgid "L'objet a été saisi" msgstr "" @@ -4494,6 +5570,10 @@ msgstr "" msgid "Des accréditations vont expirer dans %(days_left)s jours !" msgstr "" +#: notifications/templates/notifications/species/center/message/canceled.html:3 +msgid "L'objet a été annulé !" +msgstr "" + #: notifications/templates/notifications/species/center/message/deleted.html:3 msgid "L'objet a été supprimé alors qu'il était validé !" msgstr "" @@ -4502,12 +5582,8 @@ msgstr "" msgid "L'objet a été repassé en brouillon alors qu'il était validé" msgstr "" -#: notifications/templates/notifications/species/center/message/invoices_bvr_needed.html:3 -msgid "Il faut attribuer un numéro de BVR !" -msgstr "" - -#: notifications/templates/notifications/species/center/message/invoices_bvr_set.html:3 -msgid "Un numéro de BVR a été attribué !" +#: notifications/templates/notifications/species/center/message/invoices_accepted.html:3 +msgid "La facture a été acceptée, il faut l'envoyer" msgstr "" #: notifications/templates/notifications/species/center/message/invoices_done.html:3 @@ -4534,52 +5610,6 @@ msgstr "" msgid "L'objet lié est maintenant validé !" msgstr "" -#: notifications/templates/notifications/species/deleted.html:7 -#: notifications/templates/notifications/species/drafted.html:7 -#: notifications/templates/notifications/species/mails/deleted.html:2 -#: notifications/templates/notifications/species/mails/drafted.html:2 -#: notifications/templates/notifications/species/mails/online.html:2 -#: notifications/templates/notifications/species/mails/refused.html:2 -#: notifications/templates/notifications/species/mails/validated.html:2 -#: notifications/templates/notifications/species/online.html:7 -#: notifications/templates/notifications/species/refused.html:7 -#: notifications/templates/notifications/species/validated.html:7 -msgid "L'élément" -msgstr "" - -#: notifications/templates/notifications/species/deleted.html:7 -#: notifications/templates/notifications/species/mails/deleted.html:2 -msgid "a été supprimé alors qu'il était validé !" -msgstr "" - -#: notifications/templates/notifications/species/drafted.html:7 -msgid "est repassé en brouillon alors qu'il était validé !" -msgstr "" - -#: notifications/templates/notifications/species/invoices_bvr_needed.html:7 -#: notifications/templates/notifications/species/mails/invoices_bvr_needed.html:2 -msgid "Il faut attribuer un BVR à la facture" -msgstr "" - -#: notifications/templates/notifications/species/invoices_bvr_set.html:7 -#: notifications/templates/notifications/species/mails/invoices_bvr_set.html:2 -msgid "Un numéro de BVR a été attribué à la facture" -msgstr "" - -#: notifications/templates/notifications/species/invoices_done.html:7 -#: notifications/templates/notifications/species/mails/invoices_done.html:2 -msgid "Le paiement pour la facture" -msgstr "" - -#: notifications/templates/notifications/species/invoices_done.html:7 -msgid "a été effectué !" -msgstr "" - -#: notifications/templates/notifications/species/invoices_sent.html:7 -#: notifications/templates/notifications/species/mails/invoices_sent.html:2 -msgid "Une nouvelle facture a été émise" -msgstr "" - #: notifications/templates/notifications/species/mails/accounting_accepted.html:5 msgid "\" a été saisie." msgstr "" @@ -4618,36 +5648,21 @@ msgstr "" msgid "\" doit être justifiée." msgstr "" -#: notifications/templates/notifications/species/mails/accreds_validated.html:2 -msgid "a été validée !" -msgstr "" - -#: notifications/templates/notifications/species/mails/drafted.html:2 -msgid "a été repassé en brouillon alors qu'il était validé !" -msgstr "" - -#: notifications/templates/notifications/species/mails/invoices_done.html:2 -msgid "a été effectué " -msgstr "" - -#: notifications/templates/notifications/species/mails/moderation.html:2 -#: notifications/templates/notifications/species/moderation.html:7 -msgid "Il faut modérer l'élément" +#: notifications/templates/notifications/species/mails/accreds_validated.html:2 +msgid "a été validée !" msgstr "" -#: notifications/templates/notifications/species/mails/online.html:2 -#: notifications/templates/notifications/species/online.html:7 -msgid "est maintenant en ligne !" +#: notifications/templates/notifications/species/mails/drafted.html:2 +msgid "a été repassé en brouillon alors qu'il était validé !" msgstr "" -#: notifications/templates/notifications/species/mails/refused.html:2 -#: notifications/templates/notifications/species/refused.html:7 -msgid "a été refusé !" +#: notifications/templates/notifications/species/mails/invoices_accepted.html:3 +#, python-format +msgid "La Facture %(notification.linked_object)s a été validée." msgstr "" -#: notifications/templates/notifications/species/mails/validated.html:2 -#: notifications/templates/notifications/species/validated.html:7 -msgid "est maintenant validé !" +#: notifications/templates/notifications/species/mails/invoices_done.html:2 +msgid "a été effectué " msgstr "" #: notifications/templates/notifications/species/mails/validated.html:5 @@ -4769,7 +5784,7 @@ msgstr "" msgid "Rechercher dans truffe 2" msgstr "" -#: templates/base.html:116 templates/base.html.py:572 +#: templates/base.html:116 templates/base.html.py:641 msgid "Accueil" msgstr "" @@ -4812,101 +5827,121 @@ msgstr "" msgid "Slides des écrans de l'AGEPoly" msgstr "" -#: templates/base.html:188 -msgid "Gestion des logos" +#: templates/base.html:186 +msgid "Affichages" +msgstr "" + +#: templates/base.html:192 +msgid "Réservations d'affichage" +msgstr "" + +#: templates/base.html:195 templates/base.html.py:255 templates/base.html:298 +#: templates/base.html.py:341 +msgid "Calendrier de mes réservations" msgstr "" #: templates/base.html:201 -msgid "Véhicules" +msgid "Liste des affichages" msgstr "" #: templates/base.html:207 -msgid "Réservations" +msgid "Gestion des affichages" msgstr "" -#: templates/base.html:212 templates/base.html.py:257 templates/base.html:299 -msgid "Calendrier de mes réservations" +#: templates/base.html:213 +msgid "Réservations de mes affichages" msgstr "" -#: templates/base.html:217 -msgid "Calendrier de toutes les réservations" +#: templates/base.html:216 +msgid "Calendrier des réservation de mes affichages" msgstr "" -#: templates/base.html:222 vehicles/models.py:35 -msgid "Fournisseurs" +#: templates/base.html:232 +msgid "Gestion des logos" msgstr "" -#: templates/base.html:227 -msgid "Types de véhicules" +#: templates/base.html:252 +msgid "Réservations de matériel" msgstr "" -#: templates/base.html:232 vehicles/models.py:143 -msgid "Cartes" +#: templates/base.html:261 +msgid "Liste du matériel" msgstr "" -#: templates/base.html:237 vehicles/models.py:193 -msgid "Lieux" +#: templates/base.html:267 +msgid "Gestion du matériel" +msgstr "" + +#: templates/base.html:273 +msgid "Réservations de mon matériel" +msgstr "" + +#: templates/base.html:276 +msgid "Calendrier des réservation de mon matériel" msgstr "" -#: templates/base.html:248 +#: templates/base.html:289 msgid "Salles" msgstr "" -#: templates/base.html:254 +#: templates/base.html:295 msgid "Réservations de salle" msgstr "" -#: templates/base.html:262 +#: templates/base.html:303 msgid "Liste des salles" msgstr "" -#: templates/base.html:268 +#: templates/base.html:309 msgid "Gestion des salles" msgstr "" -#: templates/base.html:274 +#: templates/base.html:315 msgid "Réservations de mes salles" msgstr "" -#: templates/base.html:277 +#: templates/base.html:318 msgid "Calendrier des réservation de mes salles" msgstr "" -#: templates/base.html:296 -msgid "Réservations de matériel" +#: templates/base.html:330 +msgid "Véhicules" msgstr "" -#: templates/base.html:305 -msgid "Liste du matériel" +#: templates/base.html:336 +msgid "Réservations" msgstr "" -#: templates/base.html:311 -msgid "Gestion du matériel" +#: templates/base.html:346 +msgid "Calendrier de toutes les réservations" msgstr "" -#: templates/base.html:317 -msgid "Réservations de mon matériel" +#: templates/base.html:351 templates/base.html.py:470 vehicles/models.py:35 +msgid "Fournisseurs" msgstr "" -#: templates/base.html:320 -msgid "Calendrier des réservation de mon matériel" +#: templates/base.html:356 +msgid "Types de véhicules" +msgstr "" + +#: templates/base.html:361 vehicles/models.py:143 +msgid "Cartes" +msgstr "" + +#: templates/base.html:366 vehicles/models.py:193 +msgid "Lieux" msgstr "" -#: templates/base.html:338 +#: templates/base.html:383 msgid "Unités & Accreds" msgstr "" -#: templates/base.html:342 units/models.py:62 +#: templates/base.html:387 units/models.py:62 #: units/templates/units/selector/menu_unit.html:50 msgid "Unités" msgstr "" -#: templates/base.html:347 units/models.py:328 -#: users/templates/users/users/list.html:27 -msgid "Rôles" -msgstr "" - -#: templates/base.html:352 units/models.py:290 +#: templates/base.html:397 units/models.py:288 #: units/templates/units/accreds/delete.html:4 #: units/templates/units/accreds/delete.html:8 #: units/templates/units/accreds/list.html:4 @@ -4920,77 +5955,85 @@ msgstr "" msgid "Accréditations" msgstr "" -#: templates/base.html:357 +#: templates/base.html:402 msgid "Délégations d'accès" msgstr "" -#: templates/base.html:362 +#: templates/base.html:407 msgid "Membres de l'unité" msgstr "" -#: templates/base.html:379 +#: templates/base.html:424 msgid "Ma compta" msgstr "" -#: templates/base.html:389 +#: templates/base.html:434 msgid "Importer la compta" msgstr "" -#: templates/base.html:399 +#: templates/base.html:444 msgid "Outils" msgstr "" -#: templates/base.html:413 -msgid "Factures" -msgstr "Invoices" +#: templates/base.html:458 +msgid "Factures (Client)" +msgstr "" + +#: templates/base.html:464 +msgid "Factures (Fournisseur)" +msgstr "" -#: templates/base.html:427 +#: templates/base.html:486 msgid "Justifications" msgstr "" -#: templates/base.html:447 +#: templates/base.html:506 msgid "Demandes de subvention" msgstr "" -#: templates/base.html:465 +#: templates/base.html:524 msgid "Comptes de CG" msgstr "" -#: templates/base.html:470 +#: templates/base.html:529 msgid "Catégories des comptes" msgstr "" -#: templates/base.html:475 +#: templates/base.html:534 msgid "TVAs" msgstr "" -#: templates/base.html:523 +#: templates/base.html:582 msgid "Gestion des liens" msgstr "" -#: templates/base.html:535 +#: templates/base.html:594 msgid "Gestion des fichiers" msgstr "" -#: templates/base.html:585 +#: templates/base.html:600 +msgid "Gestion des documents à signer" +msgstr "" + +#: templates/base.html:654 msgid "" "Ton profil n'est pas correctement rempli : il faut au moins indiquer ton " "téléphone portable, ton adresse, ta banque et ton IBAN !" msgstr "" -#: templates/base.html:594 templates/base_login.html:84 +#: templates/base.html:663 templates/base_login.html:84 msgid "contributeurs" msgstr "" -#: templates/base.html:595 templates/base_login.html:85 +#: templates/base.html:664 templates/base_login.html:85 msgid "Développé pour l'" msgstr "" -#: templates/base.html:595 templates/base_login.html:85 +#: templates/base.html:664 templates/base_login.html:85 msgid "avec" msgstr "" -#: templates/base.html:595 templates/base_login.html:85 +#: templates/base.html:664 templates/base_login.html:85 msgid "Soutien technique partiel par" msgstr "" @@ -5026,19 +6069,19 @@ msgid "" " " msgstr "" -#: templates/base_pdf.html:116 vehicles/templates/vehicles/booking/pdf.html:9 +#: templates/base_pdf.html:116 vehicles/templates/vehicles/booking/pdf.html:12 msgid "Pour" msgstr "" -#: templates/base_pdf.html:116 vehicles/templates/vehicles/booking/pdf.html:9 +#: templates/base_pdf.html:116 vehicles/templates/vehicles/booking/pdf.html:12 msgid "l'équipe" msgstr "" -#: templates/base_pdf.html:116 vehicles/templates/vehicles/booking/pdf.html:9 +#: templates/base_pdf.html:116 vehicles/templates/vehicles/booking/pdf.html:12 msgid "la commission" msgstr "" -#: templates/base_pdf.html:116 vehicles/templates/vehicles/booking/pdf.html:9 +#: templates/base_pdf.html:116 vehicles/templates/vehicles/booking/pdf.html:12 msgid " : " msgstr "" @@ -5046,10 +6089,6 @@ msgstr "" msgid "Numéro comptable de l'unité : " msgstr "" -#: templates/base_pdf.html:123 -msgid "Nom : " -msgstr "" - #: templates/base_pdf.html:124 msgid "Prenom : " msgstr "" @@ -5074,6 +6113,10 @@ msgstr "" msgid "Commentaires" msgstr "" +#: templates/base_pdf.html:155 +msgid "Généré le" +msgstr "Generated on" + #: templates/base_pdf.html:155 msgid "avec Truffe2" msgstr "" @@ -5082,6 +6125,10 @@ msgstr "" msgid "par" msgstr "" +#: templates/base_pdf.html:155 +msgid "Identifiant de l'objet : " +msgstr "" + #: templates/datatables.html:89 msgid "Traitement en cours..." msgstr "" @@ -5148,6 +6195,38 @@ msgstr "" msgid "Appuiez sur quand vous avez terminé !" msgstr "" +#: templates/pdf_error.html:4 templates/pdf_error.html.py:7 +msgid "Erreur de PDF" +msgstr "" + +#: templates/pdf_error.html:10 +msgid "Désolé, mais le PDF n'a pas pu être généré." +msgstr "" + +#: templates/pdf_error.html:12 +msgid "" +"Un fichier que tu as uploadé n'a pas pu être lu. Assure toi que tous les " +"fichiers liés ne sont pas chiffrés, signés et sont bien au format PDF." +msgstr "" + +#: templates/pdf_error.html:17 +msgid "" +"Astuce: Imprime ton fichier au format PDF via un lecteur PDF: Le nouveau " +"fichier fonctionnera probalement mieux !" +msgstr "" + +#: templates/pdf_error.html:20 +msgid "Le fichier ayant causé l'erreur:" +msgstr "" + +#: templates/pdf_error.html:21 +msgid "L'erreur exacte:" +msgstr "" + +#: templates/pdf_error.html:26 +msgid "Retour" +msgstr "" + #: units/models.py:24 msgid "Utilisé pour la synchronisation des accréditations" msgstr "" @@ -5211,65 +6290,69 @@ msgid "" "l'AGEPoly au sommet." msgstr "" -#: units/models.py:254 +#: units/models.py:252 msgid "" "Au moins une accéditation existe avec cette unité, impossible de supprimer " "l'unité (NB: Historique compris)." msgstr "" -#: units/models.py:279 +#: units/models.py:277 msgid "Mettre ici l'ID accred du rôle pour la synchronisation EPFL" msgstr "" -#: units/models.py:281 +#: units/models.py:279 msgid "" "Il n'est pas possible d'accréditer la même personne dans la même unité " "plusieurs fois. Le rôle avec le plus PETIT ordre sera pris en compte" msgstr "" -#: units/models.py:283 +#: units/models.py:281 msgid "Nécessite validation" msgstr "" -#: units/models.py:283 +#: units/models.py:281 msgid "" "A cocher pour indiquer que le comité de l'AGEPoly doit valider l'attribution " "du rôle" msgstr "" -#: units/models.py:286 +#: units/models.py:284 msgid "Présidence" msgstr "" -#: units/models.py:287 +#: units/models.py:285 msgid "Trésorerie" msgstr "" -#: units/models.py:292 +#: units/models.py:290 msgid "Secrétariat" msgstr "" -#: units/models.py:293 units/templates/units/selector/menu_unit.html:18 +#: units/models.py:291 units/templates/units/selector/menu_unit.html:18 msgid "Commissions" msgstr "" -#: units/models.py:308 units/models.py:316 +#: units/models.py:309 +msgid "Peut afficher la liste des gens possédant l'accréditation" +msgstr "" + +#: units/models.py:322 units/models.py:330 msgid "ID EPFL ?" msgstr "" -#: units/models.py:309 units/models.py:317 +#: units/models.py:323 units/models.py:331 msgid "Validation ?" msgstr "" -#: units/models.py:310 units/models.py:318 +#: units/models.py:324 units/models.py:332 msgid "Ordre" msgstr "" -#: units/models.py:329 +#: units/models.py:343 msgid "Liste de tous les rôles" msgstr "" -#: units/models.py:335 +#: units/models.py:349 msgid "" "Les rôles sont les différents type d'accréditations possibles pour une " "unité.\n" @@ -5279,128 +6362,128 @@ msgid "" "gérés en fonction des accès !" msgstr "" -#: units/models.py:356 +#: units/models.py:370 msgid "" "Au moins une accréditation existe avec ce rôle, impossible de supprimer le " "rôle (NB: Historique compris)" msgstr "" -#: units/models.py:370 +#: units/models.py:384 msgid "" "Précision optionnelle à afficher dans Truffe. Peut être utilisé pour " "préciser la fonction, par exemple: \"Responsable Réseau\" pour une " "accréditation de Responsable Informatique." msgstr "" -#: units/models.py:372 +#: units/models.py:386 msgid "Désactiver syncronisation EPFL" msgstr "" -#: units/models.py:372 +#: units/models.py:386 msgid "A cocher pour ne pas synchroniser cette accréditation au niveau EPFL" msgstr "" -#: units/models.py:373 +#: units/models.py:387 msgid "Cacher au niveau EPFL" msgstr "" -#: units/models.py:373 +#: units/models.py:387 msgid "A cocher pour ne pas rendre public l'accréditation au niveau EPFL" msgstr "" -#: units/models.py:374 +#: units/models.py:388 msgid "Cacher dans Truffe" msgstr "" -#: units/models.py:374 +#: units/models.py:388 msgid "" "A cocher pour ne pas rendre public l'accréditation au niveau truffe (sauf " "aux accréditeurs sur la page d'accréditation)" msgstr "" -#: units/models.py:389 +#: units/models.py:403 msgid "Peut supprimer le dernier président" msgstr "" -#: units/models.py:390 +#: units/models.py:404 msgid "Valider les changements" msgstr "" -#: units/models.py:391 +#: units/models.py:405 msgid "Afficher l'accréditation sur le profil de l'utilisateur" msgstr "" -#: units/models.py:454 units/templates/units/accreds/logs_list.html:23 +#: units/models.py:468 units/templates/units/accreds/logs_list.html:23 msgid "Accréditation" msgstr "" -#: units/models.py:478 +#: units/models.py:492 msgid "Créée" msgstr "" -#: units/models.py:479 +#: units/models.py:493 msgid "Modifiée" msgstr "" -#: units/models.py:480 +#: units/models.py:494 msgid "Supprimée" msgstr "" -#: units/models.py:481 +#: units/models.py:495 msgid "Supprimée automatiquement" msgstr "" -#: units/models.py:482 +#: units/models.py:496 msgid "Renouvelée" msgstr "" -#: units/models.py:483 +#: units/models.py:497 msgid "Validée" msgstr "" -#: units/models.py:484 +#: units/models.py:498 msgid "Créée automatiquement" msgstr "" -#: units/models.py:494 units/models.py:515 +#: units/models.py:508 units/models.py:529 msgid "Valide pour les sous-unités" msgstr "" -#: units/models.py:494 +#: units/models.py:508 msgid "" "Si sélectionné, les accès supplémentaires dans l'unité courante seront aussi " "valides dans les sous-unités" msgstr "" -#: units/models.py:496 +#: units/models.py:510 msgid "" "(Optionnel !) L'utilisateur concerné. L'utilisateur doit disposer d'une " "accréditation dans l'unité." msgstr "" -#: units/models.py:497 +#: units/models.py:511 msgid "(Optionnel !) Le rôle concerné." msgstr "" -#: units/models.py:507 units/models.py:513 +#: units/models.py:521 units/models.py:527 #: units/templates/units/accreds/list.html:24 #: users/templates/users/users/myunit_list.html:27 msgid "Rôle" msgstr "" -#: units/models.py:514 +#: units/models.py:528 msgid "Accès supplémentaires" msgstr "" -#: units/models.py:523 +#: units/models.py:537 msgid "Délégation d'accès" msgstr "" -#: units/models.py:524 +#: units/models.py:538 msgid "Liste de toutes les délégations d'accès" msgstr "" -#: units/models.py:534 +#: units/models.py:548 msgid "" "Les délégations d'accès permettent de donner des accès supplémentaires dans " "une unité.\n" @@ -5418,15 +6501,43 @@ msgid "" "rôle particulier." msgstr "" -#: units/models.py:551 +#: units/models.py:565 #, python-format msgid "Accês supplémentaire n°%s" msgstr "" -#: units/models.py:563 +#: units/models.py:577 msgid "Délégation #{}" msgstr "" +#: units/views.py:141 +msgid "Accréditations renouvelées !" +msgstr "" + +#: units/views.py:143 +msgid "Accréditation renouvelée !" +msgstr "" + +#: units/views.py:229 units/views.py:369 +msgid "Accréditation sauvegardée !" +msgstr "" + +#: units/views.py:276 +msgid "Accréditations supprimées !" +msgstr "" + +#: units/views.py:278 +msgid "Accréditation supprimée !" +msgstr "" + +#: units/views.py:313 +msgid "Accréditations validées !" +msgstr "" + +#: units/views.py:315 +msgid "Accréditation validée !" +msgstr "" + #: units/templates/units/accreds/add.html:12 msgid "Nouvelle accréditation" msgstr "" @@ -5527,7 +6638,7 @@ msgid "" "Trésorier donne l'accès TRÉSORERIE). Les accès déterminent les droits dans " "Truffe.

    \n" " Les accéditations sont, sauf configuration contraire, " -"synchronisées avec les accréditations de l'EFPL. Ceci peut prendre jusqu'a " +"synchronisées avec les accréditations de l'EPFL. Ceci peut prendre jusqu'a " "48h avant d'être effectif.

    \n" " Les accéditations se propagent au niveau des unités " "inférieurs : par exemple, une personne accéditée en temps que Président de " @@ -5581,6 +6692,38 @@ msgid "" "Vous êtes sur le point de valider les accréditations suivantes dans l'unité" msgstr "" +#: units/templates/units/role/list_json.html:5 +#: units/templates/units/role/show.html:5 +msgid "Utilisateurs avec ce rôle" +msgstr "" + +#: units/templates/units/role/users.html:4 +msgid "Liste des utilisateurs" +msgstr "" + +#: units/templates/units/role/users.html:10 +#: users/templates/registration/password_change_form.html:4 +#: users/templates/users/users/create_external.html:5 +#: users/templates/users/users/edit.html:4 +#: users/templates/users/users/list.html:4 +#: users/templates/users/users/myunit_list.html:4 +#: users/templates/users/users/profile.html:4 +msgid "Utilisateurs" +msgstr "" + +#: units/templates/units/role/users.html:14 +msgid "Liste des utilisateurs pour le rôle" +msgstr "" + +#: units/templates/units/role/users.html:26 +#: users/templates/users/users/profile.html:24 +msgid "Email" +msgstr "" + +#: units/templates/units/role/users.html:77 +msgid "Envoyer un mail" +msgstr "" + #: units/templates/units/selector/menu_unit.html:34 msgid "Équipes" msgstr "" @@ -5608,141 +6751,112 @@ msgstr "" msgid "Page d'accréditation" msgstr "" -#: units/views.py:150 -msgid "Accréditations renouvelées !" -msgstr "" - -#: units/views.py:152 -msgid "Accréditation renouvelée !" -msgstr "" - -#: units/views.py:238 units/views.py:374 -msgid "Accréditation sauvegardée !" -msgstr "" - -#: units/views.py:281 -msgid "Accréditations supprimées !" -msgstr "" - -#: units/views.py:283 -msgid "Accréditation supprimée !" -msgstr "" - -#: units/views.py:318 -msgid "Accréditations validées !" -msgstr "" - -#: units/views.py:320 -msgid "Accréditation validée !" -msgstr "" - #: users/forms.py:14 msgid "Entrez votre adresse mail" msgstr "" -#: users/models.py:40 +#: users/models.py:41 msgid "Sciper ou username" msgstr "" -#: users/models.py:43 users/templates/users/users/myunit_pdf.html:27 +#: users/models.py:44 users/templates/users/users/myunit_pdf.html:27 msgid "Adresse email" msgstr "" -#: users/models.py:44 users/models.py:198 +#: users/models.py:45 users/models.py:223 msgid "Adresse email privée" msgstr "" -#: users/models.py:45 +#: users/models.py:46 msgid "" "Défini si cet utilisateur doit être considéré comme actif. Désactiver ceci " "au lieu de supprimer le compte." msgstr "" -#: users/models.py:46 +#: users/models.py:47 msgid "Betatesteur" msgstr "" -#: users/models.py:46 +#: users/models.py:47 msgid "Rend visible les éléments en cours de développement" msgstr "" -#: users/models.py:47 +#: users/models.py:48 msgid "Date d'inscription" msgstr "" -#: users/models.py:51 +#: users/models.py:52 msgid "Pour la poste, mets Postfinance. Sinon, mets le nom de ta banque." msgstr "" -#: users/models.py:52 +#: users/models.py:53 msgid "Pour la poste, mets ton CCP. Sinon, mets ton IBAN" msgstr "" -#: users/models.py:57 +#: users/models.py:58 msgid "" "Si pas renseigné, utilise la photo EPFL. Si pas de photo EPFL publique, " "utilise un poney." msgstr "" -#: users/models.py:65 +#: users/models.py:66 msgid "User" msgstr "" -#: users/models.py:66 +#: users/models.py:67 msgid "Users" msgstr "" -#: users/models.py:75 +#: users/models.py:76 msgid "Peut créer un nouvel utilisateur" msgstr "" -#: users/models.py:76 +#: users/models.py:77 msgid "Peut editer un utilisateur" msgstr "" -#: users/models.py:77 +#: users/models.py:78 msgid "Peut afficher un utilisateur" msgstr "" -#: users/models.py:78 +#: users/models.py:79 msgid "Peut utiliser la recherche sans filtrage préliminaire" msgstr "" -#: users/models.py:194 users/templates/users/users/profile.html:52 +#: users/models.py:219 users/templates/users/users/profile.html:52 msgid "Mobile" msgstr "" -#: users/models.py:196 users/templates/users/users/profile.html:67 +#: users/models.py:221 users/templates/users/users/profile.html:67 msgid "Nom banque" msgstr "" -#: users/models.py:197 users/templates/users/users/profile.html:71 +#: users/models.py:222 users/templates/users/users/profile.html:71 msgid "IBAN ou CCP" msgstr "" -#: users/models.py:204 +#: users/models.py:229 msgid "Privé" msgstr "" -#: users/models.py:205 +#: users/models.py:230 msgid "Membres de mes groupes" msgstr "" -#: users/models.py:206 +#: users/models.py:231 msgid "Accrédités AGEPoly" msgstr "" -#: users/models.py:207 +#: users/models.py:232 msgid "Public" msgstr "" -#: users/templates/registration/password_change_form.html:4 -#: users/templates/users/users/create_external.html:5 -#: users/templates/users/users/edit.html:4 -#: users/templates/users/users/list.html:4 -#: users/templates/users/users/myunit_list.html:4 -#: users/templates/users/users/profile.html:4 -msgid "Utilisateurs" +#: users/views.py:125 users/views.py:240 +msgid "Profil sauvegardé !" +msgstr "" + +#: users/views.py:220 +msgid "Truffe :: Nouveau compte" msgstr "" #: users/templates/registration/password_change_form.html:4 @@ -5781,6 +6895,10 @@ msgstr "" msgid "Ton username, au cas où tu l'as oublié, est :" msgstr "" +#: users/templates/registration/password_reset_email.html:12 +msgid "Le système de contact de Truffe" +msgstr "" + #: users/templates/registration/password_reset_email_html.html:6 #, python-format msgid "" @@ -5940,29 +7058,6 @@ msgstr "" msgid "Créer un nouveau compte" msgstr "" -#: users/templates/users/users/mail/newuser_html.html:7 -#, python-format -msgid "" -"\n" -" Un compte vient d'etre créé avec ton adresse email, ton nom " -"d'utilisateur est : %(username)s.
    \n" -" Le mot de passe a été généré automatiquement : %(psw)s
    \n" -" N'oublies pas de le changer " -"lors de ta première connexion.\n" -" " -msgstr "" - -#: users/templates/users/users/mail/newuser_plain.txt:4 -#, python-format -msgid "" -"\n" -"Un compte vient d'etre créé avec ton adresse email, ton nom d'utilisateur " -"est : %(username)s\n" -"Le mot de passe a été généré automatiquement : %(psw)s\n" -"N'oublies pas de le changer lors de ta première connexion ici : http://" -"%(domain)s%(link)s.\n" -msgstr "" - #: users/templates/users/users/myunit_list.html:4 #: users/templates/users/users/myunit_list.html:8 msgid "Annuaire de l'unité" @@ -5996,10 +7091,6 @@ msgstr "" msgid "Poste" msgstr "" -#: users/templates/users/users/myunit_pdf.html:28 -msgid "Téléphone" -msgstr "" - #: users/templates/users/users/profile.html:4 msgid "Profil" msgstr "" @@ -6012,10 +7103,6 @@ msgstr "" msgid "Username/sciper" msgstr "" -#: users/templates/users/users/profile.html:24 -msgid "Email" -msgstr "" - #: users/templates/users/users/profile.html:27 msgid "Email privé" msgstr "" @@ -6033,21 +7120,20 @@ msgstr "" msgid "du" msgstr "" -#: users/templates/users/users/profile.html:89 -#: vehicles/templates/vehicles/booking/switch_status.html:20 -msgid "au" -msgstr "" - #: users/templates/users/users/profile.html:103 msgid "VCard" msgstr "" -#: users/views.py:125 users/views.py:240 -msgid "Profil sauvegardé !" -msgstr "" - -#: users/views.py:220 -msgid "Truffe :: Nouveau compte" +#: users/templates/users/users/mail/newuser_html.html:7 +#, python-format +msgid "" +"\n" +" Un compte vient d'etre créé avec ton adresse email, ton nom " +"d'utilisateur est : %(username)s.
    \n" +" Le mot de passe a été généré automatiquement : %(psw)s
    \n" +" N'oublies pas de le changer " +"lors de ta première connexion.\n" +" " msgstr "" #: vehicles/models.py:36 @@ -6058,12 +7144,6 @@ msgstr "" msgid "Les entreprises fournissant des services de locations de véhicules." msgstr "" -#: vehicles/models.py:72 vehicles/models.py:79 vehicles/models.py:121 -#: vehicles/models.py:130 vehicles/models.py:232 vehicles/models.py:245 -#: vehicles/templates/vehicles/booking/pdf.html:29 -msgid "Fournisseur" -msgstr "" - #: vehicles/models.py:89 msgid "Types de véhicule" msgstr "" @@ -6105,7 +7185,7 @@ msgid "Les lieux de récupération des locations" msgstr "" #: vehicles/models.py:228 vehicles/models.py:251 -#: vehicles/templates/vehicles/booking/pdf.html:36 +#: vehicles/templates/vehicles/booking/pdf.html:39 msgid "Motif" msgstr "" @@ -6117,8 +7197,8 @@ msgstr "" msgid "Type de véhicule" msgstr "" -#: vehicles/models.py:234 vehicles/models.py:254 vehicles/models.py:321 -#: vehicles/templates/vehicles/booking/pdf.html:31 +#: vehicles/models.py:234 vehicles/models.py:254 vehicles/models.py:334 +#: vehicles/templates/vehicles/booking/pdf.html:34 msgid "Carte" msgstr "" @@ -6127,7 +7207,7 @@ msgid "Début de la réservation" msgstr "" #: vehicles/models.py:238 -msgid "Fin de la résrvation" +msgid "Fin de la réservation" msgstr "" #: vehicles/models.py:260 @@ -6138,7 +7218,7 @@ msgstr "" msgid "Liste de toutes les réservations de véhicules" msgstr "" -#: vehicles/models.py:276 +#: vehicles/models.py:289 msgid "" "Les réservations de véhicules te permettent de demander la location d'un " "véhicule pour ton unité.\n" @@ -6147,26 +7227,26 @@ msgid "" "toujours faire les réservations le plus tôt possible !" msgstr "" -#: vehicles/models.py:280 +#: vehicles/models.py:293 msgid "La liste de toutes les réservations de véhicules." msgstr "" -#: vehicles/models.py:310 +#: vehicles/models.py:323 msgid "" "La réservation est en cours de modération. Elle n'est pas éditable. " "Sélectionner ce statut pour demander une modération !" msgstr "" -#: vehicles/models.py:313 +#: vehicles/models.py:326 msgid "" "La modération a été refusée. Le véhicule n'était probablement pas disponible." msgstr "" -#: vehicles/models.py:387 +#: vehicles/models.py:400 msgid "La carte n'est pas lié au fournisseur sélectionné" msgstr "" -#: vehicles/models.py:390 +#: vehicles/models.py:403 msgid "Le type de véhicule n'est pas lié au fournisseur sélectionné" msgstr "" @@ -6178,28 +7258,28 @@ msgstr "" msgid "Type de réservation" msgstr "" -#: vehicles/templates/vehicles/booking/pdf.html:5 +#: vehicles/templates/vehicles/booking/pdf.html:6 #: vehicles/templates/vehicles/booking/show.html:5 msgid "Réservation de véhicule" msgstr "" -#: vehicles/templates/vehicles/booking/pdf.html:17 +#: vehicles/templates/vehicles/booking/pdf.html:20 msgid "Date de prise en charge" msgstr "" -#: vehicles/templates/vehicles/booking/pdf.html:19 +#: vehicles/templates/vehicles/booking/pdf.html:22 msgid "Date de retour" msgstr "" -#: vehicles/templates/vehicles/booking/pdf.html:25 +#: vehicles/templates/vehicles/booking/pdf.html:28 msgid "Téléphone responsable" msgstr "" -#: vehicles/templates/vehicles/booking/pdf.html:30 +#: vehicles/templates/vehicles/booking/pdf.html:33 msgid "Type véhicule" msgstr "" -#: vehicles/templates/vehicles/booking/pdf.html:38 +#: vehicles/templates/vehicles/booking/pdf.html:41 msgid "Remarque AGEPoly" msgstr "" diff --git a/truffe2/main/templates/main/box/invoices.html b/truffe2/main/templates/main/box/invoices.html index fbd94081..1196f6e7 100644 --- a/truffe2/main/templates/main/box/invoices.html +++ b/truffe2/main/templates/main/box/invoices.html @@ -3,13 +3,13 @@ {% with w_title="Factures client en attentes" w_nopadding=True %}{% include "widget/header.html" %}{% endwith %} - {% for invoice in invoices_need_bvr %} + {% for invoice in invoices_attente_accord %} {% endfor %} - {% for invoice in invoices_attente_accord %} + {% for invoice in invoices_attente_accord %} diff --git a/truffe2/media/img/logo_factures.png b/truffe2/media/img/logo_factures.png index 6c28e2f1..b9b70dd1 100644 Binary files a/truffe2/media/img/logo_factures.png and b/truffe2/media/img/logo_factures.png differ diff --git a/truffe2/notifications/templates/notifications/species/center/buttons/invoices_bvr_needed.html b/truffe2/notifications/templates/notifications/species/center/buttons/invoices_bvr_needed.html deleted file mode 100644 index 6a637398..00000000 --- a/truffe2/notifications/templates/notifications/species/center/buttons/invoices_bvr_needed.html +++ /dev/null @@ -1,6 +0,0 @@ -{% load i18n %} - - - diff --git a/truffe2/notifications/templates/notifications/species/center/buttons/invoices_bvr_set.html b/truffe2/notifications/templates/notifications/species/center/buttons/invoices_bvr_set.html deleted file mode 100644 index 6a637398..00000000 --- a/truffe2/notifications/templates/notifications/species/center/buttons/invoices_bvr_set.html +++ /dev/null @@ -1,6 +0,0 @@ -{% load i18n %} - - - diff --git a/truffe2/notifications/templates/notifications/species/center/message/invoices_bvr_needed.html b/truffe2/notifications/templates/notifications/species/center/message/invoices_bvr_needed.html deleted file mode 100644 index dd80a050..00000000 --- a/truffe2/notifications/templates/notifications/species/center/message/invoices_bvr_needed.html +++ /dev/null @@ -1,3 +0,0 @@ -{% load i18n %} - -{% trans "Il faut attribuer un numéro de BVR !" %} diff --git a/truffe2/notifications/templates/notifications/species/center/message/invoices_bvr_set.html b/truffe2/notifications/templates/notifications/species/center/message/invoices_bvr_set.html deleted file mode 100644 index 105f88e9..00000000 --- a/truffe2/notifications/templates/notifications/species/center/message/invoices_bvr_set.html +++ /dev/null @@ -1,3 +0,0 @@ -{% load i18n %} - -{% trans "Un numéro de BVR a été attribué !" %} diff --git a/truffe2/notifications/templates/notifications/species/invoices_bvr_needed.html b/truffe2/notifications/templates/notifications/species/invoices_bvr_needed.html deleted file mode 100644 index 6a3dd671..00000000 --- a/truffe2/notifications/templates/notifications/species/invoices_bvr_needed.html +++ /dev/null @@ -1,22 +0,0 @@ -{% load i18n %} - - - - - - {% trans "Il faut attribuer un BVR à la facture" %} {{notification.linked_object}}! - -
    - - - - - -
    -
    - {{notification.creation_date|timesince}} -
    diff --git a/truffe2/notifications/templates/notifications/species/invoices_bvr_set.html b/truffe2/notifications/templates/notifications/species/invoices_bvr_set.html deleted file mode 100644 index 0a0f989b..00000000 --- a/truffe2/notifications/templates/notifications/species/invoices_bvr_set.html +++ /dev/null @@ -1,22 +0,0 @@ -{% load i18n %} - - - - - - {% trans "Un numéro de BVR a été attribué à la facture" %} {{notification.linked_object}}! - -
    - - - - - -
    -
    - {{notification.creation_date|timesince}} -
    diff --git a/truffe2/notifications/templates/notifications/species/mails/invoices_bvr_needed.html b/truffe2/notifications/templates/notifications/species/mails/invoices_bvr_needed.html deleted file mode 100644 index 65a7a94d..00000000 --- a/truffe2/notifications/templates/notifications/species/mails/invoices_bvr_needed.html +++ /dev/null @@ -1,2 +0,0 @@ -{% load i18n %} -{% trans "Il faut attribuer un BVR à la facture" %} {{notification.linked_object}} ! diff --git a/truffe2/notifications/templates/notifications/species/mails/invoices_bvr_set.html b/truffe2/notifications/templates/notifications/species/mails/invoices_bvr_set.html deleted file mode 100644 index 2fcb666e..00000000 --- a/truffe2/notifications/templates/notifications/species/mails/invoices_bvr_set.html +++ /dev/null @@ -1,2 +0,0 @@ -{% load i18n %} -{% trans "Un numéro de BVR a été attribué à la facture" %} {{notification.linked_object}} !
    {% if invoice|is_new_for:user %} {% endif %}{{invoice}} {% trans "Besoin d'un BVR !" %}
    {% if invoice|is_new_for:user %} {% endif %}{{invoice}} {{invoice.get_total|floatformat:"2"|intcomma}} CHF