dolibarrAlchemy.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from sqlalchemy import Column, Integer, ForeignKey, UniqueConstraint
  4. from sqlalchemy.orm import relationship, sessionmaker
  5. from sqlalchemy.ext.declarative import declarative_base, DeferredReflection
  6. from sqlalchemy import create_engine, MetaData
  7. Base = declarative_base(cls=DeferredReflection)
  8. class Bank(Base):
  9. __tablename__ = "llx_bank"
  10. id = Column("rowid", Integer, primary_key=True)
  11. fk_account = Column('fk_account', Integer, ForeignKey('llx_bank_account.rowid'))
  12. account = relationship("BankAccount", backref="entries", lazy="subquery")
  13. bankclass = relationship(
  14. "BankClass", backref="bank", uselist=False,
  15. lazy="subquery"
  16. )
  17. url_company = relationship(
  18. "BankUrl", uselist=False, backref="bank_company", innerjoin=True,
  19. primaryjoin="and_(Bank.id==BankUrl.fk_bank, " "BankUrl.type=='company')",
  20. lazy="subquery",
  21. )
  22. url_payment = relationship(
  23. "BankUrl", uselist=False, backref="bank_payement", innerjoin=True,
  24. primaryjoin="and_(Bank.id==BankUrl.fk_bank, " "BankUrl.type=='payment')",
  25. lazy="subquery",
  26. )
  27. url_payment_sc = relationship(
  28. "BankUrl", uselist=False, backref="bank_payement_sc", innerjoin=True,
  29. primaryjoin="and_(Bank.id==BankUrl.fk_bank, " "BankUrl.type=='payment_sc')",
  30. lazy="subquery",
  31. )
  32. url_payment_supplier = relationship(
  33. "BankUrl", uselist=False, backref="bank_payement_supplier", innerjoin=True,
  34. primaryjoin="and_(Bank.id==BankUrl.fk_bank, " "BankUrl.type=='payment_supplier')",
  35. lazy="subquery",
  36. )
  37. payment_tva = relationship(
  38. "TVA", backref="bank",
  39. lazy="subquery"
  40. )
  41. class BankAccount(Base):
  42. __tablename__ = "llx_bank_account"
  43. id = Column("rowid", Integer, primary_key=True)
  44. class BankCateg(Base):
  45. __tablename__ = "llx_bank_categ"
  46. id = Column("rowid", Integer, primary_key=True)
  47. class BankClass(Base):
  48. __tablename__ = "llx_bank_class"
  49. id = Column('lineid', Integer, ForeignKey('llx_bank.rowid'), primary_key=True)
  50. UniqueConstraint('lineid', 'fk_categ')
  51. categ_id = Column('fk_categ', Integer, ForeignKey('llx_bank_categ.rowid'))
  52. categ = relationship(
  53. "BankCateg", backref="classes",
  54. lazy="subquery",
  55. )
  56. class BankUrl(Base):
  57. __tablename__ = "llx_bank_url"
  58. id = Column("rowid", Integer, primary_key=True)
  59. fk_bank = Column('fk_bank', Integer, ForeignKey('llx_bank.rowid'))
  60. url_id = Column('url_id', Integer)
  61. societe = relationship(
  62. "Societe", backref="bank_urls", uselist=False,
  63. primaryjoin="and_(BankUrl.url_id==Societe.id, " "BankUrl.type=='company')",
  64. foreign_keys=url_id,
  65. lazy="subquery",
  66. )
  67. payment = relationship(
  68. "Paiement", backref="bank_urls", uselist=False,
  69. primaryjoin="and_(BankUrl.url_id==Paiement.id, " "BankUrl.type=='payment')",
  70. foreign_keys=url_id,
  71. lazy="subquery",
  72. order_by="Paiement.datep,Paiement.id",
  73. )
  74. payment_sc = relationship(
  75. "PaiementCharge", backref="bank_urls", uselist=False,
  76. primaryjoin="and_(BankUrl.url_id==PaiementCharge.id, " "BankUrl.type=='payment_sc')",
  77. foreign_keys=url_id,
  78. lazy="subquery",
  79. order_by="PaiementCharge.datep,PaiementCharge.id",
  80. )
  81. payment_supplier = relationship(
  82. "PaiementFourn", backref="bank_urls", uselist=False,
  83. primaryjoin="and_(BankUrl.url_id==PaiementFourn.id, " "BankUrl.type=='payment_supplier')",
  84. foreign_keys=url_id,
  85. lazy="subquery",
  86. order_by="PaiementFourn.datep,PaiementFourn.id",
  87. )
  88. class TVA(Base):
  89. __tablename__ = "llx_tva"
  90. id = Column("rowid", Integer, primary_key=True)
  91. fk_bank = Column('fk_bank', Integer, ForeignKey('llx_bank.rowid'))
  92. class CotisationsSociales(Base):
  93. __tablename__ = "llx_chargesociales"
  94. id = Column("rowid", Integer, primary_key=True)
  95. fk_type = Column('fk_type', Integer, ForeignKey('llx_c_chargesociales.id'))
  96. type = relationship(
  97. "CCotisationsSociales", backref="cotisations_sociales",
  98. lazy="subquery",
  99. )
  100. class CCotisationsSociales(Base):
  101. __tablename__ = "llx_c_chargesociales"
  102. id = Column("id", Integer, primary_key=True)
  103. class Commande(Base):
  104. __tablename__ = "llx_commande"
  105. id = Column("rowid", Integer, primary_key=True)
  106. class CommandeDet(Base):
  107. __tablename__ = "llx_commandedet"
  108. id = Column("rowid", Integer, primary_key=True)
  109. fk_commande = Column("fk_commande", Integer, ForeignKey('llx_commande.rowid'))
  110. commande = relationship(
  111. "Commande", backref="details",
  112. lazy="subquery",
  113. )
  114. fk_product = Column("fk_product", Integer, ForeignKey('llx_product.rowid'))
  115. product = relationship(
  116. "Product", backref="commande_details",
  117. lazy="subquery",
  118. )
  119. class Societe(Base):
  120. __tablename__ = "llx_societe"
  121. id = Column("rowid", Integer, primary_key=True)
  122. class PaiementFacture(Base):
  123. __tablename__ = "llx_paiement_facture"
  124. fk_paiement = Column(Integer, ForeignKey('llx_paiement.rowid'), primary_key=True)
  125. fk_facture = Column(Integer, ForeignKey('llx_facture.rowid'), primary_key=True)
  126. facture = relationship(
  127. "Facture",
  128. lazy="subquery",
  129. order_by="Facture.facnumber"
  130. )
  131. paiement = relationship(
  132. "Paiement",
  133. lazy="subquery",
  134. order_by="Paiement.datep,Paiement.id",
  135. )
  136. class Paiement(Base):
  137. __tablename__ = "llx_paiement"
  138. id = Column("rowid", Integer, primary_key=True)
  139. factures = relationship(
  140. "PaiementFacture",
  141. lazy="subquery",
  142. order_by="PaiementFacture.fk_facture,PaiementFacture.rowid",
  143. )
  144. class PaiementFournFactureFourn(Base):
  145. __tablename__ = "llx_paiementfourn_facturefourn"
  146. fk_paiementfourn = Column(Integer, ForeignKey('llx_paiementfourn.rowid'), primary_key=True)
  147. fk_facturefourn = Column(Integer, ForeignKey('llx_facture_fourn.rowid'), primary_key=True)
  148. facture = relationship(
  149. "FactureFourn",
  150. lazy="subquery",
  151. )
  152. paiement = relationship(
  153. "PaiementFourn",
  154. lazy="subquery",
  155. order_by="PaiementFourn.datep,PaiementFourn.id",
  156. )
  157. class PaiementFourn(Base):
  158. __tablename__ = "llx_paiementfourn"
  159. id = Column("rowid", Integer, primary_key=True)
  160. factures = relationship(
  161. "PaiementFournFactureFourn",
  162. lazy="subquery",
  163. )
  164. class PaiementCharge(Base):
  165. __tablename__ = "llx_paiementcharge"
  166. id = Column("rowid", Integer, primary_key=True)
  167. fk_bank = Column("fk_bank", Integer, ForeignKey('llx_bank.rowid'))
  168. bank = relationship(
  169. "Bank", backref="paiementcharges",
  170. lazy="subquery",
  171. )
  172. fk_charge = Column(Integer, ForeignKey('llx_chargesociales.rowid'))
  173. cotisation_sociale = relationship(
  174. "CotisationsSociales", backref="paiement",
  175. lazy="subquery"
  176. )
  177. class Product(Base):
  178. __tablename__ = "llx_product"
  179. id = Column("rowid", Integer, primary_key=True)
  180. class FactureFourn(Base):
  181. __tablename__ = "llx_facture_fourn"
  182. id = Column("rowid", Integer, primary_key=True)
  183. fk_soc = Column(Integer, ForeignKey('llx_societe.rowid'))
  184. societe = relationship(
  185. 'Societe',
  186. backref="factures_fournisseurs",
  187. lazy="subquery",
  188. )
  189. details = relationship(
  190. 'FactureFournDet',
  191. lazy="subquery",
  192. )
  193. class Facture(Base):
  194. __tablename__ = "llx_facture"
  195. id = Column("rowid", Integer, primary_key=True)
  196. fk_soc = Column(Integer, ForeignKey('llx_societe.rowid'))
  197. societe = relationship(
  198. 'Societe',
  199. backref="factures",
  200. lazy="joined",
  201. )
  202. details = relationship(
  203. 'FactureDet',
  204. lazy="subquery",
  205. )
  206. class FactureDet(Base):
  207. __tablename__ = "llx_facturedet"
  208. id = Column("rowid", Integer, primary_key=True)
  209. fk_facture = Column(Integer, ForeignKey('llx_facture.rowid'))
  210. facture = relationship(
  211. 'Facture',
  212. lazy="subquery",
  213. )
  214. fk_product = Column(Integer, ForeignKey('llx_product.rowid'))
  215. product = relationship(
  216. 'Product',
  217. backref="facture_det",
  218. lazy="subquery",
  219. )
  220. fk_code_ventilation = Column(Integer, ForeignKey('llx_accountingaccount.rowid'))
  221. accounting_account = relationship(
  222. 'AccountingAccount',
  223. backref="facture_det",
  224. lazy="subquery",
  225. )
  226. class FactureFournDet(Base):
  227. __tablename__ = "llx_facture_fourn_det"
  228. id = Column("rowid", Integer, primary_key=True)
  229. fk_facture_fourn = Column(Integer, ForeignKey('llx_facture_fourn.rowid'))
  230. facture = relationship(
  231. 'FactureFourn',
  232. lazy="subquery",
  233. )
  234. fk_product = Column(Integer, ForeignKey('llx_product.rowid'))
  235. product = relationship(
  236. 'Product',
  237. backref="facture_fourn_det",
  238. lazy="subquery",
  239. )
  240. fk_code_ventilation = Column(Integer, ForeignKey('llx_accountingaccount.rowid'))
  241. accounting_account = relationship(
  242. 'AccountingAccount',
  243. backref="facture_fourn_det",
  244. lazy="subquery",
  245. )
  246. class AccountingAccount(Base):
  247. __tablename__ = "llx_accountingaccount"
  248. id = Column("rowid", Integer, primary_key=True)
  249. MYSQL_QUERIES = {
  250. "bank": """SELECT DISTINCT b.rowid as b_rowid,
  251. ba.ref as ba_ref,
  252. ba.label as ba_label,
  253. ba.account_number as ba_account_number,
  254. b.datev as b_datev,
  255. b.dateo as b_dateo,
  256. b.label as b_label,
  257. b.num_chq as b_num_chq,
  258. -b.amount as _b_amount,
  259. b.amount as b_amount,
  260. b.num_releve as b_num_releve,
  261. b.datec as b_datec,
  262. bu.url_id as bu_url_id,
  263. s.nom as s_nom,
  264. s.code_compta as s_code_compta,
  265. s.code_compta_fournisseur as s_code_compta_fournisseur,
  266. bca.label as bca_label,
  267. bca.rowid as bca_rowid,
  268. bcl.lineid as bcl_lineid,
  269. ccs.code as ccs_code,
  270. ccs.libelle as ccs_label
  271. FROM (llx_bank_account as ba, llx_bank as b)
  272. LEFT JOIN llx_bank_url as bu ON (bu.fk_bank = b.rowid AND bu.type = 'company')
  273. LEFT JOIN llx_societe as s ON bu.url_id = s.rowid
  274. LEFT JOIN llx_bank_class as bcl ON bcl.lineid = b.rowid
  275. LEFT JOIN llx_bank_categ as bca ON bca.rowid = bcl.fk_categ
  276. LEFT JOIN llx_paiementcharge as p ON p.fk_bank = b.rowid
  277. LEFT JOIN llx_chargesociales as cs ON cs.rowid = p.fk_charge
  278. LEFT JOIN llx_c_chargesociales as ccs ON cs.fk_type = ccs.id
  279. WHERE ba.rowid = b.fk_account AND ba.entity = 1 and b.num_releve <> ''
  280. ORDER BY b.datev, b.num_releve;""",
  281. "sells": """SELECT DISTINCT s.rowid as s_rowid,
  282. s.nom as s_nom,
  283. s.address as s_address,
  284. s.zip as s_zip,
  285. s.town as s_town,
  286. c.code as c_code,
  287. s.phone as s_phone,
  288. s.siren as s_siren,
  289. s.siret as s_siret,
  290. s.ape as s_ape,
  291. s.idprof4 as s_idprof4,
  292. s.code_compta as s_code_compta,
  293. s.code_compta_fournisseur as s_code_compta_fournisseur,
  294. s.tva_intra as s_tva_intra,
  295. f.rowid as f_rowid,
  296. f.facnumber as f_facnumber,
  297. f.datec as f_datec,
  298. f.datef as f_datef,
  299. f.date_lim_reglement as f_date_lim_reglement,
  300. f.total as f_total,
  301. f.total_ttc as f_total_ttc,
  302. f.tva as f_tva,
  303. f.paye as f_paye,
  304. f.fk_statut as f_fk_statut,
  305. f.note_private as f_note_private,
  306. f.note_public as f_note_public,
  307. fd.rowid as fd_rowid,
  308. fd.label as fd_label,
  309. fd.description as fd_description,
  310. fd.subprice as fd_subprice,
  311. fd.tva_tx as fd_tva_tx,
  312. fd.qty as fd_qty,
  313. fd.total_ht as fd_total_ht,
  314. fd.total_tva as fd_total_tva,
  315. fd.total_ttc as fd_total_ttc,
  316. fd.date_start as fd_date_start,
  317. fd.date_end as fd_date_end,
  318. fd.special_code as fd_special_code,
  319. fd.product_type as fd_product_type,
  320. fd.fk_product as fd_fk_product,
  321. p.ref as p_ref,
  322. p.label as p_label,
  323. p.accountancy_code_sell as p_accountancy_code_sell,
  324. a.account_number as a_account_number
  325. FROM llx_societe as s
  326. LEFT JOIN llx_c_pays as c on s.fk_pays = c.rowid, llx_facture as f
  327. LEFT JOIN llx_facture_extrafields as extra ON f.rowid = extra.fk_object , llx_facturedet as fd
  328. LEFT JOIN llx_product as p on (fd.fk_product = p.rowid)
  329. LEFT JOIN llx_accountingaccount as a ON fd.fk_code_ventilation = a.rowid
  330. WHERE f.fk_soc = s.rowid AND f.rowid = fd.fk_facture AND f.entity = 1""",
  331. "suppliers": """SELECT DISTINCT s.rowid as s_rowid,
  332. s.nom as s_nom,
  333. s.address as s_address,
  334. s.zip as s_zip,
  335. s.town as s_town,
  336. s.code_compta_fournisseur as s_code_supplier,
  337. c.code as c_code,
  338. s.phone as s_phone,
  339. s.siren as s_siren,
  340. s.siret as s_siret,
  341. s.ape as s_ape,
  342. s.idprof4 as s_idprof4,
  343. s.idprof5 as s_idprof5,
  344. s.idprof6 as s_idprof6,
  345. s.tva_intra as s_tva_intra,
  346. f.rowid as f_rowid,
  347. f.ref as f_ref,
  348. f.ref_supplier as f_ref_supplier,
  349. f.datec as f_datec,
  350. f.datef as f_datef,
  351. f.total_ht as f_total_ht,
  352. f.total_ttc as f_total_ttc,
  353. f.total_tva as f_total_tva,
  354. f.paye as f_paye,
  355. f.fk_statut as f_fk_statut,
  356. f.note_public as f_note_public,
  357. fd.rowid as fd_rowid,
  358. fd.description as fd_description,
  359. fd.tva_tx as fd_tva_tx,
  360. fd.qty as fd_qty,
  361. fd.remise_percent as fd_remise_percent,
  362. fd.total_ht as fd_total_ht,
  363. fd.total_ttc as fd_total_ttc,
  364. fd.tva as fd_tva,
  365. fd.product_type as fd_product_type,
  366. fd.fk_product as fd_fk_product,
  367. p.ref as p_ref,
  368. p.label as p_label,
  369. p.accountancy_code_buy as p_accountancy_code_buy,
  370. a.account_number as a_account_number FROM llx_societe as s
  371. LEFT JOIN llx_c_pays as c
  372. ON s.fk_pays = c.rowid, llx_facture_fourn as f
  373. LEFT JOIN llx_facture_fourn_extrafields as extra
  374. ON f.rowid = extra.fk_object, llx_facture_fourn_det as fd
  375. LEFT JOIN llx_product as p on (fd.fk_product = p.rowid)
  376. LEFT JOIN llx_accountingaccount as a
  377. ON fd.fk_code_ventilation = a.rowid
  378. WHERE f.fk_soc = s.rowid AND f.rowid = fd.fk_facture_fourn AND f.entity = 1""",
  379. "social": """SELECT DISTINCT cc.libelle as cc_libelle,
  380. c.rowid as c_rowid,
  381. c.libelle as c_libelle,
  382. c.date_ech as c_date_ech,
  383. c.periode as c_periode,
  384. c.amount as c_amount,
  385. c.paye as c_paye,
  386. p.rowid as p_rowid,
  387. p.datep as p_datep,
  388. p.amount as p_amount,
  389. p.num_paiement as p_num_paiement,
  390. cc.accountancy_code as cc_acc_code,
  391. cc.code as cc_code FROM llx_c_chargesociales as cc,
  392. llx_chargesociales as c
  393. LEFT JOIN llx_paiementcharge as p
  394. ON p.fk_charge = c.rowid
  395. WHERE c.fk_type = cc.id AND c.entity = 1""",
  396. }
  397. class DolibarrSQLAlchemy(object):
  398. def __init__(
  399. self,
  400. mysql_host,
  401. mysql_port,
  402. mysql_database,
  403. mysql_user,
  404. mysql_password,
  405. echo=False):
  406. self.mysql_database = mysql_database
  407. self.mysql_host = mysql_host
  408. self.mysql_password = mysql_password
  409. self.mysql_user = mysql_user
  410. self.mysql_port = mysql_port
  411. self.echo = echo
  412. def connect(self):
  413. engine_str = "mysql://%s:%s@%s:%s/%s" % (
  414. self.mysql_user,
  415. self.mysql_password,
  416. self.mysql_host,
  417. self.mysql_port,
  418. self.mysql_database
  419. )
  420. print engine_str
  421. self.engine = create_engine(engine_str, echo=self.echo, encoding=str("iso8859-1"), convert_unicode=True)
  422. self.metadata = MetaData(bind=self.engine)
  423. Base.prepare(self.engine)
  424. # create a configured "Session" class
  425. Session = sessionmaker(bind=self.engine)
  426. # create a Session
  427. self.session = Session(autocommit=True)
  428. def disconnect(self):
  429. self.session.close()