def migrate_datas(): from autonomie_base.models.base import DBSESSION from autonomie.models.config import Config session = DBSESSION() from alembic.context import get_bind conn = get_bind() initial_values = [ ('bookentry_facturation_label_template', '{invoice.customer.label} {company.name}'), ('bookentry_contribution_label_template', "{invoice.customer.label} {company.name}"), ('bookentry_rg_interne_label_template', "RG COOP {invoice.customer.label} {company.name}"), ('bookentry_rg_client_label_template', "RG {invoice.customer.label} {company.name}"), ('bookentry_expense_label_template', "{beneficiaire}/frais {expense_date:%-m %Y}"), ('bookentry_payment_label_template', "{company.name} / Rgt {invoice.customer.label}"), ('bookentry_expense_payment_main_label_template', "{beneficiaire_LASTNAME} / REMB FRAIS {expense_date:%B/%Y}"), ('bookentry_expense_payment_waiver_label_template', "Abandon de créance {beneficiaire_LASTNAME} {expense_date:%B/%Y}"), ] for key, val in initial_values: Config.set(key, val)
def populate_accounting_treasury_measure_types(session): """ Populate the database with treasury measure types """ from autonomie.models.config import Config from autonomie.models.accounting.treasury_measures import ( TreasuryMeasureType, ) if session.query(TreasuryMeasureType.id).count() == 0: for internal_id, start, label in ( (1, '5', u"Trésorerie du jour",), (2, "42,-421,-425,43,44", u"Impôts, taxes et cotisations dues",), (3, "40", u"Fournisseurs à payer",), (5, "421", u"Salaires à payer",), (6, "41", u"Clients à encaisser"), (7, '425', u"Notes de dépenses à payer"), (9, "1,2,3", u"Comptes bilan non pris en compte"), ): session.add( TreasuryMeasureType( internal_id=internal_id, account_prefix=start, label=label ) ) Config.set("treasury_measure_ui", "1") session.flush()
def migrate_datas(): from autonomie_base.models.base import DBSESSION session = DBSESSION() from alembic.context import get_bind conn = get_bind() from autonomie.models.config import Config Config.set('accounting_label_maxlength', 35) session.flush()
def submit_success(self, appstruct): """ Insert config informations into database """ for key, value in appstruct.items(): Config.set(key, value) self.request.session.flash(self.validation_msg) return HTTPFound(self.request.route_path(self.route_name))
def test_global_invoice_sequence_initialization( invoice, set_global_seq_index, ): from autonomie.models.config import Config Config.set('global_sequence_init_value', 12) assert GlobalInvoiceSequence.get_next_index(invoice) == 13 # ignore initialization if there is an actual SequenceNumber set_global_seq_index(index=20) assert GlobalInvoiceSequence.get_next_index(invoice) == 21
def submit_success(self, appstruct): """ Insert config informations into database """ # la table config étant un stockage clé valeur # le merge_session_with_post ne peut être utilisé logo = appstruct.pop('logo', None) if logo: ConfigFiles.set('logo.png', logo) self.request.session.pop('substanced.tempstore') self.request.session.changed() for key, value in appstruct.items(): Config.set(key, value) self.request.session.flash(self.validation_msg) return HTTPFound(self.request.route_path(self.route_name))
def store_pdf_conf(self, appstruct, data_type): """ Store the pdf configuration for the given type :param dict appstruct: The datas in which we will find the pdf configuration :param str data_type: activity/workshop """ pdf_appstruct = appstruct for file_type in ("header_img", "footer_img"): file_datas = pdf_appstruct.get(file_type) if file_datas: file_name = "%s_%s.png" % (data_type, file_type) ConfigFiles.set(file_name, file_datas) Config.set("%s_footer" % data_type, pdf_appstruct.get('footer', ''))
def content(connection, settings): """ sets up some default content """ from transaction import commit from autonomie_base.models.base import ( DBBASE, ) metadata = DBBASE.metadata metadata.drop_all(connection.engine) from autonomie.models import adjust_for_engine adjust_for_engine(connection.engine) metadata.create_all(connection.engine) from autonomie.models.config import Config Config.set('invoice_number_template', '{SEQYEAR}') commit()
def migrate_datas(): from autonomie_base.models.base import DBSESSION from autonomie.models.config import Config session = DBSESSION() from alembic.context import get_bind conn = get_bind() initial_values = [ ( 'bookentry_facturation_label_template', '{invoice.customer.label} {company.name}' ), ( 'bookentry_contribution_label_template', "{invoice.customer.label} {company.name}" ), ( 'bookentry_rg_interne_label_template', "RG COOP {invoice.customer.label} {company.name}" ), ( 'bookentry_rg_client_label_template', "RG {invoice.customer.label} {company.name}" ), ( 'bookentry_expense_label_template', "{beneficiaire}/frais {expense_date:%-m %Y}" ), ( 'bookentry_payment_label_template', "{company.name} / Rgt {invoice.customer.label}" ), ( 'bookentry_expense_payment_main_label_template', "{beneficiaire_LASTNAME} / REMB FRAIS {expense_date:%B/%Y}" ), ( 'bookentry_expense_payment_waiver_label_template', "Abandon de créance {beneficiaire_LASTNAME} {expense_date:%B/%Y}" ), ] for key, val in initial_values: Config.set(key, val)
def store_pdf_conf(self, appstruct, data_type): """ Store the pdf configuration for the given type :param dict appstruct: The datas in which we will find the pdf configuration :param str data_type: activity/workshop """ pdf_appstruct = appstruct for file_type in ("header_img", "footer_img"): file_datas = pdf_appstruct.get(file_type) if file_datas: file_name = "%s_%s.png" % (data_type, file_type) ConfigFiles.set(file_name, file_datas) Config.set( "%s_footer" % data_type, pdf_appstruct.get('footer', '') )
def test_month_invoice_sequence_initialization( mk_invoice, set_month_seq_index, ): MIS = MonthInvoiceSequence from autonomie.models.config import Config Config.set('month_sequence_init_value', 12) Config.set('month_sequence_init_date', date(2017, 2, 1)) # month with initialization assert MIS.get_next_index(mk_invoice(date=date(2017, 2, 1))) == 13 # month without initialization assert MIS.get_next_index(mk_invoice(date=date(2017, 3, 1))) == 1 # ignore initialization if there is an actual SequenceNumber set_month_seq_index(index=20, year=2017, month=2) assert MIS.get_next_index(mk_invoice(date=date(2017, 2, 1))) == 21
def test_year_invoice_sequence_initialization( mk_invoice, set_year_seq_index, ): YIS = YearInvoiceSequence from autonomie.models.config import Config Config.set('year_sequence_init_value', 12) Config.set('year_sequence_init_date', date(2017, 2, 1)) # year with initialization assert YIS.get_next_index(mk_invoice(date=date(2017, 6, 1))) == 13 # year without initialization assert YIS.get_next_index(mk_invoice(date=date(2018, 3, 1))) == 1 # ignore initialization if there is an actual SequenceNumber set_year_seq_index(index=20, year=2017) assert YIS.get_next_index(mk_invoice(date=date(2017, 2, 1))) == 21
def populate_bookentry_config(session): from autonomie.models.config import Config initial_values = [ ( 'bookentry_facturation_label_template', '{invoice.customer.label} {company.name}' ), ( 'bookentry_contribution_label_template', "{invoice.customer.label} {company.name}" ), ( 'bookentry_rg_interne_label_template', "RG COOP {invoice.customer.label} {company.name}" ), ( 'bookentry_rg_client_label_template', "RG {invoice.customer.label} {company.name}" ), ( 'bookentry_expense_label_template', "{beneficiaire}/frais {expense_date:%-m %Y}" ), ( 'bookentry_payment_label_template', "{company.name} / Rgt {invoice.customer.label}" ), ( 'bookentry_expense_payment_main_label_template', "{beneficiaire_LASTNAME} / REMB FRAIS {expense_date:%B/%Y}" ), ( 'bookentry_expense_payment_waiver_label_template', "Abandon de créance {beneficiaire_LASTNAME} {expense_date:%B/%Y}" ), ] for key, val in initial_values: Config.set(key, val)
def populate_accounting_treasury_measure_types(session): """ Populate the database with treasury measure types """ from autonomie.models.config import Config from autonomie.models.accounting.treasury_measures import ( TreasuryMeasureType, ) if session.query(TreasuryMeasureType.id).count() == 0: for internal_id, start, label in ( ( 1, '5', u"Trésorerie du jour", ), ( 2, "42,-421,-425,43,44", u"Impôts, taxes et cotisations dues", ), ( 3, "40", u"Fournisseurs à payer", ), ( 5, "421", u"Salaires à payer", ), (6, "41", u"Clients à encaisser"), (7, '425', u"Notes de dépenses à payer"), (9, "1,2,3", u"Comptes bilan non pris en compte"), ): session.add( TreasuryMeasureType(internal_id=internal_id, account_prefix=start, label=label)) Config.set("treasury_measure_ui", "1") session.flush()
def populate_bookentry_config(session): from autonomie.models.config import Config initial_values = [ ('bookentry_facturation_label_template', '{invoice.customer.label} {company.name}'), ('bookentry_contribution_label_template', "{invoice.customer.label} {company.name}"), ('bookentry_rg_interne_label_template', "RG COOP {invoice.customer.label} {company.name}"), ('bookentry_rg_client_label_template', "RG {invoice.customer.label} {company.name}"), ('bookentry_expense_label_template', "{beneficiaire}/frais {expense_date:%-m %Y}"), ('bookentry_payment_label_template', "{company.name} / Rgt {invoice.customer.label}"), ('bookentry_expense_payment_main_label_template', "{beneficiaire_LASTNAME} / REMB FRAIS {expense_date:%B/%Y}"), ('bookentry_expense_payment_waiver_label_template', "Abandon de créance {beneficiaire_LASTNAME} {expense_date:%B/%Y}"), ] for key, val in initial_values: Config.set(key, val)
def test_sage_csv_writer(dbsession): class TestCSVWriter(SageCsvWriter): headers = ( {'name': 'libelle', 'label': 'test libelle'}, ) def mk_test_csv_writer(): request = Mock() request.config = Config w = TestCSVWriter(request=request, context=None) w.set_datas([ {'libelle': '123456789'}, ]) return w # default (no conf) buf = mk_test_csv_writer().render(StringIO.StringIO()) buf.readline() # header assert buf.readline().strip() == '"123456789"' # zero Config.set('accounting_label_maxlength', '0') buf = mk_test_csv_writer().render(StringIO.StringIO()) buf.readline() # header assert buf.readline().strip() == '"123456789"' # lower than size Config.set('accounting_label_maxlength', '1') buf = mk_test_csv_writer().render(StringIO.StringIO()) buf.readline() # header assert buf.readline().strip() == '"1"' # bigger than size Config.set('accounting_label_maxlength', '11') buf = mk_test_csv_writer().render(StringIO.StringIO()) buf.readline() # header assert buf.readline().strip() == '"123456789"'
def upgrade(): from autonomie_base.models.base import DBSESSION from autonomie.models.workshop import WorkshopAction from alembic.context import get_bind session = DBSESSION() conn = get_bind() col = sa.Column('activity_id', sa.Integer(), sa.ForeignKey('company_activity.id')) op.add_column('company_datas', col) col = sa.Column('archived', sa.Boolean(), default=False, server_default="0") op.add_column('customer', col) # Migration de accompagnement_header.png en activity_header.png op.execute( 'update config_files set config_files.key="activity_header_img.png" where \ config_files.key="accompagnement_header.png";') # Le bas de page des pdfs est celui par defaut pour les ateliers et rdv from autonomie.models.config import Config val = Config.get('coop_pdffootertext').value if val: for key in ('activity', 'workshop'): config_key = '%s_footer' % key config = Config.set(config_key, val) # Migration de la taille des libelles pour les actions des rendez-vous op.execute("alter table activity_action modify label VARCHAR(255)") # Migration des intitules des ateliers # 1- Ajout des nouvelles foreignkey for name in 'info1_id', 'info2_id', 'info3_id': col = sa.Column(name, sa.Integer, sa.ForeignKey("workshop_action.id")) op.add_column("workshop", col) # 2- création des options en fonction des valeurs en durs request = "select id, info1, info2, info3 from workshop" result = conn.execute(request) already_added = {} for id, info1, info2, info3 in result: info1 = info1.lower() info2 = info2.lower() info3 = info3.lower() info1_id = info2_id = info3_id = None if (info1, info2, info3) not in already_added.keys(): for key, value in already_added.items(): if key[0] == info1 and info1: info1_id = value[0] if key[1] == info2 and info2: info2_id = value[1] if info1_id is None and info1: w = WorkshopAction(label=info1) session.add(w) session.flush() info1_id = w.id if info2_id is None and info2: w = WorkshopAction(label=info2, parent_id=info1_id) session.add(w) session.flush() info2_id = w.id if info3: w = WorkshopAction(label=info3, parent_id=info2_id) session.add(w) session.flush() info3_id = w.id already_added[(info1, info2, info3)] = ( info1_id, info2_id, info3_id, ) else: info1_id, info2_id, info3_id = already_added[(info1, info2, info3)] request = "update workshop " if info1_id: request += "set info1_id={0}".format(info1_id) if info2_id: request += ", info2_id={0}".format(info2_id) if info3_id: request += ", info3_id={0}".format(info3_id) request += " where id={0}".format(id) op.execute(request)
def _an_config(self): from autonomie.models.config import Config, ConfigFiles Config.set('cae_admin_mail', self.faker.ascii_safe_email()) Config.set('welcome', self.faker.sentence(nb_words=15)) ConfigFiles.set( 'logo.png', { 'data': pkg_resources.resource_stream('autonomie', 'static/img/autonomie.jpg'), 'filename': 'logo.jpg', }) Config.set('coop_cgv', self.faker.paragraph(nb_sentences=40)) Config.set( 'coop_pdffootertitle', u"""Une activité de ma CAE SARL SCOP à \ capital variable""") Config.set( 'coop_pdffootercourse', u"""Organisme de formation N° de déclaration \ d'activité au titre de la FPC : xx xx xxxxx. MA CAE est exonérée de TVA pour \ les activités s'inscrivant dans le cadre de la formation professionnelle \ conformément à l'art. L920-4 du Code du travail et de l'art. 202 C de \ l'annexe II du code général des impôts""") footer = u"""RCS XXXX 000 000 000 00000 - SIRET 000 \ 000 000 000 00 - Code naf 0000Z TVA INTRACOM : FR0000000. Siège social : 10 \ rue vieille 23200 Aubusson""" Config.set('coop_pdffootercontent', footer) Config.set('coop_pdffootertext', footer) Config.set( 'coop_invoicepayment', u"""Par chèque libellé à l'ordre de : \ MA CAE/ %ENTREPRENEUR% à envoyer à l'adresse suivante : MA CAE/ %ENTREPRENEUR% 10 rue Vieille 23200 Aubusson Ou par virement sur le compte de MA CAE/ %ENTREPRENEUR% MA BANQUE RIB : xxxxx xxxx xxxxxxxxxxxxx IBAN : xxxx xxxx xxxx xxxx xxxx xxxx xxx BIC : MABAFRMACAXX Merci d'indiquer le numéro de facture sur le libellé de votre virement ou \ dos de votre chèque. """) Config.set( "coop_invoicelate", u"""Tout retard de paiement entraînera à titre de \ clause pénale, conformément à la loi 92.1442 du 31 décembre 1992, une \ pénalité égale à un taux d'intérêt équivalent à une fois et demi le taux \ d'intérêt légal en vigueur à cette échéance. Une indemnité de 40 euros forfaitaire sera demandée en sus pour chaque \ facture payée après l’échéance fixée. Celle-ci n’est pas soumise à TVA.""") Config.set("activity_footer", footer) Config.set('workshop_footer', footer)
def _an_config(self): from autonomie.models.config import Config, ConfigFiles Config.set('cae_admin_mail', self.faker.ascii_safe_email()) Config.set('welcome', self.faker.sentence(nb_words=15)) ConfigFiles.set( 'logo.png', { 'data': pkg_resources.resource_stream( 'autonomie', 'static/img/autonomie.jpg' ), 'filename': 'logo.jpg', } ) Config.set('coop_cgv', self.faker.paragraph(nb_sentences=40)) Config.set('coop_pdffootertitle', u"""Une activité de ma CAE SARL SCOP à \ capital variable""") Config.set('coop_pdffootercourse', u"""Organisme de formation N° de déclaration \ d'activité au titre de la FPC : xx xx xxxxx. MA CAE est exonérée de TVA pour \ les activités s'inscrivant dans le cadre de la formation professionnelle \ conformément à l'art. L920-4 du Code du travail et de l'art. 202 C de \ l'annexe II du code général des impôts""") footer = u"""RCS XXXX 000 000 000 00000 - SIRET 000 \ 000 000 000 00 - Code naf 0000Z TVA INTRACOM : FR0000000. Siège social : 10 \ rue vieille 23200 Aubusson""" Config.set('coop_pdffootercontent', footer) Config.set('coop_pdffootertext', footer) Config.set('coop_invoicepayment', u"""Par chèque libellé à l'ordre de : \ MA CAE/ %ENTREPRENEUR% à envoyer à l'adresse suivante : MA CAE/ %ENTREPRENEUR% 10 rue Vieille 23200 Aubusson Ou par virement sur le compte de MA CAE/ %ENTREPRENEUR% MA BANQUE RIB : xxxxx xxxx xxxxxxxxxxxxx IBAN : xxxx xxxx xxxx xxxx xxxx xxxx xxx BIC : MABAFRMACAXX Merci d'indiquer le numéro de facture sur le libellé de votre virement ou \ dos de votre chèque. """) Config.set("coop_invoicelate", u"""Tout retard de paiement entraînera à titre de \ clause pénale, conformément à la loi 92.1442 du 31 décembre 1992, une \ pénalité égale à un taux d'intérêt équivalent à une fois et demi le taux \ d'intérêt légal en vigueur à cette échéance. Une indemnité de 40 euros forfaitaire sera demandée en sus pour chaque \ facture payée après l’échéance fixée. Celle-ci n’est pas soumise à TVA.""") Config.set("activity_footer", footer) Config.set('workshop_footer', footer)
def populate_invoice_number_template(session): from autonomie.models.config import Config if not Config.get_value("invoice_number_template"): Config.set("invoice_number_template", "{SEQGLOBAL}") session.flush()
def upgrade(): from autonomie.models import DBSESSION from autonomie.models.workshop import WorkshopAction from alembic.context import get_bind session = DBSESSION() conn = get_bind() col = sa.Column("activity_id", sa.Integer(), sa.ForeignKey("company_activity.id")) op.add_column("company_datas", col) col = sa.Column("archived", sa.Boolean(), default=False, server_default="0") op.add_column("customer", col) # Migration de accompagnement_header.png en activity_header.png op.execute( 'update config_files set config_files.key="activity_header_img.png" where \ config_files.key="accompagnement_header.png";' ) # Le bas de page des pdfs est celui par defaut pour les ateliers et rdv from autonomie.models.config import Config val = Config.get("coop_pdffootertext").value if val: for key in ("activity", "workshop"): config_key = "%s_footer" % key config = Config.set(config_key, val) # Migration de la taille des libelles pour les actions des rendez-vous op.execute("alter table activity_action modify label VARCHAR(255)") # Migration des intitules des ateliers # 1- Ajout des nouvelles foreignkey for name in "info1_id", "info2_id", "info3_id": col = sa.Column(name, sa.Integer, sa.ForeignKey("workshop_action.id")) op.add_column("workshop", col) # 2- création des options en fonction des valeurs en durs request = "select id, info1, info2, info3 from workshop" result = conn.execute(request) already_added = {} for id, info1, info2, info3 in result: info1 = info1.lower() info2 = info2.lower() info3 = info3.lower() info1_id = info2_id = info3_id = None if (info1, info2, info3) not in already_added.keys(): for key, value in already_added.items(): if key[0] == info1 and info1: info1_id = value[0] if key[1] == info2 and info2: info2_id = value[1] if info1_id is None and info1: w = WorkshopAction(label=info1) session.add(w) session.flush() info1_id = w.id if info2_id is None and info2: w = WorkshopAction(label=info2, parent_id=info1_id) session.add(w) session.flush() info2_id = w.id if info3: w = WorkshopAction(label=info3, parent_id=info2_id) session.add(w) session.flush() info3_id = w.id already_added[(info1, info2, info3)] = (info1_id, info2_id, info3_id) else: info1_id, info2_id, info3_id = already_added[(info1, info2, info3)] request = "update workshop " if info1_id: request += "set info1_id={0}".format(info1_id) if info2_id: request += ", info2_id={0}".format(info2_id) if info3_id: request += ", info3_id={0}".format(info3_id) request += " where id={0}".format(id) op.execute(request)
def invoice_base_config(dbsession): from autonomie.models.config import Config Config.set('invoice_number_template', '{SEQYEAR}')
def test_geninvoice_ref504(dbsession, full_estimation): from autonomie.models.config import Config Config.set('invoice_prefix', 'TEST') invoices = full_estimation.gen_invoices(full_estimation.owner) for invoice in invoices: assert invoice.prefix == 'TEST'