ajout module devis
113
mondumas/models/devis.py
Normal file
@@ -0,0 +1,113 @@
|
||||
# -*- coding: utf8 -*-
|
||||
from sqlalchemy import text
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.orm import (
|
||||
scoped_session,
|
||||
sessionmaker,
|
||||
)
|
||||
from zope.sqlalchemy import (
|
||||
ZopeTransactionExtension,
|
||||
mark_changed
|
||||
)
|
||||
|
||||
from datetime import *
|
||||
import transaction
|
||||
import os
|
||||
|
||||
from ..views.default import (
|
||||
to_int,
|
||||
)
|
||||
|
||||
|
||||
def execute_query(request, query, params):
|
||||
"""Execute query and mark session as changed"""
|
||||
request.dbsession.execute(query, params)
|
||||
mark_changed(request.dbsession)
|
||||
transaction.commit()
|
||||
|
||||
def get_devis_byName(request, societe, name):
|
||||
numero = to_int(name)
|
||||
|
||||
if numero > 0:
|
||||
query = """SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, nopol, nochantier, web
|
||||
FROM devis WHERE societe=:societe AND no_id >=:name LIMIT 300;;""" % (societe, name)
|
||||
elif len(name) == 0:
|
||||
query = """SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, nopol, nochantier, web
|
||||
FROM devis WHERE societe=:societe ORDER BY no_id DESC LIMIT 300;"""
|
||||
else:
|
||||
query = """(SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, nopol , nochantier, web
|
||||
FROM devis WHERE societe=:societe AND c_nom LIKE ':name%' LIMIT 500)"""
|
||||
results = request.dbsession.execute(query, {'societe': societe, 'name': name}).fetchall()
|
||||
return results
|
||||
|
||||
def get_devfac_by_no(request,nodossier):
|
||||
# lire devis, facture ou proforma
|
||||
|
||||
societe = nodossier[0:2]
|
||||
type_doc = nodossier[3:5]
|
||||
no_id = nodossier[5:]
|
||||
|
||||
if type_doc == 'DE':
|
||||
query = """
|
||||
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM devis d
|
||||
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
|
||||
INNER JOIN p_cabinet a ON d.cabinet = a.code
|
||||
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
|
||||
WHERE d.societe = :societe and d.no_id=:no_id;"""
|
||||
elif type_doc == 'FA':
|
||||
query = """
|
||||
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM facture d
|
||||
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
|
||||
INNER JOIN p_cabinet a ON d.cabinet = a.code
|
||||
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
|
||||
WHERE d.societe = :societe and d.no_id=:no_id;"""
|
||||
else:
|
||||
query = """
|
||||
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM proforma d
|
||||
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
|
||||
INNER JOIN p_cabinet a ON d.cabinet = a.code
|
||||
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
|
||||
WHERE d.societe = :societe and d.no_id=:no_id;"""
|
||||
|
||||
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
|
||||
return results
|
||||
|
||||
def get_devis_lig_by_no(request,nodossier):
|
||||
|
||||
societe = nodossier[0:2]
|
||||
type_doc = nodossier[3:5]
|
||||
no_id = nodossier[5:]
|
||||
|
||||
if type_doc == 'DE':
|
||||
query = "SELECT * FROM devis_lig WHERE societe = :societe and no_id=:no_id;"
|
||||
elif type_doc == 'FA':
|
||||
query = "SELECT * FROM facture_lig WHERE societe = :societe and no_id=:no_id;"
|
||||
else:
|
||||
query = "SELECT * FROM proforma_lig WHERE societe = :societe and no_id=:no_id;"
|
||||
|
||||
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall()
|
||||
return results
|
||||
|
||||
def insert_devis_from_dossier(request, nodossier, logged_in):
|
||||
societe = nodossier[0:2]
|
||||
no_id = nodossier[3:]
|
||||
|
||||
query = "CALL spINS_DEVIS_FROM_DOSSIER(:societe, 'DDW', :no_id, :logged_in);"
|
||||
results = request.dbsession.execute(query,{'societe': societe, 'no_id': no_id, 'logged_in': logged_in}).first()
|
||||
return results
|
||||
|
||||
def get_devis_by_no(request,nodossier):
|
||||
# lire devis, facture ou proforma
|
||||
|
||||
societe = nodossier[0:2]
|
||||
no_id = nodossier[5:]
|
||||
|
||||
query = """
|
||||
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM devis d
|
||||
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
|
||||
INNER JOIN p_cabinet a ON d.cabinet = a.code
|
||||
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
|
||||
WHERE d.societe = :societe and d.no_id=:no_id;"""
|
||||
|
||||
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
|
||||
return results
|
||||
@@ -57,35 +57,6 @@ def get_clients_byName(request, societe, nom):
|
||||
return results
|
||||
|
||||
|
||||
def get_devis_by_no(request,nodossier):
|
||||
societe = nodossier[0:2]
|
||||
type_doc = nodossier[3:5]
|
||||
no_id = nodossier[5:]
|
||||
|
||||
if type_doc == 'DE':
|
||||
query = """
|
||||
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM devis d
|
||||
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
|
||||
INNER JOIN p_cabinet a ON d.cabinet = a.code
|
||||
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
|
||||
WHERE d.societe = :societe and d.no_id=:no_id;"""
|
||||
elif type_doc == 'FA':
|
||||
query = """
|
||||
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM facture d
|
||||
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
|
||||
INNER JOIN p_cabinet a ON d.cabinet = a.code
|
||||
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
|
||||
WHERE d.societe = :societe and d.no_id=:no_id;"""
|
||||
else:
|
||||
query = """
|
||||
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM proforma d
|
||||
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
|
||||
INNER JOIN p_cabinet a ON d.cabinet = a.code
|
||||
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
|
||||
WHERE d.societe = :societe and d.no_id=:no_id;"""
|
||||
|
||||
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
|
||||
return results
|
||||
|
||||
def get_dossier_rdv_by_no(request,nodossier, nolig):
|
||||
societe = nodossier[0:2]
|
||||
@@ -150,22 +121,6 @@ WHERE societe<>:societe AND C_NOM=:C_NOM AND C_ADR=:C_ADR AND C_CP=:C_CP AND C_V
|
||||
|
||||
return results
|
||||
|
||||
def get_devis_lig_by_no(request,nodossier):
|
||||
|
||||
societe = nodossier[0:2]
|
||||
type_doc = nodossier[3:5]
|
||||
no_id = nodossier[5:]
|
||||
|
||||
if type_doc == 'DE':
|
||||
query = "SELECT * FROM devis_lig WHERE societe = :societe and no_id=:no_id;"
|
||||
elif type_doc == 'FA':
|
||||
query = "SELECT * FROM facture_lig WHERE societe = :societe and no_id=:no_id;"
|
||||
else:
|
||||
query = "SELECT * FROM proforma_lig WHERE societe = :societe and no_id=:no_id;"
|
||||
|
||||
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall()
|
||||
return results
|
||||
|
||||
def get_docs_attaches(request, nodossier, norapport, nosection, filename):
|
||||
societe = nodossier[0:2]
|
||||
nochantier = int(nodossier[3:])
|
||||
|
||||
@@ -17,10 +17,14 @@ def includeme(config):
|
||||
config.add_route('logout', '/logout')
|
||||
config.add_route('redefinir_mdp', '/redefinir_mdp/{lien}')
|
||||
config.add_route('init_mdp', '/init_mdp/{user}/{lien}')
|
||||
# devis
|
||||
config.add_route('devis_list', '/devis_list')
|
||||
config.add_route('devis_create', '/devis_create/{nodossier}')
|
||||
config.add_route('devis_lignes', '/devis_lignes/{nodossier}')
|
||||
config.add_route('devis_view', '/devis_view/{nodossier}')
|
||||
# dossier
|
||||
config.add_route('demandes','/demandes')
|
||||
config.add_route('delete_img','/delete_img/{nodossier}/{norapport}/{nosection}/{nomfic}')
|
||||
config.add_route('devis_view', '/devis_view/{nodossier}')
|
||||
config.add_route('dossier_edit', '/dossier_edit/{nodossier}')
|
||||
config.add_route('dossier_lookup', '/dossier_lookup')
|
||||
config.add_route('dossier_select', '/dossier_select/{date}')
|
||||
|
||||
BIN
mondumas/static/DEVFAC/DOCS_ATTACHES/ME/150040/ME-DD150040.tif
Normal file
|
After Width: | Height: | Size: 3.0 MiB |
|
After Width: | Height: | Size: 5.0 MiB |
|
After Width: | Height: | Size: 546 KiB |
|
After Width: | Height: | Size: 2.4 MiB |
|
After Width: | Height: | Size: 578 KiB |
|
After Width: | Height: | Size: 859 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 915 KiB |
|
After Width: | Height: | Size: 896 KiB |
|
After Width: | Height: | Size: 903 KiB |
|
After Width: | Height: | Size: 8.4 KiB |
BIN
mondumas/static/DEVFAC/DOCS_ATTACHES/PE/150275/PE-DD150275.tif
Normal file
|
After Width: | Height: | Size: 176 KiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 162 KiB |
@@ -0,0 +1,21 @@
|
||||
CR<EFBFBD>ATION D'UN SITE WEB MUTUALIS<49> EN LANGUEDOC-ROUSSILLON
|
||||
http://regionlr.caes.cnrs.fr/
|
||||
|
||||
HISTORIQUE :
|
||||
Les origines de ce site web sont li<6C>es <20> une volont<6E> du bureau de la Region d'homog<6F>n<EFBFBD>iser la communication par Internet entre les 4 entit<69>s de la R<>gion CAES Languedoc Roussillon : la R<>gion et les 3 CLAS de Banyuls, Montpellier et Perpignan, en les regroupant sur un seul site d'h<>bergement.
|
||||
Un autre objectif <20>tait aussi de faciliter la diffusion des informations pour leurs responsables, professionnelle(e)s ou <20>lu(e)s du CAES R<>gion, mais aussi de permettre <20> des <20>lus et/ou pr<70>sidents de CLAS de r<>diger des articles. Un plus grand nombre d'<27>lus peut ainsi se partager cette diffusion de l'information sous contr<74>le toutefois de responsables choisis.
|
||||
Le projet a <20>t<EFBFBD> d<>cid<69> lors du CRC aux Plantiers en juin 2013.
|
||||
|
||||
ARCHITECTURE :
|
||||
L'architecture SPIP a <20>t<EFBFBD> choisie parmi d'autres CMS connus (Drupal, Joomla, WordPress ...) parce que le webmestre le connaissait un peu ! De plus cette solution est propos<6F>e dans les offres d'h<>bergement (http://www.offres-de-services-labos.net/hebergement.html) que la DSI met <20> disposition pour les laboratoires dans son offre de services et permet de garder une adresse dans le domaine 'cnrs.fr' et le sous-domaine du CAES.
|
||||
Par ailleurs SPIP ne demande pas un gros investissement pour apprendre <20> r<>diger un article, lui ajouter un document ou une photo. L'article, une fois r<>dig<69> dans un espace priv<69>, est soumis pour validation <20> un administrateur qui peut l'accepter et le publier sur la partie publique donc visible du site. Ce contr<74>le est n<>cessaire compte-tenu du fait que le Pr<50>sident de R<>gion est responsable de la publication.
|
||||
L'administrateur, outre cette validation des articles, participe <20> la pr<70>sentation des contenus, en regroupant les articles dans les rubriques appropri<72>es. Chaque CLAS ainsi que la R<>GION a donc une certaine autonomie pour g<>rer ses infos.
|
||||
|
||||
La pr<70>sentation graphique des pages est commune <20> l'ensemble du site mais varie en fonction de chaque entit<69> qui poss<73>de chacune un logo simple permettant une identification facile par les agents. Il y a toutefois des <20>l<EFBFBD>ments communs <20> chaque page car ils concernent des infos pratiques pour les usagers du CAES en g<>n<EFBFBD>ral, dans lesquels on trouve aussi des outils basiques comme la fonction Rechercher ou un mini calendrier qui fournit une vue compacte des <20>v<EFBFBD>nements du mois en cours. Il a <20>t<EFBFBD> mis en place <20>galement une zone Intranet pour partager des documents destin<69>s aux <20>lus et professionnels du CAES.
|
||||
|
||||
H<EFBFBD>BERGEMENT :
|
||||
SPIP est propos<6F> dans les offres d'h<>bergement de la DSI avec une convention qui doit <20>tre sign<67>e par le Pr<50>sident du CAES. Nous avons choisi une formule gratuite avec un espace serveur de 2 Go mais cet espace d<>di<64> peut <20>tre plus important ainsi que le nombre de bases MySQl. Localement un informaticien de la DR13 a d'abord fait le lien entre notre demande et la DSI puis nous a aid<69> pour la partie administrative, le choix du nom de domaine et la mise en place du site en d<>veloppement. Une fois le site pr<70>t, les informaticiens du CAES ont permis la migration du site en d<>veloppement vers le site actuel ouvert au public.
|
||||
Toutes ces phases se sont d<>roul<75>es assez sereinement en concertation entre nous et tous les informaticiens impliqu<71>s <20> Montpellier ou au CAES National et nous tenons <20> les remercier pour leurs conseils et contributions dans ce projet.
|
||||
|
||||
Pour toute question pratique, s'adresser <20> Gilles Niel (gilles.niel@enscm.fr)
|
||||
|
||||
|
After Width: | Height: | Size: 109 KiB |