From fe688a1c77979c4025ec6cfb419a76a80e836ae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 11:45:36 +0100 Subject: [PATCH 01/88] =?UTF-8?q?Added=20Spanish=20(Espa=C3=B1ol)=20and=20?= =?UTF-8?q?Catalan=20(Catal=C3=A0)=20translations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks to Bàrbara Partegàs Rof --- languages/doliwoo-ca.mo | Bin 0 -> 3608 bytes languages/doliwoo-ca.po | 172 +++++++++++++++++++++++++++++++++++++ languages/doliwoo-es_ES.mo | Bin 0 -> 3377 bytes languages/doliwoo-es_ES.po | 169 ++++++++++++++++++++++++++++++++++++ 4 files changed, 341 insertions(+) create mode 100644 languages/doliwoo-ca.mo create mode 100644 languages/doliwoo-ca.po create mode 100644 languages/doliwoo-es_ES.mo create mode 100644 languages/doliwoo-es_ES.po diff --git a/languages/doliwoo-ca.mo b/languages/doliwoo-ca.mo new file mode 100644 index 0000000000000000000000000000000000000000..aa3740fba7a0a59023a644d7dc8185adbd804402 GIT binary patch literal 3608 zcmb7`ON<;x8OI9!kfSsoMd;2yLV<|2WR{co0)aI$(kK`XKf@vsJ6Riww&&+ zPF3}e#}}>~5E74E$i=zg0~h;-xD5voNF3k-NaVr^2?=g+v%OKDDCio0kfL{k+2QPqs1HS~Gz+%sXU68<=;2QV__%!${a1;DH$oijv(Y)?D z$m>QR+j*vWe-Zo_V)Zh}de42h_Q!#r!t+g#`#@kfL} zc*0(;|vIuz;-6Lb1B7dYvR^H^&>x8N@ zm0r=%s@E!2Boon7nZ&Qj^fhB>UwN;Kkqa*lrM2@LI&jL;PH*u7@?DeX$|j0*;nm1u z1yd{pWWvvm#yZRBP*G|MnBriOc2q&#LUgPS@qDZk3xP{!T>B!+GSf-$zIIlp3Oa@p(%z|TNZy1rEG&t|&X8cms#S;tB2Iag zAwMQBWidG!q<4B`Fcs-zWq!i)G?s;Db+drO?Oi30k!C|}GLW`o?NlsYfg^hbQqz+< zYi=*WZQS>*Nvp&YELJ09Ct@G(A-Uv+80_`-Xl)kJQJKsm5fAMK#}~O-7Xw(gu(P~R z@jVvLYfxqx0+W}R;+FW;UAc5!~O~>c2xNS)}xT^|I$!2r_qbm$VCIw2@%A`VhyFm z=8TOUZMdpr*^SztSxv0;_Xbhds<0cP9!ji3o2~ZgsI?ij&rtjM&gOHS(=R;RYIRyI z2uD}cv1S|YmwkcS?arxF&$il-+m+5o11k%cNpEb2UYy>tI1eQCu@%*5ddtx{Jo77S zhF=@y$SLps3z%ArDmhZoK*{{wOuW2vd3zC{cHCO&8k|K144IVh%A+LUywt^6RE)Gv z`SS;Zi_w{d92-1THrg%{lVX>5=**$^EB&mpGK(%6o4XDb2p}Ha`OULb-=1G9=*jcc zUO&6?jVK&EwbOm0Qthc7e>FZe_p5__46*uKRBz>OZBB=3d&IU&D(s$2hJ%0l%jwUG zL`zB)Wve))E17A3Qzm+Pw{8{FTR4lPxT3s7%^<|nTewsgIM-}S?{ik)Ox)-mXu_&dK8`Gc1q6?qJK|zTrNg}FR&YlvPN;)!D zif-LsLZM}|qh5)vh5bWpsCU|Gb|rTjE;K}ZN%LHB^KIcxXfYCjt=ke88~+cgi#tag zVlh*ScJV(+2ywx`5`?~qDx#(e%Ag1*3yx#fSWNE}I#)P@w}X#$^Wj|1CfN|Tc@u&d z|J6}?xeO6p6gO5%wJS}bLpR#jmBaZ`o#f@<1WK(g) zBge-|-J51I*=p0zFmtJ=%oM-7)%d5>Puyb`w{1=?67+3%R literal 0 HcmV?d00001 diff --git a/languages/doliwoo-ca.po b/languages/doliwoo-ca.po new file mode 100644 index 0000000..6602333 --- /dev/null +++ b/languages/doliwoo-ca.po @@ -0,0 +1,172 @@ +# Copyright (C) 2015 Doliwoo +# This file is distributed under the same license as the Doliwoo package. +# Translators: +# Raphaël Doursenaud , 2015 +msgid "" +msgstr "" +"Project-Id-Version: DoliWoo\n" +"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/doliwoo\n" +"POT-Creation-Date: 2015-02-18 16:23:59+00:00\n" +"PO-Revision-Date: 2015-02-19 11:44+0100\n" +"Last-Translator: Bàrbara Partegàs \n" +"Language-Team: Bàrbara Partegàs \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.7.4\n" +"Language: ca\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: doliwoo.php:51 +msgid "This plugin needs SOAP and OpenSSL PHP extensions." +msgstr "Aquest plugin necessita extensions SOAP i OpenSSL PHP." + +#: doliwoo.php:55 +msgid "This plugin needs SOAP PHP extension." +msgstr "Aquest plugin necessita l'extensió SOAP PHP." + +#: doliwoo.php:59 +msgid "This plugin needs OpenSSL PHP extension." +msgstr "Aquest plugin necessita l'extensió OpenSSL PHP." + +#: doliwoo.php:209 +msgid "This extension needs WooCommerce" +msgstr "Aquesta extensió necessita WooCommerce" + +#: includes/class-doliwoo-parameters.php:62 +msgid "Dolibarr" +msgstr "Dolibarr" + +#: includes/class-doliwoo-parameters.php:65 +#: includes/class-doliwoo-parameters.php:128 +msgid "Dolibarr User ID" +msgstr "ID de l'usuari Dolibarr" + +#: includes/class-tax-doliwoo.php:63 +msgid "VAT" +msgstr "IVA" + +#: includes/settings.php:37 +msgid "DoliWoo Settings" +msgstr "Paràmetres de DoliWoo" + +#: includes/settings.php:38 +msgid "Dolibarr webservices access" +msgstr "Accés webservice de Dolibarr" + +#: includes/settings.php:75 +msgid "Source application" +msgstr "Aplicació font" + +#: includes/settings.php:76 +msgid "How this application will identify itself to the webservice." +msgstr "Com s'identificarà aquesta aplicació al webservice." + +#: includes/settings.php:82 +msgid "URL" +msgstr "URL" + +#: includes/settings.php:83 +msgid "" +"Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" +msgstr "" +"Entra la URL arrel del webservice de Dolibarr (i.e. https://mydolibarr.com/" +"webservices)" + +#: includes/settings.php:90 +msgid "Delay" +msgstr "Retard" + +#: includes/settings.php:91 +msgid "Choose the automatic update frequency" +msgstr "Escull la freqüència de l'actualització automàtica" + +#: includes/settings.php:95 +msgid "Once Hourly" +msgstr "Un cop cada hora" + +#: includes/settings.php:96 +msgid "Twice Daily" +msgstr "Dos cops al dia" + +#: includes/settings.php:97 +msgid "Once Daily" +msgstr "Un cop al dia" + +#: includes/settings.php:101 +msgid "Key" +msgstr "Clau" + +#: includes/settings.php:102 +msgid "Enter your Dolibarr webservices key" +msgstr "Entra la teva clau del webservice de Dolibarr" + +#: includes/settings.php:108 +msgid "User login" +msgstr "Usuari d'inici de sessió" + +#: includes/settings.php:109 +msgid "Dolibarr actions will be done as this user" +msgstr "Les accions de Dolibarr es duran a terme amb aquest usuari" + +#: includes/settings.php:115 +msgid "User password" +msgstr "Paraula de pas de l'usuari" + +#: includes/settings.php:121 +msgid "Entity" +msgstr "Entitat (empresa)" + +#: includes/settings.php:122 +msgid "" +"If you're using multicompany, the ID of the entity you want to integrate. " +"Leave to 1 otherwise." +msgstr "" +"Si utilitzes multiempresa, l'ID de l'entitat (empresa) que vols integrar. " +"Déixa-ho amb 1 si no és així." + +#: includes/settings.php:128 +msgid "Product category" +msgstr "Categoria del producte" + +#: includes/settings.php:129 +msgid "" +"The ID of the product category you want to automatically import products " +"from." +msgstr "" +"La ID de la categoria de producte de la que vols importar productes " +"automàticament." + +#: includes/settings.php:135 +msgid "Generic thirdparty" +msgstr "Tercer per defecte" + +#: includes/settings.php:136 +msgid "The ID of the thirdparty that'll be used for anonymous orders." +msgstr "" +"La ID del tercer per defecte que serà utilitzat en les comandes anònimes." + +#: includes/settings.php:156 +msgid "The protocol to use is https://" +msgstr "El protocol per utilitzar és https://" + +#: includes/settings.php:166 +msgid "The webservice is not available. Please check the URL." +msgstr "El servei webservice no està disponible. Siusplau, comprova la URL." + +#. Plugin Name of the plugin/theme +msgid "Doliwoo" +msgstr "Doliwoo" + +#. Plugin URI of the plugin/theme +msgid "TODO (https://gpcsolutions.fr/doliwoo)" +msgstr "TODO (https://gpcsolutions.fr/doliwoo)" + +#. Description of the plugin/theme +msgid "Dolibarr WooCommerce integration" +msgstr "Dolibarr WooCommerce integration" + +#. Author of the plugin/theme +msgid "GPC.solutions" +msgstr "GPC.solutions" diff --git a/languages/doliwoo-es_ES.mo b/languages/doliwoo-es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..0eaf6dd734a969652a17075758b95c882a1d9323 GIT binary patch literal 3377 zcma);O^g&p6vsuL{WL52ngLfvjW1vD$DKy8yA`E4j(sC+g&qT(9_jcb?-QM z^~RZaB0@YFgNfndeG(H*yn689#dz>wq6dk1^8dPfK6WF7PI`acJ+IzZy?Sqd*|h$; zz_ke;<4s?{#n+_zCy~_!)Qx z{2Y7(`~!R(+_+wdXTYuCCh#rr7)_Of;AZeW zFa)=QUx0_e9!TK7;2v-rjPC+xzzOg&$a-&pZ0}2u?cE01zi-R$-+}9pgC9U%_alPm z_{5V!ybNprIUhU0E#N-z0C)m?4eWp{e;vFC-T?Q4cfpMy!6@6C0AB!)gY16;48dz4 zLJ)s~&w+PAUiUbhXM0;g&c`@-8ax3`g4aOK$M@y;-@!NWKJhg68oU6qAD@Ek@7Eyf z{T1YV{0(wl+ymLp7C6b@JrJdmUoYYBv$#3V{AEv1gk>@9nCK3)TyXRsmZfE^u!l)O@bG@twJV{P-A4v)Sc=_YWoeh?sUzc*)oEmk1adYG z6wOE-m5-+pHlFL&gjtXhJXS4ZyJ8XFAvqF;Xu#~yfn?2!Rjv$bM@A7MZYRd3RIYF+ zB-8fSs2k=G;mLG&Q68v>kebGlj7{8ao6M21p|Y-64vnb^OvI5wlu$$c4bRmNlgmHF zs0_J+(B)Eu9MvNwu_jnn!IeCvs2WxaN%e86V#iw-D-}9Il~0>?TOlKbKoVsw-T(D$ zqT9_2xqFJo1K^YWcz8gIn<{esyd?@$PtMTuX=EiLB+khNNUCvR;EZk3`iXx#okEkR62RCand_Hl(RB+O=Z2=I4~g&N{tRL z=@f2w3u;AkjBC9(Le*;Rz=3_0DmLw?SQt>#sC#D^fRNZ@Y zY+gF}#r7hZ8e5|UnJmlRR}pfU!L?XsAsw^f;N^HL2?h6JMl4n!bKJGD7iiz*I{txpBEZ4kt(XEFFy$~= z%GF|u+q@yUs-q7q^-ZG}BYy~o+q{*%+gD*A8d+={i2>9Vh|LHqlnw*{gvk9 zAe13=xA}C)y=x{zgIk3)gwp~wO&mbvvUjI#5I&WY0C`3hH~|uEmWM^T52K;@Vo|e5 z?-q|obOlpPh0^YRLg2*?ARjyv*egtF+*-l2{!p+!&Gf#!EF%LcOa-UW4xt#cw|CnY z^Bk}^7fV`ES4l<`_HN6;dmuwe%f?DEU5p3($T=<>x)D<&?l)0jsS>jzew9OI%_`Oa zr&l?f4+?1qn$hk0iqPcCr1A<>5psu&AR(B%CG-+E2MYJ6$%7^H^T(5^ue(dU(8mFG*lhSP+-}U0xme@O^42)G a&w=2ve>}NSqb;c3H~IGWKhK??68`}aywx@U literal 0 HcmV?d00001 diff --git a/languages/doliwoo-es_ES.po b/languages/doliwoo-es_ES.po new file mode 100644 index 0000000..18f4f43 --- /dev/null +++ b/languages/doliwoo-es_ES.po @@ -0,0 +1,169 @@ +# Copyright (C) 2015 DoliWoo +# This file is distributed under the same license as the Doliwoo package. +msgid "" +msgstr "" +"Project-Id-Version: DoliWoo 0.0.1\n" +"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/doliwoo\n" +"POT-Creation-Date: 2015-02-18 16:23:59+00:00\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2015-02-19 11:44+0100\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Last-Translator: Raphaël Doursenaud \n" +"Language-Team: Bàrbara Partegàs \n" +"Language: es_ES\n" +"X-Generator: Poedit 1.7.4\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: doliwoo.php:51 +msgid "This plugin needs SOAP and OpenSSL PHP extensions." +msgstr "Este plugin necesita extensiones PHP OpenSSL y SOAP." + +#: doliwoo.php:55 +msgid "This plugin needs SOAP PHP extension." +msgstr "Este plugin necesita extensión SOAP PHP." + +#: doliwoo.php:59 +msgid "This plugin needs OpenSSL PHP extension." +msgstr "Este plugin necesita extensión OpenSSL PHP." + +#: doliwoo.php:209 +msgid "This extension needs WooCommerce" +msgstr "Esta extensión necesita WooCommerce" + +#: includes/class-doliwoo-parameters.php:62 +msgid "Dolibarr" +msgstr "Dolibarr" + +#: includes/class-doliwoo-parameters.php:65 +#: includes/class-doliwoo-parameters.php:128 +msgid "Dolibarr User ID" +msgstr "ID de usuario Dolibarr" + +#: includes/class-tax-doliwoo.php:63 +msgid "VAT" +msgstr "IVA" + +#: includes/settings.php:37 +msgid "DoliWoo Settings" +msgstr "Configuración de DoliWoo" + +#: includes/settings.php:38 +msgid "Dolibarr webservices access" +msgstr "Acceso a webservices Dolibarr" + +#: includes/settings.php:75 +msgid "Source application" +msgstr "Aplicación fuente" + +#: includes/settings.php:76 +msgid "How this application will identify itself to the webservice." +msgstr "Cómo se identificará esta aplicación al webservice." + +#: includes/settings.php:82 +msgid "URL" +msgstr "URL" + +#: includes/settings.php:83 +msgid "" +"Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" +msgstr "" +"Entra la URL raíz del webservice de Dolibarr (ej.: https://mydolibarr.com/" +"webservices)" + +#: includes/settings.php:90 +msgid "Delay" +msgstr "Retraso" + +#: includes/settings.php:91 +msgid "Choose the automatic update frequency" +msgstr "Escoje la frecuencia de actualización automática" + +#: includes/settings.php:95 +msgid "Once Hourly" +msgstr "Una vez cada hora" + +#: includes/settings.php:96 +msgid "Twice Daily" +msgstr "Dos veces al día" + +#: includes/settings.php:97 +msgid "Once Daily" +msgstr "Una vez al día" + +#: includes/settings.php:101 +msgid "Key" +msgstr "Llave" + +#: includes/settings.php:102 +msgid "Enter your Dolibarr webservices key" +msgstr "Entra la llave del webservice de Dolibarr" + +#: includes/settings.php:108 +msgid "User login" +msgstr "Inicio de sesión de usuario" + +#: includes/settings.php:109 +msgid "Dolibarr actions will be done as this user" +msgstr "Las acciones de Dolibarr ser harán con este usuario" + +#: includes/settings.php:115 +msgid "User password" +msgstr "Contraseña de usuario" + +#: includes/settings.php:121 +msgid "Entity" +msgstr "Entidad (empresa)" + +#: includes/settings.php:122 +msgid "" +"If you're using multicompany, the ID of the entity you want to integrate. " +"Leave to 1 otherwise." +msgstr "" +"Si estás usando multiempresa, el ID de la entidad que quieres integrar. " +"Déjalo en 1 si no es así." + +#: includes/settings.php:128 +msgid "Product category" +msgstr "Categoría de producto" + +#: includes/settings.php:129 +msgid "" +"The ID of the product category you want to automatically import products " +"from." +msgstr "" +"El ID de la categoría de producto de la que quieres importar productos." + +#: includes/settings.php:135 +msgid "Generic thirdparty" +msgstr "Tercero por defecto" + +#: includes/settings.php:136 +msgid "The ID of the thirdparty that'll be used for anonymous orders." +msgstr "El ID del tercero que será usado para los pedidos anónimos." + +#: includes/settings.php:156 +msgid "The protocol to use is https://" +msgstr "El protocolo a usar es https://" + +#: includes/settings.php:166 +msgid "The webservice is not available. Please check the URL." +msgstr "" +"El servicio webservice no está disponible. Por favor, comprueba la URL." + +#. Plugin Name of the plugin/theme +msgid "Doliwoo" +msgstr "DoliWoo" + +#. Plugin URI of the plugin/theme +msgid "TODO (https://gpcsolutions.fr/doliwoo)" +msgstr "" + +#. Description of the plugin/theme +msgid "Dolibarr WooCommerce integration" +msgstr "" + +#. Author of the plugin/theme +msgid "GPC.solutions" +msgstr "GPC.solutions" From b6ad401d3966245bb57799e6c6de378780fba4ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 11:47:49 +0100 Subject: [PATCH 02/88] Updated translation source --- languages/doliwoo.pot | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index 5ff65ba..e6feede 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -1,10 +1,10 @@ # Copyright (C) 2015 DoliWoo -# This file is distributed under the same license as the Doliwoo package. +# This file is distributed under the same license as the DoliWoo package. msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.1\n" "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/doliwoo\n" -"POT-Creation-Date: 2015-02-18 16:23:59+00:00\n" +"POT-Creation-Date: 2015-02-19 10:47:26+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -143,11 +143,11 @@ msgid "The webservice is not available. Please check the URL." msgstr "" #. Plugin Name of the plugin/theme -msgid "Doliwoo" +msgid "DoliWoo" msgstr "" #. Plugin URI of the plugin/theme -msgid "TODO (https://gpcsolutions.fr/doliwoo)" +msgid "http://gpcsolutions.github.io/doliwoo" msgstr "" #. Description of the plugin/theme From 5ac39a049f9fa65bce77802ed90df66215744647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 11:57:35 +0100 Subject: [PATCH 03/88] Fixed project name into readme --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index a36002f..4ff1ed5 100644 --- a/readme.txt +++ b/readme.txt @@ -1,4 +1,4 @@ -=== Doliwoo === +=== DoliWoo === Contributors: GPC.solutions Donate Link: TODO (https://gpcsolutions.fr/donate) Tags: dolibarr, woocommerce, ecommerce, erp, integration From c8fbbb2c3a7ba24297df21e0b80a52ee732eb203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 14:38:05 +0100 Subject: [PATCH 04/88] French companies are not allowed to receive donations --- readme.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/readme.txt b/readme.txt index 4ff1ed5..5aaf27d 100644 --- a/readme.txt +++ b/readme.txt @@ -1,6 +1,5 @@ === DoliWoo === Contributors: GPC.solutions -Donate Link: TODO (https://gpcsolutions.fr/donate) Tags: dolibarr, woocommerce, ecommerce, erp, integration Author URI: https://gpcsolutions.fr Plugin URI: https://gpcsolutions.github.io/doliwoo From 48c512f0bbe5287f9510df3323e3cebf7153f3f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 16:24:43 +0100 Subject: [PATCH 05/88] Updated readme --- doliwoo.php | 2 +- readme.txt | 27 ++++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/doliwoo.php b/doliwoo.php index 7a1a73e..5f1b5b1 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -5,7 +5,7 @@ Description: Dolibarr WooCommerce integration Version: 0.0.1 Author: GPC.solutions -License: GPL3 +License: GPL-3.0+ Text Domain: doliwoo Domain Path: /languages */ diff --git a/readme.txt b/readme.txt index 5aaf27d..09cfa58 100644 --- a/readme.txt +++ b/readme.txt @@ -1,13 +1,13 @@ === DoliWoo === -Contributors: GPC.solutions -Tags: dolibarr, woocommerce, ecommerce, erp, integration -Author URI: https://gpcsolutions.fr -Plugin URI: https://gpcsolutions.github.io/doliwoo -Requires at least: 3.7.1 -Tested up to: 3.7.1 -Stable tag: master -License: GPLv3 -License URI: http://www.gnu.org/licenses/gpl-3.0.html +Contributors: GPC.solutions +Tags: dolibarr, woocommerce, ecommerce, erp, integration +Author URI: https://gpcsolutions.fr +Plugin URI: https://gpcsolutions.github.io/doliwoo +Requires at least: 3.7.1 +Tested up to: 3.7.1 +Stable tag: master +License: GPL-3.0+ +License URI: http://www.gnu.org/licenses/gpl-3.0.html Integrate Dolibarr with a WooCommerce shop. @@ -57,10 +57,11 @@ Only French equivalence table is shipped at the moment. * Orders == Installation == -* Make sure the WooCommerce plugin is installed into your WordPress -* Extract the zip file to the 'wp-content/plugins/' directory of your WordPress installation -* Activate the plugin from 'Plugins' WordPress settings page -* Go to 'WooCommerce' 'Settings' under the 'Integration' tab and configure the 'Doliwoo' section + +1. Make sure the WooCommerce plugin is installed into your WordPress +2. Extract the zip file to the 'wp-content/plugins/' directory of your WordPress installation +3. Activate the plugin from 'Plugins' WordPress settings page +4. Go to 'WooCommerce' 'Settings' under the 'Integration' tab and configure the 'Doliwoo' section == Frequently Asked Questions == From ca062f4341bb71468ed30dedbb8fd39cfa2f913b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 17:09:49 +0100 Subject: [PATCH 06/88] Automated i18n and release with grunt Fixes #22 --- .gitignore | 43 +++++++++++++++++ Gruntfile.js | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 104 +++++++++++++++++++++++++++++++++++++++++ package.json | 42 +++++++++++++++++ 4 files changed, 317 insertions(+) create mode 100644 .gitignore create mode 100644 Gruntfile.js create mode 100644 README.md create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..df7a0a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +### Node template +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- +node_modules + + +### Composer template +composer.phar +vendor/ + +# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file +# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file +# composer.lock + +### Release +release/ + +### Docs +docs/ diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..df65edd --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,128 @@ +module.exports = function (grunt) { + // Load tasks + require('load-grunt-tasks')(grunt); + + // Display task timing + require('time-grunt')(grunt); + + // Project configuration + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + paths: { + // PHP assets + php: { + files_std: ['*.php', '**/*.php', '!node_modules/**/*.php'], // Standard file match + files: '<%= paths.php.files_std %>' // Dynamic file match + } + }, + phplint: { + options: { + phpArgs: { + '-lf': null + } + }, + all: { + src: '<%= paths.php.files %>' + } + }, + makepot: { + target: { + options: { + mainFile: 'doliwoo.php', + type: 'wp-plugin', + potHeaders: { + poedit: true, + 'report-msgid-bugs-to': 'https://github.com/GPCsolutions/doliwoo/issues' + }, + updatePoFiles: true + } + } + }, + po2mo: { + files: { + src: 'languages/*.po', + expand: true + } + }, + phpdocumentor: { + dist: { + options: { + ignore: 'node_modules' + } + } + }, + clean: { + main: ['release/<%= pkg.version %>'] + }, + copy: { + // Copy the plugin to a versioned release directory + main: { + src: [ + '**', + '!node_modules/**', + '!release/**', + '!.git/**', + '!Gruntfile.js', + '!package.json', + '!.gitignore', + '!.gitmodules', + '!README.md', + '!CONTRIBUTING.md', + '!docs/**', + '!assets/**' + ], + dest: 'release/<%= pkg.version %>/' + }, + dist: { + src: 'readme.txt', + dest: 'README.md' + } + }, + compress: { + main: { + options: { + mode: 'zip', + archive: './release/doliwoo-v<%= pkg.version %>.zip' + }, + expand: true, + cwd: 'release/<%= pkg.version %>/', + src: ['**/*'], + dest: 'doliwoo/' + } + }, + exec: { + txpush: { + cmd: 'tx push -s' + }, + txpull: { + cmd: 'tx pull -a' + } + } + }); + + grunt.registerTask('default', [ + 'makepot', + 'copy:dist' + ]); + + grunt.registerTask('i18n', [ + 'makepot', + 'exec:txpush', + 'exec:txpull', + 'po2mo' + ]); + + grunt.registerTask('docs', [ + 'phpdocumentor:dist' + ]); + + grunt.registerTask('release', [ + 'default', + 'i18n', + 'docs', + 'clean', + 'copy', + 'compress' + ]); + +}; diff --git a/README.md b/README.md new file mode 100644 index 0000000..09cfa58 --- /dev/null +++ b/README.md @@ -0,0 +1,104 @@ +=== DoliWoo === +Contributors: GPC.solutions +Tags: dolibarr, woocommerce, ecommerce, erp, integration +Author URI: https://gpcsolutions.fr +Plugin URI: https://gpcsolutions.github.io/doliwoo +Requires at least: 3.7.1 +Tested up to: 3.7.1 +Stable tag: master +License: GPL-3.0+ +License URI: http://www.gnu.org/licenses/gpl-3.0.html + +Integrate Dolibarr with a WooCommerce shop. + +== Description == +Doliwoo allows integration of Dolibarr into WooCommerce. + +It leverages Dolibarr webservices feature to exchange data. + += Features = + +**Dolibarr to WooCommerce** +* Periodic sync of products informations including images and stock informations +* Link customers to existing thirdparties + +**WooCommerce to Dolibarr** +* Create thirdparties +* Create customer orders + +**Known missing (TODO)** +* International VAT rates management +* Products stock informations resync on orders +* Invoicing +* Payments +* Multiple languages products management + +**Known issues** +WooCommerce VAT management vastly differs from Dolibarr and we need equivalence tables. +Only French equivalence table is shipped at the moment. + += Requirements = + +**PHP extensions** +* SOAP +* OpenSSL + +**WordPress plugins** +* Woocommerce >= 2.0.0 + +**Dolibarr** +* HTTPS access with a valid certificate +* Dolibarr >= 3.4.0 +* Modules: + * Webservices + * Thirdparties + * Products + * Categories (Products) + * Orders + +== Installation == + +1. Make sure the WooCommerce plugin is installed into your WordPress +2. Extract the zip file to the 'wp-content/plugins/' directory of your WordPress installation +3. Activate the plugin from 'Plugins' WordPress settings page +4. Go to 'WooCommerce' 'Settings' under the 'Integration' tab and configure the 'Doliwoo' section + +== Frequently Asked Questions == + += Is this plugin stable and useable in a production environment? = + +NO! This is beta code. This project started as an internal proof of concept and has just been reviewed. +But you're very welcome to test it on a pre-production environment. + += OK, so how can I make it happen then? = + +You can help by testing, providing detailed bug reports, documentation or even code. +Alternatively, you can buy paid support and/or development services from us: [GPC.solutions](https://gpcsolutions.fr). + += Why do I need to use HTTPS with a good known SSL certificate? = + +Otherwise SOAP requests will fail. + +This is a security feature to make sure your important data is properly encrypted in transit between WooCommerce and Dolibarr. + +You may allow insecure requests by tweaking the source code if you know what you're doing but we don't recommend that. + +== Screenshots == + +1. FIXME: Placeholder + +== Changelog == + += 0.0.1 = + +* First beta release +* Periodically sync products from a Dolibarr category +* Use a generic thirdparty for sales without user creation +* Create or reuse a thirdparty for sales with a logged in user +* Create an order into Dolibarr for each sale + +== Upgrade Notice == + += 0.0.1 = + +N.A. diff --git a/package.json b/package.json new file mode 100644 index 0000000..55acfea --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "doliwoo", + "version": "0.0.2-alpha", + "description": "Integrate Dolibarr with a WooCommerce shop.", + "keywords": [ + "wordpress", + "dolibarr", + "woocommerce", + "ecommerce", + "erp", + "integration" + ], + "homepage": "https://gpcsolutions.github.io/doliwoo", + "bugs": "https://github.com/GPCsolutions/doliwoo/issues", + "license": "GPL-3.0+", + "author": "GPC.solutions", + "maintainers": [ + "Raphaël Doursenaud " + ], + "contributors": [ + "Cédric Salvador", + "Maxime Lafourcade" + ], + "main": "doliwoo.php", + "repository": { + "type": "git", + "url": "https://github.com/GPCsolutions/doliwoo" + }, + "devDependencies": { + "grunt": "~0.4.2", + "grunt-contrib-clean": "^0.6.0", + "grunt-contrib-compress": "^0.13.0", + "grunt-contrib-copy": "^0.7.0", + "grunt-exec": "^0.4.6", + "grunt-phpdocumentor": "^0.4.1", + "grunt-phplint": "0.0.5", + "grunt-po2mo": "^0.1.2", + "grunt-wp-i18n": "^0.5.0", + "load-grunt-tasks": "^3.1.0", + "time-grunt": "^1.0.0" + } +} From b9c49e6d78d7e48d25a6b58eda8cd465240c6977 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 17:12:29 +0100 Subject: [PATCH 07/88] Removed Gettext mo files now managed by Grunt --- .gitignore | 3 +++ languages/doliwoo-ca.mo | Bin 3608 -> 0 bytes languages/doliwoo-es_ES.mo | Bin 3377 -> 0 bytes languages/doliwoo-fr_FR.mo | Bin 3612 -> 0 bytes 4 files changed, 3 insertions(+) delete mode 100644 languages/doliwoo-ca.mo delete mode 100644 languages/doliwoo-es_ES.mo delete mode 100644 languages/doliwoo-fr_FR.mo diff --git a/.gitignore b/.gitignore index df7a0a4..6386105 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ release/ ### Docs docs/ + +### Compiled translations +*.mo diff --git a/languages/doliwoo-ca.mo b/languages/doliwoo-ca.mo deleted file mode 100644 index aa3740fba7a0a59023a644d7dc8185adbd804402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3608 zcmb7`ON<;x8OI9!kfSsoMd;2yLV<|2WR{co0)aI$(kK`XKf@vsJ6Riww&&+ zPF3}e#}}>~5E74E$i=zg0~h;-xD5voNF3k-NaVr^2?=g+v%OKDDCio0kfL{k+2QPqs1HS~Gz+%sXU68<=;2QV__%!${a1;DH$oijv(Y)?D z$m>QR+j*vWe-Zo_V)Zh}de42h_Q!#r!t+g#`#@kfL} zc*0(;|vIuz;-6Lb1B7dYvR^H^&>x8N@ zm0r=%s@E!2Boon7nZ&Qj^fhB>UwN;Kkqa*lrM2@LI&jL;PH*u7@?DeX$|j0*;nm1u z1yd{pWWvvm#yZRBP*G|MnBriOc2q&#LUgPS@qDZk3xP{!T>B!+GSf-$zIIlp3Oa@p(%z|TNZy1rEG&t|&X8cms#S;tB2Iag zAwMQBWidG!q<4B`Fcs-zWq!i)G?s;Db+drO?Oi30k!C|}GLW`o?NlsYfg^hbQqz+< zYi=*WZQS>*Nvp&YELJ09Ct@G(A-Uv+80_`-Xl)kJQJKsm5fAMK#}~O-7Xw(gu(P~R z@jVvLYfxqx0+W}R;+FW;UAc5!~O~>c2xNS)}xT^|I$!2r_qbm$VCIw2@%A`VhyFm z=8TOUZMdpr*^SztSxv0;_Xbhds<0cP9!ji3o2~ZgsI?ij&rtjM&gOHS(=R;RYIRyI z2uD}cv1S|YmwkcS?arxF&$il-+m+5o11k%cNpEb2UYy>tI1eQCu@%*5ddtx{Jo77S zhF=@y$SLps3z%ArDmhZoK*{{wOuW2vd3zC{cHCO&8k|K144IVh%A+LUywt^6RE)Gv z`SS;Zi_w{d92-1THrg%{lVX>5=**$^EB&mpGK(%6o4XDb2p}Ha`OULb-=1G9=*jcc zUO&6?jVK&EwbOm0Qthc7e>FZe_p5__46*uKRBz>OZBB=3d&IU&D(s$2hJ%0l%jwUG zL`zB)Wve))E17A3Qzm+Pw{8{FTR4lPxT3s7%^<|nTewsgIM-}S?{ik)Ox)-mXu_&dK8`Gc1q6?qJK|zTrNg}FR&YlvPN;)!D zif-LsLZM}|qh5)vh5bWpsCU|Gb|rTjE;K}ZN%LHB^KIcxXfYCjt=ke88~+cgi#tag zVlh*ScJV(+2ywx`5`?~qDx#(e%Ag1*3yx#fSWNE}I#)P@w}X#$^Wj|1CfN|Tc@u&d z|J6}?xeO6p6gO5%wJS}bLpR#jmBaZ`o#f@<1WK(g) zBge-|-J51I*=p0zFmtJ=%oM-7)%d5>Puyb`w{1=?67+3%R diff --git a/languages/doliwoo-es_ES.mo b/languages/doliwoo-es_ES.mo deleted file mode 100644 index 0eaf6dd734a969652a17075758b95c882a1d9323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3377 zcma);O^g&p6vsuL{WL52ngLfvjW1vD$DKy8yA`E4j(sC+g&qT(9_jcb?-QM z^~RZaB0@YFgNfndeG(H*yn689#dz>wq6dk1^8dPfK6WF7PI`acJ+IzZy?Sqd*|h$; zz_ke;<4s?{#n+_zCy~_!)Qx z{2Y7(`~!R(+_+wdXTYuCCh#rr7)_Of;AZeW zFa)=QUx0_e9!TK7;2v-rjPC+xzzOg&$a-&pZ0}2u?cE01zi-R$-+}9pgC9U%_alPm z_{5V!ybNprIUhU0E#N-z0C)m?4eWp{e;vFC-T?Q4cfpMy!6@6C0AB!)gY16;48dz4 zLJ)s~&w+PAUiUbhXM0;g&c`@-8ax3`g4aOK$M@y;-@!NWKJhg68oU6qAD@Ek@7Eyf z{T1YV{0(wl+ymLp7C6b@JrJdmUoYYBv$#3V{AEv1gk>@9nCK3)TyXRsmZfE^u!l)O@bG@twJV{P-A4v)Sc=_YWoeh?sUzc*)oEmk1adYG z6wOE-m5-+pHlFL&gjtXhJXS4ZyJ8XFAvqF;Xu#~yfn?2!Rjv$bM@A7MZYRd3RIYF+ zB-8fSs2k=G;mLG&Q68v>kebGlj7{8ao6M21p|Y-64vnb^OvI5wlu$$c4bRmNlgmHF zs0_J+(B)Eu9MvNwu_jnn!IeCvs2WxaN%e86V#iw-D-}9Il~0>?TOlKbKoVsw-T(D$ zqT9_2xqFJo1K^YWcz8gIn<{esyd?@$PtMTuX=EiLB+khNNUCvR;EZk3`iXx#okEkR62RCand_Hl(RB+O=Z2=I4~g&N{tRL z=@f2w3u;AkjBC9(Le*;Rz=3_0DmLw?SQt>#sC#D^fRNZ@Y zY+gF}#r7hZ8e5|UnJmlRR}pfU!L?XsAsw^f;N^HL2?h6JMl4n!bKJGD7iiz*I{txpBEZ4kt(XEFFy$~= z%GF|u+q@yUs-q7q^-ZG}BYy~o+q{*%+gD*A8d+={i2>9Vh|LHqlnw*{gvk9 zAe13=xA}C)y=x{zgIk3)gwp~wO&mbvvUjI#5I&WY0C`3hH~|uEmWM^T52K;@Vo|e5 z?-q|obOlpPh0^YRLg2*?ARjyv*egtF+*-l2{!p+!&Gf#!EF%LcOa-UW4xt#cw|CnY z^Bk}^7fV`ES4l<`_HN6;dmuwe%f?DEU5p3($T=<>x)D<&?l)0jsS>jzew9OI%_`Oa zr&l?f4+?1qn$hk0iqPcCr1A<>5psu&AR(B%CG-+E2MYJ6$%7^H^T(5^ue(dU(8mFG*lhSP+-}U0xme@O^42)G a&w=2ve>}NSqb;c3H~IGWKhK??68`}aywx@U diff --git a/languages/doliwoo-fr_FR.mo b/languages/doliwoo-fr_FR.mo deleted file mode 100644 index 83619c311003bfcfa5c57767e46112e889983ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3612 zcmb7`+ixUC6~-%&a54Ag7A}DUx!5M#bMancW-qYV>#P$y9@*m!2v8_@*Nkh^)74v5 z?b*o-;w`Tr<%I|d5+O10%6~AC@(4maA;AkE5Ko9F#0z|WuW zzzO&n@VDT*!M}sM;6K5~!L5gdco%pF`~Y|tJO_RkybAsRd1OEoH{m0-mue%EJ zx)I2Ju2DVgRIXV!B2vJ0UrhbU44J_gU|=> ze0>Nv`-qT(wm|TWiR}sbfN;bo_(OGJ`t0I7;@sr;_<9UCrzfw+7hD!!#LaOMZuXC_ zCvbluJe3-A{BSSi4g3D7>bDxaU-k7-JbbQt`80^M2yu#yV`H2mf2>Fr-VCMJF%@|t zy`sKVcMFxpW3j1HiN7Y*FB(G!%6pv+T=;M#t(`s4p;MN&H|HNPe!~oh%EpRx=GDMr z1(VGO$e7<9jdYsQk)p(8aK*tR?Wlmc`OuL%!uyGil_MGBZ|T9v7;zJ(EwO{_4=s+g z#&|m1-=P)VPz^fvK6jmFb2v__(T&&)n+r2mD{Es@{1=lit1*w!ek`8tZZw=pix7l( zR%OaUKsaxcTv`mcWkzKzGS5>Thv>^-b)sOSKPK&+O8ewZ*oL_$4YA!Pc(H61lz`$i zEK=-`8Rjw@pAVzAH_2cswvUbZF^{K_%siW`1xMIBN}gbw4YkQ&v>j=u8sd2bvX^0N zHly&EaRzjVyU~=i#DtZry<%zigjqM)xH$9)}r=0wJ&$pE_5z^`RP`x z(`sRGw69Jy`*5GJ>z#|2pKi4=Zbv#F^{mWXD!s8C+L!sUocY0?i4inj+kOLL2VGPJkke3Nu6Cmc1d{buO0TbqV@SWUbC-k zbTf-hf{M_g^&{*)l$aUL?Dg2S(LIrJI$j77^y&J@Q| zd(1+=;hj^qK?fRz7kN|W54NG*5E}?p974uE5{u9tL;9Tla*R|!Fp>=!3yNg1 zFJ3Ui(uIZSL|wPf9Oe2Hik;eV$*pW=Rh3-@t@plxgvNvaDC&NMV2232!R8Y7$%hTN zTR=ET)1UKBmf}H~oDW5cR6(a6q9Aj+hBl-ea+enl%_kh7N^wid`FRh*sChn6w#+}G zI#Z%uZZaL(&@TR`(yYe`r$8V6l(`C>LkcYPqUnVHS;7{bYDf zvvas67i#25NZ118|LlJId^?ronB6_!Pi2ned CyC Date: Thu, 19 Feb 2015 17:13:00 +0100 Subject: [PATCH 08/88] Translation sync --- languages/doliwoo-ca.po | 72 ++++++++++++++------------ languages/doliwoo-es_ES.po | 77 +++++++++++++++------------- languages/doliwoo-fr_FR.po | 100 ++++++++++++++++++++++--------------- languages/doliwoo.pot | 89 ++++++++++++++++++++------------- 4 files changed, 192 insertions(+), 146 deletions(-) diff --git a/languages/doliwoo-ca.po b/languages/doliwoo-ca.po index 6602333..923838b 100644 --- a/languages/doliwoo-ca.po +++ b/languages/doliwoo-ca.po @@ -5,120 +5,124 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" -"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/doliwoo\n" -"POT-Creation-Date: 2015-02-18 16:23:59+00:00\n" +"Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" +"POT-Creation-Date: 2015-02-19 16:10:52+00:00\n" "PO-Revision-Date: 2015-02-19 11:44+0100\n" "Last-Translator: Bàrbara Partegàs \n" "Language-Team: Bàrbara Partegàs \n" +"Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.7.4\n" -"Language: ca\n" "X-Poedit-SourceCharset: UTF-8\n" -#: doliwoo.php:51 +#: doliwoo.php:51 release/0.0.2-alpha/doliwoo.php:51 msgid "This plugin needs SOAP and OpenSSL PHP extensions." msgstr "Aquest plugin necessita extensions SOAP i OpenSSL PHP." -#: doliwoo.php:55 +#: doliwoo.php:55 release/0.0.2-alpha/doliwoo.php:55 msgid "This plugin needs SOAP PHP extension." msgstr "Aquest plugin necessita l'extensió SOAP PHP." -#: doliwoo.php:59 +#: doliwoo.php:59 release/0.0.2-alpha/doliwoo.php:59 msgid "This plugin needs OpenSSL PHP extension." msgstr "Aquest plugin necessita l'extensió OpenSSL PHP." -#: doliwoo.php:209 +#: doliwoo.php:209 release/0.0.2-alpha/doliwoo.php:209 msgid "This extension needs WooCommerce" msgstr "Aquesta extensió necessita WooCommerce" #: includes/class-doliwoo-parameters.php:62 +#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" #: includes/class-doliwoo-parameters.php:65 #: includes/class-doliwoo-parameters.php:128 +#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:65 +#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:128 msgid "Dolibarr User ID" msgstr "ID de l'usuari Dolibarr" #: includes/class-tax-doliwoo.php:63 +#: release/0.0.2-alpha/includes/class-tax-doliwoo.php:63 msgid "VAT" msgstr "IVA" -#: includes/settings.php:37 +#: includes/settings.php:37 release/0.0.2-alpha/includes/settings.php:37 msgid "DoliWoo Settings" msgstr "Paràmetres de DoliWoo" -#: includes/settings.php:38 +#: includes/settings.php:38 release/0.0.2-alpha/includes/settings.php:38 msgid "Dolibarr webservices access" msgstr "Accés webservice de Dolibarr" -#: includes/settings.php:75 +#: includes/settings.php:75 release/0.0.2-alpha/includes/settings.php:75 msgid "Source application" msgstr "Aplicació font" -#: includes/settings.php:76 +#: includes/settings.php:76 release/0.0.2-alpha/includes/settings.php:76 msgid "How this application will identify itself to the webservice." msgstr "Com s'identificarà aquesta aplicació al webservice." -#: includes/settings.php:82 +#: includes/settings.php:82 release/0.0.2-alpha/includes/settings.php:82 msgid "URL" msgstr "URL" -#: includes/settings.php:83 +#: includes/settings.php:83 release/0.0.2-alpha/includes/settings.php:83 msgid "" "Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" msgstr "" "Entra la URL arrel del webservice de Dolibarr (i.e. https://mydolibarr.com/" "webservices)" -#: includes/settings.php:90 +#: includes/settings.php:90 release/0.0.2-alpha/includes/settings.php:90 msgid "Delay" msgstr "Retard" -#: includes/settings.php:91 +#: includes/settings.php:91 release/0.0.2-alpha/includes/settings.php:91 msgid "Choose the automatic update frequency" msgstr "Escull la freqüència de l'actualització automàtica" -#: includes/settings.php:95 +#: includes/settings.php:95 release/0.0.2-alpha/includes/settings.php:95 msgid "Once Hourly" msgstr "Un cop cada hora" -#: includes/settings.php:96 +#: includes/settings.php:96 release/0.0.2-alpha/includes/settings.php:96 msgid "Twice Daily" msgstr "Dos cops al dia" -#: includes/settings.php:97 +#: includes/settings.php:97 release/0.0.2-alpha/includes/settings.php:97 msgid "Once Daily" msgstr "Un cop al dia" -#: includes/settings.php:101 +#: includes/settings.php:101 release/0.0.2-alpha/includes/settings.php:101 msgid "Key" msgstr "Clau" -#: includes/settings.php:102 +#: includes/settings.php:102 release/0.0.2-alpha/includes/settings.php:102 msgid "Enter your Dolibarr webservices key" msgstr "Entra la teva clau del webservice de Dolibarr" -#: includes/settings.php:108 +#: includes/settings.php:108 release/0.0.2-alpha/includes/settings.php:108 msgid "User login" msgstr "Usuari d'inici de sessió" -#: includes/settings.php:109 +#: includes/settings.php:109 release/0.0.2-alpha/includes/settings.php:109 msgid "Dolibarr actions will be done as this user" msgstr "Les accions de Dolibarr es duran a terme amb aquest usuari" -#: includes/settings.php:115 +#: includes/settings.php:115 release/0.0.2-alpha/includes/settings.php:115 msgid "User password" msgstr "Paraula de pas de l'usuari" -#: includes/settings.php:121 +#: includes/settings.php:121 release/0.0.2-alpha/includes/settings.php:121 msgid "Entity" msgstr "Entitat (empresa)" -#: includes/settings.php:122 +#: includes/settings.php:122 release/0.0.2-alpha/includes/settings.php:122 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." @@ -126,11 +130,11 @@ msgstr "" "Si utilitzes multiempresa, l'ID de l'entitat (empresa) que vols integrar. " "Déixa-ho amb 1 si no és així." -#: includes/settings.php:128 +#: includes/settings.php:128 release/0.0.2-alpha/includes/settings.php:128 msgid "Product category" msgstr "Categoria del producte" -#: includes/settings.php:129 +#: includes/settings.php:129 release/0.0.2-alpha/includes/settings.php:129 msgid "" "The ID of the product category you want to automatically import products " "from." @@ -138,29 +142,31 @@ msgstr "" "La ID de la categoria de producte de la que vols importar productes " "automàticament." -#: includes/settings.php:135 +#: includes/settings.php:135 release/0.0.2-alpha/includes/settings.php:135 msgid "Generic thirdparty" msgstr "Tercer per defecte" -#: includes/settings.php:136 +#: includes/settings.php:136 release/0.0.2-alpha/includes/settings.php:136 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "" "La ID del tercer per defecte que serà utilitzat en les comandes anònimes." -#: includes/settings.php:156 +#: includes/settings.php:156 release/0.0.2-alpha/includes/settings.php:156 msgid "The protocol to use is https://" msgstr "El protocol per utilitzar és https://" -#: includes/settings.php:166 +#: includes/settings.php:166 release/0.0.2-alpha/includes/settings.php:166 msgid "The webservice is not available. Please check the URL." msgstr "El servei webservice no està disponible. Siusplau, comprova la URL." #. Plugin Name of the plugin/theme -msgid "Doliwoo" +#, fuzzy +msgid "DoliWoo" msgstr "Doliwoo" #. Plugin URI of the plugin/theme -msgid "TODO (https://gpcsolutions.fr/doliwoo)" +#, fuzzy +msgid "http://gpcsolutions.github.io/doliwoo" msgstr "TODO (https://gpcsolutions.fr/doliwoo)" #. Description of the plugin/theme diff --git a/languages/doliwoo-es_ES.po b/languages/doliwoo-es_ES.po index 18f4f43..96ac3bf 100644 --- a/languages/doliwoo-es_ES.po +++ b/languages/doliwoo-es_ES.po @@ -3,120 +3,124 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.1\n" -"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/doliwoo\n" -"POT-Creation-Date: 2015-02-18 16:23:59+00:00\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" +"Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" +"POT-Creation-Date: 2015-02-19 16:10:52+00:00\n" "PO-Revision-Date: 2015-02-19 11:44+0100\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Bàrbara Partegàs \n" "Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.7.4\n" "X-Poedit-SourceCharset: UTF-8\n" -#: doliwoo.php:51 +#: doliwoo.php:51 release/0.0.2-alpha/doliwoo.php:51 msgid "This plugin needs SOAP and OpenSSL PHP extensions." msgstr "Este plugin necesita extensiones PHP OpenSSL y SOAP." -#: doliwoo.php:55 +#: doliwoo.php:55 release/0.0.2-alpha/doliwoo.php:55 msgid "This plugin needs SOAP PHP extension." msgstr "Este plugin necesita extensión SOAP PHP." -#: doliwoo.php:59 +#: doliwoo.php:59 release/0.0.2-alpha/doliwoo.php:59 msgid "This plugin needs OpenSSL PHP extension." msgstr "Este plugin necesita extensión OpenSSL PHP." -#: doliwoo.php:209 +#: doliwoo.php:209 release/0.0.2-alpha/doliwoo.php:209 msgid "This extension needs WooCommerce" msgstr "Esta extensión necesita WooCommerce" #: includes/class-doliwoo-parameters.php:62 +#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" #: includes/class-doliwoo-parameters.php:65 #: includes/class-doliwoo-parameters.php:128 +#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:65 +#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:128 msgid "Dolibarr User ID" msgstr "ID de usuario Dolibarr" #: includes/class-tax-doliwoo.php:63 +#: release/0.0.2-alpha/includes/class-tax-doliwoo.php:63 msgid "VAT" msgstr "IVA" -#: includes/settings.php:37 +#: includes/settings.php:37 release/0.0.2-alpha/includes/settings.php:37 msgid "DoliWoo Settings" msgstr "Configuración de DoliWoo" -#: includes/settings.php:38 +#: includes/settings.php:38 release/0.0.2-alpha/includes/settings.php:38 msgid "Dolibarr webservices access" msgstr "Acceso a webservices Dolibarr" -#: includes/settings.php:75 +#: includes/settings.php:75 release/0.0.2-alpha/includes/settings.php:75 msgid "Source application" msgstr "Aplicación fuente" -#: includes/settings.php:76 +#: includes/settings.php:76 release/0.0.2-alpha/includes/settings.php:76 msgid "How this application will identify itself to the webservice." msgstr "Cómo se identificará esta aplicación al webservice." -#: includes/settings.php:82 +#: includes/settings.php:82 release/0.0.2-alpha/includes/settings.php:82 msgid "URL" msgstr "URL" -#: includes/settings.php:83 +#: includes/settings.php:83 release/0.0.2-alpha/includes/settings.php:83 msgid "" "Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" msgstr "" "Entra la URL raíz del webservice de Dolibarr (ej.: https://mydolibarr.com/" "webservices)" -#: includes/settings.php:90 +#: includes/settings.php:90 release/0.0.2-alpha/includes/settings.php:90 msgid "Delay" msgstr "Retraso" -#: includes/settings.php:91 +#: includes/settings.php:91 release/0.0.2-alpha/includes/settings.php:91 msgid "Choose the automatic update frequency" msgstr "Escoje la frecuencia de actualización automática" -#: includes/settings.php:95 +#: includes/settings.php:95 release/0.0.2-alpha/includes/settings.php:95 msgid "Once Hourly" msgstr "Una vez cada hora" -#: includes/settings.php:96 +#: includes/settings.php:96 release/0.0.2-alpha/includes/settings.php:96 msgid "Twice Daily" msgstr "Dos veces al día" -#: includes/settings.php:97 +#: includes/settings.php:97 release/0.0.2-alpha/includes/settings.php:97 msgid "Once Daily" msgstr "Una vez al día" -#: includes/settings.php:101 +#: includes/settings.php:101 release/0.0.2-alpha/includes/settings.php:101 msgid "Key" msgstr "Llave" -#: includes/settings.php:102 +#: includes/settings.php:102 release/0.0.2-alpha/includes/settings.php:102 msgid "Enter your Dolibarr webservices key" msgstr "Entra la llave del webservice de Dolibarr" -#: includes/settings.php:108 +#: includes/settings.php:108 release/0.0.2-alpha/includes/settings.php:108 msgid "User login" msgstr "Inicio de sesión de usuario" -#: includes/settings.php:109 +#: includes/settings.php:109 release/0.0.2-alpha/includes/settings.php:109 msgid "Dolibarr actions will be done as this user" msgstr "Las acciones de Dolibarr ser harán con este usuario" -#: includes/settings.php:115 +#: includes/settings.php:115 release/0.0.2-alpha/includes/settings.php:115 msgid "User password" msgstr "Contraseña de usuario" -#: includes/settings.php:121 +#: includes/settings.php:121 release/0.0.2-alpha/includes/settings.php:121 msgid "Entity" msgstr "Entidad (empresa)" -#: includes/settings.php:122 +#: includes/settings.php:122 release/0.0.2-alpha/includes/settings.php:122 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." @@ -124,40 +128,41 @@ msgstr "" "Si estás usando multiempresa, el ID de la entidad que quieres integrar. " "Déjalo en 1 si no es así." -#: includes/settings.php:128 +#: includes/settings.php:128 release/0.0.2-alpha/includes/settings.php:128 msgid "Product category" msgstr "Categoría de producto" -#: includes/settings.php:129 +#: includes/settings.php:129 release/0.0.2-alpha/includes/settings.php:129 msgid "" "The ID of the product category you want to automatically import products " "from." msgstr "" "El ID de la categoría de producto de la que quieres importar productos." -#: includes/settings.php:135 +#: includes/settings.php:135 release/0.0.2-alpha/includes/settings.php:135 msgid "Generic thirdparty" msgstr "Tercero por defecto" -#: includes/settings.php:136 +#: includes/settings.php:136 release/0.0.2-alpha/includes/settings.php:136 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "El ID del tercero que será usado para los pedidos anónimos." -#: includes/settings.php:156 +#: includes/settings.php:156 release/0.0.2-alpha/includes/settings.php:156 msgid "The protocol to use is https://" msgstr "El protocolo a usar es https://" -#: includes/settings.php:166 +#: includes/settings.php:166 release/0.0.2-alpha/includes/settings.php:166 msgid "The webservice is not available. Please check the URL." msgstr "" "El servicio webservice no está disponible. Por favor, comprueba la URL." #. Plugin Name of the plugin/theme -msgid "Doliwoo" +#, fuzzy +msgid "DoliWoo" msgstr "DoliWoo" #. Plugin URI of the plugin/theme -msgid "TODO (https://gpcsolutions.fr/doliwoo)" +msgid "http://gpcsolutions.github.io/doliwoo" msgstr "" #. Description of the plugin/theme diff --git a/languages/doliwoo-fr_FR.po b/languages/doliwoo-fr_FR.po index 04ad92a..32a44d9 100644 --- a/languages/doliwoo-fr_FR.po +++ b/languages/doliwoo-fr_FR.po @@ -5,148 +5,166 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" -"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/doliwoo\n" -"POT-Creation-Date: 2015-02-18 16:23:59+00:00\n" +"Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" +"POT-Creation-Date: 2015-02-19 16:10:52+00:00\n" "PO-Revision-Date: 2015-02-18 18:45+0100\n" "Last-Translator: Raphaël Doursenaud \n" -"Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/language/fr_FR/)\n" +"Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/" +"language/fr_FR/)\n" +"Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: fr_FR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.7.4\n" -#: doliwoo.php:51 +#: doliwoo.php:51 release/0.0.2-alpha/doliwoo.php:51 msgid "This plugin needs SOAP and OpenSSL PHP extensions." msgstr "Cette extension nécessite les extensions PHP SOAP et OpenSSL." -#: doliwoo.php:55 +#: doliwoo.php:55 release/0.0.2-alpha/doliwoo.php:55 msgid "This plugin needs SOAP PHP extension." msgstr "Cette extension nécessite l'extension PHP SOAP." -#: doliwoo.php:59 +#: doliwoo.php:59 release/0.0.2-alpha/doliwoo.php:59 msgid "This plugin needs OpenSSL PHP extension." msgstr "Cette extension nécessite l'extension PHP OpenSSL." -#: doliwoo.php:209 +#: doliwoo.php:209 release/0.0.2-alpha/doliwoo.php:209 msgid "This extension needs WooCommerce" msgstr "Cette extension nécessite WooCommerce" #: includes/class-doliwoo-parameters.php:62 +#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" -#: includes/class-doliwoo-parameters.php:65 includes/class-doliwoo-parameters.php:128 +#: includes/class-doliwoo-parameters.php:65 +#: includes/class-doliwoo-parameters.php:128 +#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:65 +#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:128 msgid "Dolibarr User ID" msgstr "Identifiant Utilisateur Dolibarr" #: includes/class-tax-doliwoo.php:63 +#: release/0.0.2-alpha/includes/class-tax-doliwoo.php:63 msgid "VAT" msgstr "TVA" -#: includes/settings.php:37 +#: includes/settings.php:37 release/0.0.2-alpha/includes/settings.php:37 msgid "DoliWoo Settings" msgstr "Réglages DoliWoo" -#: includes/settings.php:38 +#: includes/settings.php:38 release/0.0.2-alpha/includes/settings.php:38 msgid "Dolibarr webservices access" msgstr "Accès aux webservices Dolibarr" -#: includes/settings.php:75 +#: includes/settings.php:75 release/0.0.2-alpha/includes/settings.php:75 msgid "Source application" msgstr "Nom de l'application" -#: includes/settings.php:76 +#: includes/settings.php:76 release/0.0.2-alpha/includes/settings.php:76 msgid "How this application will identify itself to the webservice." msgstr "Comment cette application s'identifie auprès du webservice." -#: includes/settings.php:82 +#: includes/settings.php:82 release/0.0.2-alpha/includes/settings.php:82 msgid "URL" msgstr "URL" -#: includes/settings.php:83 -msgid "Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" -msgstr "Entrez l'URL racine des webservices de Dolibarr (i.e. https://mydolibarr.com/webservices)" +#: includes/settings.php:83 release/0.0.2-alpha/includes/settings.php:83 +msgid "" +"Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" +msgstr "" +"Entrez l'URL racine des webservices de Dolibarr (i.e. https://mydolibarr.com/" +"webservices)" -#: includes/settings.php:90 +#: includes/settings.php:90 release/0.0.2-alpha/includes/settings.php:90 msgid "Delay" msgstr "Délai" -#: includes/settings.php:91 +#: includes/settings.php:91 release/0.0.2-alpha/includes/settings.php:91 msgid "Choose the automatic update frequency" msgstr "Choisissez la fréquence de mise à jour automatique" -#: includes/settings.php:95 +#: includes/settings.php:95 release/0.0.2-alpha/includes/settings.php:95 msgid "Once Hourly" msgstr "Une fois par heure" -#: includes/settings.php:96 +#: includes/settings.php:96 release/0.0.2-alpha/includes/settings.php:96 msgid "Twice Daily" msgstr "Deux fois par jour" -#: includes/settings.php:97 +#: includes/settings.php:97 release/0.0.2-alpha/includes/settings.php:97 msgid "Once Daily" msgstr "Une fois par jour" -#: includes/settings.php:101 +#: includes/settings.php:101 release/0.0.2-alpha/includes/settings.php:101 msgid "Key" msgstr "Clé" -#: includes/settings.php:102 +#: includes/settings.php:102 release/0.0.2-alpha/includes/settings.php:102 msgid "Enter your Dolibarr webservices key" msgstr "Entrez votre clé du webservices de Dolibarr" -#: includes/settings.php:108 +#: includes/settings.php:108 release/0.0.2-alpha/includes/settings.php:108 msgid "User login" msgstr "Identifiant utilisateur" -#: includes/settings.php:109 +#: includes/settings.php:109 release/0.0.2-alpha/includes/settings.php:109 msgid "Dolibarr actions will be done as this user" msgstr "Les actions de Dolibarr seront attribuées à cet utilisateur" -#: includes/settings.php:115 +#: includes/settings.php:115 release/0.0.2-alpha/includes/settings.php:115 msgid "User password" msgstr "Mot de passe utilisateur" -#: includes/settings.php:121 +#: includes/settings.php:121 release/0.0.2-alpha/includes/settings.php:121 msgid "Entity" msgstr "Entité" -#: includes/settings.php:122 -msgid "If you're using multicompany, the ID of the entity you want to integrate. Leave to 1 otherwise." -msgstr "Si vous utilisez multi-société, l'ID de l'entité que vous souhaitez intégrer. Sinon laissez à 1." +#: includes/settings.php:122 release/0.0.2-alpha/includes/settings.php:122 +msgid "" +"If you're using multicompany, the ID of the entity you want to integrate. " +"Leave to 1 otherwise." +msgstr "" +"Si vous utilisez multi-société, l'ID de l'entité que vous souhaitez " +"intégrer. Sinon laissez à 1." -#: includes/settings.php:128 +#: includes/settings.php:128 release/0.0.2-alpha/includes/settings.php:128 msgid "Product category" msgstr "Catégorie du Produit" -#: includes/settings.php:129 -msgid "The ID of the product category you want to automatically import products from." -msgstr "L'ID de la catégorie de produits que vous souhaitez importer automatiquement." +#: includes/settings.php:129 release/0.0.2-alpha/includes/settings.php:129 +msgid "" +"The ID of the product category you want to automatically import products " +"from." +msgstr "" +"L'ID de la catégorie de produits que vous souhaitez importer automatiquement." -#: includes/settings.php:135 +#: includes/settings.php:135 release/0.0.2-alpha/includes/settings.php:135 msgid "Generic thirdparty" msgstr "Tiers générique" -#: includes/settings.php:136 +#: includes/settings.php:136 release/0.0.2-alpha/includes/settings.php:136 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "L'Id du tiers qui va être utilisé pour les commandes anonymes" -#: includes/settings.php:156 +#: includes/settings.php:156 release/0.0.2-alpha/includes/settings.php:156 msgid "The protocol to use is https://" msgstr "Le protocole à utiliser est https://" -#: includes/settings.php:166 +#: includes/settings.php:166 release/0.0.2-alpha/includes/settings.php:166 msgid "The webservice is not available. Please check the URL." msgstr "Le webservice n'est pas disponible. Merci de vérifier l'URL." #. Plugin Name of the plugin/theme -msgid "Doliwoo" +#, fuzzy +msgid "DoliWoo" msgstr "DoliWoo" #. Plugin URI of the plugin/theme -msgid "TODO (https://gpcsolutions.fr/doliwoo)" +#, fuzzy +msgid "http://gpcsolutions.github.io/doliwoo" msgstr "https://gpcsolutions.fr/doliwoo" #. Description of the plugin/theme diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index e6feede..619d5a6 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -1,144 +1,161 @@ -# Copyright (C) 2015 DoliWoo -# This file is distributed under the same license as the DoliWoo package. +# Copyright (C) 2015 GPC.solutions +# This file is distributed under the GPL-3.0+. msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.1\n" -"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/doliwoo\n" -"POT-Creation-Date: 2015-02-19 10:47:26+00:00\n" +"Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" +"POT-Creation-Date: 2015-02-19 16:12:40+00:00\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2015-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" - -#: doliwoo.php:51 +"X-Generator: grunt-wp-i18n 0.5.0\n" +"X-Poedit-KeywordsList: " +"__;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;_nx_noop:1,2,3c;esc_" +"attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;esc_html_x:1,2c;\n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Country: United States\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-Basepath: ../\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-Bookmarks: \n" +"X-Textdomain-Support: yes\n" + +#: doliwoo.php:51 release/0.0.2-alpha/doliwoo.php:51 msgid "This plugin needs SOAP and OpenSSL PHP extensions." msgstr "" -#: doliwoo.php:55 +#: doliwoo.php:55 release/0.0.2-alpha/doliwoo.php:55 msgid "This plugin needs SOAP PHP extension." msgstr "" -#: doliwoo.php:59 +#: doliwoo.php:59 release/0.0.2-alpha/doliwoo.php:59 msgid "This plugin needs OpenSSL PHP extension." msgstr "" -#: doliwoo.php:209 +#: doliwoo.php:209 release/0.0.2-alpha/doliwoo.php:209 msgid "This extension needs WooCommerce" msgstr "" #: includes/class-doliwoo-parameters.php:62 +#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "" #: includes/class-doliwoo-parameters.php:65 #: includes/class-doliwoo-parameters.php:128 +#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:65 +#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:128 msgid "Dolibarr User ID" msgstr "" #: includes/class-tax-doliwoo.php:63 +#: release/0.0.2-alpha/includes/class-tax-doliwoo.php:63 msgid "VAT" msgstr "" -#: includes/settings.php:37 +#: includes/settings.php:37 release/0.0.2-alpha/includes/settings.php:37 msgid "DoliWoo Settings" msgstr "" -#: includes/settings.php:38 +#: includes/settings.php:38 release/0.0.2-alpha/includes/settings.php:38 msgid "Dolibarr webservices access" msgstr "" -#: includes/settings.php:75 +#: includes/settings.php:75 release/0.0.2-alpha/includes/settings.php:75 msgid "Source application" msgstr "" -#: includes/settings.php:76 +#: includes/settings.php:76 release/0.0.2-alpha/includes/settings.php:76 msgid "How this application will identify itself to the webservice." msgstr "" -#: includes/settings.php:82 +#: includes/settings.php:82 release/0.0.2-alpha/includes/settings.php:82 msgid "URL" msgstr "" -#: includes/settings.php:83 +#: includes/settings.php:83 release/0.0.2-alpha/includes/settings.php:83 msgid "" -"Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" +"Enter Dolibarr webservices root URL (i.e. " +"https://mydolibarr.com/webservices)" msgstr "" -#: includes/settings.php:90 +#: includes/settings.php:90 release/0.0.2-alpha/includes/settings.php:90 msgid "Delay" msgstr "" -#: includes/settings.php:91 +#: includes/settings.php:91 release/0.0.2-alpha/includes/settings.php:91 msgid "Choose the automatic update frequency" msgstr "" -#: includes/settings.php:95 +#: includes/settings.php:95 release/0.0.2-alpha/includes/settings.php:95 msgid "Once Hourly" msgstr "" -#: includes/settings.php:96 +#: includes/settings.php:96 release/0.0.2-alpha/includes/settings.php:96 msgid "Twice Daily" msgstr "" -#: includes/settings.php:97 +#: includes/settings.php:97 release/0.0.2-alpha/includes/settings.php:97 msgid "Once Daily" msgstr "" -#: includes/settings.php:101 +#: includes/settings.php:101 release/0.0.2-alpha/includes/settings.php:101 msgid "Key" msgstr "" -#: includes/settings.php:102 +#: includes/settings.php:102 release/0.0.2-alpha/includes/settings.php:102 msgid "Enter your Dolibarr webservices key" msgstr "" -#: includes/settings.php:108 +#: includes/settings.php:108 release/0.0.2-alpha/includes/settings.php:108 msgid "User login" msgstr "" -#: includes/settings.php:109 +#: includes/settings.php:109 release/0.0.2-alpha/includes/settings.php:109 msgid "Dolibarr actions will be done as this user" msgstr "" -#: includes/settings.php:115 +#: includes/settings.php:115 release/0.0.2-alpha/includes/settings.php:115 msgid "User password" msgstr "" -#: includes/settings.php:121 +#: includes/settings.php:121 release/0.0.2-alpha/includes/settings.php:121 msgid "Entity" msgstr "" -#: includes/settings.php:122 +#: includes/settings.php:122 release/0.0.2-alpha/includes/settings.php:122 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "" -#: includes/settings.php:128 +#: includes/settings.php:128 release/0.0.2-alpha/includes/settings.php:128 msgid "Product category" msgstr "" -#: includes/settings.php:129 +#: includes/settings.php:129 release/0.0.2-alpha/includes/settings.php:129 msgid "" "The ID of the product category you want to automatically import products " "from." msgstr "" -#: includes/settings.php:135 +#: includes/settings.php:135 release/0.0.2-alpha/includes/settings.php:135 msgid "Generic thirdparty" msgstr "" -#: includes/settings.php:136 +#: includes/settings.php:136 release/0.0.2-alpha/includes/settings.php:136 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "" -#: includes/settings.php:156 +#: includes/settings.php:156 release/0.0.2-alpha/includes/settings.php:156 msgid "The protocol to use is https://" msgstr "" -#: includes/settings.php:166 +#: includes/settings.php:166 release/0.0.2-alpha/includes/settings.php:166 msgid "The webservice is not available. Please check the URL." msgstr "" @@ -156,4 +173,4 @@ msgstr "" #. Author of the plugin/theme msgid "GPC.solutions" -msgstr "" +msgstr "" \ No newline at end of file From ab4b43319124ca67d31fbfefbeaba523e6d70c37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 19:25:50 +0100 Subject: [PATCH 09/88] Switched to wp-readme-to-markdown to generate GitHub readme --- Gruntfile.js | 9 +++++++- README.md | 50 +++++++++++++++++++++---------------------- languages/doliwoo.pot | 2 +- package.json | 1 + 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index df65edd..f6131d0 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -97,12 +97,19 @@ module.exports = function (grunt) { txpull: { cmd: 'tx pull -a' } + }, + wp_readme_to_markdown: { + main: { + files: { + 'README.md': 'readme.txt' + } + } } }); grunt.registerTask('default', [ 'makepot', - 'copy:dist' + 'wp_readme_to_markdown' ]); grunt.registerTask('i18n', [ diff --git a/README.md b/README.md index 09cfa58..ac023c2 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,22 @@ -=== DoliWoo === -Contributors: GPC.solutions -Tags: dolibarr, woocommerce, ecommerce, erp, integration -Author URI: https://gpcsolutions.fr -Plugin URI: https://gpcsolutions.github.io/doliwoo -Requires at least: 3.7.1 -Tested up to: 3.7.1 -Stable tag: master -License: GPL-3.0+ -License URI: http://www.gnu.org/licenses/gpl-3.0.html +# DoliWoo # +**Contributors:** GPC.solutions +**Tags:** dolibarr, woocommerce, ecommerce, erp, integration +**Author URI:** https://gpcsolutions.fr +**Plugin URI:** https://gpcsolutions.github.io/doliwoo +**Requires at least:** 3.7.1 +**Tested up to:** 3.7.1 +**Stable tag:** master +**License:** GPL-3.0+ +**License URI:** http://www.gnu.org/licenses/gpl-3.0.html Integrate Dolibarr with a WooCommerce shop. -== Description == +## Description ## Doliwoo allows integration of Dolibarr into WooCommerce. It leverages Dolibarr webservices feature to exchange data. -= Features = +### Features ### **Dolibarr to WooCommerce** * Periodic sync of products informations including images and stock informations @@ -37,7 +37,7 @@ It leverages Dolibarr webservices feature to exchange data. WooCommerce VAT management vastly differs from Dolibarr and we need equivalence tables. Only French equivalence table is shipped at the moment. -= Requirements = +### Requirements ### **PHP extensions** * SOAP @@ -56,26 +56,26 @@ Only French equivalence table is shipped at the moment. * Categories (Products) * Orders -== Installation == +## Installation ## 1. Make sure the WooCommerce plugin is installed into your WordPress 2. Extract the zip file to the 'wp-content/plugins/' directory of your WordPress installation 3. Activate the plugin from 'Plugins' WordPress settings page 4. Go to 'WooCommerce' 'Settings' under the 'Integration' tab and configure the 'Doliwoo' section -== Frequently Asked Questions == +## Frequently Asked Questions ## -= Is this plugin stable and useable in a production environment? = +### Is this plugin stable and useable in a production environment? ### NO! This is beta code. This project started as an internal proof of concept and has just been reviewed. But you're very welcome to test it on a pre-production environment. -= OK, so how can I make it happen then? = +### OK, so how can I make it happen then? ### You can help by testing, providing detailed bug reports, documentation or even code. -Alternatively, you can buy paid support and/or development services from us: [GPC.solutions](https://gpcsolutions.fr). +**Alternatively, you can buy paid support and/or development services from us:** [GPC.solutions](https://gpcsolutions.fr). -= Why do I need to use HTTPS with a good known SSL certificate? = +### Why do I need to use HTTPS with a good known SSL certificate? ### Otherwise SOAP requests will fail. @@ -83,13 +83,13 @@ This is a security feature to make sure your important data is properly encrypte You may allow insecure requests by tweaking the source code if you know what you're doing but we don't recommend that. -== Screenshots == +## Screenshots ## -1. FIXME: Placeholder +**1. FIXME:** Placeholder -== Changelog == +## Changelog ## -= 0.0.1 = +### 0.0.1 ### * First beta release * Periodically sync products from a Dolibarr category @@ -97,8 +97,8 @@ You may allow insecure requests by tweaking the source code if you know what you * Create or reuse a thirdparty for sales with a logged in user * Create an order into Dolibarr for each sale -== Upgrade Notice == +## Upgrade Notice ## -= 0.0.1 = +### 0.0.1 ### N.A. diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index 619d5a6..b844054 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.1\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-19 16:12:40+00:00\n" +"POT-Creation-Date: 2015-02-19 18:22:01+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/package.json b/package.json index 55acfea..aa19ffa 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "grunt-phplint": "0.0.5", "grunt-po2mo": "^0.1.2", "grunt-wp-i18n": "^0.5.0", + "grunt-wp-readme-to-markdown": "^0.8.0", "load-grunt-tasks": "^3.1.0", "time-grunt": "^1.0.0" } From b69c30851af96373f05f1a39a58cf4a16289202a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 19:38:39 +0100 Subject: [PATCH 10/88] Added version check to grunt --- Gruntfile.js | 25 +++++++++++++++++++++++-- doliwoo.php | 2 +- languages/doliwoo.pot | 4 ++-- package.json | 1 + 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index f6131d0..d686575 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -104,18 +104,39 @@ module.exports = function (grunt) { 'README.md': 'readme.txt' } } + }, + checkwpversion: { + check: { //Check plug-in version and stable tag match + version1: 'plugin', + version2: 'readme', + compare: '>=' + }, + check2: { //Check plug-in version and package.json match + version1: 'plugin', + version2: '<%= pkg.version %>', + compare: '==' + } } }); grunt.registerTask('default', [ - 'makepot', + 'potupdate', + 'checkwpversion', 'wp_readme_to_markdown' ]); - grunt.registerTask('i18n', [ + grunt.registerTask('potupdate', [ 'makepot', 'exec:txpush', + ]); + + grunt.registerTask('poupdate', [ 'exec:txpull', + ]); + + grunt.registerTask('i18n', [ + 'potupdate', + 'poupdate', 'po2mo' ]); diff --git a/doliwoo.php b/doliwoo.php index 5f1b5b1..72f9ce7 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -3,7 +3,7 @@ Plugin Name: DoliWoo Plugin URI: http://gpcsolutions.github.io/doliwoo Description: Dolibarr WooCommerce integration -Version: 0.0.1 +Version: 0.0.2-alpha Author: GPC.solutions License: GPL-3.0+ Text Domain: doliwoo diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index b844054..7ed9e0c 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -2,9 +2,9 @@ # This file is distributed under the GPL-3.0+. msgid "" msgstr "" -"Project-Id-Version: DoliWoo 0.0.1\n" +"Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-19 18:22:01+00:00\n" +"POT-Creation-Date: 2015-02-19 18:38:04+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/package.json b/package.json index aa19ffa..88df253 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ }, "devDependencies": { "grunt": "~0.4.2", + "grunt-checkwpversion": "^0.3.0", "grunt-contrib-clean": "^0.6.0", "grunt-contrib-compress": "^0.13.0", "grunt-contrib-copy": "^0.7.0", From 55e1eff32e539678cf17916b5052860b0b3115a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 20:01:09 +0100 Subject: [PATCH 11/88] Re-added Travis-CI Only running grunt tests for the moment --- .travis.yml | 9 +++++++++ Gruntfile.js | 6 +++++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..3d6f933 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,9 @@ +language: php + +php: + - 5.3 + - 5.4 + +before_install: npm install -g grunt-cli +install: npm install +script: grunt test diff --git a/Gruntfile.js b/Gruntfile.js index d686575..905131f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -121,10 +121,14 @@ module.exports = function (grunt) { grunt.registerTask('default', [ 'potupdate', - 'checkwpversion', + 'test', 'wp_readme_to_markdown' ]); + grunt.registerTask('test', [ + 'checkwpversion', + ]); + grunt.registerTask('potupdate', [ 'makepot', 'exec:txpush', From 2e8e8adcad4f18e32ad8b8141ce6dbe41e1052ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 21:13:07 +0100 Subject: [PATCH 12/88] Added composer Fixes #49 --- .gitignore | 3 ++ Gruntfile.js | 47 ++++++++++++----- composer.json | 47 +++++++++++++++++ composer.lock | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 5 files changed, 222 insertions(+), 12 deletions(-) create mode 100644 composer.json create mode 100644 composer.lock diff --git a/.gitignore b/.gitignore index 6386105..ee9d52a 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,6 @@ docs/ ### Compiled translations *.mo + +### CI target +dev/ diff --git a/Gruntfile.js b/Gruntfile.js index 905131f..a4c143c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -45,10 +45,9 @@ module.exports = function (grunt) { } }, phpdocumentor: { - dist: { - options: { - ignore: 'node_modules' - } + main: { + // TODO: ignore dev, node_modules, release and vendor directories. + // Needs https://github.com/gomoob/grunt-phpdocumentor/pull/10 merged } }, clean: { @@ -59,17 +58,23 @@ module.exports = function (grunt) { main: { src: [ '**', - '!node_modules/**', - '!release/**', + '!assets/**', + '!composer.json', + '!composer.lock', + '!CONTRIBUTING.md', + '!docs/**', '!.git/**', - '!Gruntfile.js', - '!package.json', '!.gitignore', '!.gitmodules', + '!Gruntfile.js', + '!node_modules/**', + '!package.json', '!README.md', - '!CONTRIBUTING.md', - '!docs/**', - '!assets/**' + '!release/**', + '!.sensiolabs.yml', + '!.travis.yml', + '!.tx', + '!vendor' ], dest: 'release/<%= pkg.version %>/' }, @@ -116,10 +121,28 @@ module.exports = function (grunt) { version2: '<%= pkg.version %>', compare: '==' } + }, + "sync-json": { + options: { + indent: 2, + include: [ + 'version', + 'description', + 'keywords', + 'homepage', + 'license', + ] + }, + composer: { + files: { + 'composer.json': 'package.json' + } + } } }); grunt.registerTask('default', [ + 'sync-json', 'potupdate', 'test', 'wp_readme_to_markdown' @@ -145,7 +168,7 @@ module.exports = function (grunt) { ]); grunt.registerTask('docs', [ - 'phpdocumentor:dist' + 'phpdocumentor' ]); grunt.registerTask('release', [ diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..ebc05be --- /dev/null +++ b/composer.json @@ -0,0 +1,47 @@ +{ + "name": "gpcsolutions/doliwoo", + "description": "Integrate Dolibarr with a WooCommerce shop.", + "version": "0.0.2-alpha", + "type": "wordpress-plugin", + "keywords": [ + "wordpress", + "dolibarr", + "woocommerce", + "ecommerce", + "erp", + "integration" + ], + "homepage": "https://gpcsolutions.github.io/doliwoo", + "license": "GPL-3.0+", + "authors": [ + { + "name": "GPC.solutions", + "email": "contact@gpcsolutions.fr", + "homepage": "https://gpcsolutions.fr" + } + ], + "support": { + "issues": "https://github.com/GPCsolutions/doliwoo/issues", + "wiki": "https://github.com/GPCsolutions/doliwoo/wiki", + "source": "https://github.com/GPCsolutions/doliwoo" + }, + "require": { + "composer/installers": ">=1.0.6", + "php": ">=5.3.0", + "ext-openssl": "*", + "wpackagist-plugin/woocommerce": ">=2.0.0" + }, + "repositories": [ + { + "type": "composer", + "url": "http://wpackagist.org" + } + ], + "extra": { + "installer-paths": { + "dev/wordpress/wp-content/plugins/{$name}": [ + "wpackagist-plugin/woocommerce" + ] + } + } +} \ No newline at end of file diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..fe0537c --- /dev/null +++ b/composer.lock @@ -0,0 +1,136 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "39c83da0ff3f44df246514c3da5da4b3", + "packages": [ + { + "name": "composer/installers", + "version": "v1.0.21", + "source": { + "type": "git", + "url": "https://github.com/composer/installers.git", + "reference": "d64e23fce42a4063d63262b19b8e7c0f3b5e4c45" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/installers/zipball/d64e23fce42a4063d63262b19b8e7c0f3b5e4c45", + "reference": "d64e23fce42a4063d63262b19b8e7c0f3b5e4c45", + "shasum": "" + }, + "replace": { + "roundcube/plugin-installer": "*", + "shama/baton": "*" + }, + "require-dev": { + "composer/composer": "1.0.*@dev", + "phpunit/phpunit": "4.1.*" + }, + "type": "composer-installer", + "extra": { + "class": "Composer\\Installers\\Installer", + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Composer\\Installers\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle Robinson Young", + "email": "kyle@dontkry.com", + "homepage": "https://github.com/shama" + } + ], + "description": "A multi-framework Composer library installer", + "homepage": "http://composer.github.com/installers/", + "keywords": [ + "Craft", + "Dolibarr", + "Hurad", + "MODX Evo", + "OXID", + "SMF", + "Thelia", + "WolfCMS", + "agl", + "aimeos", + "annotatecms", + "bitrix", + "cakephp", + "chef", + "codeigniter", + "concrete5", + "croogo", + "dokuwiki", + "drupal", + "elgg", + "fuelphp", + "grav", + "installer", + "joomla", + "kohana", + "laravel", + "lithium", + "magento", + "mako", + "mediawiki", + "modulework", + "moodle", + "phpbb", + "piwik", + "ppi", + "puppet", + "roundcube", + "shopware", + "silverstripe", + "symfony", + "typo3", + "wordpress", + "zend", + "zikula" + ], + "time": "2015-02-18 17:17:01" + }, + { + "name": "wpackagist-plugin/woocommerce", + "version": "2.3.4", + "source": { + "type": "svn", + "url": "http://plugins.svn.wordpress.org/woocommerce/", + "reference": "tags/2.3.4" + }, + "dist": { + "type": "zip", + "url": "http://downloads.wordpress.org/plugin/woocommerce.2.3.4.zip", + "reference": null, + "shasum": null + }, + "require": { + "composer/installers": "~1.0" + }, + "type": "wordpress-plugin", + "homepage": "https://wordpress.org/plugins/woocommerce/" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.3.0", + "ext-openssl": "*" + }, + "platform-dev": [] +} diff --git a/package.json b/package.json index 88df253..51a50df 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "grunt-phpdocumentor": "^0.4.1", "grunt-phplint": "0.0.5", "grunt-po2mo": "^0.1.2", + "grunt-sync-json": "^0.3.1", "grunt-wp-i18n": "^0.5.0", "grunt-wp-readme-to-markdown": "^0.8.0", "load-grunt-tasks": "^3.1.0", From 6c1db992444bb91aae755378c102cff70a88287a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 22:05:18 +0100 Subject: [PATCH 13/88] Fixed readme presentation --- README.md | 18 ++++++++++-------- readme.txt | 18 ++++++++++-------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index ac023c2..91587ea 100644 --- a/README.md +++ b/README.md @@ -19,14 +19,17 @@ It leverages Dolibarr webservices feature to exchange data. ### Features ### **Dolibarr to WooCommerce** + * Periodic sync of products informations including images and stock informations * Link customers to existing thirdparties **WooCommerce to Dolibarr** + * Create thirdparties * Create customer orders **Known missing (TODO)** + * International VAT rates management * Products stock informations resync on orders * Invoicing @@ -34,7 +37,8 @@ It leverages Dolibarr webservices feature to exchange data. * Multiple languages products management **Known issues** -WooCommerce VAT management vastly differs from Dolibarr and we need equivalence tables. + +WooCommerce VAT management vastly differs from Dolibarr and we need equivalence tables. Only French equivalence table is shipped at the moment. ### Requirements ### @@ -67,21 +71,19 @@ Only French equivalence table is shipped at the moment. ### Is this plugin stable and useable in a production environment? ### -NO! This is beta code. This project started as an internal proof of concept and has just been reviewed. +NO! This is beta code. This project started as an internal proof of concept and has just been reviewed. But you're very welcome to test it on a pre-production environment. ### OK, so how can I make it happen then? ### -You can help by testing, providing detailed bug reports, documentation or even code. +You can help by testing, providing detailed bug reports, documentation or even code. **Alternatively, you can buy paid support and/or development services from us:** [GPC.solutions](https://gpcsolutions.fr). ### Why do I need to use HTTPS with a good known SSL certificate? ### -Otherwise SOAP requests will fail. - -This is a security feature to make sure your important data is properly encrypted in transit between WooCommerce and Dolibarr. - -You may allow insecure requests by tweaking the source code if you know what you're doing but we don't recommend that. +Otherwise SOAP requests will fail. +This is a security feature to make sure your important data is properly encrypted in transit between WooCommerce and Dolibarr. +You may allow insecure requests by tweaking the source code if you know what you're doing but we don't recommend that. ## Screenshots ## diff --git a/readme.txt b/readme.txt index 09cfa58..912d9ed 100644 --- a/readme.txt +++ b/readme.txt @@ -19,14 +19,17 @@ It leverages Dolibarr webservices feature to exchange data. = Features = **Dolibarr to WooCommerce** + * Periodic sync of products informations including images and stock informations * Link customers to existing thirdparties **WooCommerce to Dolibarr** + * Create thirdparties * Create customer orders **Known missing (TODO)** + * International VAT rates management * Products stock informations resync on orders * Invoicing @@ -34,7 +37,8 @@ It leverages Dolibarr webservices feature to exchange data. * Multiple languages products management **Known issues** -WooCommerce VAT management vastly differs from Dolibarr and we need equivalence tables. + +WooCommerce VAT management vastly differs from Dolibarr and we need equivalence tables. Only French equivalence table is shipped at the moment. = Requirements = @@ -67,21 +71,19 @@ Only French equivalence table is shipped at the moment. = Is this plugin stable and useable in a production environment? = -NO! This is beta code. This project started as an internal proof of concept and has just been reviewed. +NO! This is beta code. This project started as an internal proof of concept and has just been reviewed. But you're very welcome to test it on a pre-production environment. = OK, so how can I make it happen then? = -You can help by testing, providing detailed bug reports, documentation or even code. +You can help by testing, providing detailed bug reports, documentation or even code. Alternatively, you can buy paid support and/or development services from us: [GPC.solutions](https://gpcsolutions.fr). = Why do I need to use HTTPS with a good known SSL certificate? = -Otherwise SOAP requests will fail. - -This is a security feature to make sure your important data is properly encrypted in transit between WooCommerce and Dolibarr. - -You may allow insecure requests by tweaking the source code if you know what you're doing but we don't recommend that. +Otherwise SOAP requests will fail. +This is a security feature to make sure your important data is properly encrypted in transit between WooCommerce and Dolibarr. +You may allow insecure requests by tweaking the source code if you know what you're doing but we don't recommend that. == Screenshots == From fc08276f07ceea5a317469c76ed32559ed4d5df1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 22:54:43 +0100 Subject: [PATCH 14/88] Stabilized grunt Better ignore conditions Removed phpdocumentor because it can't ignore files and it's too much of a hassle --- Gruntfile.js | 54 +++++++++++++++++++++++++++++++++------------------ composer.json | 2 +- composer.lock | 2 +- package.json | 1 - 4 files changed, 37 insertions(+), 22 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index a4c143c..414d6b1 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -11,8 +11,33 @@ module.exports = function (grunt) { paths: { // PHP assets php: { - files_std: ['*.php', '**/*.php', '!node_modules/**/*.php'], // Standard file match - files: '<%= paths.php.files_std %>' // Dynamic file match + files_std: [ + '*.php', + '**/*.php', + '!node_modules/**/*.php', + '!dev/**/*.php', + '!vendor/**/*.php' + ], // Standard file match + files: '<%= paths.php.files_std %>', // Dynamic file match + exclude: [ + 'assets/.*', + 'dev/.*', + 'composer.json', + 'composer.lock', + 'CONTRIBUTING.md', + '.git/.*', + '.gitignore', + '.gitmodules', + 'Gruntfile.js', + 'node_modules/.*', + 'package.json', + 'README.md', + 'release/.*', + '.sensiolabs.yml', + '.travis.yml', + '.tx', + 'vendor/.*' + ] // PHP regex match } }, phplint: { @@ -29,6 +54,7 @@ module.exports = function (grunt) { target: { options: { mainFile: 'doliwoo.php', + exclude: '<%= paths.php.exclude %>', type: 'wp-plugin', potHeaders: { poedit: true, @@ -44,12 +70,6 @@ module.exports = function (grunt) { expand: true } }, - phpdocumentor: { - main: { - // TODO: ignore dev, node_modules, release and vendor directories. - // Needs https://github.com/gomoob/grunt-phpdocumentor/pull/10 merged - } - }, clean: { main: ['release/<%= pkg.version %>'] }, @@ -59,10 +79,10 @@ module.exports = function (grunt) { src: [ '**', '!assets/**', + '!dev/**', '!composer.json', '!composer.lock', '!CONTRIBUTING.md', - '!docs/**', '!.git/**', '!.gitignore', '!.gitmodules', @@ -74,7 +94,7 @@ module.exports = function (grunt) { '!.sensiolabs.yml', '!.travis.yml', '!.tx', - '!vendor' + '!vendor/**' ], dest: 'release/<%= pkg.version %>/' }, @@ -130,7 +150,7 @@ module.exports = function (grunt) { 'description', 'keywords', 'homepage', - 'license', + 'license' ] }, composer: { @@ -142,6 +162,7 @@ module.exports = function (grunt) { }); grunt.registerTask('default', [ + 'phplint', 'sync-json', 'potupdate', 'test', @@ -149,16 +170,16 @@ module.exports = function (grunt) { ]); grunt.registerTask('test', [ - 'checkwpversion', + 'checkwpversion' ]); grunt.registerTask('potupdate', [ 'makepot', - 'exec:txpush', + 'exec:txpush' ]); grunt.registerTask('poupdate', [ - 'exec:txpull', + 'exec:txpull' ]); grunt.registerTask('i18n', [ @@ -167,14 +188,9 @@ module.exports = function (grunt) { 'po2mo' ]); - grunt.registerTask('docs', [ - 'phpdocumentor' - ]); - grunt.registerTask('release', [ 'default', 'i18n', - 'docs', 'clean', 'copy', 'compress' diff --git a/composer.json b/composer.json index ebc05be..9199146 100644 --- a/composer.json +++ b/composer.json @@ -44,4 +44,4 @@ ] } } -} \ No newline at end of file +} diff --git a/composer.lock b/composer.lock index fe0537c..f369ea7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "39c83da0ff3f44df246514c3da5da4b3", + "hash": "5fba15866600794f2b8233fd1fcd708e", "packages": [ { "name": "composer/installers", diff --git a/package.json b/package.json index 51a50df..24e99a0 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "grunt-contrib-compress": "^0.13.0", "grunt-contrib-copy": "^0.7.0", "grunt-exec": "^0.4.6", - "grunt-phpdocumentor": "^0.4.1", "grunt-phplint": "0.0.5", "grunt-po2mo": "^0.1.2", "grunt-sync-json": "^0.3.1", From 98b75ff7c909e1d9ee2e8d551cec498556876a96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 23:07:30 +0100 Subject: [PATCH 15/88] Make sure we get the right type --- includes/class-dolibarr.php | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 0f2f639..b0d58ed 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -254,14 +254,11 @@ private function create_order_lines( $order ) { $line->vat_rate = array_values( $rates )[0]['rate']; $line->qty = $product['quantity']; - $line->price = $woocommerce_product->get_price(); - $line->unitprice = $woocommerce_product->get_price(); - $line->total_net - = $woocommerce_product->get_price_excluding_tax( $line->qty ); - $line->total - = $woocommerce_product->get_price_including_tax( $line->qty ); - $line->total_vat - = $line->total - $line->total_net; + $line->price = floatval( $woocommerce_product->get_price() ); + $line->unitprice = floatval( $woocommerce_product->get_price() ); + $line->total_net = floatval( $woocommerce_product->get_price_excluding_tax( $line->qty ) ); + $line->total = floatval( $woocommerce_product->get_price_including_tax( $line->qty ) ); + $line->total_vat = $line->total - $line->total_net; $order->lines[] = $line; } } From 4e80bd3a2876e47da281e009a4b344d49769afb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 23:07:44 +0100 Subject: [PATCH 16/88] Better type hinting --- includes/settings.php | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/includes/settings.php b/includes/settings.php index d700579..7c0578a 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -29,6 +29,33 @@ * Doliwoo settings WooCommerce integration */ class WC_Integration_Doliwoo_Settings extends WC_Integration { + /** @var string The Dolibarr webservice URL */ + public $webservs_url; + + /** @var string WordPress pseudo cron update delay */ + public $delay_update; + + /** @var string The Dolibarr webservice key */ + public $dolibarr_key; + + /** @var string The application name declared when using the Dolibarr webservice */ + public $sourceapplication; + + /** @var string Username to connect to Dolibarr webservice */ + public $dolibarr_login; + + /** @var string Password to connect to Dolibarr webservice */ + public $dolibarr_password; + + /** @var string Dolibarr entity we want webservice responses from */ + public $dolibarr_entity; + + /** @var string ID of the Dolibarr category we sync products from */ + public $dolibarr_category_id; + + /** @var string ID of the Dolibarr thirdparty to use when we make a sale without a user logged in */ + public $dolibarr_generic_id; + /** * Init and hook in the integration. */ From 111d449a9431ab43686c87aa24e413e0bb4906ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 23:15:41 +0100 Subject: [PATCH 17/88] Added WordPress to composer deps --- composer.json | 2 ++ composer.lock | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9199146..22ac768 100644 --- a/composer.json +++ b/composer.json @@ -29,6 +29,7 @@ "composer/installers": ">=1.0.6", "php": ">=5.3.0", "ext-openssl": "*", + "johnpbloch/wordpress": ">=3.7.1", "wpackagist-plugin/woocommerce": ">=2.0.0" }, "repositories": [ @@ -39,6 +40,7 @@ ], "extra": { "installer-paths": { + "dev/wordpress": ["johnpbloch/wordpress"], "dev/wordpress/wp-content/plugins/{$name}": [ "wpackagist-plugin/woocommerce" ] diff --git a/composer.lock b/composer.lock index f369ea7..e1f3bbb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "5fba15866600794f2b8233fd1fcd708e", + "hash": "2772a23974794b9fc4073a1b60351211", "packages": [ { "name": "composer/installers", @@ -101,6 +101,88 @@ ], "time": "2015-02-18 17:17:01" }, + { + "name": "johnpbloch/wordpress", + "version": "4.1.1", + "source": { + "type": "git", + "url": "https://github.com/johnpbloch/wordpress.git", + "reference": "b6a0e3c2ef178f97ce8b709897fd4411420b3ccb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/johnpbloch/wordpress/zipball/b6a0e3c2ef178f97ce8b709897fd4411420b3ccb", + "reference": "b6a0e3c2ef178f97ce8b709897fd4411420b3ccb", + "shasum": "" + }, + "require": { + "johnpbloch/wordpress-core-installer": "~0.2", + "php": ">=5.3.2" + }, + "type": "wordpress-core", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "WordPress Community", + "homepage": "http://wordpress.org/about/" + } + ], + "description": "WordPress is web software you can use to create a beautiful website or blog.", + "homepage": "http://wordpress.org/", + "keywords": [ + "blog", + "cms" + ], + "time": "2015-02-18 22:16:06" + }, + { + "name": "johnpbloch/wordpress-core-installer", + "version": "0.2.0", + "source": { + "type": "git", + "url": "https://github.com/johnpbloch/wordpress-core-installer.git", + "reference": "a4c08e91be99e858c7778c2f52a4d73820147c2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/johnpbloch/wordpress-core-installer/zipball/a4c08e91be99e858c7778c2f52a4d73820147c2e", + "reference": "a4c08e91be99e858c7778c2f52a4d73820147c2e", + "shasum": "" + }, + "require": { + "composer-plugin-api": "1.0.0" + }, + "conflict": { + "composer/installers": "<1.0.6" + }, + "require-dev": { + "composer/composer": "1.0.*@dev" + }, + "type": "composer-plugin", + "extra": { + "class": "johnpbloch\\Composer\\WordPressCorePlugin" + }, + "autoload": { + "psr-0": { + "johnpbloch\\Composer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "John P. Bloch", + "email": "me@johnpbloch.com" + } + ], + "description": "A custom installer to handle deploying WordPress with composer", + "time": "2013-09-09 15:04:54" + }, { "name": "wpackagist-plugin/woocommerce", "version": "2.3.4", From 7f3fd10cb693fed9baf23e8b57545abe55b64b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 23:18:05 +0100 Subject: [PATCH 18/88] Moved phplint to test grunt task --- Gruntfile.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 414d6b1..6eee590 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -162,14 +162,14 @@ module.exports = function (grunt) { }); grunt.registerTask('default', [ - 'phplint', - 'sync-json', - 'potupdate', 'test', + 'potupdate', + 'sync-json', 'wp_readme_to_markdown' ]); grunt.registerTask('test', [ + 'phplint', 'checkwpversion' ]); From 7c22725e10745447b3ac8968b5c49fce80720072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 23:21:44 +0100 Subject: [PATCH 19/88] Fixed composer paths --- .gitignore | 2 +- Gruntfile.js | 6 +++--- composer.json | 5 ++--- composer.lock | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index ee9d52a..8a95a53 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,4 @@ docs/ *.mo ### CI target -dev/ +wordpress/ diff --git a/Gruntfile.js b/Gruntfile.js index 6eee590..c387d72 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -15,13 +15,13 @@ module.exports = function (grunt) { '*.php', '**/*.php', '!node_modules/**/*.php', - '!dev/**/*.php', + '!wordpress/**/*.php', '!vendor/**/*.php' ], // Standard file match files: '<%= paths.php.files_std %>', // Dynamic file match exclude: [ 'assets/.*', - 'dev/.*', + 'wordpress/.*', 'composer.json', 'composer.lock', 'CONTRIBUTING.md', @@ -79,7 +79,7 @@ module.exports = function (grunt) { src: [ '**', '!assets/**', - '!dev/**', + '!wordpress/**', '!composer.json', '!composer.lock', '!CONTRIBUTING.md', diff --git a/composer.json b/composer.json index 22ac768..58f4f05 100644 --- a/composer.json +++ b/composer.json @@ -40,10 +40,9 @@ ], "extra": { "installer-paths": { - "dev/wordpress": ["johnpbloch/wordpress"], - "dev/wordpress/wp-content/plugins/{$name}": [ + "wordpress/wp-content/plugins/{$name}": [ "wpackagist-plugin/woocommerce" ] } } -} +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index e1f3bbb..508fb7e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "2772a23974794b9fc4073a1b60351211", + "hash": "092798d3324bdd088440b005ca54f8e1", "packages": [ { "name": "composer/installers", From 950ef63cf2ec9626c4d67b23e006bd487b6a6cf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 23:22:32 +0100 Subject: [PATCH 20/88] Added source code line hinting to translation files --- languages/doliwoo-ca.po | 62 ++++++++++++++++++-------------------- languages/doliwoo-es_ES.po | 62 ++++++++++++++++++-------------------- languages/doliwoo-fr_FR.po | 62 ++++++++++++++++++-------------------- languages/doliwoo.pot | 62 ++++++++++++++++++-------------------- 4 files changed, 116 insertions(+), 132 deletions(-) diff --git a/languages/doliwoo-ca.po b/languages/doliwoo-ca.po index 923838b..2d26107 100644 --- a/languages/doliwoo-ca.po +++ b/languages/doliwoo-ca.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-19 16:10:52+00:00\n" +"POT-Creation-Date: 2015-02-19 22:22:12+00:00\n" "PO-Revision-Date: 2015-02-19 11:44+0100\n" "Last-Translator: Bàrbara Partegàs \n" "Language-Team: Bàrbara Partegàs \n" @@ -18,111 +18,107 @@ msgstr "" "X-Generator: Poedit 1.7.4\n" "X-Poedit-SourceCharset: UTF-8\n" -#: doliwoo.php:51 release/0.0.2-alpha/doliwoo.php:51 +#: doliwoo.php:51 msgid "This plugin needs SOAP and OpenSSL PHP extensions." msgstr "Aquest plugin necessita extensions SOAP i OpenSSL PHP." -#: doliwoo.php:55 release/0.0.2-alpha/doliwoo.php:55 +#: doliwoo.php:55 msgid "This plugin needs SOAP PHP extension." msgstr "Aquest plugin necessita l'extensió SOAP PHP." -#: doliwoo.php:59 release/0.0.2-alpha/doliwoo.php:59 +#: doliwoo.php:59 msgid "This plugin needs OpenSSL PHP extension." msgstr "Aquest plugin necessita l'extensió OpenSSL PHP." -#: doliwoo.php:209 release/0.0.2-alpha/doliwoo.php:209 +#: doliwoo.php:209 msgid "This extension needs WooCommerce" msgstr "Aquesta extensió necessita WooCommerce" #: includes/class-doliwoo-parameters.php:62 -#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" #: includes/class-doliwoo-parameters.php:65 #: includes/class-doliwoo-parameters.php:128 -#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:65 -#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:128 msgid "Dolibarr User ID" msgstr "ID de l'usuari Dolibarr" #: includes/class-tax-doliwoo.php:63 -#: release/0.0.2-alpha/includes/class-tax-doliwoo.php:63 msgid "VAT" msgstr "IVA" -#: includes/settings.php:37 release/0.0.2-alpha/includes/settings.php:37 +#: includes/settings.php:64 msgid "DoliWoo Settings" msgstr "Paràmetres de DoliWoo" -#: includes/settings.php:38 release/0.0.2-alpha/includes/settings.php:38 +#: includes/settings.php:65 msgid "Dolibarr webservices access" msgstr "Accés webservice de Dolibarr" -#: includes/settings.php:75 release/0.0.2-alpha/includes/settings.php:75 +#: includes/settings.php:102 msgid "Source application" msgstr "Aplicació font" -#: includes/settings.php:76 release/0.0.2-alpha/includes/settings.php:76 +#: includes/settings.php:103 msgid "How this application will identify itself to the webservice." msgstr "Com s'identificarà aquesta aplicació al webservice." -#: includes/settings.php:82 release/0.0.2-alpha/includes/settings.php:82 +#: includes/settings.php:109 msgid "URL" msgstr "URL" -#: includes/settings.php:83 release/0.0.2-alpha/includes/settings.php:83 +#: includes/settings.php:110 msgid "" "Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" msgstr "" "Entra la URL arrel del webservice de Dolibarr (i.e. https://mydolibarr.com/" "webservices)" -#: includes/settings.php:90 release/0.0.2-alpha/includes/settings.php:90 +#: includes/settings.php:117 msgid "Delay" msgstr "Retard" -#: includes/settings.php:91 release/0.0.2-alpha/includes/settings.php:91 +#: includes/settings.php:118 msgid "Choose the automatic update frequency" msgstr "Escull la freqüència de l'actualització automàtica" -#: includes/settings.php:95 release/0.0.2-alpha/includes/settings.php:95 +#: includes/settings.php:122 msgid "Once Hourly" msgstr "Un cop cada hora" -#: includes/settings.php:96 release/0.0.2-alpha/includes/settings.php:96 +#: includes/settings.php:123 msgid "Twice Daily" msgstr "Dos cops al dia" -#: includes/settings.php:97 release/0.0.2-alpha/includes/settings.php:97 +#: includes/settings.php:124 msgid "Once Daily" msgstr "Un cop al dia" -#: includes/settings.php:101 release/0.0.2-alpha/includes/settings.php:101 +#: includes/settings.php:128 msgid "Key" msgstr "Clau" -#: includes/settings.php:102 release/0.0.2-alpha/includes/settings.php:102 +#: includes/settings.php:129 msgid "Enter your Dolibarr webservices key" msgstr "Entra la teva clau del webservice de Dolibarr" -#: includes/settings.php:108 release/0.0.2-alpha/includes/settings.php:108 +#: includes/settings.php:135 msgid "User login" msgstr "Usuari d'inici de sessió" -#: includes/settings.php:109 release/0.0.2-alpha/includes/settings.php:109 +#: includes/settings.php:136 msgid "Dolibarr actions will be done as this user" msgstr "Les accions de Dolibarr es duran a terme amb aquest usuari" -#: includes/settings.php:115 release/0.0.2-alpha/includes/settings.php:115 +#: includes/settings.php:142 msgid "User password" msgstr "Paraula de pas de l'usuari" -#: includes/settings.php:121 release/0.0.2-alpha/includes/settings.php:121 +#: includes/settings.php:148 msgid "Entity" msgstr "Entitat (empresa)" -#: includes/settings.php:122 release/0.0.2-alpha/includes/settings.php:122 +#: includes/settings.php:149 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." @@ -130,11 +126,11 @@ msgstr "" "Si utilitzes multiempresa, l'ID de l'entitat (empresa) que vols integrar. " "Déixa-ho amb 1 si no és així." -#: includes/settings.php:128 release/0.0.2-alpha/includes/settings.php:128 +#: includes/settings.php:155 msgid "Product category" msgstr "Categoria del producte" -#: includes/settings.php:129 release/0.0.2-alpha/includes/settings.php:129 +#: includes/settings.php:156 msgid "" "The ID of the product category you want to automatically import products " "from." @@ -142,20 +138,20 @@ msgstr "" "La ID de la categoria de producte de la que vols importar productes " "automàticament." -#: includes/settings.php:135 release/0.0.2-alpha/includes/settings.php:135 +#: includes/settings.php:162 msgid "Generic thirdparty" msgstr "Tercer per defecte" -#: includes/settings.php:136 release/0.0.2-alpha/includes/settings.php:136 +#: includes/settings.php:163 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "" "La ID del tercer per defecte que serà utilitzat en les comandes anònimes." -#: includes/settings.php:156 release/0.0.2-alpha/includes/settings.php:156 +#: includes/settings.php:183 msgid "The protocol to use is https://" msgstr "El protocol per utilitzar és https://" -#: includes/settings.php:166 release/0.0.2-alpha/includes/settings.php:166 +#: includes/settings.php:193 msgid "The webservice is not available. Please check the URL." msgstr "El servei webservice no està disponible. Siusplau, comprova la URL." diff --git a/languages/doliwoo-es_ES.po b/languages/doliwoo-es_ES.po index 96ac3bf..0328a60 100644 --- a/languages/doliwoo-es_ES.po +++ b/languages/doliwoo-es_ES.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.1\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-19 16:10:52+00:00\n" +"POT-Creation-Date: 2015-02-19 22:22:12+00:00\n" "PO-Revision-Date: 2015-02-19 11:44+0100\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Bàrbara Partegàs \n" @@ -16,111 +16,107 @@ msgstr "" "X-Generator: Poedit 1.7.4\n" "X-Poedit-SourceCharset: UTF-8\n" -#: doliwoo.php:51 release/0.0.2-alpha/doliwoo.php:51 +#: doliwoo.php:51 msgid "This plugin needs SOAP and OpenSSL PHP extensions." msgstr "Este plugin necesita extensiones PHP OpenSSL y SOAP." -#: doliwoo.php:55 release/0.0.2-alpha/doliwoo.php:55 +#: doliwoo.php:55 msgid "This plugin needs SOAP PHP extension." msgstr "Este plugin necesita extensión SOAP PHP." -#: doliwoo.php:59 release/0.0.2-alpha/doliwoo.php:59 +#: doliwoo.php:59 msgid "This plugin needs OpenSSL PHP extension." msgstr "Este plugin necesita extensión OpenSSL PHP." -#: doliwoo.php:209 release/0.0.2-alpha/doliwoo.php:209 +#: doliwoo.php:209 msgid "This extension needs WooCommerce" msgstr "Esta extensión necesita WooCommerce" #: includes/class-doliwoo-parameters.php:62 -#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" #: includes/class-doliwoo-parameters.php:65 #: includes/class-doliwoo-parameters.php:128 -#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:65 -#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:128 msgid "Dolibarr User ID" msgstr "ID de usuario Dolibarr" #: includes/class-tax-doliwoo.php:63 -#: release/0.0.2-alpha/includes/class-tax-doliwoo.php:63 msgid "VAT" msgstr "IVA" -#: includes/settings.php:37 release/0.0.2-alpha/includes/settings.php:37 +#: includes/settings.php:64 msgid "DoliWoo Settings" msgstr "Configuración de DoliWoo" -#: includes/settings.php:38 release/0.0.2-alpha/includes/settings.php:38 +#: includes/settings.php:65 msgid "Dolibarr webservices access" msgstr "Acceso a webservices Dolibarr" -#: includes/settings.php:75 release/0.0.2-alpha/includes/settings.php:75 +#: includes/settings.php:102 msgid "Source application" msgstr "Aplicación fuente" -#: includes/settings.php:76 release/0.0.2-alpha/includes/settings.php:76 +#: includes/settings.php:103 msgid "How this application will identify itself to the webservice." msgstr "Cómo se identificará esta aplicación al webservice." -#: includes/settings.php:82 release/0.0.2-alpha/includes/settings.php:82 +#: includes/settings.php:109 msgid "URL" msgstr "URL" -#: includes/settings.php:83 release/0.0.2-alpha/includes/settings.php:83 +#: includes/settings.php:110 msgid "" "Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" msgstr "" "Entra la URL raíz del webservice de Dolibarr (ej.: https://mydolibarr.com/" "webservices)" -#: includes/settings.php:90 release/0.0.2-alpha/includes/settings.php:90 +#: includes/settings.php:117 msgid "Delay" msgstr "Retraso" -#: includes/settings.php:91 release/0.0.2-alpha/includes/settings.php:91 +#: includes/settings.php:118 msgid "Choose the automatic update frequency" msgstr "Escoje la frecuencia de actualización automática" -#: includes/settings.php:95 release/0.0.2-alpha/includes/settings.php:95 +#: includes/settings.php:122 msgid "Once Hourly" msgstr "Una vez cada hora" -#: includes/settings.php:96 release/0.0.2-alpha/includes/settings.php:96 +#: includes/settings.php:123 msgid "Twice Daily" msgstr "Dos veces al día" -#: includes/settings.php:97 release/0.0.2-alpha/includes/settings.php:97 +#: includes/settings.php:124 msgid "Once Daily" msgstr "Una vez al día" -#: includes/settings.php:101 release/0.0.2-alpha/includes/settings.php:101 +#: includes/settings.php:128 msgid "Key" msgstr "Llave" -#: includes/settings.php:102 release/0.0.2-alpha/includes/settings.php:102 +#: includes/settings.php:129 msgid "Enter your Dolibarr webservices key" msgstr "Entra la llave del webservice de Dolibarr" -#: includes/settings.php:108 release/0.0.2-alpha/includes/settings.php:108 +#: includes/settings.php:135 msgid "User login" msgstr "Inicio de sesión de usuario" -#: includes/settings.php:109 release/0.0.2-alpha/includes/settings.php:109 +#: includes/settings.php:136 msgid "Dolibarr actions will be done as this user" msgstr "Las acciones de Dolibarr ser harán con este usuario" -#: includes/settings.php:115 release/0.0.2-alpha/includes/settings.php:115 +#: includes/settings.php:142 msgid "User password" msgstr "Contraseña de usuario" -#: includes/settings.php:121 release/0.0.2-alpha/includes/settings.php:121 +#: includes/settings.php:148 msgid "Entity" msgstr "Entidad (empresa)" -#: includes/settings.php:122 release/0.0.2-alpha/includes/settings.php:122 +#: includes/settings.php:149 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." @@ -128,30 +124,30 @@ msgstr "" "Si estás usando multiempresa, el ID de la entidad que quieres integrar. " "Déjalo en 1 si no es así." -#: includes/settings.php:128 release/0.0.2-alpha/includes/settings.php:128 +#: includes/settings.php:155 msgid "Product category" msgstr "Categoría de producto" -#: includes/settings.php:129 release/0.0.2-alpha/includes/settings.php:129 +#: includes/settings.php:156 msgid "" "The ID of the product category you want to automatically import products " "from." msgstr "" "El ID de la categoría de producto de la que quieres importar productos." -#: includes/settings.php:135 release/0.0.2-alpha/includes/settings.php:135 +#: includes/settings.php:162 msgid "Generic thirdparty" msgstr "Tercero por defecto" -#: includes/settings.php:136 release/0.0.2-alpha/includes/settings.php:136 +#: includes/settings.php:163 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "El ID del tercero que será usado para los pedidos anónimos." -#: includes/settings.php:156 release/0.0.2-alpha/includes/settings.php:156 +#: includes/settings.php:183 msgid "The protocol to use is https://" msgstr "El protocolo a usar es https://" -#: includes/settings.php:166 release/0.0.2-alpha/includes/settings.php:166 +#: includes/settings.php:193 msgid "The webservice is not available. Please check the URL." msgstr "" "El servicio webservice no está disponible. Por favor, comprueba la URL." diff --git a/languages/doliwoo-fr_FR.po b/languages/doliwoo-fr_FR.po index 32a44d9..871eaa2 100644 --- a/languages/doliwoo-fr_FR.po +++ b/languages/doliwoo-fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-19 16:10:52+00:00\n" +"POT-Creation-Date: 2015-02-19 22:22:12+00:00\n" "PO-Revision-Date: 2015-02-18 18:45+0100\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/" @@ -18,111 +18,107 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.7.4\n" -#: doliwoo.php:51 release/0.0.2-alpha/doliwoo.php:51 +#: doliwoo.php:51 msgid "This plugin needs SOAP and OpenSSL PHP extensions." msgstr "Cette extension nécessite les extensions PHP SOAP et OpenSSL." -#: doliwoo.php:55 release/0.0.2-alpha/doliwoo.php:55 +#: doliwoo.php:55 msgid "This plugin needs SOAP PHP extension." msgstr "Cette extension nécessite l'extension PHP SOAP." -#: doliwoo.php:59 release/0.0.2-alpha/doliwoo.php:59 +#: doliwoo.php:59 msgid "This plugin needs OpenSSL PHP extension." msgstr "Cette extension nécessite l'extension PHP OpenSSL." -#: doliwoo.php:209 release/0.0.2-alpha/doliwoo.php:209 +#: doliwoo.php:209 msgid "This extension needs WooCommerce" msgstr "Cette extension nécessite WooCommerce" #: includes/class-doliwoo-parameters.php:62 -#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" #: includes/class-doliwoo-parameters.php:65 #: includes/class-doliwoo-parameters.php:128 -#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:65 -#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:128 msgid "Dolibarr User ID" msgstr "Identifiant Utilisateur Dolibarr" #: includes/class-tax-doliwoo.php:63 -#: release/0.0.2-alpha/includes/class-tax-doliwoo.php:63 msgid "VAT" msgstr "TVA" -#: includes/settings.php:37 release/0.0.2-alpha/includes/settings.php:37 +#: includes/settings.php:64 msgid "DoliWoo Settings" msgstr "Réglages DoliWoo" -#: includes/settings.php:38 release/0.0.2-alpha/includes/settings.php:38 +#: includes/settings.php:65 msgid "Dolibarr webservices access" msgstr "Accès aux webservices Dolibarr" -#: includes/settings.php:75 release/0.0.2-alpha/includes/settings.php:75 +#: includes/settings.php:102 msgid "Source application" msgstr "Nom de l'application" -#: includes/settings.php:76 release/0.0.2-alpha/includes/settings.php:76 +#: includes/settings.php:103 msgid "How this application will identify itself to the webservice." msgstr "Comment cette application s'identifie auprès du webservice." -#: includes/settings.php:82 release/0.0.2-alpha/includes/settings.php:82 +#: includes/settings.php:109 msgid "URL" msgstr "URL" -#: includes/settings.php:83 release/0.0.2-alpha/includes/settings.php:83 +#: includes/settings.php:110 msgid "" "Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" msgstr "" "Entrez l'URL racine des webservices de Dolibarr (i.e. https://mydolibarr.com/" "webservices)" -#: includes/settings.php:90 release/0.0.2-alpha/includes/settings.php:90 +#: includes/settings.php:117 msgid "Delay" msgstr "Délai" -#: includes/settings.php:91 release/0.0.2-alpha/includes/settings.php:91 +#: includes/settings.php:118 msgid "Choose the automatic update frequency" msgstr "Choisissez la fréquence de mise à jour automatique" -#: includes/settings.php:95 release/0.0.2-alpha/includes/settings.php:95 +#: includes/settings.php:122 msgid "Once Hourly" msgstr "Une fois par heure" -#: includes/settings.php:96 release/0.0.2-alpha/includes/settings.php:96 +#: includes/settings.php:123 msgid "Twice Daily" msgstr "Deux fois par jour" -#: includes/settings.php:97 release/0.0.2-alpha/includes/settings.php:97 +#: includes/settings.php:124 msgid "Once Daily" msgstr "Une fois par jour" -#: includes/settings.php:101 release/0.0.2-alpha/includes/settings.php:101 +#: includes/settings.php:128 msgid "Key" msgstr "Clé" -#: includes/settings.php:102 release/0.0.2-alpha/includes/settings.php:102 +#: includes/settings.php:129 msgid "Enter your Dolibarr webservices key" msgstr "Entrez votre clé du webservices de Dolibarr" -#: includes/settings.php:108 release/0.0.2-alpha/includes/settings.php:108 +#: includes/settings.php:135 msgid "User login" msgstr "Identifiant utilisateur" -#: includes/settings.php:109 release/0.0.2-alpha/includes/settings.php:109 +#: includes/settings.php:136 msgid "Dolibarr actions will be done as this user" msgstr "Les actions de Dolibarr seront attribuées à cet utilisateur" -#: includes/settings.php:115 release/0.0.2-alpha/includes/settings.php:115 +#: includes/settings.php:142 msgid "User password" msgstr "Mot de passe utilisateur" -#: includes/settings.php:121 release/0.0.2-alpha/includes/settings.php:121 +#: includes/settings.php:148 msgid "Entity" msgstr "Entité" -#: includes/settings.php:122 release/0.0.2-alpha/includes/settings.php:122 +#: includes/settings.php:149 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." @@ -130,30 +126,30 @@ msgstr "" "Si vous utilisez multi-société, l'ID de l'entité que vous souhaitez " "intégrer. Sinon laissez à 1." -#: includes/settings.php:128 release/0.0.2-alpha/includes/settings.php:128 +#: includes/settings.php:155 msgid "Product category" msgstr "Catégorie du Produit" -#: includes/settings.php:129 release/0.0.2-alpha/includes/settings.php:129 +#: includes/settings.php:156 msgid "" "The ID of the product category you want to automatically import products " "from." msgstr "" "L'ID de la catégorie de produits que vous souhaitez importer automatiquement." -#: includes/settings.php:135 release/0.0.2-alpha/includes/settings.php:135 +#: includes/settings.php:162 msgid "Generic thirdparty" msgstr "Tiers générique" -#: includes/settings.php:136 release/0.0.2-alpha/includes/settings.php:136 +#: includes/settings.php:163 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "L'Id du tiers qui va être utilisé pour les commandes anonymes" -#: includes/settings.php:156 release/0.0.2-alpha/includes/settings.php:156 +#: includes/settings.php:183 msgid "The protocol to use is https://" msgstr "Le protocole à utiliser est https://" -#: includes/settings.php:166 release/0.0.2-alpha/includes/settings.php:166 +#: includes/settings.php:193 msgid "The webservice is not available. Please check the URL." msgstr "Le webservice n'est pas disponible. Merci de vérifier l'URL." diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index 7ed9e0c..18616af 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-19 18:38:04+00:00\n" +"POT-Creation-Date: 2015-02-19 22:22:12+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -24,138 +24,134 @@ msgstr "" "X-Poedit-Bookmarks: \n" "X-Textdomain-Support: yes\n" -#: doliwoo.php:51 release/0.0.2-alpha/doliwoo.php:51 +#: doliwoo.php:51 msgid "This plugin needs SOAP and OpenSSL PHP extensions." msgstr "" -#: doliwoo.php:55 release/0.0.2-alpha/doliwoo.php:55 +#: doliwoo.php:55 msgid "This plugin needs SOAP PHP extension." msgstr "" -#: doliwoo.php:59 release/0.0.2-alpha/doliwoo.php:59 +#: doliwoo.php:59 msgid "This plugin needs OpenSSL PHP extension." msgstr "" -#: doliwoo.php:209 release/0.0.2-alpha/doliwoo.php:209 +#: doliwoo.php:209 msgid "This extension needs WooCommerce" msgstr "" #: includes/class-doliwoo-parameters.php:62 -#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "" #: includes/class-doliwoo-parameters.php:65 #: includes/class-doliwoo-parameters.php:128 -#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:65 -#: release/0.0.2-alpha/includes/class-doliwoo-parameters.php:128 msgid "Dolibarr User ID" msgstr "" #: includes/class-tax-doliwoo.php:63 -#: release/0.0.2-alpha/includes/class-tax-doliwoo.php:63 msgid "VAT" msgstr "" -#: includes/settings.php:37 release/0.0.2-alpha/includes/settings.php:37 +#: includes/settings.php:64 msgid "DoliWoo Settings" msgstr "" -#: includes/settings.php:38 release/0.0.2-alpha/includes/settings.php:38 +#: includes/settings.php:65 msgid "Dolibarr webservices access" msgstr "" -#: includes/settings.php:75 release/0.0.2-alpha/includes/settings.php:75 +#: includes/settings.php:102 msgid "Source application" msgstr "" -#: includes/settings.php:76 release/0.0.2-alpha/includes/settings.php:76 +#: includes/settings.php:103 msgid "How this application will identify itself to the webservice." msgstr "" -#: includes/settings.php:82 release/0.0.2-alpha/includes/settings.php:82 +#: includes/settings.php:109 msgid "URL" msgstr "" -#: includes/settings.php:83 release/0.0.2-alpha/includes/settings.php:83 +#: includes/settings.php:110 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "" -#: includes/settings.php:90 release/0.0.2-alpha/includes/settings.php:90 +#: includes/settings.php:117 msgid "Delay" msgstr "" -#: includes/settings.php:91 release/0.0.2-alpha/includes/settings.php:91 +#: includes/settings.php:118 msgid "Choose the automatic update frequency" msgstr "" -#: includes/settings.php:95 release/0.0.2-alpha/includes/settings.php:95 +#: includes/settings.php:122 msgid "Once Hourly" msgstr "" -#: includes/settings.php:96 release/0.0.2-alpha/includes/settings.php:96 +#: includes/settings.php:123 msgid "Twice Daily" msgstr "" -#: includes/settings.php:97 release/0.0.2-alpha/includes/settings.php:97 +#: includes/settings.php:124 msgid "Once Daily" msgstr "" -#: includes/settings.php:101 release/0.0.2-alpha/includes/settings.php:101 +#: includes/settings.php:128 msgid "Key" msgstr "" -#: includes/settings.php:102 release/0.0.2-alpha/includes/settings.php:102 +#: includes/settings.php:129 msgid "Enter your Dolibarr webservices key" msgstr "" -#: includes/settings.php:108 release/0.0.2-alpha/includes/settings.php:108 +#: includes/settings.php:135 msgid "User login" msgstr "" -#: includes/settings.php:109 release/0.0.2-alpha/includes/settings.php:109 +#: includes/settings.php:136 msgid "Dolibarr actions will be done as this user" msgstr "" -#: includes/settings.php:115 release/0.0.2-alpha/includes/settings.php:115 +#: includes/settings.php:142 msgid "User password" msgstr "" -#: includes/settings.php:121 release/0.0.2-alpha/includes/settings.php:121 +#: includes/settings.php:148 msgid "Entity" msgstr "" -#: includes/settings.php:122 release/0.0.2-alpha/includes/settings.php:122 +#: includes/settings.php:149 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "" -#: includes/settings.php:128 release/0.0.2-alpha/includes/settings.php:128 +#: includes/settings.php:155 msgid "Product category" msgstr "" -#: includes/settings.php:129 release/0.0.2-alpha/includes/settings.php:129 +#: includes/settings.php:156 msgid "" "The ID of the product category you want to automatically import products " "from." msgstr "" -#: includes/settings.php:135 release/0.0.2-alpha/includes/settings.php:135 +#: includes/settings.php:162 msgid "Generic thirdparty" msgstr "" -#: includes/settings.php:136 release/0.0.2-alpha/includes/settings.php:136 +#: includes/settings.php:163 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "" -#: includes/settings.php:156 release/0.0.2-alpha/includes/settings.php:156 +#: includes/settings.php:183 msgid "The protocol to use is https://" msgstr "" -#: includes/settings.php:166 release/0.0.2-alpha/includes/settings.php:166 +#: includes/settings.php:193 msgid "The webservice is not available. Please check the URL." msgstr "" From f0e02435590c5ac98bc04c12bf7a081e8a6b7a00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 19 Feb 2015 23:25:10 +0100 Subject: [PATCH 21/88] PHP 5.3 compat --- doliwoo.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doliwoo.php b/doliwoo.php index 72f9ce7..46225e1 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -193,7 +193,8 @@ public function schedule_import_products() { */ public function get_settings() { // Load settings - $this->settings = WC()->integrations->get_integrations()['doliwoo']; + $integrations = WC()->integrations->get_integrations(); + $this->settings = $integrations['doliwoo']; $this->ws_auth = array( 'dolibarrkey' => $this->settings->dolibarr_key, 'sourceapplication' => $this->settings->sourceapplication, From 3f5cf3b4d56aaa40dcf852ccb8eaf2cf896dd272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 20 Feb 2015 10:44:54 +0100 Subject: [PATCH 22/88] Better type hinting --- includes/class-dolibarr.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index b0d58ed..b9e4f9a 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -138,7 +138,7 @@ private function dolibarr_create_thirdparty_if_not_exists( * * @param int $user_id wordpress ID of an user * - * @return mixed $result array with the request results if it succeeds, null if there's an error + * @return int $result array with the request results if it succeeds, null if there's an error */ private function dolibarr_thirdparty_exists( $user_id ) { $this->Doliwoo = new Doliwoo(); @@ -172,7 +172,7 @@ private function dolibarr_thirdparty_exists( $user_id ) { * * @param int $user_id a Wordpress user id * - * @return mixed $result the SOAP response + * @return int $result the SOAP response */ public function dolibarr_create_thirdparty( $user_id ) { $this->Doliwoo = new Doliwoo(); From beb2c7c794f07c5edd043af9b851db4d6ac41bd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 20 Feb 2015 10:45:04 +0100 Subject: [PATCH 23/88] PHP 5.3 compat --- includes/class-dolibarr.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index b9e4f9a..4162de8 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -250,8 +250,9 @@ private function create_order_lines( $order ) { 'dolibarr_id', 1 ); $rates = $this->taxes->get_rates( $woocommerce_product->get_tax_class() ); + $rates = array_values( $rates ); // We get the first one - $line->vat_rate = array_values( $rates )[0]['rate']; + $line->vat_rate = $rates[0]['rate']; $line->qty = $product['quantity']; $line->price = floatval( $woocommerce_product->get_price() ); From 18ef6b7f83a20a25f86910a7eb78d298b4a2d694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 20 Feb 2015 10:47:09 +0100 Subject: [PATCH 24/88] PHP 5.3 compat --- includes/class-tax-doliwoo.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/includes/class-tax-doliwoo.php b/includes/class-tax-doliwoo.php index f9c9d3c..33048ca 100644 --- a/includes/class-tax-doliwoo.php +++ b/includes/class-tax-doliwoo.php @@ -43,7 +43,8 @@ public function get_tax_class( $tax_rate ) { foreach ( $tax_classes as $class ) { $rates = $this->get_rates( $class ); - if ( array_values( $rates )[0]['rate'] == $tax_rate ) { + $rates_values = array_values( $rates ); + if ( $rates_values[0]['rate'] == $tax_rate ) { // Use the first class found return $class; } From e677dbcc439b9591a1bd136b604b61dfdb183a77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 20 Feb 2015 13:50:59 +0100 Subject: [PATCH 25/88] Type assertion --- includes/class-dolibarr.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 4162de8..592e22f 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -83,7 +83,7 @@ public function dolibarr_create_order() { true ); } if ( '' != $thirdparty_id ) { - $order->thirdparty_id = $thirdparty_id; + $order->thirdparty_id = intval( $thirdparty_id ); } else { if ( get_user_meta( $user_id, 'billing_company', true ) == '' @@ -92,8 +92,7 @@ public function dolibarr_create_order() { $_POST['billing_company'] ); } $this->dolibarr_create_thirdparty_if_not_exists( $user_id ); - $order->thirdparty_id = get_user_meta( $user_id, - 'dolibarr_id', true ); + $order->thirdparty_id = intval( get_user_meta( $user_id, 'dolibarr_id', true ) ); } $order->date = date( 'Ymd' ); $order->status = 1; @@ -200,7 +199,7 @@ public function dolibarr_create_thirdparty( $user_id ) { $new_thirdparty = new DolibarrThirdparty(); - $new_thirdparty->ref = $ref; + $new_thirdparty->ref = intval( $ref ); $new_thirdparty->status = '1'; $new_thirdparty->client = '1'; $new_thirdparty->supplier = '0'; From 46d4280515104bb870653bd7f3b41aa55810db54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 17:41:44 +0100 Subject: [PATCH 26/88] PHP 5.3 compat array_column() is only available from PHP 5.5. wp_list_pluck() provides the same functionnality. --- includes/class-tax-doliwoo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/class-tax-doliwoo.php b/includes/class-tax-doliwoo.php index 33048ca..aecc160 100644 --- a/includes/class-tax-doliwoo.php +++ b/includes/class-tax-doliwoo.php @@ -126,8 +126,8 @@ public function create_custom_tax_classes() { } // Insert missing classes - $declared_classes = array_column( $declared_rates, 'tax_rate_class' ); - $database_classes = array_column( $database_rates, 'tax_rate_class' ); + $declared_classes = wp_list_pluck( $declared_rates, 'tax_rate_class' ); + $database_classes = wp_list_pluck( $database_rates, 'tax_rate_class' ); foreach ( $declared_classes as $key => $class ) { if ( ! in_array( $class, $database_classes ) ) { $to_create = $declared_rates[ $key ]; From ba781507605e2c9c430161fbca2d7e0d4de3571b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 17:52:48 +0100 Subject: [PATCH 27/88] Better type hinting --- includes/class-dolibarr.php | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 592e22f..b896c77 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -199,7 +199,7 @@ public function dolibarr_create_thirdparty( $user_id ) { $new_thirdparty = new DolibarrThirdparty(); - $new_thirdparty->ref = intval( $ref ); + $new_thirdparty->ref = $ref; $new_thirdparty->status = '1'; $new_thirdparty->client = '1'; $new_thirdparty->supplier = '0'; @@ -238,20 +238,15 @@ private function create_order_lines( $order ) { /** @var WC_Product $woocommerce_product */ $woocommerce_product = $product['data']; - $line = new DolibarrOrderLine(); - $line->type - = get_post_meta( $product['product_id'], - 'dolibarr_type', 1 ); - $line->desc - = $woocommerce_product->post->post_content; - $line->product_id - = get_post_meta( $product['product_id'], - 'dolibarr_id', 1 ); - - $rates = $this->taxes->get_rates( $woocommerce_product->get_tax_class() ); - $rates = array_values( $rates ); + $line = new DolibarrOrderLine(); + $line->type = intval( get_post_meta( $product['product_id'], 'dolibarr_type', true ) ); + $line->desc = $woocommerce_product->post->post_content; + $line->product_id = intval( get_post_meta( $product['product_id'], 'dolibarr_id', true ) ); + + $rates = $this->taxes->get_rates( $woocommerce_product->get_tax_class() ); + $rates = array_values( $rates ); // We get the first one - $line->vat_rate = $rates[0]['rate']; + $line->vat_rate = $rates[0]['rate']; $line->qty = $product['quantity']; $line->price = floatval( $woocommerce_product->get_price() ); From 09b97ec0fb05d61a4aaca3697a5ec9fc423faee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 17:52:56 +0100 Subject: [PATCH 28/88] Fix: Actually display the error --- includes/settings.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/includes/settings.php b/includes/settings.php index 7c0578a..043dbb5 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -206,10 +206,10 @@ public function display_errors() { ?>

- -

+ +

Date: Tue, 24 Feb 2015 18:00:39 +0100 Subject: [PATCH 29/88] Fixed ugly coding style --- includes/class-dolibarr.php | 138 ++++++++++++++---------------------- 1 file changed, 55 insertions(+), 83 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index b896c77..8da65f7 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -79,17 +79,13 @@ public function dolibarr_create_order() { // default to the generic user $thirdparty_id = $this->Doliwoo->settings->dolibarr_generic_id; } else { - $thirdparty_id = get_user_meta( $user_id, 'dolibarr_id', - true ); + $thirdparty_id = get_user_meta( $user_id, 'dolibarr_id', true ); } if ( '' != $thirdparty_id ) { $order->thirdparty_id = intval( $thirdparty_id ); } else { - if ( get_user_meta( $user_id, 'billing_company', true ) - == '' - ) { - update_user_meta( $user_id, 'billing_company', - $_POST['billing_company'] ); + if ( get_user_meta( $user_id, 'billing_company', true ) == '' ) { + update_user_meta( $user_id, 'billing_company', $_POST['billing_company'] ); } $this->dolibarr_create_thirdparty_if_not_exists( $user_id ); $order->thirdparty_id = intval( get_user_meta( $user_id, 'dolibarr_id', true ) ); @@ -116,17 +112,14 @@ private function dolibarr_create_thirdparty_if_not_exists( if ( $result ) { if ( $result['thirdparty'] - && get_user_meta( $user_id, 'dolibarr_id', true ) - != $result['thirdparty']->id + && get_user_meta( $user_id, 'dolibarr_id', true ) != $result['thirdparty']->id ) { - update_user_meta( $user_id, 'dolibarr_id', - $result['thirdparty']->id ); + update_user_meta( $user_id, 'dolibarr_id', $result['thirdparty']->id ); } elseif ( null === $result['thirdparty'] ) { $res = $this->dolibarr_create_thirdparty( $user_id ); if ( 'OK' == $res['result']->result_code ) { - update_user_meta( $user_id, 'dolibarr_id', - $res->id ); + update_user_meta( $user_id, 'dolibarr_id', $res->id ); } } } @@ -152,12 +145,13 @@ private function dolibarr_thirdparty_exists( $user_id ) { // if the user has a Dolibarr ID, use it, else use his company name if ( $dol_id ) { - $result = $soap_client->getThirdParty( $this->Doliwoo->ws_auth, - $dol_id ); + $result = $soap_client->getThirdParty( $this->Doliwoo->ws_auth, $dol_id ); } else { - $result = $soap_client->getThirdParty( $this->Doliwoo->ws_auth, - '', get_user_meta( $user_id, 'billing_company', - true ) ); + $result = $soap_client->getThirdParty( + $this->Doliwoo->ws_auth, + '', + get_user_meta( $user_id, 'billing_company', true ) + ); } if ( $result ) { return $result; @@ -177,8 +171,7 @@ public function dolibarr_create_thirdparty( $user_id ) { $this->Doliwoo = new Doliwoo(); $this->Doliwoo->get_settings(); - $dolibarr_ws_url = $this->Doliwoo->settings->webservs_url - . 'server_thirdparty.php?wsdl'; + $dolibarr_ws_url = $this->Doliwoo->settings->webservs_url . 'server_thirdparty.php?wsdl'; // Set the WebService URL $soap_client = new SoapClient( null, @@ -188,12 +181,10 @@ public function dolibarr_create_thirdparty( $user_id ) { ) ); - $ref = get_user_meta( $user_id, 'billing_company', - true ); + $ref = get_user_meta( $user_id, 'billing_company', true ); $individual = 0; if ( '' == $ref ) { - $ref = get_user_meta( $user_id, - 'billing_last_name', true ); + $ref = get_user_meta( $user_id, 'billing_last_name', true ); $individual = 1; } @@ -204,22 +195,15 @@ public function dolibarr_create_thirdparty( $user_id ) { $new_thirdparty->client = '1'; $new_thirdparty->supplier = '0'; - $new_thirdparty->address = get_user_meta( - $user_id, 'billing_address', true ); - $new_thirdparty->zip = get_user_meta( - $user_id, 'billing_postcode', true ); - $new_thirdparty->town = get_user_meta( - $user_id, 'billing_city', true ); - $new_thirdparty->country_code = get_user_meta( - $user_id, 'billing_country', true ); + $new_thirdparty->address = get_user_meta( $user_id, 'billing_address', true ); + $new_thirdparty->zip = get_user_meta( $user_id, 'billing_postcode', true ); + $new_thirdparty->town = get_user_meta( $user_id, 'billing_city', true ); + $new_thirdparty->country_code = get_user_meta( $user_id, 'billing_country', true ); $new_thirdparty->supplier_code = '0'; - $new_thirdparty->phone = get_user_meta( - $user_id, 'billing_phone', true ); - $new_thirdparty->email = get_user_meta( - $user_id, 'billing_email', true ); + $new_thirdparty->phone = get_user_meta( $user_id, 'billing_phone', true ); + $new_thirdparty->email = get_user_meta( $user_id, 'billing_email', true ); $new_thirdparty->individual = $individual; - $new_thirdparty->firstname = get_user_meta( - $user_id, 'billing_first_name', true ); + $new_thirdparty->firstname = get_user_meta( $user_id, 'billing_first_name', true ); $result = $soap_client->createThirdParty( $this->Doliwoo->ws_auth, $new_thirdparty ); @@ -243,10 +227,10 @@ private function create_order_lines( $order ) { $line->desc = $woocommerce_product->post->post_content; $line->product_id = intval( get_post_meta( $product['product_id'], 'dolibarr_id', true ) ); - $rates = $this->taxes->get_rates( $woocommerce_product->get_tax_class() ); - $rates = array_values( $rates ); + $rates = $this->taxes->get_rates( $woocommerce_product->get_tax_class() ); + $rates = array_values( $rates ); // We get the first one - $line->vat_rate = $rates[0]['rate']; + $line->vat_rate = $rates[0]['rate']; $line->qty = $product['quantity']; $line->price = floatval( $woocommerce_product->get_price() ); @@ -271,8 +255,7 @@ public function dolibarr_import_products() { // Set the WebService URL try { $soap_client = new SoapClient( - $this->Doliwoo->settings->webservs_url - . 'server_productorservice.php?wsdl' + $this->Doliwoo->settings->webservs_url . 'server_productorservice.php?wsdl' ); } catch ( SoapFault $exception ) { $this->logger->add( 'doliwoo', $exception->getMessage() ); @@ -282,9 +265,10 @@ public function dolibarr_import_products() { } // Get all products that are meant to be displayed on the website - $result - = $soap_client->getProductsForCategory( $this->Doliwoo->ws_auth, - $this->Doliwoo->settings->dolibarr_category_id ); + $result = $soap_client->getProductsForCategory( + $this->Doliwoo->ws_auth, + $this->Doliwoo->settings->dolibarr_category_id + ); if ( $result['result']->result_code == 'OK' ) { $dolibarr_products = $result['products']; @@ -303,30 +287,23 @@ public function dolibarr_import_products() { if ( 0 < $post_id ) { // Post metas management - add_post_meta( $post_id, 'dolibarr_id', - $dolibarr_product->id, true ); - add_post_meta( $post_id, 'dolibarr_type', $dolibarr_product->type, - true ); - update_post_meta( $post_id, '_regular_price', - $dolibarr_product->price_net ); - update_post_meta( $post_id, '_sale_price', - $dolibarr_product->price_net ); - update_post_meta( $post_id, '_price', - $dolibarr_product->price_net ); - update_post_meta( $post_id, '_visibility', - 'visible' ); - update_post_meta( $post_id, '_tax_class', - $this->taxes->get_tax_class( $dolibarr_product->vat_rate ) ); + add_post_meta( $post_id, 'dolibarr_id', $dolibarr_product->id, true ); + add_post_meta( $post_id, 'dolibarr_type', $dolibarr_product->type, true ); + update_post_meta( $post_id, '_regular_price', $dolibarr_product->price_net ); + update_post_meta( $post_id, '_sale_price', $dolibarr_product->price_net ); + update_post_meta( $post_id, '_price', $dolibarr_product->price_net ); + update_post_meta( $post_id, '_visibility', 'visible' ); + update_post_meta( + $post_id, + '_tax_class', + $this->taxes->get_tax_class( $dolibarr_product->vat_rate ) + ); // Stock management - if ( get_option( 'woocommerce_manage_stock' ) - == 'yes' - ) { + if ( get_option( 'woocommerce_manage_stock' ) == 'yes' ) { if ( 0 < $dolibarr_product->stock_real ) { - update_post_meta( $post_id, - '_stock_status', 'instock' ); - update_post_meta( $post_id, '_stock', - $dolibarr_product->stock_real ); + update_post_meta( $post_id, '_stock_status', 'instock' ); + update_post_meta( $post_id, '_stock', $dolibarr_product->stock_real ); } } @@ -367,17 +344,13 @@ private function dolibarr_product_exists( $dolibarr_id ) { * @param int $post_id The WooCommerce product */ private function import_product_images( $dolibarr_product, $post_id ) { - $image_attachment_ids = $this->get_product_image( $dolibarr_product, - $post_id ); + $image_attachment_ids = $this->get_product_image( $dolibarr_product, $post_id ); // Fill the image gallery - update_post_meta( $post_id, - '_product_image_gallery', - implode( ',', $image_attachment_ids ) ); + update_post_meta( $post_id, '_product_image_gallery', implode( ',', $image_attachment_ids ) ); // Use the first image as the product thumbnail - update_post_meta( $post_id, '_thumbnail_id', - $image_attachment_ids[0] ); + update_post_meta( $post_id, '_thumbnail_id', $image_attachment_ids[0] ); } /** @@ -395,8 +368,7 @@ private function get_product_image( $this->Doliwoo->get_settings(); $soap_client = new SoapClient( - $this->Doliwoo->settings->webservs_url - . 'server_other.php?wsdl' + $this->Doliwoo->settings->webservs_url . 'server_other.php?wsdl' ); $file_array = array(); @@ -411,16 +383,16 @@ private function get_product_image( ); if ( 'OK' == $result['result']->result_code ) { - $file_array['name'] = $images->photo; - $file_array['tmp_name'] - = - sys_get_temp_dir() . DIRECTORY_SEPARATOR . $images->photo; - file_put_contents( $file_array['tmp_name'], - base64_decode( $result['document']->content ) ); + $file_array['name'] = $images->photo; + $file_array['tmp_name'] = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $images->photo; + file_put_contents( + $file_array['tmp_name'], + base64_decode( $result['document']->content ) + ); $res = media_handle_sideload( $file_array, $post_id ); - // handle errors nicely ( logging ) + // Handle errors nicely ( logging ) if ( true === is_wp_error( $res ) ) { $message = $res->get_error_message(); $this->logger->add( 'doliwoo', $message ); From 0f536033c02d5fce3a9115f4af20c943292ff03b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 18:09:31 +0100 Subject: [PATCH 30/88] Better type hinting and comments --- includes/class-dolibarr.php | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 8da65f7..15e0f31 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -181,29 +181,36 @@ public function dolibarr_create_thirdparty( $user_id ) { ) ); + /** @var string $ref */ $ref = get_user_meta( $user_id, 'billing_company', true ); $individual = 0; if ( '' == $ref ) { + // We could not find a company, let's get an indivual $ref = get_user_meta( $user_id, 'billing_last_name', true ); $individual = 1; } $new_thirdparty = new DolibarrThirdparty(); - $new_thirdparty->ref = $ref; - $new_thirdparty->status = '1'; - $new_thirdparty->client = '1'; - $new_thirdparty->supplier = '0'; - - $new_thirdparty->address = get_user_meta( $user_id, 'billing_address', true ); - $new_thirdparty->zip = get_user_meta( $user_id, 'billing_postcode', true ); - $new_thirdparty->town = get_user_meta( $user_id, 'billing_city', true ); - $new_thirdparty->country_code = get_user_meta( $user_id, 'billing_country', true ); - $new_thirdparty->supplier_code = '0'; - $new_thirdparty->phone = get_user_meta( $user_id, 'billing_phone', true ); - $new_thirdparty->email = get_user_meta( $user_id, 'billing_email', true ); - $new_thirdparty->individual = $individual; - $new_thirdparty->firstname = get_user_meta( $user_id, 'billing_first_name', true ); + $new_thirdparty->ref = $ref; // Company name or individual last name + $new_thirdparty->individual = $individual; // Individual + /** @var string firstname */ + $new_thirdparty->firstname = get_user_meta( $user_id, 'billing_first_name', true ); + $new_thirdparty->status = '1'; // Active + $new_thirdparty->client = '1'; // Is a client + $new_thirdparty->supplier = '0'; // Is not a supplier + /** @var string address */ + $new_thirdparty->address = get_user_meta( $user_id, 'billing_address', true ); + /** @var string zip */ + $new_thirdparty->zip = get_user_meta( $user_id, 'billing_postcode', true ); + /** @var string town */ + $new_thirdparty->town = get_user_meta( $user_id, 'billing_city', true ); + /** @var string country_code */ + $new_thirdparty->country_code = get_user_meta( $user_id, 'billing_country', true ); + /** @var string phone */ + $new_thirdparty->phone = get_user_meta( $user_id, 'billing_phone', true ); + /** @var string email */ + $new_thirdparty->email = get_user_meta( $user_id, 'billing_email', true ); $result = $soap_client->createThirdParty( $this->Doliwoo->ws_auth, $new_thirdparty ); From 7c26d6f9b0d2e2b230b33f4fb0cced36d2df3c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 18:20:39 +0100 Subject: [PATCH 31/88] Better error management --- includes/class-dolibarr.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 15e0f31..7a0ac76 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -292,7 +292,15 @@ public function dolibarr_import_products() { $post_id = wp_insert_post( $post ); } - if ( 0 < $post_id ) { + // Error management (logging) + if (is_wp_error($post_id)) { + /** @var WP_Error $post_id */ + $this->logger->add('doliwoo', $post_id->get_error_message()); + } + + if ( 0 < $post_id && ! is_wp_error($post_id)) { + /** @var int $post_id */ + // Post metas management add_post_meta( $post_id, 'dolibarr_id', $dolibarr_product->id, true ); add_post_meta( $post_id, 'dolibarr_type', $dolibarr_product->type, true ); From 17be5583d41524994e0689864f97b0bc385dd95c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 18:30:32 +0100 Subject: [PATCH 32/88] Removed unused type hinting --- includes/class-dolibarr.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 7a0ac76..6d84b9f 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -181,7 +181,6 @@ public function dolibarr_create_thirdparty( $user_id ) { ) ); - /** @var string $ref */ $ref = get_user_meta( $user_id, 'billing_company', true ); $individual = 0; if ( '' == $ref ) { @@ -194,22 +193,15 @@ public function dolibarr_create_thirdparty( $user_id ) { $new_thirdparty->ref = $ref; // Company name or individual last name $new_thirdparty->individual = $individual; // Individual - /** @var string firstname */ $new_thirdparty->firstname = get_user_meta( $user_id, 'billing_first_name', true ); $new_thirdparty->status = '1'; // Active $new_thirdparty->client = '1'; // Is a client $new_thirdparty->supplier = '0'; // Is not a supplier - /** @var string address */ $new_thirdparty->address = get_user_meta( $user_id, 'billing_address', true ); - /** @var string zip */ $new_thirdparty->zip = get_user_meta( $user_id, 'billing_postcode', true ); - /** @var string town */ $new_thirdparty->town = get_user_meta( $user_id, 'billing_city', true ); - /** @var string country_code */ $new_thirdparty->country_code = get_user_meta( $user_id, 'billing_country', true ); - /** @var string phone */ $new_thirdparty->phone = get_user_meta( $user_id, 'billing_phone', true ); - /** @var string email */ $new_thirdparty->email = get_user_meta( $user_id, 'billing_email', true ); $result = $soap_client->createThirdParty( $this->Doliwoo->ws_auth, $new_thirdparty ); From cb8d12264184ae1381fa78645d78573f2c3a0053 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 18:31:05 +0100 Subject: [PATCH 33/88] Translations update --- languages/doliwoo-ca.po | 6 +++--- languages/doliwoo-es_ES.po | 6 +++--- languages/doliwoo-fr_FR.po | 6 +++--- languages/doliwoo.pot | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/languages/doliwoo-ca.po b/languages/doliwoo-ca.po index 2d26107..93a84c5 100644 --- a/languages/doliwoo-ca.po +++ b/languages/doliwoo-ca.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-19 22:22:12+00:00\n" +"POT-Creation-Date: 2015-02-24 17:21:51+00:00\n" "PO-Revision-Date: 2015-02-19 11:44+0100\n" "Last-Translator: Bàrbara Partegàs \n" "Language-Team: Bàrbara Partegàs \n" @@ -30,7 +30,7 @@ msgstr "Aquest plugin necessita l'extensió SOAP PHP." msgid "This plugin needs OpenSSL PHP extension." msgstr "Aquest plugin necessita l'extensió OpenSSL PHP." -#: doliwoo.php:209 +#: doliwoo.php:210 msgid "This extension needs WooCommerce" msgstr "Aquesta extensió necessita WooCommerce" @@ -43,7 +43,7 @@ msgstr "Dolibarr" msgid "Dolibarr User ID" msgstr "ID de l'usuari Dolibarr" -#: includes/class-tax-doliwoo.php:63 +#: includes/class-tax-doliwoo.php:64 msgid "VAT" msgstr "IVA" diff --git a/languages/doliwoo-es_ES.po b/languages/doliwoo-es_ES.po index 0328a60..746f979 100644 --- a/languages/doliwoo-es_ES.po +++ b/languages/doliwoo-es_ES.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.1\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-19 22:22:12+00:00\n" +"POT-Creation-Date: 2015-02-24 17:21:51+00:00\n" "PO-Revision-Date: 2015-02-19 11:44+0100\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Bàrbara Partegàs \n" @@ -28,7 +28,7 @@ msgstr "Este plugin necesita extensión SOAP PHP." msgid "This plugin needs OpenSSL PHP extension." msgstr "Este plugin necesita extensión OpenSSL PHP." -#: doliwoo.php:209 +#: doliwoo.php:210 msgid "This extension needs WooCommerce" msgstr "Esta extensión necesita WooCommerce" @@ -41,7 +41,7 @@ msgstr "Dolibarr" msgid "Dolibarr User ID" msgstr "ID de usuario Dolibarr" -#: includes/class-tax-doliwoo.php:63 +#: includes/class-tax-doliwoo.php:64 msgid "VAT" msgstr "IVA" diff --git a/languages/doliwoo-fr_FR.po b/languages/doliwoo-fr_FR.po index 871eaa2..12f7cbf 100644 --- a/languages/doliwoo-fr_FR.po +++ b/languages/doliwoo-fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-19 22:22:12+00:00\n" +"POT-Creation-Date: 2015-02-24 17:21:51+00:00\n" "PO-Revision-Date: 2015-02-18 18:45+0100\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/" @@ -30,7 +30,7 @@ msgstr "Cette extension nécessite l'extension PHP SOAP." msgid "This plugin needs OpenSSL PHP extension." msgstr "Cette extension nécessite l'extension PHP OpenSSL." -#: doliwoo.php:209 +#: doliwoo.php:210 msgid "This extension needs WooCommerce" msgstr "Cette extension nécessite WooCommerce" @@ -43,7 +43,7 @@ msgstr "Dolibarr" msgid "Dolibarr User ID" msgstr "Identifiant Utilisateur Dolibarr" -#: includes/class-tax-doliwoo.php:63 +#: includes/class-tax-doliwoo.php:64 msgid "VAT" msgstr "TVA" diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index 18616af..ab53c79 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-19 22:22:12+00:00\n" +"POT-Creation-Date: 2015-02-24 17:30:50+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -36,7 +36,7 @@ msgstr "" msgid "This plugin needs OpenSSL PHP extension." msgstr "" -#: doliwoo.php:209 +#: doliwoo.php:210 msgid "This extension needs WooCommerce" msgstr "" @@ -49,7 +49,7 @@ msgstr "" msgid "Dolibarr User ID" msgstr "" -#: includes/class-tax-doliwoo.php:63 +#: includes/class-tax-doliwoo.php:64 msgid "VAT" msgstr "" From 1a8d1a821ed87c51103539ac9d56a95bc8b313ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 18:54:22 +0100 Subject: [PATCH 34/88] Added PHP codesniffer Fixes #55 --- Gruntfile.js | 10 ++++ composer.json | 13 +++++- composer.lock | 123 +++++++++++++++++++++++++++++++++++++++++++++++--- package.json | 1 + 4 files changed, 140 insertions(+), 7 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index c387d72..0b99b9d 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -40,6 +40,15 @@ module.exports = function (grunt) { ] // PHP regex match } }, + phpcs: { + application: { + dir: '<%= paths.php.files %>' + }, + options: { + bin: 'vendor/bin/phpcs', + standard: 'Wordpress' + } + }, phplint: { options: { phpArgs: { @@ -169,6 +178,7 @@ module.exports = function (grunt) { ]); grunt.registerTask('test', [ + 'phpcs', 'phplint', 'checkwpversion' ]); diff --git a/composer.json b/composer.json index 58f4f05..9cad347 100644 --- a/composer.json +++ b/composer.json @@ -32,6 +32,9 @@ "johnpbloch/wordpress": ">=3.7.1", "wpackagist-plugin/woocommerce": ">=2.0.0" }, + "require-dev": { + "wp-coding-standards/wpcs": "dev-master" + }, "repositories": [ { "type": "composer", @@ -44,5 +47,13 @@ "wpackagist-plugin/woocommerce" ] } + }, + "scripts": { + "post-install-cmd": [ + "vendor/bin/phpcs --config-set installed_paths vendor/wp-coding-standards/wpcs" + ], + "post-update-cmd": [ + "vendor/bin/phpcs --config-set installed_paths vendor/wp-coding-standards/wpcs" + ] } -} \ No newline at end of file +} diff --git a/composer.lock b/composer.lock index 508fb7e..a6cbc7e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "092798d3324bdd088440b005ca54f8e1", + "hash": "2b1d8341dfdf5b6d1b193eebb46d89ff", "packages": [ { "name": "composer/installers", @@ -185,15 +185,15 @@ }, { "name": "wpackagist-plugin/woocommerce", - "version": "2.3.4", + "version": "2.3.5", "source": { "type": "svn", "url": "http://plugins.svn.wordpress.org/woocommerce/", - "reference": "tags/2.3.4" + "reference": "tags/2.3.5" }, "dist": { "type": "zip", - "url": "http://downloads.wordpress.org/plugin/woocommerce.2.3.4.zip", + "url": "http://downloads.wordpress.org/plugin/woocommerce.2.3.5.zip", "reference": null, "shasum": null }, @@ -204,10 +204,121 @@ "homepage": "https://wordpress.org/plugins/woocommerce/" } ], - "packages-dev": [], + "packages-dev": [ + { + "name": "squizlabs/php_codesniffer", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "b301c98f19414d836fdaa678648745fcca5aeb4f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/b301c98f19414d836fdaa678648745fcca5aeb4f", + "reference": "b301c98f19414d836fdaa678648745fcca5aeb4f", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.1.2" + }, + "bin": [ + "scripts/phpcs", + "scripts/phpcbf" + ], + "type": "library", + "autoload": { + "classmap": [ + "CodeSniffer.php", + "CodeSniffer/CLI.php", + "CodeSniffer/Exception.php", + "CodeSniffer/File.php", + "CodeSniffer/Fixer.php", + "CodeSniffer/Report.php", + "CodeSniffer/Reporting.php", + "CodeSniffer/Sniff.php", + "CodeSniffer/Tokens.php", + "CodeSniffer/Reports/", + "CodeSniffer/Tokenizers/", + "CodeSniffer/DocGenerators/", + "CodeSniffer/Standards/AbstractPatternSniff.php", + "CodeSniffer/Standards/AbstractScopeSniff.php", + "CodeSniffer/Standards/AbstractVariableSniff.php", + "CodeSniffer/Standards/IncorrectPatternException.php", + "CodeSniffer/Standards/Generic/Sniffs/", + "CodeSniffer/Standards/MySource/Sniffs/", + "CodeSniffer/Standards/PEAR/Sniffs/", + "CodeSniffer/Standards/PSR1/Sniffs/", + "CodeSniffer/Standards/PSR2/Sniffs/", + "CodeSniffer/Standards/Squiz/Sniffs/", + "CodeSniffer/Standards/Zend/Sniffs/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "http://www.squizlabs.com/php-codesniffer", + "keywords": [ + "phpcs", + "standards" + ], + "time": "2015-01-21 22:44:05" + }, + { + "name": "wp-coding-standards/wpcs", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards.git", + "reference": "e68ce329fee8efcee8891327f3e42dcacf0f001c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress-Coding-Standards/WordPress-Coding-Standards/zipball/e68ce329fee8efcee8891327f3e42dcacf0f001c", + "reference": "e68ce329fee8efcee8891327f3e42dcacf0f001c", + "shasum": "" + }, + "require": { + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "X-Team", + "homepage": "http://x-team.com/" + }, + { + "name": "Contributors", + "homepage": "https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", + "keywords": [ + "phpcs", + "standards", + "wordpress" + ], + "time": "2014-12-24 09:37:55" + } + ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "wp-coding-standards/wpcs": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/package.json b/package.json index 24e99a0..e74d8a9 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "grunt-contrib-compress": "^0.13.0", "grunt-contrib-copy": "^0.7.0", "grunt-exec": "^0.4.6", + "grunt-phpcs": "^0.2.3", "grunt-phplint": "0.0.5", "grunt-po2mo": "^0.1.2", "grunt-sync-json": "^0.3.1", From 5bb951e7f8152def5fea56c1922ffc45db1ed213 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 18:57:38 +0100 Subject: [PATCH 35/88] Automate composer updates with grunt --- Gruntfile.js | 1 + package.json | 1 + 2 files changed, 2 insertions(+) diff --git a/Gruntfile.js b/Gruntfile.js index 0b99b9d..5c624af 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -178,6 +178,7 @@ module.exports = function (grunt) { ]); grunt.registerTask('test', [ + 'composer:update', 'phpcs', 'phplint', 'checkwpversion' diff --git a/package.json b/package.json index e74d8a9..8b58c23 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "devDependencies": { "grunt": "~0.4.2", "grunt-checkwpversion": "^0.3.0", + "grunt-composer": "^0.4.4", "grunt-contrib-clean": "^0.6.0", "grunt-contrib-compress": "^0.13.0", "grunt-contrib-copy": "^0.7.0", From 10083d122099cfe3a22fcfcca92fb3efad88a354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 19:32:27 +0100 Subject: [PATCH 36/88] Lowered PHPCS WordPress standard --- Gruntfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gruntfile.js b/Gruntfile.js index 5c624af..c98c408 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -46,7 +46,7 @@ module.exports = function (grunt) { }, options: { bin: 'vendor/bin/phpcs', - standard: 'Wordpress' + standard: 'Wordpress-Extra' } }, phplint: { From 865f287b35bd7c4a5a794228c5ebcebc3311aebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 19:33:19 +0100 Subject: [PATCH 37/88] PHPCS fixes --- doliwoo.php | 81 ++++++++++++++------------- includes/class-dolibarr.php | 16 +++--- includes/class-doliwoo-parameters.php | 6 +- includes/class-tax-doliwoo.php | 38 +++++++------ includes/settings.php | 36 ++++++------ 5 files changed, 93 insertions(+), 84 deletions(-) diff --git a/doliwoo.php b/doliwoo.php index 46225e1..6790e76 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -40,23 +40,23 @@ exit; // Exit if accessed directly } -load_plugin_textdomain( 'doliwoo', +load_plugin_textdomain( + 'doliwoo', false, - dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); + dirname( plugin_basename( __FILE__ ) ) . '/languages/' +); // Check required extensions -if ( false === extension_loaded( 'soap' ) - && false === extension_loaded( 'openssl' ) -) { - echo __( 'This plugin needs SOAP and OpenSSL PHP extensions.' ); +if ( false === extension_loaded( 'soap' ) && false === extension_loaded( 'openssl' ) ) { + esc_html_e( __( 'This plugin needs SOAP and OpenSSL PHP extensions.' ) ); exit; } if ( false === extension_loaded( 'soap' ) ) { - echo __( 'This plugin needs SOAP PHP extension.' ); + esc_html_e( __( 'This plugin needs SOAP PHP extension.' ) ); exit; } if ( false === extension_loaded( 'openssl' ) ) { - echo __( 'This plugin needs OpenSSL PHP extension.' ); + esc_html_e( __( 'This plugin needs OpenSSL PHP extension.' ) ); exit; } @@ -64,8 +64,10 @@ if ( ! class_exists( 'WC_Integration_Doliwoo_Settings' ) ) : // If WooCommerce is active - if ( in_array( 'woocommerce/woocommerce.php', - apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) { + if ( in_array( + 'woocommerce/woocommerce.php', + apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) + ) ) { if ( ! class_exists( 'Doliwoo' ) ) { /** @@ -103,40 +105,42 @@ public function __construct() { // Initialize plugin settings add_action( 'plugins_loaded', array( $this, 'init' ) ); - add_action( 'woocommerce_loaded', - array( &$this->dolibarr, 'set_woocommerce' ) ); + add_action( 'woocommerce_loaded', array( &$this->dolibarr, 'set_woocommerce' ) ); // Create custom tax classes and VAT rates on plugin settings saved - add_action( 'woocommerce_settings_saved', - array( &$this->taxes, 'create_custom_tax_classes' ) ); + add_action( 'woocommerce_settings_saved', array( &$this->taxes, 'create_custom_tax_classes' ) ); // Import Dolibarr products on plugin settings saved - add_action( 'woocommerce_settings_saved', - array( &$this->dolibarr, 'dolibarr_import_products' ) ); + add_action( 'woocommerce_settings_saved', array( &$this->dolibarr, 'dolibarr_import_products' ) ); // Hook on woocommerce_checkout_process to create a Dolibarr order using WooCommerce order data - add_action( 'woocommerce_checkout_order_processed', - array( &$this->dolibarr, 'dolibarr_create_order' ) ); + add_action( + 'woocommerce_checkout_order_processed', + array( &$this->dolibarr, 'dolibarr_create_order' ) + ); // Schedule the import of product data from Dolibarr - add_action( 'wp', - array( &$this, 'schedule_import_products' ) ); - add_action( 'import_products', - array( &$this->dolibarr, 'dolibarr_import_products' ) ); + add_action( 'wp', array( &$this, 'schedule_import_products' ) ); + add_action( 'import_products', array( &$this->dolibarr, 'dolibarr_import_products' ) ); // Dolibarr ID custom field - add_filter( 'manage_users_columns', - array( &$this->woocommerce_parameters, 'user_columns' ) ); - add_action( 'show_user_profile', - array( &$this->woocommerce_parameters, 'customer_meta_fields' ) ); - add_action( 'edit_user_profile', - array( &$this->woocommerce_parameters, 'customer_meta_fields' ) ); - add_action( 'personal_options_update', - array( &$this->woocommerce_parameters, 'save_customer_meta_fields' ) ); - add_action( 'edit_user_profile_update', - array( &$this->woocommerce_parameters, 'save_customer_meta_fields' ) ); - add_action( 'manage_users_custom_column', - array( &$this->woocommerce_parameters, 'user_column_values' ), 10, 3 ); + add_filter( 'manage_users_columns', array( &$this->woocommerce_parameters, 'user_columns' ) ); + add_action( 'show_user_profile', array( &$this->woocommerce_parameters, 'customer_meta_fields' ) ); + add_action( 'edit_user_profile', array( &$this->woocommerce_parameters, 'customer_meta_fields' ) ); + add_action( + 'personal_options_update', + array( &$this->woocommerce_parameters, 'save_customer_meta_fields' ) + ); + add_action( + 'edit_user_profile_update', + array( &$this->woocommerce_parameters, 'save_customer_meta_fields' ) + ); + add_action( + 'manage_users_custom_column', + array( &$this->woocommerce_parameters, 'user_column_values' ), + 10, + 3 + ); } /** @@ -153,8 +157,7 @@ public function init() { // Include our integration class. require_once 'includes/settings.php'; // Register the integration. - add_filter( 'woocommerce_integrations', - array( $this, 'add_integration' ) ); + add_filter( 'woocommerce_integrations', array( $this, 'add_integration' ) ); } $this->taxes = new WC_Tax_Doliwoo(); } @@ -200,17 +203,17 @@ public function get_settings() { 'sourceapplication' => $this->settings->sourceapplication, 'login' => $this->settings->dolibarr_login, 'password' => $this->settings->dolibarr_password, - 'entity' => $this->settings->dolibarr_entity + 'entity' => $this->settings->dolibarr_entity, ); } } } } else { // WooCommerce is not available - echo __( 'This extension needs WooCommerce' ); + esc_html_e( __( 'This extension needs WooCommerce' ) ); exit; } $Doliwoo = new Doliwoo(); -endif; + endif; diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 6d84b9f..1b3732b 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -68,7 +68,7 @@ public function dolibarr_create_order() { null, array( 'location' => $dolibarr_ws_url, - 'uri' => "http://www.dolibar.org/ns/" + 'uri' => 'http://www.dolibar.org/ns/', ) ); $order = new DolibarrOrder(); @@ -177,7 +177,7 @@ public function dolibarr_create_thirdparty( $user_id ) { null, array( 'location' => $dolibarr_ws_url, - 'uri' => "http://www.dolibar.org/ns/" + 'uri' => 'http://www.dolibar.org/ns/', ) ); @@ -269,7 +269,7 @@ public function dolibarr_import_products() { $this->Doliwoo->settings->dolibarr_category_id ); - if ( $result['result']->result_code == 'OK' ) { + if ( 'OK' == $result['result']->result_code ) { $dolibarr_products = $result['products']; foreach ( $dolibarr_products as $dolibarr_product ) { if ( $this->dolibarr_product_exists( $dolibarr_product->id ) ) { @@ -285,12 +285,12 @@ public function dolibarr_import_products() { } // Error management (logging) - if (is_wp_error($post_id)) { + if ( is_wp_error( $post_id ) ) { /** @var WP_Error $post_id */ - $this->logger->add('doliwoo', $post_id->get_error_message()); + $this->logger->add( 'doliwoo', $post_id->get_error_message() ); } - if ( 0 < $post_id && ! is_wp_error($post_id)) { + if ( 0 < $post_id && ! is_wp_error( $post_id ) ) { /** @var int $post_id */ // Post metas management @@ -307,7 +307,7 @@ public function dolibarr_import_products() { ); // Stock management - if ( get_option( 'woocommerce_manage_stock' ) == 'yes' ) { + if ( 'yes' == get_option( 'woocommerce_manage_stock' ) ) { if ( 0 < $dolibarr_product->stock_real ) { update_post_meta( $post_id, '_stock_status', 'instock' ); update_post_meta( $post_id, '_stock', $dolibarr_product->stock_real ); @@ -337,7 +337,7 @@ private function dolibarr_product_exists( $dolibarr_id ) { $args = array( 'post_type' => 'product', 'meta_key' => 'dolibarr_id', - 'meta_value' => $dolibarr_id + 'meta_value' => $dolibarr_id, ); $query = new WP_Query( $args ); diff --git a/includes/class-doliwoo-parameters.php b/includes/class-doliwoo-parameters.php index 0c3f6c0..971f03b 100644 --- a/includes/class-doliwoo-parameters.php +++ b/includes/class-doliwoo-parameters.php @@ -38,8 +38,8 @@ public function save_customer_meta_fields( $user_id ) { foreach ( $save_fields as $fieldset ) { foreach ( $fieldset['fields'] as $key => $field ) { if ( isset( $_POST[ $key ] ) ) { - update_user_meta( $user_id, $key, - wc_clean( $_POST[ $key ] ) ); + update_user_meta( $user_id, $key, wc_clean( $_POST[ $key ] ) + ); } } } @@ -63,7 +63,7 @@ public function get_customer_meta_fields() { 'fields' => array( 'dolibarr_id' => array( 'label' => __( 'Dolibarr User ID', 'doliwoo' ), - 'description' => 'The boss' + 'description' => 'The boss', // FIXME: WTF? ) ) ) diff --git a/includes/class-tax-doliwoo.php b/includes/class-tax-doliwoo.php index aecc160..b2891d7 100644 --- a/includes/class-tax-doliwoo.php +++ b/includes/class-tax-doliwoo.php @@ -71,7 +71,7 @@ public function create_custom_tax_classes() { 'tax_rate_name' => $tax_name, 'tax_rate_priority' => '1', 'tax_rate_order' => '0', - 'tax_rate_class' => '' + 'tax_rate_class' => '', ), array( 'tax_rate_country' => 'FR', @@ -79,7 +79,7 @@ public function create_custom_tax_classes() { 'tax_rate_name' => $tax_name, 'tax_rate_priority' => '1', 'tax_rate_order' => '0', - 'tax_rate_class' => 'reduced' + 'tax_rate_class' => 'reduced', ), array( 'tax_rate_country' => 'FR', @@ -87,7 +87,7 @@ public function create_custom_tax_classes() { 'tax_rate_name' => $tax_name, 'tax_rate_priority' => '1', 'tax_rate_order' => '0', - 'tax_rate_class' => 'super-reduced' + 'tax_rate_class' => 'super-reduced', ), array( 'tax_rate_country' => 'FR', @@ -95,7 +95,7 @@ public function create_custom_tax_classes() { 'tax_rate_name' => $tax_name, 'tax_rate_priority' => '1', 'tax_rate_order' => '0', - 'tax_rate_class' => 'minimum' + 'tax_rate_class' => 'minimum', ), array( 'tax_rate_country' => 'FR', @@ -103,19 +103,20 @@ public function create_custom_tax_classes() { 'tax_rate_name' => $tax_name, 'tax_rate_priority' => '1', 'tax_rate_order' => '0', - 'tax_rate_class' => 'zero' - ) + 'tax_rate_class' => 'zero', + ), ); $db_taxes = $wpdb->get_results( - "SELECT tax_rate_id - , tax_rate_country - , tax_rate, tax_rate_name - , tax_rate_priority - , tax_rate_order - , tax_rate_class - FROM " . $wpdb->prefix . "woocommerce_tax_rates;", - ARRAY_A ); + 'SELECT tax_rate_id +, tax_rate_country +, tax_rate +, tax_rate_name +, tax_rate_priority +, tax_rate_order +, tax_rate_class FROM ' . $wpdb->prefix . 'woocommerce_tax_rates;', + ARRAY_A + ); // Struture database results $database_rates = array(); @@ -143,9 +144,10 @@ public function create_custom_tax_classes() { ) { // _assoc is important. It allows strict checking to take 0 into account! if ( array_diff_assoc( $declared_rate, $database_rate ) ) { - ( $this->update_tax( + $this->update_tax( $tax_rate_id, - $declared_rate ) ); + $declared_rate + ); } } } @@ -187,10 +189,10 @@ public function update_tax( $tax_rate_id, $tax_rate ) { global $wpdb; return $wpdb->update( - $wpdb->prefix . "woocommerce_tax_rates", + $wpdb->prefix . 'woocommerce_tax_rates', $tax_rate, array( - 'tax_rate_id' => $tax_rate_id + 'tax_rate_id' => $tax_rate_id, ) ); } diff --git a/includes/settings.php b/includes/settings.php index 043dbb5..aac4066 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -87,8 +87,10 @@ public function __construct() { = $this->get_option( 'dolibarr_generic_id' ); // Actions - add_action( 'woocommerce_update_options_integration_' . $this->id, - array( $this, 'process_admin_options' ) ); + add_action( + 'woocommerce_update_options_integration_' . $this->id, + array( $this, 'process_admin_options' ) + ); } /** @@ -103,15 +105,17 @@ public function init_form_fields() { 'description' => __( 'How this application will identify itself to the webservice.', 'doliwoo' ), 'type' => 'text', 'desc_tip' => false, - 'default' => 'WooCommerce' + 'default' => 'WooCommerce', ), 'webservs_url' => array( 'title' => __( 'URL', 'doliwoo' ), - 'description' => __( 'Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)', - 'doliwoo' ), + 'description' => __( + 'Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)', + 'doliwoo' + ), 'type' => 'text', 'desc_tip' => false, - 'default' => '' + 'default' => '', ), 'delay_update' => array( 'title' => __( 'Delay', 'doliwoo' ), @@ -129,41 +133,41 @@ public function init_form_fields() { 'description' => __( 'Enter your Dolibarr webservices key', 'doliwoo' ), 'type' => 'text', 'desc_tip' => false, - 'default' => '' + 'default' => '', ), 'dolibarr_login' => array( 'title' => __( 'User login', 'doliwoo' ), 'description' => __( 'Dolibarr actions will be done as this user', 'doliwoo' ), 'type' => 'text', 'desc_tip' => false, - 'default' => '' + 'default' => '', ), 'dolibarr_password' => array( 'title' => __( 'User password', 'doliwoo' ), 'type' => 'password', 'desc_tip' => false, - 'default' => '' + 'default' => '', ), 'dolibarr_entity' => array( 'title' => __( 'Entity', 'doliwoo' ), 'description' => __( 'If you\'re using multicompany, the ID of the entity you want to integrate. Leave to 1 otherwise.', 'doliwoo' ), 'type' => 'text', 'desc_tip' => false, - 'default' => 1 + 'default' => 1, ), 'dolibarr_category_id' => array( 'title' => __( 'Product category', 'doliwoo' ), 'description' => __( 'The ID of the product category you want to automatically import products from.', 'doliwoo' ), 'type' => 'text', 'desc_tip' => false, - 'default' => '' + 'default' => '', ), 'dolibarr_generic_id' => array( 'title' => __( 'Generic thirdparty', 'doliwoo' ), 'description' => __( 'The ID of the thirdparty that\'ll be used for anonymous orders.', 'doliwoo' ), 'type' => 'text', 'desc_tip' => false, - 'default' => '' + 'default' => '', ), ); } @@ -179,8 +183,8 @@ public function validate_webservs_url_field( $key ) { $value = $_POST['woocommerce_doliwoo_webservs_url']; // Make sure we use HTTPS - if ( ( substr( $value, 0, 8 ) ) !== 'https://' ) { - $this->errors[] = __('The protocol to use is https://'); + if ( 'https://' !== ( substr( $value, 0, 8 ) ) ) { + $this->errors[] = __( 'The protocol to use is https://' ); } // Make sure we have the trailing slash @@ -190,7 +194,7 @@ public function validate_webservs_url_field( $key ) { try { new SoapClient( $value . 'server_other.php?wsdl' ); } catch ( SoapFault $exc ) { - $this->errors[] = __('The webservice is not available. Please check the URL.'); + $this->errors[] = __( 'The webservice is not available. Please check the URL.' ); } return $value; @@ -207,7 +211,7 @@ public function display_errors() {

From 25c45e679d71ce22d49d2fb04897bf9e69aa4c70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 19:34:39 +0100 Subject: [PATCH 38/88] Translations update --- composer.json | 2 +- languages/doliwoo-ca.po | 74 ++++++++++++++++++-------------------- languages/doliwoo-es_ES.po | 74 ++++++++++++++++++-------------------- languages/doliwoo-fr_FR.po | 74 ++++++++++++++++++-------------------- languages/doliwoo.pot | 62 ++++++++++++-------------------- 5 files changed, 129 insertions(+), 157 deletions(-) diff --git a/composer.json b/composer.json index 9cad347..b6c7b9d 100644 --- a/composer.json +++ b/composer.json @@ -56,4 +56,4 @@ "vendor/bin/phpcs --config-set installed_paths vendor/wp-coding-standards/wpcs" ] } -} +} \ No newline at end of file diff --git a/languages/doliwoo-ca.po b/languages/doliwoo-ca.po index 93a84c5..4a9ded0 100644 --- a/languages/doliwoo-ca.po +++ b/languages/doliwoo-ca.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-24 17:21:51+00:00\n" +"POT-Creation-Date: 2015-02-24 18:33:51+00:00\n" "PO-Revision-Date: 2015-02-19 11:44+0100\n" "Last-Translator: Bàrbara Partegàs \n" "Language-Team: Bàrbara Partegàs \n" @@ -18,22 +18,6 @@ msgstr "" "X-Generator: Poedit 1.7.4\n" "X-Poedit-SourceCharset: UTF-8\n" -#: doliwoo.php:51 -msgid "This plugin needs SOAP and OpenSSL PHP extensions." -msgstr "Aquest plugin necessita extensions SOAP i OpenSSL PHP." - -#: doliwoo.php:55 -msgid "This plugin needs SOAP PHP extension." -msgstr "Aquest plugin necessita l'extensió SOAP PHP." - -#: doliwoo.php:59 -msgid "This plugin needs OpenSSL PHP extension." -msgstr "Aquest plugin necessita l'extensió OpenSSL PHP." - -#: doliwoo.php:210 -msgid "This extension needs WooCommerce" -msgstr "Aquesta extensió necessita WooCommerce" - #: includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" @@ -55,70 +39,70 @@ msgstr "Paràmetres de DoliWoo" msgid "Dolibarr webservices access" msgstr "Accés webservice de Dolibarr" -#: includes/settings.php:102 +#: includes/settings.php:104 msgid "Source application" msgstr "Aplicació font" -#: includes/settings.php:103 +#: includes/settings.php:105 msgid "How this application will identify itself to the webservice." msgstr "Com s'identificarà aquesta aplicació al webservice." -#: includes/settings.php:109 +#: includes/settings.php:111 msgid "URL" msgstr "URL" -#: includes/settings.php:110 +#: includes/settings.php:112 msgid "" "Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" msgstr "" "Entra la URL arrel del webservice de Dolibarr (i.e. https://mydolibarr.com/" "webservices)" -#: includes/settings.php:117 +#: includes/settings.php:121 msgid "Delay" msgstr "Retard" -#: includes/settings.php:118 +#: includes/settings.php:122 msgid "Choose the automatic update frequency" msgstr "Escull la freqüència de l'actualització automàtica" -#: includes/settings.php:122 +#: includes/settings.php:126 msgid "Once Hourly" msgstr "Un cop cada hora" -#: includes/settings.php:123 +#: includes/settings.php:127 msgid "Twice Daily" msgstr "Dos cops al dia" -#: includes/settings.php:124 +#: includes/settings.php:128 msgid "Once Daily" msgstr "Un cop al dia" -#: includes/settings.php:128 +#: includes/settings.php:132 msgid "Key" msgstr "Clau" -#: includes/settings.php:129 +#: includes/settings.php:133 msgid "Enter your Dolibarr webservices key" msgstr "Entra la teva clau del webservice de Dolibarr" -#: includes/settings.php:135 +#: includes/settings.php:139 msgid "User login" msgstr "Usuari d'inici de sessió" -#: includes/settings.php:136 +#: includes/settings.php:140 msgid "Dolibarr actions will be done as this user" msgstr "Les accions de Dolibarr es duran a terme amb aquest usuari" -#: includes/settings.php:142 +#: includes/settings.php:146 msgid "User password" msgstr "Paraula de pas de l'usuari" -#: includes/settings.php:148 +#: includes/settings.php:152 msgid "Entity" msgstr "Entitat (empresa)" -#: includes/settings.php:149 +#: includes/settings.php:153 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." @@ -126,11 +110,11 @@ msgstr "" "Si utilitzes multiempresa, l'ID de l'entitat (empresa) que vols integrar. " "Déixa-ho amb 1 si no és així." -#: includes/settings.php:155 +#: includes/settings.php:159 msgid "Product category" msgstr "Categoria del producte" -#: includes/settings.php:156 +#: includes/settings.php:160 msgid "" "The ID of the product category you want to automatically import products " "from." @@ -138,20 +122,20 @@ msgstr "" "La ID de la categoria de producte de la que vols importar productes " "automàticament." -#: includes/settings.php:162 +#: includes/settings.php:166 msgid "Generic thirdparty" msgstr "Tercer per defecte" -#: includes/settings.php:163 +#: includes/settings.php:167 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "" "La ID del tercer per defecte que serà utilitzat en les comandes anònimes." -#: includes/settings.php:183 +#: includes/settings.php:187 msgid "The protocol to use is https://" msgstr "El protocol per utilitzar és https://" -#: includes/settings.php:193 +#: includes/settings.php:197 msgid "The webservice is not available. Please check the URL." msgstr "El servei webservice no està disponible. Siusplau, comprova la URL." @@ -172,3 +156,15 @@ msgstr "Dolibarr WooCommerce integration" #. Author of the plugin/theme msgid "GPC.solutions" msgstr "GPC.solutions" + +#~ msgid "This plugin needs SOAP and OpenSSL PHP extensions." +#~ msgstr "Aquest plugin necessita extensions SOAP i OpenSSL PHP." + +#~ msgid "This plugin needs SOAP PHP extension." +#~ msgstr "Aquest plugin necessita l'extensió SOAP PHP." + +#~ msgid "This plugin needs OpenSSL PHP extension." +#~ msgstr "Aquest plugin necessita l'extensió OpenSSL PHP." + +#~ msgid "This extension needs WooCommerce" +#~ msgstr "Aquesta extensió necessita WooCommerce" diff --git a/languages/doliwoo-es_ES.po b/languages/doliwoo-es_ES.po index 746f979..14ff1c0 100644 --- a/languages/doliwoo-es_ES.po +++ b/languages/doliwoo-es_ES.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.1\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-24 17:21:51+00:00\n" +"POT-Creation-Date: 2015-02-24 18:33:51+00:00\n" "PO-Revision-Date: 2015-02-19 11:44+0100\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Bàrbara Partegàs \n" @@ -16,22 +16,6 @@ msgstr "" "X-Generator: Poedit 1.7.4\n" "X-Poedit-SourceCharset: UTF-8\n" -#: doliwoo.php:51 -msgid "This plugin needs SOAP and OpenSSL PHP extensions." -msgstr "Este plugin necesita extensiones PHP OpenSSL y SOAP." - -#: doliwoo.php:55 -msgid "This plugin needs SOAP PHP extension." -msgstr "Este plugin necesita extensión SOAP PHP." - -#: doliwoo.php:59 -msgid "This plugin needs OpenSSL PHP extension." -msgstr "Este plugin necesita extensión OpenSSL PHP." - -#: doliwoo.php:210 -msgid "This extension needs WooCommerce" -msgstr "Esta extensión necesita WooCommerce" - #: includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" @@ -53,70 +37,70 @@ msgstr "Configuración de DoliWoo" msgid "Dolibarr webservices access" msgstr "Acceso a webservices Dolibarr" -#: includes/settings.php:102 +#: includes/settings.php:104 msgid "Source application" msgstr "Aplicación fuente" -#: includes/settings.php:103 +#: includes/settings.php:105 msgid "How this application will identify itself to the webservice." msgstr "Cómo se identificará esta aplicación al webservice." -#: includes/settings.php:109 +#: includes/settings.php:111 msgid "URL" msgstr "URL" -#: includes/settings.php:110 +#: includes/settings.php:112 msgid "" "Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" msgstr "" "Entra la URL raíz del webservice de Dolibarr (ej.: https://mydolibarr.com/" "webservices)" -#: includes/settings.php:117 +#: includes/settings.php:121 msgid "Delay" msgstr "Retraso" -#: includes/settings.php:118 +#: includes/settings.php:122 msgid "Choose the automatic update frequency" msgstr "Escoje la frecuencia de actualización automática" -#: includes/settings.php:122 +#: includes/settings.php:126 msgid "Once Hourly" msgstr "Una vez cada hora" -#: includes/settings.php:123 +#: includes/settings.php:127 msgid "Twice Daily" msgstr "Dos veces al día" -#: includes/settings.php:124 +#: includes/settings.php:128 msgid "Once Daily" msgstr "Una vez al día" -#: includes/settings.php:128 +#: includes/settings.php:132 msgid "Key" msgstr "Llave" -#: includes/settings.php:129 +#: includes/settings.php:133 msgid "Enter your Dolibarr webservices key" msgstr "Entra la llave del webservice de Dolibarr" -#: includes/settings.php:135 +#: includes/settings.php:139 msgid "User login" msgstr "Inicio de sesión de usuario" -#: includes/settings.php:136 +#: includes/settings.php:140 msgid "Dolibarr actions will be done as this user" msgstr "Las acciones de Dolibarr ser harán con este usuario" -#: includes/settings.php:142 +#: includes/settings.php:146 msgid "User password" msgstr "Contraseña de usuario" -#: includes/settings.php:148 +#: includes/settings.php:152 msgid "Entity" msgstr "Entidad (empresa)" -#: includes/settings.php:149 +#: includes/settings.php:153 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." @@ -124,30 +108,30 @@ msgstr "" "Si estás usando multiempresa, el ID de la entidad que quieres integrar. " "Déjalo en 1 si no es así." -#: includes/settings.php:155 +#: includes/settings.php:159 msgid "Product category" msgstr "Categoría de producto" -#: includes/settings.php:156 +#: includes/settings.php:160 msgid "" "The ID of the product category you want to automatically import products " "from." msgstr "" "El ID de la categoría de producto de la que quieres importar productos." -#: includes/settings.php:162 +#: includes/settings.php:166 msgid "Generic thirdparty" msgstr "Tercero por defecto" -#: includes/settings.php:163 +#: includes/settings.php:167 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "El ID del tercero que será usado para los pedidos anónimos." -#: includes/settings.php:183 +#: includes/settings.php:187 msgid "The protocol to use is https://" msgstr "El protocolo a usar es https://" -#: includes/settings.php:193 +#: includes/settings.php:197 msgid "The webservice is not available. Please check the URL." msgstr "" "El servicio webservice no está disponible. Por favor, comprueba la URL." @@ -168,3 +152,15 @@ msgstr "" #. Author of the plugin/theme msgid "GPC.solutions" msgstr "GPC.solutions" + +#~ msgid "This plugin needs SOAP and OpenSSL PHP extensions." +#~ msgstr "Este plugin necesita extensiones PHP OpenSSL y SOAP." + +#~ msgid "This plugin needs SOAP PHP extension." +#~ msgstr "Este plugin necesita extensión SOAP PHP." + +#~ msgid "This plugin needs OpenSSL PHP extension." +#~ msgstr "Este plugin necesita extensión OpenSSL PHP." + +#~ msgid "This extension needs WooCommerce" +#~ msgstr "Esta extensión necesita WooCommerce" diff --git a/languages/doliwoo-fr_FR.po b/languages/doliwoo-fr_FR.po index 12f7cbf..eb7afbb 100644 --- a/languages/doliwoo-fr_FR.po +++ b/languages/doliwoo-fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-24 17:21:51+00:00\n" +"POT-Creation-Date: 2015-02-24 18:33:51+00:00\n" "PO-Revision-Date: 2015-02-18 18:45+0100\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/" @@ -18,22 +18,6 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.7.4\n" -#: doliwoo.php:51 -msgid "This plugin needs SOAP and OpenSSL PHP extensions." -msgstr "Cette extension nécessite les extensions PHP SOAP et OpenSSL." - -#: doliwoo.php:55 -msgid "This plugin needs SOAP PHP extension." -msgstr "Cette extension nécessite l'extension PHP SOAP." - -#: doliwoo.php:59 -msgid "This plugin needs OpenSSL PHP extension." -msgstr "Cette extension nécessite l'extension PHP OpenSSL." - -#: doliwoo.php:210 -msgid "This extension needs WooCommerce" -msgstr "Cette extension nécessite WooCommerce" - #: includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" @@ -55,70 +39,70 @@ msgstr "Réglages DoliWoo" msgid "Dolibarr webservices access" msgstr "Accès aux webservices Dolibarr" -#: includes/settings.php:102 +#: includes/settings.php:104 msgid "Source application" msgstr "Nom de l'application" -#: includes/settings.php:103 +#: includes/settings.php:105 msgid "How this application will identify itself to the webservice." msgstr "Comment cette application s'identifie auprès du webservice." -#: includes/settings.php:109 +#: includes/settings.php:111 msgid "URL" msgstr "URL" -#: includes/settings.php:110 +#: includes/settings.php:112 msgid "" "Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" msgstr "" "Entrez l'URL racine des webservices de Dolibarr (i.e. https://mydolibarr.com/" "webservices)" -#: includes/settings.php:117 +#: includes/settings.php:121 msgid "Delay" msgstr "Délai" -#: includes/settings.php:118 +#: includes/settings.php:122 msgid "Choose the automatic update frequency" msgstr "Choisissez la fréquence de mise à jour automatique" -#: includes/settings.php:122 +#: includes/settings.php:126 msgid "Once Hourly" msgstr "Une fois par heure" -#: includes/settings.php:123 +#: includes/settings.php:127 msgid "Twice Daily" msgstr "Deux fois par jour" -#: includes/settings.php:124 +#: includes/settings.php:128 msgid "Once Daily" msgstr "Une fois par jour" -#: includes/settings.php:128 +#: includes/settings.php:132 msgid "Key" msgstr "Clé" -#: includes/settings.php:129 +#: includes/settings.php:133 msgid "Enter your Dolibarr webservices key" msgstr "Entrez votre clé du webservices de Dolibarr" -#: includes/settings.php:135 +#: includes/settings.php:139 msgid "User login" msgstr "Identifiant utilisateur" -#: includes/settings.php:136 +#: includes/settings.php:140 msgid "Dolibarr actions will be done as this user" msgstr "Les actions de Dolibarr seront attribuées à cet utilisateur" -#: includes/settings.php:142 +#: includes/settings.php:146 msgid "User password" msgstr "Mot de passe utilisateur" -#: includes/settings.php:148 +#: includes/settings.php:152 msgid "Entity" msgstr "Entité" -#: includes/settings.php:149 +#: includes/settings.php:153 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." @@ -126,30 +110,30 @@ msgstr "" "Si vous utilisez multi-société, l'ID de l'entité que vous souhaitez " "intégrer. Sinon laissez à 1." -#: includes/settings.php:155 +#: includes/settings.php:159 msgid "Product category" msgstr "Catégorie du Produit" -#: includes/settings.php:156 +#: includes/settings.php:160 msgid "" "The ID of the product category you want to automatically import products " "from." msgstr "" "L'ID de la catégorie de produits que vous souhaitez importer automatiquement." -#: includes/settings.php:162 +#: includes/settings.php:166 msgid "Generic thirdparty" msgstr "Tiers générique" -#: includes/settings.php:163 +#: includes/settings.php:167 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "L'Id du tiers qui va être utilisé pour les commandes anonymes" -#: includes/settings.php:183 +#: includes/settings.php:187 msgid "The protocol to use is https://" msgstr "Le protocole à utiliser est https://" -#: includes/settings.php:193 +#: includes/settings.php:197 msgid "The webservice is not available. Please check the URL." msgstr "Le webservice n'est pas disponible. Merci de vérifier l'URL." @@ -170,3 +154,15 @@ msgstr "Intégration Dolibarr WooCommerc" #. Author of the plugin/theme msgid "GPC.solutions" msgstr "GPC.solutions" + +#~ msgid "This plugin needs SOAP and OpenSSL PHP extensions." +#~ msgstr "Cette extension nécessite les extensions PHP SOAP et OpenSSL." + +#~ msgid "This plugin needs SOAP PHP extension." +#~ msgstr "Cette extension nécessite l'extension PHP SOAP." + +#~ msgid "This plugin needs OpenSSL PHP extension." +#~ msgstr "Cette extension nécessite l'extension PHP OpenSSL." + +#~ msgid "This extension needs WooCommerce" +#~ msgstr "Cette extension nécessite WooCommerce" diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index ab53c79..7874288 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-24 17:30:50+00:00\n" +"POT-Creation-Date: 2015-02-24 18:33:51+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -24,22 +24,6 @@ msgstr "" "X-Poedit-Bookmarks: \n" "X-Textdomain-Support: yes\n" -#: doliwoo.php:51 -msgid "This plugin needs SOAP and OpenSSL PHP extensions." -msgstr "" - -#: doliwoo.php:55 -msgid "This plugin needs SOAP PHP extension." -msgstr "" - -#: doliwoo.php:59 -msgid "This plugin needs OpenSSL PHP extension." -msgstr "" - -#: doliwoo.php:210 -msgid "This extension needs WooCommerce" -msgstr "" - #: includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "" @@ -61,97 +45,97 @@ msgstr "" msgid "Dolibarr webservices access" msgstr "" -#: includes/settings.php:102 +#: includes/settings.php:104 msgid "Source application" msgstr "" -#: includes/settings.php:103 +#: includes/settings.php:105 msgid "How this application will identify itself to the webservice." msgstr "" -#: includes/settings.php:109 +#: includes/settings.php:111 msgid "URL" msgstr "" -#: includes/settings.php:110 +#: includes/settings.php:112 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "" -#: includes/settings.php:117 +#: includes/settings.php:121 msgid "Delay" msgstr "" -#: includes/settings.php:118 +#: includes/settings.php:122 msgid "Choose the automatic update frequency" msgstr "" -#: includes/settings.php:122 +#: includes/settings.php:126 msgid "Once Hourly" msgstr "" -#: includes/settings.php:123 +#: includes/settings.php:127 msgid "Twice Daily" msgstr "" -#: includes/settings.php:124 +#: includes/settings.php:128 msgid "Once Daily" msgstr "" -#: includes/settings.php:128 +#: includes/settings.php:132 msgid "Key" msgstr "" -#: includes/settings.php:129 +#: includes/settings.php:133 msgid "Enter your Dolibarr webservices key" msgstr "" -#: includes/settings.php:135 +#: includes/settings.php:139 msgid "User login" msgstr "" -#: includes/settings.php:136 +#: includes/settings.php:140 msgid "Dolibarr actions will be done as this user" msgstr "" -#: includes/settings.php:142 +#: includes/settings.php:146 msgid "User password" msgstr "" -#: includes/settings.php:148 +#: includes/settings.php:152 msgid "Entity" msgstr "" -#: includes/settings.php:149 +#: includes/settings.php:153 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "" -#: includes/settings.php:155 +#: includes/settings.php:159 msgid "Product category" msgstr "" -#: includes/settings.php:156 +#: includes/settings.php:160 msgid "" "The ID of the product category you want to automatically import products " "from." msgstr "" -#: includes/settings.php:162 +#: includes/settings.php:166 msgid "Generic thirdparty" msgstr "" -#: includes/settings.php:163 +#: includes/settings.php:167 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "" -#: includes/settings.php:183 +#: includes/settings.php:187 msgid "The protocol to use is https://" msgstr "" -#: includes/settings.php:193 +#: includes/settings.php:197 msgid "The webservice is not available. Please check the URL." msgstr "" From 30c576c2fdfd1a21bd3c02fdcc6af22a1e3fc087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 20:41:26 +0100 Subject: [PATCH 39/88] Hopefully fixed the scheduler --- doliwoo.php | 42 +++++++++++++++++++++++++++---------- includes/class-dolibarr.php | 4 +++- includes/settings.php | 1 + 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/doliwoo.php b/doliwoo.php index 6790e76..e79f852 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -105,6 +105,7 @@ public function __construct() { // Initialize plugin settings add_action( 'plugins_loaded', array( $this, 'init' ) ); + // Setup logger add_action( 'woocommerce_loaded', array( &$this->dolibarr, 'set_woocommerce' ) ); // Create custom tax classes and VAT rates on plugin settings saved @@ -113,17 +114,19 @@ public function __construct() { // Import Dolibarr products on plugin settings saved add_action( 'woocommerce_settings_saved', array( &$this->dolibarr, 'dolibarr_import_products' ) ); - // Hook on woocommerce_checkout_process to create a Dolibarr order using WooCommerce order data + // Reschedule products imporrt + add_action( 'woocommerce_settings_saved', array( $this, 'reschedule_import_products' ) ); + + // Create a Dolibarr order on each WooCommerce order add_action( 'woocommerce_checkout_order_processed', array( &$this->dolibarr, 'dolibarr_create_order' ) ); - // Schedule the import of product data from Dolibarr - add_action( 'wp', array( &$this, 'schedule_import_products' ) ); + // Add Dolibarr import products hook add_action( 'import_products', array( &$this->dolibarr, 'dolibarr_import_products' ) ); - // Dolibarr ID custom field + // Dolibarr ID User admin custom meta add_filter( 'manage_users_columns', array( &$this->woocommerce_parameters, 'user_columns' ) ); add_action( 'show_user_profile', array( &$this->woocommerce_parameters, 'customer_meta_fields' ) ); add_action( 'edit_user_profile', array( &$this->woocommerce_parameters, 'customer_meta_fields' ) ); @@ -162,6 +165,26 @@ public function init() { $this->taxes = new WC_Tax_Doliwoo(); } + /** + * On plugin activation + * + * @return void + */ + public function activation() { + // Schedule product import with a sensible default + wp_schedule_event( time(), 'daily', 'import_products' ); + } + + /** + * On plugin deactivation + * + * @return void + */ + public function deactivation() { + // Unschedule product import + wp_clear_scheduled_hook( 'import_products' ); + } + /** * Add a new integration to WooCommerce * @@ -176,17 +199,14 @@ public function add_integration( $integrations ) { } /** - * Schedules the daily import of Dolibarr products - * - * @access public + * Reschedules the automatic import of Dolibarr products * * @return void */ - public function schedule_import_products() { + public function reschedule_import_products() { $delay = $this->settings->delay_update; - if ( ! wp_next_scheduled( 'import_products' ) ) { - wp_schedule_event( time(), $delay, 'import_products' ); - } + wp_clear_scheduled_hook( 'import_products' ); + wp_schedule_event( time(), $delay, 'import_products' ); } /** diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 1b3732b..350c2a4 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -251,6 +251,8 @@ public function dolibarr_import_products() { $this->Doliwoo = new Doliwoo(); $this->Doliwoo->get_settings(); + // FIXME: protect executions if settings are not yet completed + // Set the WebService URL try { $soap_client = new SoapClient( @@ -400,7 +402,7 @@ private function get_product_image( $res = media_handle_sideload( $file_array, $post_id ); // Handle errors nicely ( logging ) - if ( true === is_wp_error( $res ) ) { + if ( is_wp_error( $res ) ) { $message = $res->get_error_message(); $this->logger->add( 'doliwoo', $message ); } else { diff --git a/includes/settings.php b/includes/settings.php index aac4066..c8006ce 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -127,6 +127,7 @@ public function init_form_fields() { 'twicedaily' => __( 'Twice Daily' ), 'daily' => __( 'Once Daily' ), ), + 'default' => 'daily', ), 'dolibarr_key' => array( 'title' => __( 'Key', 'doliwoo' ), From a778f592fef54c2e42e0bd26eb91ee5a7e4b89bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 20:43:26 +0100 Subject: [PATCH 40/88] Hopefully fixed the user meta --- doliwoo.php | 8 ++++++-- includes/class-doliwoo-parameters.php | 14 ++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/doliwoo.php b/doliwoo.php index e79f852..7cdbe93 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -141,9 +141,13 @@ public function __construct() { add_action( 'manage_users_custom_column', array( &$this->woocommerce_parameters, 'user_column_values' ), - 10, - 3 + 10, // Prio + 3 // Args count ); + + // Schedule the import of product data from Dolibarr + register_activation_hook( __FILE__, 'activation' ); + register_deactivation_hook( __FILE__, 'deactivation' ); } /** diff --git a/includes/class-doliwoo-parameters.php b/includes/class-doliwoo-parameters.php index 971f03b..b3cc5a7 100644 --- a/includes/class-doliwoo-parameters.php +++ b/includes/class-doliwoo-parameters.php @@ -62,8 +62,8 @@ public function get_customer_meta_fields() { 'title' => __( 'Dolibarr', 'doliwoo' ), 'fields' => array( 'dolibarr_id' => array( - 'label' => __( 'Dolibarr User ID', 'doliwoo' ), - 'description' => 'The boss', // FIXME: WTF? + 'label' => __( 'User ID', 'doliwoo' ), + 'description' => __( 'The Dolibarr ID for this user' ), ) ) ) @@ -109,12 +109,18 @@ public function customer_meta_fields( WP_User $user ) { /** * Define value for the Dolibarr ID column * + * @param string $value The current value + * @param string $column_name The curent custom column * @param mixed $user_id The ID of the user being displayed * * @return string Value for the column */ - public function user_column_values( $user_id ) { - return get_user_meta( $user_id, 'dolibarr_id', true ); + public function user_column_values( $value, $column_name, $user_id ) { + $user = get_userdata( $user_id ); + if ( 'dolibarr_id' == $column_name ) { + return get_user_meta( $user->ID, 'dolibarr_id', true ); + } + return $value; } /** From cb9c7bb7dd400b2a71adaa51fefb9b944ee20107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 20:47:37 +0100 Subject: [PATCH 41/88] Updated translations --- composer.lock | 2 +- languages/doliwoo-ca.po | 38 +++++++++++++++++++++++--------------- languages/doliwoo-es_ES.po | 38 +++++++++++++++++++++++--------------- languages/doliwoo-fr_FR.po | 38 +++++++++++++++++++++++--------------- languages/doliwoo.pot | 37 ++++++++++++++++++++++--------------- 5 files changed, 92 insertions(+), 61 deletions(-) diff --git a/composer.lock b/composer.lock index a6cbc7e..98a8310 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "2b1d8341dfdf5b6d1b193eebb46d89ff", + "hash": "0b98b4ce55ad1e6f793fe8b6fec80676", "packages": [ { "name": "composer/installers", diff --git a/languages/doliwoo-ca.po b/languages/doliwoo-ca.po index 4a9ded0..4864152 100644 --- a/languages/doliwoo-ca.po +++ b/languages/doliwoo-ca.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-24 18:33:51+00:00\n" +"POT-Creation-Date: 2015-02-24 19:47:16+00:00\n" "PO-Revision-Date: 2015-02-19 11:44+0100\n" "Last-Translator: Bàrbara Partegàs \n" "Language-Team: Bàrbara Partegàs \n" @@ -23,7 +23,15 @@ msgid "Dolibarr" msgstr "Dolibarr" #: includes/class-doliwoo-parameters.php:65 -#: includes/class-doliwoo-parameters.php:128 +#, fuzzy +msgid "User ID" +msgstr "ID de l'usuari Dolibarr" + +#: includes/class-doliwoo-parameters.php:66 +msgid "The Dolibarr ID for this user" +msgstr "" + +#: includes/class-doliwoo-parameters.php:134 msgid "Dolibarr User ID" msgstr "ID de l'usuari Dolibarr" @@ -78,31 +86,31 @@ msgstr "Dos cops al dia" msgid "Once Daily" msgstr "Un cop al dia" -#: includes/settings.php:132 +#: includes/settings.php:133 msgid "Key" msgstr "Clau" -#: includes/settings.php:133 +#: includes/settings.php:134 msgid "Enter your Dolibarr webservices key" msgstr "Entra la teva clau del webservice de Dolibarr" -#: includes/settings.php:139 +#: includes/settings.php:140 msgid "User login" msgstr "Usuari d'inici de sessió" -#: includes/settings.php:140 +#: includes/settings.php:141 msgid "Dolibarr actions will be done as this user" msgstr "Les accions de Dolibarr es duran a terme amb aquest usuari" -#: includes/settings.php:146 +#: includes/settings.php:147 msgid "User password" msgstr "Paraula de pas de l'usuari" -#: includes/settings.php:152 +#: includes/settings.php:153 msgid "Entity" msgstr "Entitat (empresa)" -#: includes/settings.php:153 +#: includes/settings.php:154 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." @@ -110,11 +118,11 @@ msgstr "" "Si utilitzes multiempresa, l'ID de l'entitat (empresa) que vols integrar. " "Déixa-ho amb 1 si no és així." -#: includes/settings.php:159 +#: includes/settings.php:160 msgid "Product category" msgstr "Categoria del producte" -#: includes/settings.php:160 +#: includes/settings.php:161 msgid "" "The ID of the product category you want to automatically import products " "from." @@ -122,20 +130,20 @@ msgstr "" "La ID de la categoria de producte de la que vols importar productes " "automàticament." -#: includes/settings.php:166 +#: includes/settings.php:167 msgid "Generic thirdparty" msgstr "Tercer per defecte" -#: includes/settings.php:167 +#: includes/settings.php:168 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "" "La ID del tercer per defecte que serà utilitzat en les comandes anònimes." -#: includes/settings.php:187 +#: includes/settings.php:188 msgid "The protocol to use is https://" msgstr "El protocol per utilitzar és https://" -#: includes/settings.php:197 +#: includes/settings.php:198 msgid "The webservice is not available. Please check the URL." msgstr "El servei webservice no està disponible. Siusplau, comprova la URL." diff --git a/languages/doliwoo-es_ES.po b/languages/doliwoo-es_ES.po index 14ff1c0..58042c1 100644 --- a/languages/doliwoo-es_ES.po +++ b/languages/doliwoo-es_ES.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.1\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-24 18:33:51+00:00\n" +"POT-Creation-Date: 2015-02-24 19:47:16+00:00\n" "PO-Revision-Date: 2015-02-19 11:44+0100\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Bàrbara Partegàs \n" @@ -21,7 +21,15 @@ msgid "Dolibarr" msgstr "Dolibarr" #: includes/class-doliwoo-parameters.php:65 -#: includes/class-doliwoo-parameters.php:128 +#, fuzzy +msgid "User ID" +msgstr "ID de usuario Dolibarr" + +#: includes/class-doliwoo-parameters.php:66 +msgid "The Dolibarr ID for this user" +msgstr "" + +#: includes/class-doliwoo-parameters.php:134 msgid "Dolibarr User ID" msgstr "ID de usuario Dolibarr" @@ -76,31 +84,31 @@ msgstr "Dos veces al día" msgid "Once Daily" msgstr "Una vez al día" -#: includes/settings.php:132 +#: includes/settings.php:133 msgid "Key" msgstr "Llave" -#: includes/settings.php:133 +#: includes/settings.php:134 msgid "Enter your Dolibarr webservices key" msgstr "Entra la llave del webservice de Dolibarr" -#: includes/settings.php:139 +#: includes/settings.php:140 msgid "User login" msgstr "Inicio de sesión de usuario" -#: includes/settings.php:140 +#: includes/settings.php:141 msgid "Dolibarr actions will be done as this user" msgstr "Las acciones de Dolibarr ser harán con este usuario" -#: includes/settings.php:146 +#: includes/settings.php:147 msgid "User password" msgstr "Contraseña de usuario" -#: includes/settings.php:152 +#: includes/settings.php:153 msgid "Entity" msgstr "Entidad (empresa)" -#: includes/settings.php:153 +#: includes/settings.php:154 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." @@ -108,30 +116,30 @@ msgstr "" "Si estás usando multiempresa, el ID de la entidad que quieres integrar. " "Déjalo en 1 si no es así." -#: includes/settings.php:159 +#: includes/settings.php:160 msgid "Product category" msgstr "Categoría de producto" -#: includes/settings.php:160 +#: includes/settings.php:161 msgid "" "The ID of the product category you want to automatically import products " "from." msgstr "" "El ID de la categoría de producto de la que quieres importar productos." -#: includes/settings.php:166 +#: includes/settings.php:167 msgid "Generic thirdparty" msgstr "Tercero por defecto" -#: includes/settings.php:167 +#: includes/settings.php:168 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "El ID del tercero que será usado para los pedidos anónimos." -#: includes/settings.php:187 +#: includes/settings.php:188 msgid "The protocol to use is https://" msgstr "El protocolo a usar es https://" -#: includes/settings.php:197 +#: includes/settings.php:198 msgid "The webservice is not available. Please check the URL." msgstr "" "El servicio webservice no está disponible. Por favor, comprueba la URL." diff --git a/languages/doliwoo-fr_FR.po b/languages/doliwoo-fr_FR.po index eb7afbb..e84820b 100644 --- a/languages/doliwoo-fr_FR.po +++ b/languages/doliwoo-fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-24 18:33:51+00:00\n" +"POT-Creation-Date: 2015-02-24 19:47:16+00:00\n" "PO-Revision-Date: 2015-02-18 18:45+0100\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/" @@ -23,7 +23,15 @@ msgid "Dolibarr" msgstr "Dolibarr" #: includes/class-doliwoo-parameters.php:65 -#: includes/class-doliwoo-parameters.php:128 +#, fuzzy +msgid "User ID" +msgstr "Identifiant Utilisateur Dolibarr" + +#: includes/class-doliwoo-parameters.php:66 +msgid "The Dolibarr ID for this user" +msgstr "" + +#: includes/class-doliwoo-parameters.php:134 msgid "Dolibarr User ID" msgstr "Identifiant Utilisateur Dolibarr" @@ -78,31 +86,31 @@ msgstr "Deux fois par jour" msgid "Once Daily" msgstr "Une fois par jour" -#: includes/settings.php:132 +#: includes/settings.php:133 msgid "Key" msgstr "Clé" -#: includes/settings.php:133 +#: includes/settings.php:134 msgid "Enter your Dolibarr webservices key" msgstr "Entrez votre clé du webservices de Dolibarr" -#: includes/settings.php:139 +#: includes/settings.php:140 msgid "User login" msgstr "Identifiant utilisateur" -#: includes/settings.php:140 +#: includes/settings.php:141 msgid "Dolibarr actions will be done as this user" msgstr "Les actions de Dolibarr seront attribuées à cet utilisateur" -#: includes/settings.php:146 +#: includes/settings.php:147 msgid "User password" msgstr "Mot de passe utilisateur" -#: includes/settings.php:152 +#: includes/settings.php:153 msgid "Entity" msgstr "Entité" -#: includes/settings.php:153 +#: includes/settings.php:154 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." @@ -110,30 +118,30 @@ msgstr "" "Si vous utilisez multi-société, l'ID de l'entité que vous souhaitez " "intégrer. Sinon laissez à 1." -#: includes/settings.php:159 +#: includes/settings.php:160 msgid "Product category" msgstr "Catégorie du Produit" -#: includes/settings.php:160 +#: includes/settings.php:161 msgid "" "The ID of the product category you want to automatically import products " "from." msgstr "" "L'ID de la catégorie de produits que vous souhaitez importer automatiquement." -#: includes/settings.php:166 +#: includes/settings.php:167 msgid "Generic thirdparty" msgstr "Tiers générique" -#: includes/settings.php:167 +#: includes/settings.php:168 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "L'Id du tiers qui va être utilisé pour les commandes anonymes" -#: includes/settings.php:187 +#: includes/settings.php:188 msgid "The protocol to use is https://" msgstr "Le protocole à utiliser est https://" -#: includes/settings.php:197 +#: includes/settings.php:198 msgid "The webservice is not available. Please check the URL." msgstr "Le webservice n'est pas disponible. Merci de vérifier l'URL." diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index 7874288..91f529d 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-24 18:33:51+00:00\n" +"POT-Creation-Date: 2015-02-24 19:47:16+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -29,7 +29,14 @@ msgid "Dolibarr" msgstr "" #: includes/class-doliwoo-parameters.php:65 -#: includes/class-doliwoo-parameters.php:128 +msgid "User ID" +msgstr "" + +#: includes/class-doliwoo-parameters.php:66 +msgid "The Dolibarr ID for this user" +msgstr "" + +#: includes/class-doliwoo-parameters.php:134 msgid "Dolibarr User ID" msgstr "" @@ -83,59 +90,59 @@ msgstr "" msgid "Once Daily" msgstr "" -#: includes/settings.php:132 +#: includes/settings.php:133 msgid "Key" msgstr "" -#: includes/settings.php:133 +#: includes/settings.php:134 msgid "Enter your Dolibarr webservices key" msgstr "" -#: includes/settings.php:139 +#: includes/settings.php:140 msgid "User login" msgstr "" -#: includes/settings.php:140 +#: includes/settings.php:141 msgid "Dolibarr actions will be done as this user" msgstr "" -#: includes/settings.php:146 +#: includes/settings.php:147 msgid "User password" msgstr "" -#: includes/settings.php:152 +#: includes/settings.php:153 msgid "Entity" msgstr "" -#: includes/settings.php:153 +#: includes/settings.php:154 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "" -#: includes/settings.php:159 +#: includes/settings.php:160 msgid "Product category" msgstr "" -#: includes/settings.php:160 +#: includes/settings.php:161 msgid "" "The ID of the product category you want to automatically import products " "from." msgstr "" -#: includes/settings.php:166 +#: includes/settings.php:167 msgid "Generic thirdparty" msgstr "" -#: includes/settings.php:167 +#: includes/settings.php:168 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "" -#: includes/settings.php:187 +#: includes/settings.php:188 msgid "The protocol to use is https://" msgstr "" -#: includes/settings.php:197 +#: includes/settings.php:198 msgid "The webservice is not available. Please check the URL." msgstr "" From 7e0381f040a65687a0f18fc6b81c3ced1ab0fec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 20:49:21 +0100 Subject: [PATCH 42/88] Don't update po files. These are managed at Transifex. --- Gruntfile.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index c98c408..7b88012 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -68,8 +68,7 @@ module.exports = function (grunt) { potHeaders: { poedit: true, 'report-msgid-bugs-to': 'https://github.com/GPCsolutions/doliwoo/issues' - }, - updatePoFiles: true + } } } }, From 9748f444d6642da46e79fbe81a26aac9e04ab769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 24 Feb 2015 20:51:50 +0100 Subject: [PATCH 43/88] French translation update --- languages/doliwoo-fr_FR.po | 55 +++++++++++++++----------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/languages/doliwoo-fr_FR.po b/languages/doliwoo-fr_FR.po index e84820b..1bd99be 100644 --- a/languages/doliwoo-fr_FR.po +++ b/languages/doliwoo-fr_FR.po @@ -1,5 +1,5 @@ -# Copyright (C) 2015 Doliwoo -# This file is distributed under the same license as the Doliwoo package. +# Copyright (C) 2015 GPC.solutions +# This file is distributed under the GPL-3.0+. # Translators: # Raphaël Doursenaud , 2015 msgid "" @@ -7,29 +7,34 @@ msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" "POT-Creation-Date: 2015-02-24 19:47:16+00:00\n" -"PO-Revision-Date: 2015-02-18 18:45+0100\n" +"PO-Revision-Date: 2015-02-24 19:50+0000\n" "Last-Translator: Raphaël Doursenaud \n" -"Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/" -"language/fr_FR/)\n" -"Language: fr_FR\n" +"Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/language/fr_FR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: fr_FR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 1.7.4\n" +"X-Generator: grunt-wp-i18n 0.5.0\n" +"X-Poedit-Basepath: ../\n" +"X-Poedit-Bookmarks: \n" +"X-Poedit-Country: United States\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;_nx_noop:1,2,3c;esc_attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;esc_html_x:1,2c;\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Textdomain-Support: yes\n" #: includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" #: includes/class-doliwoo-parameters.php:65 -#, fuzzy msgid "User ID" -msgstr "Identifiant Utilisateur Dolibarr" +msgstr "Identifiant utilisateur" #: includes/class-doliwoo-parameters.php:66 msgid "The Dolibarr ID for this user" -msgstr "" +msgstr "L'identifiant Dolibarr pour cet utilisateur" #: includes/class-doliwoo-parameters.php:134 msgid "Dolibarr User ID" @@ -61,10 +66,9 @@ msgstr "URL" #: includes/settings.php:112 msgid "" -"Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" -msgstr "" -"Entrez l'URL racine des webservices de Dolibarr (i.e. https://mydolibarr.com/" -"webservices)" +"Enter Dolibarr webservices root URL (i.e. " +"https://mydolibarr.com/webservices)" +msgstr "Entrez l'URL racine des webservices de Dolibarr (i.e. https://mydolibarr.com/webservices)" #: includes/settings.php:121 msgid "Delay" @@ -114,9 +118,7 @@ msgstr "Entité" msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." -msgstr "" -"Si vous utilisez multi-société, l'ID de l'entité que vous souhaitez " -"intégrer. Sinon laissez à 1." +msgstr "Si vous utilisez multi-société, l'ID de l'entité que vous souhaitez intégrer. Sinon laissez à 1." #: includes/settings.php:160 msgid "Product category" @@ -126,8 +128,7 @@ msgstr "Catégorie du Produit" msgid "" "The ID of the product category you want to automatically import products " "from." -msgstr "" -"L'ID de la catégorie de produits que vous souhaitez importer automatiquement." +msgstr "L'ID de la catégorie de produits que vous souhaitez importer automatiquement." #: includes/settings.php:167 msgid "Generic thirdparty" @@ -146,14 +147,12 @@ msgid "The webservice is not available. Please check the URL." msgstr "Le webservice n'est pas disponible. Merci de vérifier l'URL." #. Plugin Name of the plugin/theme -#, fuzzy msgid "DoliWoo" msgstr "DoliWoo" #. Plugin URI of the plugin/theme -#, fuzzy msgid "http://gpcsolutions.github.io/doliwoo" -msgstr "https://gpcsolutions.fr/doliwoo" +msgstr "http://gpcsolutions.github.io/doliwoo" #. Description of the plugin/theme msgid "Dolibarr WooCommerce integration" @@ -162,15 +161,3 @@ msgstr "Intégration Dolibarr WooCommerc" #. Author of the plugin/theme msgid "GPC.solutions" msgstr "GPC.solutions" - -#~ msgid "This plugin needs SOAP and OpenSSL PHP extensions." -#~ msgstr "Cette extension nécessite les extensions PHP SOAP et OpenSSL." - -#~ msgid "This plugin needs SOAP PHP extension." -#~ msgstr "Cette extension nécessite l'extension PHP SOAP." - -#~ msgid "This plugin needs OpenSSL PHP extension." -#~ msgstr "Cette extension nécessite l'extension PHP OpenSSL." - -#~ msgid "This extension needs WooCommerce" -#~ msgstr "Cette extension nécessite WooCommerce" From 04897e4f948dc3cb34d108650f01e47a022628e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 27 Feb 2015 15:55:41 +0100 Subject: [PATCH 44/88] Added missing documentation --- includes/settings.php | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/includes/settings.php b/includes/settings.php index c8006ce..b481f5a 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -69,22 +69,15 @@ public function __construct() { $this->init_settings(); // Define user set variables - $this->webservs_url = $this->get_option( 'webservs_url' ); - - $this->delay_update = $this->get_option( 'delay_update' ); - - $this->dolibarr_key = $this->get_option( 'dolibarr_key' ); - $this->sourceapplication - = $this->get_option( 'sourceapplication' ); - $this->dolibarr_login = $this->get_option( 'dolibarr_login' ); - $this->dolibarr_password - = $this->get_option( 'dolibarr_password' ); - $this->dolibarr_entity - = $this->get_option( 'dolibarr_entity' ); - $this->dolibarr_category_id - = $this->get_option( 'dolibarr_category_id' ); - $this->dolibarr_generic_id - = $this->get_option( 'dolibarr_generic_id' ); + $this->webservs_url = $this->get_option( 'webservs_url' ); + $this->delay_update = $this->get_option( 'delay_update' ); + $this->dolibarr_key = $this->get_option( 'dolibarr_key' ); + $this->sourceapplication = $this->get_option( 'sourceapplication' ); + $this->dolibarr_login = $this->get_option( 'dolibarr_login' ); + $this->dolibarr_password = $this->get_option( 'dolibarr_password' ); + $this->dolibarr_entity = $this->get_option( 'dolibarr_entity' ); + $this->dolibarr_category_id = $this->get_option( 'dolibarr_category_id' ); + $this->dolibarr_generic_id = $this->get_option( 'dolibarr_generic_id' ); // Actions add_action( @@ -175,13 +168,14 @@ public function init_form_fields() { /** * Check if the fields URL Webservs is HTTPS + * @see validate_settings_fields() * * @param string $key The form setting * * @return string The form value */ public function validate_webservs_url_field( $key ) { - $value = $_POST['woocommerce_doliwoo_webservs_url']; + $value = $_POST[ $this->plugin_id . $this->id . '_' . $key ]; // Make sure we use HTTPS if ( 'https://' !== ( substr( $value, 0, 8 ) ) ) { @@ -203,10 +197,11 @@ public function validate_webservs_url_field( $key ) { /** * Display HTTPS is needed + * @see WC_Integration::display_errors() * * @return void */ - public function display_errors() { + public function display_errors( ) { foreach ( $this->errors as $key => $value ) { ?>
From d9ba8b0324c8b9d06ff3ad1bba80999cfb76de65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 27 Feb 2015 16:26:29 +0100 Subject: [PATCH 45/88] Added a check on Dolibarr availability and compatibility --- includes/settings.php | 129 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/includes/settings.php b/includes/settings.php index b481f5a..369fc76 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -56,6 +56,9 @@ class WC_Integration_Doliwoo_Settings extends WC_Integration { /** @var string ID of the Dolibarr thirdparty to use when we make a sale without a user logged in */ public $dolibarr_generic_id; + /** @var int[] The distant Dolibarr version */ + private $dolibarr_version; + /** * Init and hook in the integration. */ @@ -79,11 +82,28 @@ public function __construct() { $this->dolibarr_category_id = $this->get_option( 'dolibarr_category_id' ); $this->dolibarr_generic_id = $this->get_option( 'dolibarr_generic_id' ); + // Get Webservice infos + $endpoint = $this->webservs_url; + $ws_auth = array( + 'dolibarrkey' => $this->dolibarr_key, + 'sourceapplication' => $this->sourceapplication, + 'login' => $this->dolibarr_login, + 'password' => $this->dolibarr_password, + 'entity' => $this->dolibarr_entity, + ); + $this->test_webservice( $endpoint, $ws_auth ); + // Actions add_action( 'woocommerce_update_options_integration_' . $this->id, array( $this, 'process_admin_options' ) ); + + // Filters. + add_filter( + 'woocommerce_settings_api_sanitized_fields_' . $this->id, + array( $this, 'sanitize_settings' ) + ); } /** @@ -163,9 +183,61 @@ public function init_form_fields() { 'desc_tip' => false, 'default' => '', ), + 'dolibarr_version' => array( + 'title' => __( 'Dolibarr version', 'doliwoo' ), + 'description' => __( 'If the webservice communication is OK, it displays your Dolibarr version' ), + 'type' => 'info', + ), ); } + /** + * Display Dolibarr version and compatibility + * + * @param string $key Settings key + * @param array $data Setting valupe + * + * @return string HTML to display + */ + protected function generate_info_html( $key, $data ) { + $field = $this->plugin_id . $this->id . '_' . $key; + + $version_ok = false; + if ( + // Is version > 3.4.0 + 4 <= $this->dolibarr_version[0] + || ( 3 <= $this->dolibarr_version[0] && 4 <= $this->dolibarr_version[1] ) + ) { + $version_ok = true; + } + + ob_start(); + ?> + + + + get_tooltip_html( $data ) ); ?> + + + dolibarr_version ) + . ')' + ); + ?> + + + $settings['dolibarr_key'], + 'sourceapplication' => $settings['sourceapplication'], + 'login' => $settings['dolibarr_login'], + 'password' => $settings['dolibarr_password'], + 'entity' => $settings['dolibarr_entity'], + ); + + $this->test_webservice( $endpoint, $ws_auth ); + + return $settings; + } + /** * Display HTTPS is needed * @see WC_Integration::display_errors() @@ -214,5 +312,36 @@ public function display_errors( ) { errors[] = __( 'The webservice is not available. Please check the URL.' ); + $this->display_errors(); + + // No point in doing the next test + return; + } + + $response = $soapclient->getVersions( $ws_auth ); + + if ( 'OK' == $response['result']->result_code ) { + $this->dolibarr_version = explode( '.', $response['dolibarr'] ); + } else { + $this->errors[] = 'Webservice error:' . $response['result']->result_label; + } + + // Not called by the framework + $this->display_errors(); + } } endif; From 9415d15bc7dedc6d0fe4b055404f7be8f9b292a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 27 Feb 2015 16:40:28 +0100 Subject: [PATCH 46/88] Translations update --- includes/settings.php | 4 +- languages/doliwoo-ca.po | 120 ++++++++++++++++++------------------- languages/doliwoo-es_ES.po | 120 ++++++++++++++++++------------------- languages/doliwoo-fr_FR.po | 67 ++++++++++++--------- languages/doliwoo.pot | 60 +++++++++++-------- 5 files changed, 190 insertions(+), 181 deletions(-) diff --git a/includes/settings.php b/includes/settings.php index 369fc76..6afff14 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -170,8 +170,8 @@ public function init_form_fields() { 'default' => 1, ), 'dolibarr_category_id' => array( - 'title' => __( 'Product category', 'doliwoo' ), - 'description' => __( 'The ID of the product category you want to automatically import products from.', 'doliwoo' ), + 'title' => __( 'Products category', 'doliwoo' ), + 'description' => __( 'The ID of the products category you want to automatically import products from.', 'doliwoo' ), 'type' => 'text', 'desc_tip' => false, 'default' => '', diff --git a/languages/doliwoo-ca.po b/languages/doliwoo-ca.po index 4864152..ab1546f 100644 --- a/languages/doliwoo-ca.po +++ b/languages/doliwoo-ca.po @@ -1,31 +1,36 @@ -# Copyright (C) 2015 Doliwoo -# This file is distributed under the same license as the Doliwoo package. +# Copyright (C) 2015 GPC.solutions +# This file is distributed under the GPL-3.0+. # Translators: # Raphaël Doursenaud , 2015 msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-24 19:47:16+00:00\n" -"PO-Revision-Date: 2015-02-19 11:44+0100\n" -"Last-Translator: Bàrbara Partegàs \n" -"Language-Team: Bàrbara Partegàs \n" -"Language: ca\n" +"POT-Creation-Date: 2015-02-27 15:36:15+00:00\n" +"PO-Revision-Date: 2015-02-27 15:38+0000\n" +"Last-Translator: Raphaël Doursenaud \n" +"Language-Team: Catalan (http://www.transifex.com/projects/p/doliwoo/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.7.4\n" +"X-Generator: grunt-wp-i18n 0.5.0\n" +"X-Poedit-Basepath: ../\n" +"X-Poedit-Bookmarks: \n" +"X-Poedit-Country: United States\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;_nx_noop:1,2,3c;esc_attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;esc_html_x:1,2c;\n" +"X-Poedit-SearchPath-0: .\n" "X-Poedit-SourceCharset: UTF-8\n" +"X-Textdomain-Support: yes\n" #: includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" #: includes/class-doliwoo-parameters.php:65 -#, fuzzy msgid "User ID" -msgstr "ID de l'usuari Dolibarr" +msgstr "ID de l'usuari" #: includes/class-doliwoo-parameters.php:66 msgid "The Dolibarr ID for this user" @@ -39,123 +44,124 @@ msgstr "ID de l'usuari Dolibarr" msgid "VAT" msgstr "IVA" -#: includes/settings.php:64 +#: includes/settings.php:67 msgid "DoliWoo Settings" msgstr "Paràmetres de DoliWoo" -#: includes/settings.php:65 +#: includes/settings.php:68 msgid "Dolibarr webservices access" msgstr "Accés webservice de Dolibarr" -#: includes/settings.php:104 +#: includes/settings.php:117 msgid "Source application" msgstr "Aplicació font" -#: includes/settings.php:105 +#: includes/settings.php:118 msgid "How this application will identify itself to the webservice." msgstr "Com s'identificarà aquesta aplicació al webservice." -#: includes/settings.php:111 +#: includes/settings.php:124 msgid "URL" msgstr "URL" -#: includes/settings.php:112 +#: includes/settings.php:125 msgid "" -"Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" -msgstr "" -"Entra la URL arrel del webservice de Dolibarr (i.e. https://mydolibarr.com/" -"webservices)" +"Enter Dolibarr webservices root URL (i.e. " +"https://mydolibarr.com/webservices)" +msgstr "Entra la URL arrel del webservice de Dolibarr (i.e. https://mydolibarr.com/webservices)" -#: includes/settings.php:121 +#: includes/settings.php:134 msgid "Delay" msgstr "Retard" -#: includes/settings.php:122 +#: includes/settings.php:135 msgid "Choose the automatic update frequency" msgstr "Escull la freqüència de l'actualització automàtica" -#: includes/settings.php:126 +#: includes/settings.php:139 msgid "Once Hourly" msgstr "Un cop cada hora" -#: includes/settings.php:127 +#: includes/settings.php:140 msgid "Twice Daily" msgstr "Dos cops al dia" -#: includes/settings.php:128 +#: includes/settings.php:141 msgid "Once Daily" msgstr "Un cop al dia" -#: includes/settings.php:133 +#: includes/settings.php:146 msgid "Key" msgstr "Clau" -#: includes/settings.php:134 +#: includes/settings.php:147 msgid "Enter your Dolibarr webservices key" msgstr "Entra la teva clau del webservice de Dolibarr" -#: includes/settings.php:140 +#: includes/settings.php:153 msgid "User login" msgstr "Usuari d'inici de sessió" -#: includes/settings.php:141 +#: includes/settings.php:154 msgid "Dolibarr actions will be done as this user" msgstr "Les accions de Dolibarr es duran a terme amb aquest usuari" -#: includes/settings.php:147 +#: includes/settings.php:160 msgid "User password" msgstr "Paraula de pas de l'usuari" -#: includes/settings.php:153 +#: includes/settings.php:166 msgid "Entity" msgstr "Entitat (empresa)" -#: includes/settings.php:154 +#: includes/settings.php:167 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." -msgstr "" -"Si utilitzes multiempresa, l'ID de l'entitat (empresa) que vols integrar. " -"Déixa-ho amb 1 si no és així." +msgstr "Si utilitzes multiempresa, l'ID de l'entitat (empresa) que vols integrar. Déixa-ho amb 1 si no és així." -#: includes/settings.php:160 -msgid "Product category" -msgstr "Categoria del producte" +#: includes/settings.php:173 +msgid "Products category" +msgstr "" -#: includes/settings.php:161 +#: includes/settings.php:174 msgid "" -"The ID of the product category you want to automatically import products " +"The ID of the products category you want to automatically import products " "from." -msgstr "" -"La ID de la categoria de producte de la que vols importar productes " -"automàticament." +msgstr "La ID de la categoria de producte de la que vols importar productes automàticament." -#: includes/settings.php:167 +#: includes/settings.php:180 msgid "Generic thirdparty" msgstr "Tercer per defecte" -#: includes/settings.php:168 +#: includes/settings.php:181 msgid "The ID of the thirdparty that'll be used for anonymous orders." +msgstr "La ID del tercer per defecte que serà utilitzat en les comandes anònimes." + +#: includes/settings.php:187 +msgid "Dolibarr version" msgstr "" -"La ID del tercer per defecte que serà utilitzat en les comandes anònimes." #: includes/settings.php:188 +msgid "" +"If the webservice communication is OK, it displays your Dolibarr version" +msgstr "" + +#: includes/settings.php:254 msgid "The protocol to use is https://" msgstr "El protocol per utilitzar és https://" -#: includes/settings.php:198 +#: includes/settings.php:264 includes/settings.php:328 msgid "The webservice is not available. Please check the URL." msgstr "El servei webservice no està disponible. Siusplau, comprova la URL." #. Plugin Name of the plugin/theme -#, fuzzy msgid "DoliWoo" -msgstr "Doliwoo" +msgstr "DoliWoo" #. Plugin URI of the plugin/theme -#, fuzzy msgid "http://gpcsolutions.github.io/doliwoo" -msgstr "TODO (https://gpcsolutions.fr/doliwoo)" +msgstr "http://gpcsolutions.github.io/doliwoo" #. Description of the plugin/theme msgid "Dolibarr WooCommerce integration" @@ -164,15 +170,3 @@ msgstr "Dolibarr WooCommerce integration" #. Author of the plugin/theme msgid "GPC.solutions" msgstr "GPC.solutions" - -#~ msgid "This plugin needs SOAP and OpenSSL PHP extensions." -#~ msgstr "Aquest plugin necessita extensions SOAP i OpenSSL PHP." - -#~ msgid "This plugin needs SOAP PHP extension." -#~ msgstr "Aquest plugin necessita l'extensió SOAP PHP." - -#~ msgid "This plugin needs OpenSSL PHP extension." -#~ msgstr "Aquest plugin necessita l'extensió OpenSSL PHP." - -#~ msgid "This extension needs WooCommerce" -#~ msgstr "Aquesta extensió necessita WooCommerce" diff --git a/languages/doliwoo-es_ES.po b/languages/doliwoo-es_ES.po index 58042c1..c2fa05b 100644 --- a/languages/doliwoo-es_ES.po +++ b/languages/doliwoo-es_ES.po @@ -1,29 +1,36 @@ -# Copyright (C) 2015 DoliWoo -# This file is distributed under the same license as the Doliwoo package. +# Copyright (C) 2015 GPC.solutions +# This file is distributed under the GPL-3.0+. +# Translators: +# Raphaël Doursenaud , 2015 msgid "" msgstr "" -"Project-Id-Version: DoliWoo 0.0.1\n" +"Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-24 19:47:16+00:00\n" -"PO-Revision-Date: 2015-02-19 11:44+0100\n" +"POT-Creation-Date: 2015-02-27 15:36:15+00:00\n" +"PO-Revision-Date: 2015-02-27 15:39+0000\n" "Last-Translator: Raphaël Doursenaud \n" -"Language-Team: Bàrbara Partegàs \n" -"Language: es_ES\n" +"Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/doliwoo/language/es_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.7.4\n" +"X-Generator: grunt-wp-i18n 0.5.0\n" +"X-Poedit-Basepath: ../\n" +"X-Poedit-Bookmarks: \n" +"X-Poedit-Country: United States\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;_nx_noop:1,2,3c;esc_attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;esc_html_x:1,2c;\n" +"X-Poedit-SearchPath-0: .\n" "X-Poedit-SourceCharset: UTF-8\n" +"X-Textdomain-Support: yes\n" #: includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" #: includes/class-doliwoo-parameters.php:65 -#, fuzzy msgid "User ID" -msgstr "ID de usuario Dolibarr" +msgstr "ID de usuario" #: includes/class-doliwoo-parameters.php:66 msgid "The Dolibarr ID for this user" @@ -37,121 +44,124 @@ msgstr "ID de usuario Dolibarr" msgid "VAT" msgstr "IVA" -#: includes/settings.php:64 +#: includes/settings.php:67 msgid "DoliWoo Settings" msgstr "Configuración de DoliWoo" -#: includes/settings.php:65 +#: includes/settings.php:68 msgid "Dolibarr webservices access" msgstr "Acceso a webservices Dolibarr" -#: includes/settings.php:104 +#: includes/settings.php:117 msgid "Source application" msgstr "Aplicación fuente" -#: includes/settings.php:105 +#: includes/settings.php:118 msgid "How this application will identify itself to the webservice." msgstr "Cómo se identificará esta aplicación al webservice." -#: includes/settings.php:111 +#: includes/settings.php:124 msgid "URL" msgstr "URL" -#: includes/settings.php:112 +#: includes/settings.php:125 msgid "" -"Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)" -msgstr "" -"Entra la URL raíz del webservice de Dolibarr (ej.: https://mydolibarr.com/" -"webservices)" +"Enter Dolibarr webservices root URL (i.e. " +"https://mydolibarr.com/webservices)" +msgstr "Entra la URL raíz del webservice de Dolibarr (ej.: https://mydolibarr.com/webservices)" -#: includes/settings.php:121 +#: includes/settings.php:134 msgid "Delay" msgstr "Retraso" -#: includes/settings.php:122 +#: includes/settings.php:135 msgid "Choose the automatic update frequency" msgstr "Escoje la frecuencia de actualización automática" -#: includes/settings.php:126 +#: includes/settings.php:139 msgid "Once Hourly" msgstr "Una vez cada hora" -#: includes/settings.php:127 +#: includes/settings.php:140 msgid "Twice Daily" msgstr "Dos veces al día" -#: includes/settings.php:128 +#: includes/settings.php:141 msgid "Once Daily" msgstr "Una vez al día" -#: includes/settings.php:133 +#: includes/settings.php:146 msgid "Key" msgstr "Llave" -#: includes/settings.php:134 +#: includes/settings.php:147 msgid "Enter your Dolibarr webservices key" msgstr "Entra la llave del webservice de Dolibarr" -#: includes/settings.php:140 +#: includes/settings.php:153 msgid "User login" msgstr "Inicio de sesión de usuario" -#: includes/settings.php:141 +#: includes/settings.php:154 msgid "Dolibarr actions will be done as this user" msgstr "Las acciones de Dolibarr ser harán con este usuario" -#: includes/settings.php:147 +#: includes/settings.php:160 msgid "User password" msgstr "Contraseña de usuario" -#: includes/settings.php:153 +#: includes/settings.php:166 msgid "Entity" msgstr "Entidad (empresa)" -#: includes/settings.php:154 +#: includes/settings.php:167 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." -msgstr "" -"Si estás usando multiempresa, el ID de la entidad que quieres integrar. " -"Déjalo en 1 si no es así." +msgstr "Si estás usando multiempresa, el ID de la entidad que quieres integrar. Déjalo en 1 si no es así." -#: includes/settings.php:160 -msgid "Product category" -msgstr "Categoría de producto" +#: includes/settings.php:173 +msgid "Products category" +msgstr "Categoría de productos" -#: includes/settings.php:161 +#: includes/settings.php:174 msgid "" -"The ID of the product category you want to automatically import products " +"The ID of the products category you want to automatically import products " "from." -msgstr "" -"El ID de la categoría de producto de la que quieres importar productos." +msgstr "El ID de la categoría de productos de la que quieres importar productos." -#: includes/settings.php:167 +#: includes/settings.php:180 msgid "Generic thirdparty" msgstr "Tercero por defecto" -#: includes/settings.php:168 +#: includes/settings.php:181 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "El ID del tercero que será usado para los pedidos anónimos." +#: includes/settings.php:187 +msgid "Dolibarr version" +msgstr "" + #: includes/settings.php:188 +msgid "" +"If the webservice communication is OK, it displays your Dolibarr version" +msgstr "" + +#: includes/settings.php:254 msgid "The protocol to use is https://" msgstr "El protocolo a usar es https://" -#: includes/settings.php:198 +#: includes/settings.php:264 includes/settings.php:328 msgid "The webservice is not available. Please check the URL." -msgstr "" -"El servicio webservice no está disponible. Por favor, comprueba la URL." +msgstr "El servicio webservice no está disponible. Por favor, comprueba la URL." #. Plugin Name of the plugin/theme -#, fuzzy msgid "DoliWoo" msgstr "DoliWoo" #. Plugin URI of the plugin/theme msgid "http://gpcsolutions.github.io/doliwoo" -msgstr "" +msgstr "http://gpcsolutions.github.io/doliwoo" #. Description of the plugin/theme msgid "Dolibarr WooCommerce integration" @@ -160,15 +170,3 @@ msgstr "" #. Author of the plugin/theme msgid "GPC.solutions" msgstr "GPC.solutions" - -#~ msgid "This plugin needs SOAP and OpenSSL PHP extensions." -#~ msgstr "Este plugin necesita extensiones PHP OpenSSL y SOAP." - -#~ msgid "This plugin needs SOAP PHP extension." -#~ msgstr "Este plugin necesita extensión SOAP PHP." - -#~ msgid "This plugin needs OpenSSL PHP extension." -#~ msgstr "Este plugin necesita extensión OpenSSL PHP." - -#~ msgid "This extension needs WooCommerce" -#~ msgstr "Esta extensión necesita WooCommerce" diff --git a/languages/doliwoo-fr_FR.po b/languages/doliwoo-fr_FR.po index 1bd99be..df724c1 100644 --- a/languages/doliwoo-fr_FR.po +++ b/languages/doliwoo-fr_FR.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-24 19:47:16+00:00\n" -"PO-Revision-Date: 2015-02-24 19:50+0000\n" +"POT-Creation-Date: 2015-02-27 15:36:15+00:00\n" +"PO-Revision-Date: 2015-02-27 15:35+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/language/fr_FR/)\n" "MIME-Version: 1.0\n" @@ -44,105 +44,114 @@ msgstr "Identifiant Utilisateur Dolibarr" msgid "VAT" msgstr "TVA" -#: includes/settings.php:64 +#: includes/settings.php:67 msgid "DoliWoo Settings" msgstr "Réglages DoliWoo" -#: includes/settings.php:65 +#: includes/settings.php:68 msgid "Dolibarr webservices access" msgstr "Accès aux webservices Dolibarr" -#: includes/settings.php:104 +#: includes/settings.php:117 msgid "Source application" msgstr "Nom de l'application" -#: includes/settings.php:105 +#: includes/settings.php:118 msgid "How this application will identify itself to the webservice." msgstr "Comment cette application s'identifie auprès du webservice." -#: includes/settings.php:111 +#: includes/settings.php:124 msgid "URL" msgstr "URL" -#: includes/settings.php:112 +#: includes/settings.php:125 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "Entrez l'URL racine des webservices de Dolibarr (i.e. https://mydolibarr.com/webservices)" -#: includes/settings.php:121 +#: includes/settings.php:134 msgid "Delay" msgstr "Délai" -#: includes/settings.php:122 +#: includes/settings.php:135 msgid "Choose the automatic update frequency" msgstr "Choisissez la fréquence de mise à jour automatique" -#: includes/settings.php:126 +#: includes/settings.php:139 msgid "Once Hourly" msgstr "Une fois par heure" -#: includes/settings.php:127 +#: includes/settings.php:140 msgid "Twice Daily" msgstr "Deux fois par jour" -#: includes/settings.php:128 +#: includes/settings.php:141 msgid "Once Daily" msgstr "Une fois par jour" -#: includes/settings.php:133 +#: includes/settings.php:146 msgid "Key" msgstr "Clé" -#: includes/settings.php:134 +#: includes/settings.php:147 msgid "Enter your Dolibarr webservices key" msgstr "Entrez votre clé du webservices de Dolibarr" -#: includes/settings.php:140 +#: includes/settings.php:153 msgid "User login" msgstr "Identifiant utilisateur" -#: includes/settings.php:141 +#: includes/settings.php:154 msgid "Dolibarr actions will be done as this user" msgstr "Les actions de Dolibarr seront attribuées à cet utilisateur" -#: includes/settings.php:147 +#: includes/settings.php:160 msgid "User password" msgstr "Mot de passe utilisateur" -#: includes/settings.php:153 +#: includes/settings.php:166 msgid "Entity" msgstr "Entité" -#: includes/settings.php:154 +#: includes/settings.php:167 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "Si vous utilisez multi-société, l'ID de l'entité que vous souhaitez intégrer. Sinon laissez à 1." -#: includes/settings.php:160 -msgid "Product category" -msgstr "Catégorie du Produit" +#: includes/settings.php:173 +msgid "Products category" +msgstr "Catégorie des produits" -#: includes/settings.php:161 +#: includes/settings.php:174 msgid "" -"The ID of the product category you want to automatically import products " +"The ID of the products category you want to automatically import products " "from." -msgstr "L'ID de la catégorie de produits que vous souhaitez importer automatiquement." +msgstr "L'ID de la catégorie des produits que vous souhaitez importer automatiquement." -#: includes/settings.php:167 +#: includes/settings.php:180 msgid "Generic thirdparty" msgstr "Tiers générique" -#: includes/settings.php:168 +#: includes/settings.php:181 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "L'Id du tiers qui va être utilisé pour les commandes anonymes" +#: includes/settings.php:187 +msgid "Dolibarr version" +msgstr "Version de Dolibarr" + #: includes/settings.php:188 +msgid "" +"If the webservice communication is OK, it displays your Dolibarr version" +msgstr "Vérifie si la communication est établie au travers du webservice et récupère la version de Dolibarr" + +#: includes/settings.php:254 msgid "The protocol to use is https://" msgstr "Le protocole à utiliser est https://" -#: includes/settings.php:198 +#: includes/settings.php:264 includes/settings.php:328 msgid "The webservice is not available. Please check the URL." msgstr "Le webservice n'est pas disponible. Merci de vérifier l'URL." diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index 91f529d..42ec800 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-24 19:47:16+00:00\n" +"POT-Creation-Date: 2015-02-27 15:36:15+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -44,105 +44,113 @@ msgstr "" msgid "VAT" msgstr "" -#: includes/settings.php:64 +#: includes/settings.php:67 msgid "DoliWoo Settings" msgstr "" -#: includes/settings.php:65 +#: includes/settings.php:68 msgid "Dolibarr webservices access" msgstr "" -#: includes/settings.php:104 +#: includes/settings.php:117 msgid "Source application" msgstr "" -#: includes/settings.php:105 +#: includes/settings.php:118 msgid "How this application will identify itself to the webservice." msgstr "" -#: includes/settings.php:111 +#: includes/settings.php:124 msgid "URL" msgstr "" -#: includes/settings.php:112 +#: includes/settings.php:125 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "" -#: includes/settings.php:121 +#: includes/settings.php:134 msgid "Delay" msgstr "" -#: includes/settings.php:122 +#: includes/settings.php:135 msgid "Choose the automatic update frequency" msgstr "" -#: includes/settings.php:126 +#: includes/settings.php:139 msgid "Once Hourly" msgstr "" -#: includes/settings.php:127 +#: includes/settings.php:140 msgid "Twice Daily" msgstr "" -#: includes/settings.php:128 +#: includes/settings.php:141 msgid "Once Daily" msgstr "" -#: includes/settings.php:133 +#: includes/settings.php:146 msgid "Key" msgstr "" -#: includes/settings.php:134 +#: includes/settings.php:147 msgid "Enter your Dolibarr webservices key" msgstr "" -#: includes/settings.php:140 +#: includes/settings.php:153 msgid "User login" msgstr "" -#: includes/settings.php:141 +#: includes/settings.php:154 msgid "Dolibarr actions will be done as this user" msgstr "" -#: includes/settings.php:147 +#: includes/settings.php:160 msgid "User password" msgstr "" -#: includes/settings.php:153 +#: includes/settings.php:166 msgid "Entity" msgstr "" -#: includes/settings.php:154 +#: includes/settings.php:167 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "" -#: includes/settings.php:160 -msgid "Product category" +#: includes/settings.php:173 +msgid "Products category" msgstr "" -#: includes/settings.php:161 +#: includes/settings.php:174 msgid "" -"The ID of the product category you want to automatically import products " +"The ID of the products category you want to automatically import products " "from." msgstr "" -#: includes/settings.php:167 +#: includes/settings.php:180 msgid "Generic thirdparty" msgstr "" -#: includes/settings.php:168 +#: includes/settings.php:181 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "" +#: includes/settings.php:187 +msgid "Dolibarr version" +msgstr "" + #: includes/settings.php:188 +msgid "If the webservice communication is OK, it displays your Dolibarr version" +msgstr "" + +#: includes/settings.php:254 msgid "The protocol to use is https://" msgstr "" -#: includes/settings.php:198 +#: includes/settings.php:264 includes/settings.php:328 msgid "The webservice is not available. Please check the URL." msgstr "" From 04426159b550499689bb1a3c09d6fd8a0fb081d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 27 Feb 2015 17:45:12 +0100 Subject: [PATCH 47/88] Better settings management --- doliwoo.php | 24 +++++-------- includes/class-dolibarr.php | 67 +++++++++++++++++++------------------ includes/settings.php | 31 ++++++++++------- 3 files changed, 62 insertions(+), 60 deletions(-) diff --git a/doliwoo.php b/doliwoo.php index 7cdbe93..39cadcb 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -83,9 +83,6 @@ class Doliwoo { /** @var array SOAP authentication parameters */ public $ws_auth = array(); - /** @var WC_Tax_Doliwoo WooCommerce taxes informations */ - public $taxes; - /** @var Woocomerce_Parameters custom parameters */ public $woocommerce_parameters; @@ -105,11 +102,12 @@ public function __construct() { // Initialize plugin settings add_action( 'plugins_loaded', array( $this, 'init' ) ); - // Setup logger + // Setup dolibarr environment add_action( 'woocommerce_loaded', array( &$this->dolibarr, 'set_woocommerce' ) ); + add_action( 'woocommerce_init', array( $this, 'set_settings' ) ); // Create custom tax classes and VAT rates on plugin settings saved - add_action( 'woocommerce_settings_saved', array( &$this->taxes, 'create_custom_tax_classes' ) ); + add_action( 'woocommerce_settings_saved', array( &$this->dolibarr->taxes, 'create_custom_tax_classes' ) ); // Import Dolibarr products on plugin settings saved add_action( 'woocommerce_settings_saved', array( &$this->dolibarr, 'dolibarr_import_products' ) ); @@ -166,7 +164,7 @@ public function init() { // Register the integration. add_filter( 'woocommerce_integrations', array( $this, 'add_integration' ) ); } - $this->taxes = new WC_Tax_Doliwoo(); + $this->dolibarr->taxes = new WC_Tax_Doliwoo(); } /** @@ -214,21 +212,15 @@ public function reschedule_import_products() { } /** - * Extract settings from WooCommerce integration settings + * Set Dolibarr settings from WooCommerce integration settings * * @return void */ - public function get_settings() { + public function set_settings() { // Load settings $integrations = WC()->integrations->get_integrations(); - $this->settings = $integrations['doliwoo']; - $this->ws_auth = array( - 'dolibarrkey' => $this->settings->dolibarr_key, - 'sourceapplication' => $this->settings->sourceapplication, - 'login' => $this->settings->dolibarr_login, - 'password' => $this->settings->dolibarr_password, - 'entity' => $this->settings->dolibarr_entity, - ); + $this->dolibarr->settings = $integrations['doliwoo']; + $this->dolibarr->update_settings(); } } } diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 350c2a4..1ccf8d9 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -28,12 +28,18 @@ class Dolibarr { /** @var WC_Logger Logging */ public $logger; - /** @var Doliwoo */ - public $Doliwoo; + /** @var WC_Integration_Doliwoo_Settings Settings */ + public $settings; /** @var WC_Tax_Doliwoo WooCommerce taxes informations */ public $taxes; + /** @var string Webservice endpoint */ + private $ws_endpoint; + + /** @var array Webservice authentication parameters */ + private $ws_auth; + /** * Init parameters */ @@ -56,12 +62,8 @@ public function set_woocommerce() { * @return void */ public function dolibarr_create_order() { - $this->taxes = new WC_Tax_Doliwoo(); - - $this->Doliwoo = new Doliwoo(); - $this->Doliwoo->get_settings(); - $dolibarr_ws_url = $this->Doliwoo->settings->webservs_url . 'server_order.php?wsdl'; + $dolibarr_ws_url = $this->ws_endpoint . 'server_order.php?wsdl'; // Set the WebService URL $soap_client = new SoapClient( @@ -77,7 +79,7 @@ public function dolibarr_create_order() { $user_id = get_current_user_id(); if ( '' == $user_id ) { // default to the generic user - $thirdparty_id = $this->Doliwoo->settings->dolibarr_generic_id; + $thirdparty_id = $this->settings->dolibarr_generic_id; } else { $thirdparty_id = get_user_meta( $user_id, 'dolibarr_id', true ); } @@ -95,7 +97,7 @@ public function dolibarr_create_order() { $this->create_order_lines( $order ); - $soap_client->createOrder( $this->Doliwoo->ws_auth, $order ); + $soap_client->createOrder( $this->ws_auth, $order ); } /** @@ -133,10 +135,7 @@ private function dolibarr_create_thirdparty_if_not_exists( * @return int $result array with the request results if it succeeds, null if there's an error */ private function dolibarr_thirdparty_exists( $user_id ) { - $this->Doliwoo = new Doliwoo(); - $this->Doliwoo->get_settings(); - $dolibarr_ws_url = $this->Doliwoo->settings->webservs_url - . 'server_thirdparty.php?wsdl'; + $dolibarr_ws_url = $this->ws_endpoint . 'server_thirdparty.php?wsdl'; // Set the WebService URL $soap_client = new SoapClient( $dolibarr_ws_url ); @@ -145,10 +144,10 @@ private function dolibarr_thirdparty_exists( $user_id ) { // if the user has a Dolibarr ID, use it, else use his company name if ( $dol_id ) { - $result = $soap_client->getThirdParty( $this->Doliwoo->ws_auth, $dol_id ); + $result = $soap_client->getThirdParty( $this->ws_auth, $dol_id ); } else { $result = $soap_client->getThirdParty( - $this->Doliwoo->ws_auth, + $this->ws_auth, '', get_user_meta( $user_id, 'billing_company', true ) ); @@ -168,10 +167,7 @@ private function dolibarr_thirdparty_exists( $user_id ) { * @return int $result the SOAP response */ public function dolibarr_create_thirdparty( $user_id ) { - $this->Doliwoo = new Doliwoo(); - $this->Doliwoo->get_settings(); - - $dolibarr_ws_url = $this->Doliwoo->settings->webservs_url . 'server_thirdparty.php?wsdl'; + $dolibarr_ws_url = $this->ws_endpoint . 'server_thirdparty.php?wsdl'; // Set the WebService URL $soap_client = new SoapClient( null, @@ -204,7 +200,7 @@ public function dolibarr_create_thirdparty( $user_id ) { $new_thirdparty->phone = get_user_meta( $user_id, 'billing_phone', true ); $new_thirdparty->email = get_user_meta( $user_id, 'billing_email', true ); - $result = $soap_client->createThirdParty( $this->Doliwoo->ws_auth, $new_thirdparty ); + $result = $soap_client->createThirdParty( $this->ws_auth, $new_thirdparty ); return $result; } @@ -247,16 +243,12 @@ private function create_order_lines( $order ) { * @return void */ public function dolibarr_import_products() { - $this->taxes = new WC_Tax_Doliwoo(); - $this->Doliwoo = new Doliwoo(); - $this->Doliwoo->get_settings(); - // FIXME: protect executions if settings are not yet completed // Set the WebService URL try { $soap_client = new SoapClient( - $this->Doliwoo->settings->webservs_url . 'server_productorservice.php?wsdl' + $this->ws_endpoint . 'server_productorservice.php?wsdl' ); } catch ( SoapFault $exception ) { $this->logger->add( 'doliwoo', $exception->getMessage() ); @@ -267,8 +259,8 @@ public function dolibarr_import_products() { // Get all products that are meant to be displayed on the website $result = $soap_client->getProductsForCategory( - $this->Doliwoo->ws_auth, - $this->Doliwoo->settings->dolibarr_category_id + $this->ws_auth, + $this->settings->dolibarr_category_id ); if ( 'OK' == $result['result']->result_code ) { @@ -373,11 +365,8 @@ private function import_product_images( $dolibarr_product, $post_id ) { private function get_product_image( stdClass $dolibarr_product, $post_id ) { - $this->Doliwoo = new Doliwoo(); - $this->Doliwoo->get_settings(); - $soap_client = new SoapClient( - $this->Doliwoo->settings->webservs_url . 'server_other.php?wsdl' + $this->ws_endpoint . 'server_other.php?wsdl' ); $file_array = array(); @@ -386,7 +375,7 @@ private function get_product_image( foreach ( $dolibarr_product->images as $images ) { // Get the image from Dolibarr $result = $soap_client->getDocument( - $this->Doliwoo->ws_auth, + $this->ws_auth, 'product', $dolibarr_product->dir . $images->photo ); @@ -413,4 +402,18 @@ private function get_product_image( return $attach_ids; } + + /** + * Set settings in a more useable form + */ + public function update_settings() { + $this->ws_endpoint = $this->settings->dolibarr_ws_endpoint; + $this->ws_auth = array( + 'sourceapplication' => $this->settings->sourceapplication, + 'dolibarrkey' => $this->settings->dolibarr_key, + 'login' => $this->settings->dolibarr_login, + 'password' => $this->settings->dolibarr_password, + 'entity' => $this->settings->dolibarr_entity, + ); + } } diff --git a/includes/settings.php b/includes/settings.php index 6afff14..d573ef8 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -30,7 +30,7 @@ */ class WC_Integration_Doliwoo_Settings extends WC_Integration { /** @var string The Dolibarr webservice URL */ - public $webservs_url; + public $dolibarr_ws_endpoint; /** @var string WordPress pseudo cron update delay */ public $delay_update; @@ -72,7 +72,7 @@ public function __construct() { $this->init_settings(); // Define user set variables - $this->webservs_url = $this->get_option( 'webservs_url' ); + $this->dolibarr_ws_endpoint = $this->get_option( 'dolibarr_ws_endpoint' ); $this->delay_update = $this->get_option( 'delay_update' ); $this->dolibarr_key = $this->get_option( 'dolibarr_key' ); $this->sourceapplication = $this->get_option( 'sourceapplication' ); @@ -83,7 +83,6 @@ public function __construct() { $this->dolibarr_generic_id = $this->get_option( 'dolibarr_generic_id' ); // Get Webservice infos - $endpoint = $this->webservs_url; $ws_auth = array( 'dolibarrkey' => $this->dolibarr_key, 'sourceapplication' => $this->sourceapplication, @@ -91,7 +90,7 @@ public function __construct() { 'password' => $this->dolibarr_password, 'entity' => $this->dolibarr_entity, ); - $this->test_webservice( $endpoint, $ws_auth ); + $this->test_webservice( $this->dolibarr_ws_endpoint, $ws_auth ); // Actions add_action( @@ -120,7 +119,7 @@ public function init_form_fields() { 'desc_tip' => false, 'default' => 'WooCommerce', ), - 'webservs_url' => array( + 'dolibarr_ws_endpoint' => array( 'title' => __( 'URL', 'doliwoo' ), 'description' => __( 'Enter Dolibarr webservices root URL (i.e. https://mydolibarr.com/webservices)', @@ -183,10 +182,10 @@ public function init_form_fields() { 'desc_tip' => false, 'default' => '', ), - 'dolibarr_version' => array( - 'title' => __( 'Dolibarr version', 'doliwoo' ), - 'description' => __( 'If the webservice communication is OK, it displays your Dolibarr version' ), - 'type' => 'info', + 'dolibarr_version' => array( + 'title' => __( 'Dolibarr version', 'doliwoo' ), + 'description' => __( 'If the webservice communication is OK, it displays your Dolibarr version' ), + 'type' => 'info', ), ); } @@ -246,7 +245,7 @@ protected function generate_info_html( $key, $data ) { * * @return string The form value */ - public function validate_webservs_url_field( $key ) { + public function validate_dolibarr_ws_endpoint_field( $key ) { $value = $_POST[ $this->plugin_id . $this->id . '_' . $key ]; // Make sure we use HTTPS @@ -277,9 +276,9 @@ public function validate_webservs_url_field( $key ) { * @return array Sanitized settings */ public function sanitize_settings( $settings ) { - // TODO: Check Dolibarr version and compatibility + // Check Dolibarr version and compatibility - $endpoint = $settings['webservs_url']; + $endpoint = $settings['dolibarr_ws_endpoint']; $ws_auth = array( 'dolibarrkey' => $settings['dolibarr_key'], 'sourceapplication' => $settings['sourceapplication'], @@ -300,6 +299,11 @@ public function sanitize_settings( $settings ) { * @return void */ public function display_errors( ) { + if( ! $this->errors ) { + // Nothing to do + return; + } + foreach ( $this->errors as $key => $value ) { ?>
@@ -311,6 +315,9 @@ public function display_errors( ) {
errors ); } /** From 052b97308d8c8008d4d1306a2a27f3600d932013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 27 Feb 2015 17:54:59 +0100 Subject: [PATCH 48/88] Code quality --- includes/settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/settings.php b/includes/settings.php index d573ef8..f3d4523 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -299,7 +299,7 @@ public function sanitize_settings( $settings ) { * @return void */ public function display_errors( ) { - if( ! $this->errors ) { + if( empty( $this->errors ) ) { // Nothing to do return; } From d43106cf5512c964bd2053cedf38342c6278adb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 27 Feb 2015 17:57:28 +0100 Subject: [PATCH 49/88] Fixed coding style --- includes/settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/settings.php b/includes/settings.php index f3d4523..68c62b1 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -299,7 +299,7 @@ public function sanitize_settings( $settings ) { * @return void */ public function display_errors( ) { - if( empty( $this->errors ) ) { + if ( empty( $this->errors ) ) { // Nothing to do return; } From 0e1f43f3a06e8d838f1fdac2aabf8ec94898c0fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 27 Feb 2015 18:09:57 +0100 Subject: [PATCH 50/88] Added missing SKU, note and manage stock information to products --- includes/class-dolibarr-soap-elements.php | 91 +++++++++++++++++++++++ includes/class-dolibarr.php | 18 +++-- includes/settings.php | 4 +- 3 files changed, 104 insertions(+), 9 deletions(-) diff --git a/includes/class-dolibarr-soap-elements.php b/includes/class-dolibarr-soap-elements.php index dadbc1f..447e3ce 100644 --- a/includes/class-dolibarr-soap-elements.php +++ b/includes/class-dolibarr-soap-elements.php @@ -26,12 +26,18 @@ * SOAP orders representation */ class DolibarrOrder { + /** @var string */ + public $id; + /** @var int */ public $thirdparty_id; + /** @var string ISO 8601 */ public $date; + /** @var int */ public $status; + /** @var DolibarrOrderLine[] */ public $lines; } @@ -79,6 +85,9 @@ class DolibarrOrderLine { * SOAP third parties representation */ class DolibarrThirdparty { + /** @var string */ + public $id; + /** @var string */ public $ref; @@ -118,3 +127,85 @@ class DolibarrThirdparty { /** @var string */ public $firstname; } + +/** + * Class DolibarrProduct + * + * SOAP products representation + */ +class DolibarrProduct { + /** @var string */ + public $id; + + /** @var string */ + public $ref; + + /** @var string */ + public $type; + + /** @var string */ + public $label; + + /** @var string */ + public $description; + + /** @var string */ + public $date_creation; + + /** @var string */ + public $date_modification; + + /** @var string */ + public $note; + + /** @var string */ + public $status_tobuy; + + /** @var string */ + public $status_tosell; + + /** @var string */ + public $barcode_type; + + /** @var string */ + public $country_id; + + /** @var string */ + public $country_code; + + /** @var string */ + public $price_net; + + /** @var string */ + public $price; + + /** @var string */ + public $price_min_net; + + /** @var string */ + public $price_min; + + /** @var string */ + public $price_base_type; + + /** @var string */ + public $vat_rate; + + /** @var string */ + public $vat_npr; + + /** @var string */ + public $localtax1_tx; + + /** @var string */ + public $localtax2_tx; + + /** @var string */ + public $stock_real; + + /** @var string */ + public $dir; + + /** @var array */ + public $images; +} diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 1ccf8d9..f2f90f7 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -263,8 +263,10 @@ public function dolibarr_import_products() { $this->settings->dolibarr_category_id ); - if ( 'OK' == $result['result']->result_code ) { - $dolibarr_products = $result['products']; + /** @var DolibarrProduct[] $dolibarr_products */ + $dolibarr_products = $result['products']; + + if ( 'OK' == $result['result']->result_code && $dolibarr_products ) { foreach ( $dolibarr_products as $dolibarr_product ) { if ( $this->dolibarr_product_exists( $dolibarr_product->id ) ) { $post_id = 0; @@ -290,6 +292,8 @@ public function dolibarr_import_products() { // Post metas management add_post_meta( $post_id, 'dolibarr_id', $dolibarr_product->id, true ); add_post_meta( $post_id, 'dolibarr_type', $dolibarr_product->type, true ); + update_post_meta( $post_id, '_sku', $dolibarr_product->ref ); + update_post_meta( $post_id, '_purchase_note', $dolibarr_product->note ); update_post_meta( $post_id, '_regular_price', $dolibarr_product->price_net ); update_post_meta( $post_id, '_sale_price', $dolibarr_product->price_net ); update_post_meta( $post_id, '_price', $dolibarr_product->price_net ); @@ -299,12 +303,14 @@ public function dolibarr_import_products() { '_tax_class', $this->taxes->get_tax_class( $dolibarr_product->vat_rate ) ); + update_post_meta( $post_id, '_manage_stock', 'no' ); // Stock management if ( 'yes' == get_option( 'woocommerce_manage_stock' ) ) { if ( 0 < $dolibarr_product->stock_real ) { update_post_meta( $post_id, '_stock_status', 'instock' ); update_post_meta( $post_id, '_stock', $dolibarr_product->stock_real ); + update_post_meta( $post_id, '_manage_stock', 'yes' ); } } @@ -341,7 +347,7 @@ private function dolibarr_product_exists( $dolibarr_id ) { /** * Import Dolibarr product images * - * @param StdClass $dolibarr_product The Dolibarr product + * @param DolibarrProduct $dolibarr_product The Dolibarr product * @param int $post_id The WooCommerce product */ private function import_product_images( $dolibarr_product, $post_id ) { @@ -357,14 +363,12 @@ private function import_product_images( $dolibarr_product, $post_id ) { /** * Webservice calls to get the product's images * - * @param stdClass $dolibarr_product SOAP product object + * @param DolibarrProduct $dolibarr_product SOAP product object * @param int $post_id WooCommerce product ID * * @return int[] Attachment IDs */ - private function get_product_image( - stdClass $dolibarr_product, $post_id - ) { + private function get_product_image( $dolibarr_product, $post_id ) { $soap_client = new SoapClient( $this->ws_endpoint . 'server_other.php?wsdl' ); diff --git a/includes/settings.php b/includes/settings.php index 68c62b1..7456eb5 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -324,8 +324,8 @@ public function display_errors( ) { * Check that the webservice works. * Tests endpoint, authentication and actual response * - * @param $endpoint - * @param $ws_auth + * @param string $endpoint The webservice endpoint URL + * @param string[] $ws_auth The webservice authentication array */ private function test_webservice( $endpoint, $ws_auth ) { // Check that the server is available From 6aedd92235bc95d94359d7786910d5cc14295a6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 27 Feb 2015 18:41:24 +0100 Subject: [PATCH 51/88] Update existing products! --- includes/class-dolibarr.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index f2f90f7..0413ee7 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -268,8 +268,15 @@ public function dolibarr_import_products() { if ( 'OK' == $result['result']->result_code && $dolibarr_products ) { foreach ( $dolibarr_products as $dolibarr_product ) { - if ( $this->dolibarr_product_exists( $dolibarr_product->id ) ) { - $post_id = 0; + $existing_product = $this->dolibarr_product_exists( $dolibarr_product->id ); + if ( $existing_product ) { + // Update the product + $post = array( + 'ID' => $existing_product->ID, + 'post_title' => $dolibarr_product->label, + 'post_content' => $dolibarr_product->description, + ); + $post_id = wp_update_post( $post ); } else { $post = array( 'post_title' => $dolibarr_product->label, @@ -331,7 +338,7 @@ public function dolibarr_import_products() { * * @param int $dolibarr_id ID of a product in Dolibarr * - * @return bool $exists + * @return WP_POST */ private function dolibarr_product_exists( $dolibarr_id ) { $args = array( @@ -341,7 +348,7 @@ private function dolibarr_product_exists( $dolibarr_id ) { ); $query = new WP_Query( $args ); - return $query->have_posts(); + return $query->post; } /** From a482f62f902c796cb318a2b0d84494b2c5015b49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 27 Feb 2015 18:41:44 +0100 Subject: [PATCH 52/88] Don't add product image to the gallery --- includes/class-dolibarr.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 0413ee7..20cffda 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -360,11 +360,11 @@ private function dolibarr_product_exists( $dolibarr_id ) { private function import_product_images( $dolibarr_product, $post_id ) { $image_attachment_ids = $this->get_product_image( $dolibarr_product, $post_id ); + // Use the first image as the product thumbnail + update_post_meta( $post_id, '_thumbnail_id', array_shift( $image_attachment_ids ) ); + // Fill the image gallery update_post_meta( $post_id, '_product_image_gallery', implode( ',', $image_attachment_ids ) ); - - // Use the first image as the product thumbnail - update_post_meta( $post_id, '_thumbnail_id', $image_attachment_ids[0] ); } /** From fa3d40314eb68f4372b8123b7970d40dc7f3649a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 27 Feb 2015 18:50:49 +0100 Subject: [PATCH 53/88] Factorised code and ignored product not for sale --- includes/class-dolibarr.php | 90 ++++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 36 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 20cffda..c57f298 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -268,6 +268,11 @@ public function dolibarr_import_products() { if ( 'OK' == $result['result']->result_code && $dolibarr_products ) { foreach ( $dolibarr_products as $dolibarr_product ) { + if ( 0 == $dolibarr_product->status_tosell ) { + // This product is not for sale, let's skip it. + continue; + } + $existing_product = $this->dolibarr_product_exists( $dolibarr_product->id ); if ( $existing_product ) { // Update the product @@ -278,6 +283,7 @@ public function dolibarr_import_products() { ); $post_id = wp_update_post( $post ); } else { + // Create a new product $post = array( 'post_title' => $dolibarr_product->label, 'post_content' => $dolibarr_product->description, @@ -293,42 +299,8 @@ public function dolibarr_import_products() { $this->logger->add( 'doliwoo', $post_id->get_error_message() ); } - if ( 0 < $post_id && ! is_wp_error( $post_id ) ) { - /** @var int $post_id */ - - // Post metas management - add_post_meta( $post_id, 'dolibarr_id', $dolibarr_product->id, true ); - add_post_meta( $post_id, 'dolibarr_type', $dolibarr_product->type, true ); - update_post_meta( $post_id, '_sku', $dolibarr_product->ref ); - update_post_meta( $post_id, '_purchase_note', $dolibarr_product->note ); - update_post_meta( $post_id, '_regular_price', $dolibarr_product->price_net ); - update_post_meta( $post_id, '_sale_price', $dolibarr_product->price_net ); - update_post_meta( $post_id, '_price', $dolibarr_product->price_net ); - update_post_meta( $post_id, '_visibility', 'visible' ); - update_post_meta( - $post_id, - '_tax_class', - $this->taxes->get_tax_class( $dolibarr_product->vat_rate ) - ); - update_post_meta( $post_id, '_manage_stock', 'no' ); - - // Stock management - if ( 'yes' == get_option( 'woocommerce_manage_stock' ) ) { - if ( 0 < $dolibarr_product->stock_real ) { - update_post_meta( $post_id, '_stock_status', 'instock' ); - update_post_meta( $post_id, '_stock', $dolibarr_product->stock_real ); - update_post_meta( $post_id, '_manage_stock', 'yes' ); - } - } - - // Product images management - if ( $dolibarr_product->images ) { - $this->import_product_images( $dolibarr_product, $post_id ); - } - - // Cleanup - wc_delete_product_transients( $post_id ); - } + $this->update_product_attributes( $dolibarr_product, $post_id ); + } } } @@ -351,6 +323,52 @@ private function dolibarr_product_exists( $dolibarr_id ) { return $query->post; } + + /** + * Update the product attributes + * + * @param DolibarrProduct $dolibarr_product The dolibarr product + * @param int $post_id The woocommerce product ID + */ + private function update_product_attributes( $dolibarr_product, $post_id ) { + if ( 0 < $post_id && ! is_wp_error( $post_id ) ) { + /** @var int $post_id */ + + // Post metas management + add_post_meta( $post_id, 'dolibarr_id', $dolibarr_product->id, true ); + add_post_meta( $post_id, 'dolibarr_type', $dolibarr_product->type, true ); + update_post_meta( $post_id, '_sku', $dolibarr_product->ref ); + update_post_meta( $post_id, '_purchase_note', $dolibarr_product->note ); + update_post_meta( $post_id, '_regular_price', $dolibarr_product->price_net ); + update_post_meta( $post_id, '_sale_price', $dolibarr_product->price_net ); + update_post_meta( $post_id, '_price', $dolibarr_product->price_net ); + update_post_meta( $post_id, '_visibility', 'visible' ); + update_post_meta( + $post_id, + '_tax_class', + $this->taxes->get_tax_class( $dolibarr_product->vat_rate ) + ); + update_post_meta( $post_id, '_manage_stock', 'no' ); + + // Stock management + if ( 'yes' == get_option( 'woocommerce_manage_stock' ) ) { + if ( 0 < $dolibarr_product->stock_real ) { + update_post_meta( $post_id, '_stock_status', 'instock' ); + update_post_meta( $post_id, '_stock', $dolibarr_product->stock_real ); + update_post_meta( $post_id, '_manage_stock', 'yes' ); + } + } + + // Product images management + if ( $dolibarr_product->images ) { + $this->import_product_images( $dolibarr_product, $post_id ); + } + + // Cleanup + wc_delete_product_transients( $post_id ); + } + } + /** * Import Dolibarr product images * From 8abce895fe5548ab52d1ac6b61530e2fad041e40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 27 Feb 2015 18:56:23 +0100 Subject: [PATCH 54/88] Move type check outside method --- includes/class-dolibarr.php | 69 +++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index c57f298..6819219 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -299,8 +299,10 @@ public function dolibarr_import_products() { $this->logger->add( 'doliwoo', $post_id->get_error_message() ); } - $this->update_product_attributes( $dolibarr_product, $post_id ); - + if ( 0 < $post_id && ! is_wp_error( $post_id ) ) { + /** @var int $post_id */ + $this->update_product_attributes( $dolibarr_product, $post_id ); + } } } } @@ -331,42 +333,41 @@ private function dolibarr_product_exists( $dolibarr_id ) { * @param int $post_id The woocommerce product ID */ private function update_product_attributes( $dolibarr_product, $post_id ) { - if ( 0 < $post_id && ! is_wp_error( $post_id ) ) { - /** @var int $post_id */ - - // Post metas management - add_post_meta( $post_id, 'dolibarr_id', $dolibarr_product->id, true ); - add_post_meta( $post_id, 'dolibarr_type', $dolibarr_product->type, true ); - update_post_meta( $post_id, '_sku', $dolibarr_product->ref ); - update_post_meta( $post_id, '_purchase_note', $dolibarr_product->note ); - update_post_meta( $post_id, '_regular_price', $dolibarr_product->price_net ); - update_post_meta( $post_id, '_sale_price', $dolibarr_product->price_net ); - update_post_meta( $post_id, '_price', $dolibarr_product->price_net ); - update_post_meta( $post_id, '_visibility', 'visible' ); - update_post_meta( - $post_id, - '_tax_class', - $this->taxes->get_tax_class( $dolibarr_product->vat_rate ) - ); - update_post_meta( $post_id, '_manage_stock', 'no' ); - - // Stock management - if ( 'yes' == get_option( 'woocommerce_manage_stock' ) ) { - if ( 0 < $dolibarr_product->stock_real ) { - update_post_meta( $post_id, '_stock_status', 'instock' ); - update_post_meta( $post_id, '_stock', $dolibarr_product->stock_real ); - update_post_meta( $post_id, '_manage_stock', 'yes' ); - } - } - // Product images management - if ( $dolibarr_product->images ) { - $this->import_product_images( $dolibarr_product, $post_id ); + /** @var int $post_id */ + + // Post metas management + add_post_meta( $post_id, 'dolibarr_id', $dolibarr_product->id, true ); + add_post_meta( $post_id, 'dolibarr_type', $dolibarr_product->type, true ); + update_post_meta( $post_id, '_sku', $dolibarr_product->ref ); + update_post_meta( $post_id, '_purchase_note', $dolibarr_product->note ); + update_post_meta( $post_id, '_regular_price', $dolibarr_product->price_net ); + update_post_meta( $post_id, '_sale_price', $dolibarr_product->price_net ); + update_post_meta( $post_id, '_price', $dolibarr_product->price_net ); + update_post_meta( $post_id, '_visibility', 'visible' ); + update_post_meta( + $post_id, + '_tax_class', + $this->taxes->get_tax_class( $dolibarr_product->vat_rate ) + ); + update_post_meta( $post_id, '_manage_stock', 'no' ); + + // Stock management + if ( 'yes' == get_option( 'woocommerce_manage_stock' ) ) { + if ( 0 < $dolibarr_product->stock_real ) { + update_post_meta( $post_id, '_stock_status', 'instock' ); + update_post_meta( $post_id, '_stock', $dolibarr_product->stock_real ); + update_post_meta( $post_id, '_manage_stock', 'yes' ); } + } - // Cleanup - wc_delete_product_transients( $post_id ); + // Product images management + if ( $dolibarr_product->images ) { + $this->import_product_images( $dolibarr_product, $post_id ); } + + // Cleanup + wc_delete_product_transients( $post_id ); } /** From d60b44bbbe43d51791e6fe3d34ed352f3708f058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 27 Feb 2015 19:10:24 +0100 Subject: [PATCH 55/88] Added author URI --- doliwoo.php | 1 + includes/class-dolibarr.php | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/doliwoo.php b/doliwoo.php index 39cadcb..1c94216 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -5,6 +5,7 @@ Description: Dolibarr WooCommerce integration Version: 0.0.2-alpha Author: GPC.solutions +Author URI: http://gpcsolutions.fr License: GPL-3.0+ Text Domain: doliwoo Domain Path: /languages diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 6819219..459bf60 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -325,7 +325,6 @@ private function dolibarr_product_exists( $dolibarr_id ) { return $query->post; } - /** * Update the product attributes * From aa1982bc9c3a2190fddbf71a4b5f4cd13fa6a605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 2 Mar 2015 15:40:19 +0100 Subject: [PATCH 56/88] SOAP parameters cleanup --- includes/class-dolibarr.php | 41 ++++++++++++++++++++++--------------- includes/settings.php | 8 ++++---- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 459bf60..078dcc1 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -40,6 +40,15 @@ class Dolibarr { /** @var array Webservice authentication parameters */ private $ws_auth; + /** + * Dolibarr webservices endpoints + */ + const ORDER_ENDPOINT = 'server_order.php'; + const THIRDPARTY_ENDPOINT = 'server_thirdparty.php'; + const PRODUCT_ENDPOINT = 'server_productorservice.php'; + const OTHER_ENDPOINT = 'server_other.php'; + const WSDL_MODE = '?wsdl'; + /** * Init parameters */ @@ -62,14 +71,14 @@ public function set_woocommerce() { * @return void */ public function dolibarr_create_order() { - - $dolibarr_ws_url = $this->ws_endpoint . 'server_order.php?wsdl'; - - // Set the WebService URL + /* + * We use non WSDL mode to workaround Dolibarr broken declaration marking all the fields as required + * when they're not. + */ $soap_client = new SoapClient( null, array( - 'location' => $dolibarr_ws_url, + 'location' => $this->ws_endpoint . self::ORDER_ENDPOINT, 'uri' => 'http://www.dolibar.org/ns/', ) ); @@ -135,10 +144,9 @@ private function dolibarr_create_thirdparty_if_not_exists( * @return int $result array with the request results if it succeeds, null if there's an error */ private function dolibarr_thirdparty_exists( $user_id ) { - $dolibarr_ws_url = $this->ws_endpoint . 'server_thirdparty.php?wsdl'; - - // Set the WebService URL - $soap_client = new SoapClient( $dolibarr_ws_url ); + $soap_client = new SoapClient( + $this->ws_endpoint . self::THIRDPARTY_ENDPOINT . self::WSDL_MODE + ); $dol_id = get_user_meta( $user_id, 'dolibarr_id', true ); @@ -167,12 +175,14 @@ private function dolibarr_thirdparty_exists( $user_id ) { * @return int $result the SOAP response */ public function dolibarr_create_thirdparty( $user_id ) { - $dolibarr_ws_url = $this->ws_endpoint . 'server_thirdparty.php?wsdl'; - // Set the WebService URL + /* + * We use non WSDL mode to workaround Dolibarr broken declaration marking all the fields as required + * when they're not. + */ $soap_client = new SoapClient( null, array( - 'location' => $dolibarr_ws_url, + 'location' => $this->ws_endpoint . self::THIRDPARTY_ENDPOINT, 'uri' => 'http://www.dolibar.org/ns/', ) ); @@ -243,12 +253,9 @@ private function create_order_lines( $order ) { * @return void */ public function dolibarr_import_products() { - // FIXME: protect executions if settings are not yet completed - - // Set the WebService URL try { $soap_client = new SoapClient( - $this->ws_endpoint . 'server_productorservice.php?wsdl' + $this->ws_endpoint . self::PRODUCT_ENDPOINT . self::WSDL_MODE ); } catch ( SoapFault $exception ) { $this->logger->add( 'doliwoo', $exception->getMessage() ); @@ -395,7 +402,7 @@ private function import_product_images( $dolibarr_product, $post_id ) { */ private function get_product_image( $dolibarr_product, $post_id ) { $soap_client = new SoapClient( - $this->ws_endpoint . 'server_other.php?wsdl' + $this->ws_endpoint . self::OTHER_ENDPOINT . self::WSDL_MODE ); $file_array = array(); diff --git a/includes/settings.php b/includes/settings.php index 7456eb5..c1b96fb 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -258,7 +258,7 @@ public function validate_dolibarr_ws_endpoint_field( $key ) { // Check that the server is available try { - new SoapClient( $value . 'server_other.php?wsdl' ); + new SoapClient( $value . Dolibarr::OTHER_ENDPOINT . Dolibarr::WSDL_MODE ); } catch ( SoapFault $exc ) { $this->errors[] = __( 'The webservice is not available. Please check the URL.' ); } @@ -324,13 +324,13 @@ public function display_errors( ) { * Check that the webservice works. * Tests endpoint, authentication and actual response * - * @param string $endpoint The webservice endpoint URL + * @param string $webservice The webservice URL * @param string[] $ws_auth The webservice authentication array */ - private function test_webservice( $endpoint, $ws_auth ) { + private function test_webservice( $webservice, $ws_auth ) { // Check that the server is available try { - $soapclient = new SoapClient( $endpoint . 'server_other.php?wsdl' ); + $soapclient = new SoapClient( $webservice . Dolibarr::OTHER_ENDPOINT . Dolibarr::WSDL_MODE ); } catch ( SoapFault $exc ) { $this->errors[] = __( 'The webservice is not available. Please check the URL.' ); $this->display_errors(); From 9425c641aef28f532ca4a5b94528c0364e4fb255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 2 Mar 2015 16:25:52 +0100 Subject: [PATCH 57/88] Translations update --- languages/doliwoo.pot | 54 +++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index 42ec800..b548f61 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-27 15:36:15+00:00\n" +"POT-Creation-Date: 2015-03-02 15:25:28+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -52,105 +52,105 @@ msgstr "" msgid "Dolibarr webservices access" msgstr "" -#: includes/settings.php:117 +#: includes/settings.php:116 msgid "Source application" msgstr "" -#: includes/settings.php:118 +#: includes/settings.php:117 msgid "How this application will identify itself to the webservice." msgstr "" -#: includes/settings.php:124 +#: includes/settings.php:123 msgid "URL" msgstr "" -#: includes/settings.php:125 +#: includes/settings.php:124 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "" -#: includes/settings.php:134 +#: includes/settings.php:133 msgid "Delay" msgstr "" -#: includes/settings.php:135 +#: includes/settings.php:134 msgid "Choose the automatic update frequency" msgstr "" -#: includes/settings.php:139 +#: includes/settings.php:138 msgid "Once Hourly" msgstr "" -#: includes/settings.php:140 +#: includes/settings.php:139 msgid "Twice Daily" msgstr "" -#: includes/settings.php:141 +#: includes/settings.php:140 msgid "Once Daily" msgstr "" -#: includes/settings.php:146 +#: includes/settings.php:145 msgid "Key" msgstr "" -#: includes/settings.php:147 +#: includes/settings.php:146 msgid "Enter your Dolibarr webservices key" msgstr "" -#: includes/settings.php:153 +#: includes/settings.php:152 msgid "User login" msgstr "" -#: includes/settings.php:154 +#: includes/settings.php:153 msgid "Dolibarr actions will be done as this user" msgstr "" -#: includes/settings.php:160 +#: includes/settings.php:159 msgid "User password" msgstr "" -#: includes/settings.php:166 +#: includes/settings.php:165 msgid "Entity" msgstr "" -#: includes/settings.php:167 +#: includes/settings.php:166 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "" -#: includes/settings.php:173 +#: includes/settings.php:172 msgid "Products category" msgstr "" -#: includes/settings.php:174 +#: includes/settings.php:173 msgid "" "The ID of the products category you want to automatically import products " "from." msgstr "" -#: includes/settings.php:180 +#: includes/settings.php:179 msgid "Generic thirdparty" msgstr "" -#: includes/settings.php:181 +#: includes/settings.php:180 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "" -#: includes/settings.php:187 +#: includes/settings.php:186 msgid "Dolibarr version" msgstr "" -#: includes/settings.php:188 +#: includes/settings.php:187 msgid "If the webservice communication is OK, it displays your Dolibarr version" msgstr "" -#: includes/settings.php:254 +#: includes/settings.php:253 msgid "The protocol to use is https://" msgstr "" -#: includes/settings.php:264 includes/settings.php:328 +#: includes/settings.php:263 includes/settings.php:335 msgid "The webservice is not available. Please check the URL." msgstr "" @@ -168,4 +168,8 @@ msgstr "" #. Author of the plugin/theme msgid "GPC.solutions" +msgstr "" + +#. Author URI of the plugin/theme +msgid "http://gpcsolutions.fr" msgstr "" \ No newline at end of file From 733781e9018deb870fe24d82a2b385d44adb37ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 2 Mar 2015 16:54:17 +0100 Subject: [PATCH 58/88] Catch and log all webservice exceptions --- includes/class-dolibarr.php | 75 +++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 23 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 078dcc1..14ef2b1 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -75,14 +75,22 @@ public function dolibarr_create_order() { * We use non WSDL mode to workaround Dolibarr broken declaration marking all the fields as required * when they're not. */ - $soap_client = new SoapClient( - null, - array( - 'location' => $this->ws_endpoint . self::ORDER_ENDPOINT, - 'uri' => 'http://www.dolibar.org/ns/', - ) - ); - $order = new DolibarrOrder(); + try { + $soap_client = new SoapClient( + null, + array( + 'location' => $this->ws_endpoint . self::ORDER_ENDPOINT, + 'uri' => 'http://www.dolibar.org/ns/', + ) + ); + } catch ( SoapFault $exception ) { + $this->logger->add( 'doliwoo', $exception->getMessage() ); + + // Do nothing. + return; + } + + $order = new DolibarrOrder(); // Fill this array with all data required to create an order in Dolibarr $user_id = get_current_user_id(); @@ -139,14 +147,21 @@ private function dolibarr_create_thirdparty_if_not_exists( /** * Checks if a thirdparty exists in Dolibarr * - * @param int $user_id wordpress ID of an user + * @param int $user_id Wordpress ID of an user * - * @return int $result array with the request results if it succeeds, null if there's an error + * @return int $result Array with the request results if it succeeds, null if there's an error */ private function dolibarr_thirdparty_exists( $user_id ) { - $soap_client = new SoapClient( - $this->ws_endpoint . self::THIRDPARTY_ENDPOINT . self::WSDL_MODE - ); + try { + $soap_client = new SoapClient( + $this->ws_endpoint . self::THIRDPARTY_ENDPOINT . self::WSDL_MODE + ); + } catch ( SoapFault $exception ) { + $this->logger->add( 'doliwoo', $exception->getMessage() ); + + // Do nothing. + return null; + } $dol_id = get_user_meta( $user_id, 'dolibarr_id', true ); @@ -179,13 +194,20 @@ public function dolibarr_create_thirdparty( $user_id ) { * We use non WSDL mode to workaround Dolibarr broken declaration marking all the fields as required * when they're not. */ - $soap_client = new SoapClient( - null, - array( - 'location' => $this->ws_endpoint . self::THIRDPARTY_ENDPOINT, - 'uri' => 'http://www.dolibar.org/ns/', - ) - ); + try { + $soap_client = new SoapClient( + null, + array( + 'location' => $this->ws_endpoint . self::THIRDPARTY_ENDPOINT, + 'uri' => 'http://www.dolibar.org/ns/', + ) + ); + } catch ( SoapFault $exception ) { + $this->logger->add( 'doliwoo', $exception->getMessage() ); + + // Do nothing. + return null; + } $ref = get_user_meta( $user_id, 'billing_company', true ); $individual = 0; @@ -401,9 +423,16 @@ private function import_product_images( $dolibarr_product, $post_id ) { * @return int[] Attachment IDs */ private function get_product_image( $dolibarr_product, $post_id ) { - $soap_client = new SoapClient( - $this->ws_endpoint . self::OTHER_ENDPOINT . self::WSDL_MODE - ); + try { + $soap_client = new SoapClient( + $this->ws_endpoint . self::OTHER_ENDPOINT . self::WSDL_MODE + ); + } catch ( SoapFault $exception ) { + $this->logger->add( 'doliwoo', $exception->getMessage() ); + + // Do nothing. + return null; + } $file_array = array(); $attach_ids = array(); From 34f21ed62b3c5a57dc4b5426a4fdb1d74d81fa72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 2 Mar 2015 16:56:18 +0100 Subject: [PATCH 59/88] Don't touch translations as part of the default grunt task --- Gruntfile.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Gruntfile.js b/Gruntfile.js index 7b88012..8324626 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -171,7 +171,6 @@ module.exports = function (grunt) { grunt.registerTask('default', [ 'test', - 'potupdate', 'sync-json', 'wp_readme_to_markdown' ]); From 3ec713899ce72aa537a5cc03347038c05a8e8cb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 2 Mar 2015 17:53:32 +0100 Subject: [PATCH 60/88] Removed old unused grunt code --- Gruntfile.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 8324626..2118808 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -105,10 +105,6 @@ module.exports = function (grunt) { '!vendor/**' ], dest: 'release/<%= pkg.version %>/' - }, - dist: { - src: 'readme.txt', - dest: 'README.md' } }, compress: { From bde46c9d38a74b268ee32235725b14df24a10cc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 3 Mar 2015 14:30:07 +0100 Subject: [PATCH 61/88] Missing required field --- includes/settings.php | 1 + 1 file changed, 1 insertion(+) diff --git a/includes/settings.php b/includes/settings.php index c1b96fb..fb4059e 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -186,6 +186,7 @@ public function init_form_fields() { 'title' => __( 'Dolibarr version', 'doliwoo' ), 'description' => __( 'If the webservice communication is OK, it displays your Dolibarr version' ), 'type' => 'info', + 'desc_tip' => false, ), ); } From 638a61f5b151d338936515d65312ceeacdfc266a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 3 Mar 2015 14:30:19 +0100 Subject: [PATCH 62/88] Catch webservice response errors and log them where appropriate --- includes/class-dolibarr.php | 71 +++++++++++++++++++++++++++---------- includes/settings.php | 12 +++++-- 2 files changed, 63 insertions(+), 20 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 14ef2b1..fa7dd56 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -114,7 +114,14 @@ public function dolibarr_create_order() { $this->create_order_lines( $order ); - $soap_client->createOrder( $this->ws_auth, $order ); + try { + $soap_client->createOrder( $this->ws_auth, $order ); + } catch ( SoapFault $exception ) { + $this->logger->add( 'doliwoo', $exception->getMessage() ); + + // Do nothing. + return; + } } /** @@ -164,17 +171,24 @@ private function dolibarr_thirdparty_exists( $user_id ) { } $dol_id = get_user_meta( $user_id, 'dolibarr_id', true ); + $dol_ref = get_user_meta( $user_id, 'billing_company', true ); - // if the user has a Dolibarr ID, use it, else use his company name + // If the user has a Dolibarr ID, use it, else search his company name if ( $dol_id ) { - $result = $soap_client->getThirdParty( $this->ws_auth, $dol_id ); + $dol_ref = null; } else { - $result = $soap_client->getThirdParty( - $this->ws_auth, - '', - get_user_meta( $user_id, 'billing_company', true ) - ); + $dol_id = ''; + } + + try { + $result = $soap_client->getThirdParty( $this->ws_auth, $dol_id, $dol_ref ); + } catch ( SoapFault $exception ) { + $this->logger->add( 'doliwoo', $exception->getMessage() ); + + // Do nothing. + return null; } + if ( $result ) { return $result; } else { @@ -232,7 +246,14 @@ public function dolibarr_create_thirdparty( $user_id ) { $new_thirdparty->phone = get_user_meta( $user_id, 'billing_phone', true ); $new_thirdparty->email = get_user_meta( $user_id, 'billing_email', true ); - $result = $soap_client->createThirdParty( $this->ws_auth, $new_thirdparty ); + try { + $result = $soap_client->createThirdParty( $this->ws_auth, $new_thirdparty ); + } catch ( SoapFault $exception ) { + $this->logger->add( 'doliwoo', $exception->getMessage() ); + + // Do nothing. + return null; + } return $result; } @@ -287,10 +308,17 @@ public function dolibarr_import_products() { } // Get all products that are meant to be displayed on the website - $result = $soap_client->getProductsForCategory( - $this->ws_auth, - $this->settings->dolibarr_category_id - ); + try { + $result = $soap_client->getProductsForCategory( + $this->ws_auth, + $this->settings->dolibarr_category_id + ); + } catch ( SoapFault $exception ) { + $this->logger->add( 'doliwoo', $exception->getMessage() ); + + // Do nothing. + return; + } /** @var DolibarrProduct[] $dolibarr_products */ $dolibarr_products = $result['products']; @@ -439,11 +467,18 @@ private function get_product_image( $dolibarr_product, $post_id ) { foreach ( $dolibarr_product->images as $images ) { // Get the image from Dolibarr - $result = $soap_client->getDocument( - $this->ws_auth, - 'product', - $dolibarr_product->dir . $images->photo - ); + try { + $result = $soap_client->getDocument( + $this->ws_auth, + 'product', + $dolibarr_product->dir . $images->photo + ); + } catch ( SoapFault $exception ) { + $this->logger->add( 'doliwoo', $exception->getMessage() ); + + // Do nothing. + continue; + } if ( 'OK' == $result['result']->result_code ) { $file_array['name'] = $images->photo; diff --git a/includes/settings.php b/includes/settings.php index fb4059e..a27bf20 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -331,7 +331,7 @@ public function display_errors( ) { private function test_webservice( $webservice, $ws_auth ) { // Check that the server is available try { - $soapclient = new SoapClient( $webservice . Dolibarr::OTHER_ENDPOINT . Dolibarr::WSDL_MODE ); + $soap_client = new SoapClient( $webservice . Dolibarr::OTHER_ENDPOINT . Dolibarr::WSDL_MODE ); } catch ( SoapFault $exc ) { $this->errors[] = __( 'The webservice is not available. Please check the URL.' ); $this->display_errors(); @@ -340,7 +340,15 @@ private function test_webservice( $webservice, $ws_auth ) { return; } - $response = $soapclient->getVersions( $ws_auth ); + try { + $response = $soap_client->getVersions( $ws_auth ); + } catch ( SoapFault $exc ) { + $this->errors[] = 'Webservice error:' . $exc->getMessage(); + $this->display_errors(); + + // No point in doing the next test + return; + } if ( 'OK' == $response['result']->result_code ) { $this->dolibarr_version = explode( '.', $response['dolibarr'] ); From 9e33d0739361cb20d1ad6069d205f29fddb6573e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 3 Mar 2015 14:43:45 +0100 Subject: [PATCH 63/88] Better ignore for PHP grunt tasks --- Gruntfile.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 2118808..4937cdf 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -14,14 +14,15 @@ module.exports = function (grunt) { files_std: [ '*.php', '**/*.php', + '!assets/**/*.php', '!node_modules/**/*.php', - '!wordpress/**/*.php', - '!vendor/**/*.php' + '!release/**/*.php', + '!vendor/**/*.php', + '!wordpress/**/*.php' ], // Standard file match files: '<%= paths.php.files_std %>', // Dynamic file match exclude: [ 'assets/.*', - 'wordpress/.*', 'composer.json', 'composer.lock', 'CONTRIBUTING.md', @@ -36,7 +37,8 @@ module.exports = function (grunt) { '.sensiolabs.yml', '.travis.yml', '.tx', - 'vendor/.*' + 'vendor/.*', + 'wordpress/.*' ] // PHP regex match } }, From 04f257c24b5580c0bfd2e93e3fbe02dbc335c661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 3 Mar 2015 14:45:45 +0100 Subject: [PATCH 64/88] Fixed small comparison issues --- includes/class-dolibarr.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index fa7dd56..144f7a0 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -323,7 +323,7 @@ public function dolibarr_import_products() { /** @var DolibarrProduct[] $dolibarr_products */ $dolibarr_products = $result['products']; - if ( 'OK' == $result['result']->result_code && $dolibarr_products ) { + if ( 'OK' == $result['result']->result_code && ! empty( $dolibarr_products ) ) { foreach ( $dolibarr_products as $dolibarr_product ) { if ( 0 == $dolibarr_product->status_tosell ) { // This product is not for sale, let's skip it. @@ -418,7 +418,7 @@ private function update_product_attributes( $dolibarr_product, $post_id ) { } // Product images management - if ( $dolibarr_product->images ) { + if ( ! empty( $dolibarr_product->images ) ) { $this->import_product_images( $dolibarr_product, $post_id ); } From 4616c4fb7495fe813c59fd146179ebebc4df5427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 3 Mar 2015 15:29:05 +0100 Subject: [PATCH 65/88] Added settings shortcut --- doliwoo.php | 25 +++++++++++++++++++++++++ languages/doliwoo.pot | 6 +++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/doliwoo.php b/doliwoo.php index 1c94216..8d38c06 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -103,6 +103,11 @@ public function __construct() { // Initialize plugin settings add_action( 'plugins_loaded', array( $this, 'init' ) ); + // Add a link to settings + add_filter( + 'plugin_action_links_' . plugin_basename( __FILE__ ), array( $this, 'plugin_action_links' ) + ); + // Setup dolibarr environment add_action( 'woocommerce_loaded', array( &$this->dolibarr, 'set_woocommerce' ) ); add_action( 'woocommerce_init', array( $this, 'set_settings' ) ); @@ -212,6 +217,26 @@ public function reschedule_import_products() { wp_schedule_event( time(), $delay, 'import_products' ); } + /** + * Show action links on the plugin screen. + * + * @param mixed $links Plugin Action links + * @return array + */ + public static function plugin_action_links( $links ) { + $action_links = array( + 'settings' => '' . esc_attr( + __( 'Settings', 'woocommerce' ) + ) . '', + ); + + return array_merge( $action_links, $links ); + } + /** * Set Dolibarr settings from WooCommerce integration settings * diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index b548f61..ac50aa7 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-02 15:25:28+00:00\n" +"POT-Creation-Date: 2015-03-03 13:49:19+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -146,11 +146,11 @@ msgstr "" msgid "If the webservice communication is OK, it displays your Dolibarr version" msgstr "" -#: includes/settings.php:253 +#: includes/settings.php:254 msgid "The protocol to use is https://" msgstr "" -#: includes/settings.php:263 includes/settings.php:335 +#: includes/settings.php:264 includes/settings.php:336 msgid "The webservice is not available. Please check the URL." msgstr "" From d8862bdefbecfe36da4e85fd977e38146a634648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 3 Mar 2015 16:13:17 +0100 Subject: [PATCH 66/88] Translations update --- languages/doliwoo-ca.po | 62 +++++++++++++++++++++++--------------- languages/doliwoo-es_ES.po | 62 +++++++++++++++++++++++--------------- languages/doliwoo-fr_FR.po | 62 +++++++++++++++++++++++--------------- languages/doliwoo.pot | 10 +++++- 4 files changed, 120 insertions(+), 76 deletions(-) diff --git a/languages/doliwoo-ca.po b/languages/doliwoo-ca.po index ab1546f..2201c24 100644 --- a/languages/doliwoo-ca.po +++ b/languages/doliwoo-ca.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-27 15:36:15+00:00\n" -"PO-Revision-Date: 2015-02-27 15:38+0000\n" +"POT-Creation-Date: 2015-03-03 15:12:59+00:00\n" +"PO-Revision-Date: 2015-03-03 15:13+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/doliwoo/language/ca/)\n" "MIME-Version: 1.0\n" @@ -24,6 +24,14 @@ msgstr "" "X-Poedit-SourceCharset: UTF-8\n" "X-Textdomain-Support: yes\n" +#: doliwoo.php:231 +msgid "View WooCommerce Settings" +msgstr "" + +#: doliwoo.php:233 +msgid "Settings" +msgstr "" + #: includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" @@ -52,97 +60,97 @@ msgstr "Paràmetres de DoliWoo" msgid "Dolibarr webservices access" msgstr "Accés webservice de Dolibarr" -#: includes/settings.php:117 +#: includes/settings.php:116 msgid "Source application" msgstr "Aplicació font" -#: includes/settings.php:118 +#: includes/settings.php:117 msgid "How this application will identify itself to the webservice." msgstr "Com s'identificarà aquesta aplicació al webservice." -#: includes/settings.php:124 +#: includes/settings.php:123 msgid "URL" msgstr "URL" -#: includes/settings.php:125 +#: includes/settings.php:124 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "Entra la URL arrel del webservice de Dolibarr (i.e. https://mydolibarr.com/webservices)" -#: includes/settings.php:134 +#: includes/settings.php:133 msgid "Delay" msgstr "Retard" -#: includes/settings.php:135 +#: includes/settings.php:134 msgid "Choose the automatic update frequency" msgstr "Escull la freqüència de l'actualització automàtica" -#: includes/settings.php:139 +#: includes/settings.php:138 msgid "Once Hourly" msgstr "Un cop cada hora" -#: includes/settings.php:140 +#: includes/settings.php:139 msgid "Twice Daily" msgstr "Dos cops al dia" -#: includes/settings.php:141 +#: includes/settings.php:140 msgid "Once Daily" msgstr "Un cop al dia" -#: includes/settings.php:146 +#: includes/settings.php:145 msgid "Key" msgstr "Clau" -#: includes/settings.php:147 +#: includes/settings.php:146 msgid "Enter your Dolibarr webservices key" msgstr "Entra la teva clau del webservice de Dolibarr" -#: includes/settings.php:153 +#: includes/settings.php:152 msgid "User login" msgstr "Usuari d'inici de sessió" -#: includes/settings.php:154 +#: includes/settings.php:153 msgid "Dolibarr actions will be done as this user" msgstr "Les accions de Dolibarr es duran a terme amb aquest usuari" -#: includes/settings.php:160 +#: includes/settings.php:159 msgid "User password" msgstr "Paraula de pas de l'usuari" -#: includes/settings.php:166 +#: includes/settings.php:165 msgid "Entity" msgstr "Entitat (empresa)" -#: includes/settings.php:167 +#: includes/settings.php:166 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "Si utilitzes multiempresa, l'ID de l'entitat (empresa) que vols integrar. Déixa-ho amb 1 si no és així." -#: includes/settings.php:173 +#: includes/settings.php:172 msgid "Products category" msgstr "" -#: includes/settings.php:174 +#: includes/settings.php:173 msgid "" "The ID of the products category you want to automatically import products " "from." msgstr "La ID de la categoria de producte de la que vols importar productes automàticament." -#: includes/settings.php:180 +#: includes/settings.php:179 msgid "Generic thirdparty" msgstr "Tercer per defecte" -#: includes/settings.php:181 +#: includes/settings.php:180 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "La ID del tercer per defecte que serà utilitzat en les comandes anònimes." -#: includes/settings.php:187 +#: includes/settings.php:186 msgid "Dolibarr version" msgstr "" -#: includes/settings.php:188 +#: includes/settings.php:187 msgid "" "If the webservice communication is OK, it displays your Dolibarr version" msgstr "" @@ -151,7 +159,7 @@ msgstr "" msgid "The protocol to use is https://" msgstr "El protocol per utilitzar és https://" -#: includes/settings.php:264 includes/settings.php:328 +#: includes/settings.php:264 includes/settings.php:336 msgid "The webservice is not available. Please check the URL." msgstr "El servei webservice no està disponible. Siusplau, comprova la URL." @@ -170,3 +178,7 @@ msgstr "Dolibarr WooCommerce integration" #. Author of the plugin/theme msgid "GPC.solutions" msgstr "GPC.solutions" + +#. Author URI of the plugin/theme +msgid "http://gpcsolutions.fr" +msgstr "" diff --git a/languages/doliwoo-es_ES.po b/languages/doliwoo-es_ES.po index c2fa05b..0b7d459 100644 --- a/languages/doliwoo-es_ES.po +++ b/languages/doliwoo-es_ES.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-27 15:36:15+00:00\n" -"PO-Revision-Date: 2015-02-27 15:39+0000\n" +"POT-Creation-Date: 2015-03-03 15:12:59+00:00\n" +"PO-Revision-Date: 2015-03-03 15:13+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/doliwoo/language/es_ES/)\n" "MIME-Version: 1.0\n" @@ -24,6 +24,14 @@ msgstr "" "X-Poedit-SourceCharset: UTF-8\n" "X-Textdomain-Support: yes\n" +#: doliwoo.php:231 +msgid "View WooCommerce Settings" +msgstr "" + +#: doliwoo.php:233 +msgid "Settings" +msgstr "" + #: includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" @@ -52,97 +60,97 @@ msgstr "Configuración de DoliWoo" msgid "Dolibarr webservices access" msgstr "Acceso a webservices Dolibarr" -#: includes/settings.php:117 +#: includes/settings.php:116 msgid "Source application" msgstr "Aplicación fuente" -#: includes/settings.php:118 +#: includes/settings.php:117 msgid "How this application will identify itself to the webservice." msgstr "Cómo se identificará esta aplicación al webservice." -#: includes/settings.php:124 +#: includes/settings.php:123 msgid "URL" msgstr "URL" -#: includes/settings.php:125 +#: includes/settings.php:124 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "Entra la URL raíz del webservice de Dolibarr (ej.: https://mydolibarr.com/webservices)" -#: includes/settings.php:134 +#: includes/settings.php:133 msgid "Delay" msgstr "Retraso" -#: includes/settings.php:135 +#: includes/settings.php:134 msgid "Choose the automatic update frequency" msgstr "Escoje la frecuencia de actualización automática" -#: includes/settings.php:139 +#: includes/settings.php:138 msgid "Once Hourly" msgstr "Una vez cada hora" -#: includes/settings.php:140 +#: includes/settings.php:139 msgid "Twice Daily" msgstr "Dos veces al día" -#: includes/settings.php:141 +#: includes/settings.php:140 msgid "Once Daily" msgstr "Una vez al día" -#: includes/settings.php:146 +#: includes/settings.php:145 msgid "Key" msgstr "Llave" -#: includes/settings.php:147 +#: includes/settings.php:146 msgid "Enter your Dolibarr webservices key" msgstr "Entra la llave del webservice de Dolibarr" -#: includes/settings.php:153 +#: includes/settings.php:152 msgid "User login" msgstr "Inicio de sesión de usuario" -#: includes/settings.php:154 +#: includes/settings.php:153 msgid "Dolibarr actions will be done as this user" msgstr "Las acciones de Dolibarr ser harán con este usuario" -#: includes/settings.php:160 +#: includes/settings.php:159 msgid "User password" msgstr "Contraseña de usuario" -#: includes/settings.php:166 +#: includes/settings.php:165 msgid "Entity" msgstr "Entidad (empresa)" -#: includes/settings.php:167 +#: includes/settings.php:166 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "Si estás usando multiempresa, el ID de la entidad que quieres integrar. Déjalo en 1 si no es así." -#: includes/settings.php:173 +#: includes/settings.php:172 msgid "Products category" msgstr "Categoría de productos" -#: includes/settings.php:174 +#: includes/settings.php:173 msgid "" "The ID of the products category you want to automatically import products " "from." msgstr "El ID de la categoría de productos de la que quieres importar productos." -#: includes/settings.php:180 +#: includes/settings.php:179 msgid "Generic thirdparty" msgstr "Tercero por defecto" -#: includes/settings.php:181 +#: includes/settings.php:180 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "El ID del tercero que será usado para los pedidos anónimos." -#: includes/settings.php:187 +#: includes/settings.php:186 msgid "Dolibarr version" msgstr "" -#: includes/settings.php:188 +#: includes/settings.php:187 msgid "" "If the webservice communication is OK, it displays your Dolibarr version" msgstr "" @@ -151,7 +159,7 @@ msgstr "" msgid "The protocol to use is https://" msgstr "El protocolo a usar es https://" -#: includes/settings.php:264 includes/settings.php:328 +#: includes/settings.php:264 includes/settings.php:336 msgid "The webservice is not available. Please check the URL." msgstr "El servicio webservice no está disponible. Por favor, comprueba la URL." @@ -170,3 +178,7 @@ msgstr "" #. Author of the plugin/theme msgid "GPC.solutions" msgstr "GPC.solutions" + +#. Author URI of the plugin/theme +msgid "http://gpcsolutions.fr" +msgstr "" diff --git a/languages/doliwoo-fr_FR.po b/languages/doliwoo-fr_FR.po index df724c1..4f4604e 100644 --- a/languages/doliwoo-fr_FR.po +++ b/languages/doliwoo-fr_FR.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-02-27 15:36:15+00:00\n" -"PO-Revision-Date: 2015-02-27 15:35+0000\n" +"POT-Creation-Date: 2015-03-03 15:12:59+00:00\n" +"PO-Revision-Date: 2015-03-03 15:13+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/language/fr_FR/)\n" "MIME-Version: 1.0\n" @@ -24,6 +24,14 @@ msgstr "" "X-Poedit-SourceCharset: UTF-8\n" "X-Textdomain-Support: yes\n" +#: doliwoo.php:231 +msgid "View WooCommerce Settings" +msgstr "" + +#: doliwoo.php:233 +msgid "Settings" +msgstr "" + #: includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "Dolibarr" @@ -52,97 +60,97 @@ msgstr "Réglages DoliWoo" msgid "Dolibarr webservices access" msgstr "Accès aux webservices Dolibarr" -#: includes/settings.php:117 +#: includes/settings.php:116 msgid "Source application" msgstr "Nom de l'application" -#: includes/settings.php:118 +#: includes/settings.php:117 msgid "How this application will identify itself to the webservice." msgstr "Comment cette application s'identifie auprès du webservice." -#: includes/settings.php:124 +#: includes/settings.php:123 msgid "URL" msgstr "URL" -#: includes/settings.php:125 +#: includes/settings.php:124 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "Entrez l'URL racine des webservices de Dolibarr (i.e. https://mydolibarr.com/webservices)" -#: includes/settings.php:134 +#: includes/settings.php:133 msgid "Delay" msgstr "Délai" -#: includes/settings.php:135 +#: includes/settings.php:134 msgid "Choose the automatic update frequency" msgstr "Choisissez la fréquence de mise à jour automatique" -#: includes/settings.php:139 +#: includes/settings.php:138 msgid "Once Hourly" msgstr "Une fois par heure" -#: includes/settings.php:140 +#: includes/settings.php:139 msgid "Twice Daily" msgstr "Deux fois par jour" -#: includes/settings.php:141 +#: includes/settings.php:140 msgid "Once Daily" msgstr "Une fois par jour" -#: includes/settings.php:146 +#: includes/settings.php:145 msgid "Key" msgstr "Clé" -#: includes/settings.php:147 +#: includes/settings.php:146 msgid "Enter your Dolibarr webservices key" msgstr "Entrez votre clé du webservices de Dolibarr" -#: includes/settings.php:153 +#: includes/settings.php:152 msgid "User login" msgstr "Identifiant utilisateur" -#: includes/settings.php:154 +#: includes/settings.php:153 msgid "Dolibarr actions will be done as this user" msgstr "Les actions de Dolibarr seront attribuées à cet utilisateur" -#: includes/settings.php:160 +#: includes/settings.php:159 msgid "User password" msgstr "Mot de passe utilisateur" -#: includes/settings.php:166 +#: includes/settings.php:165 msgid "Entity" msgstr "Entité" -#: includes/settings.php:167 +#: includes/settings.php:166 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "Si vous utilisez multi-société, l'ID de l'entité que vous souhaitez intégrer. Sinon laissez à 1." -#: includes/settings.php:173 +#: includes/settings.php:172 msgid "Products category" msgstr "Catégorie des produits" -#: includes/settings.php:174 +#: includes/settings.php:173 msgid "" "The ID of the products category you want to automatically import products " "from." msgstr "L'ID de la catégorie des produits que vous souhaitez importer automatiquement." -#: includes/settings.php:180 +#: includes/settings.php:179 msgid "Generic thirdparty" msgstr "Tiers générique" -#: includes/settings.php:181 +#: includes/settings.php:180 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "L'Id du tiers qui va être utilisé pour les commandes anonymes" -#: includes/settings.php:187 +#: includes/settings.php:186 msgid "Dolibarr version" msgstr "Version de Dolibarr" -#: includes/settings.php:188 +#: includes/settings.php:187 msgid "" "If the webservice communication is OK, it displays your Dolibarr version" msgstr "Vérifie si la communication est établie au travers du webservice et récupère la version de Dolibarr" @@ -151,7 +159,7 @@ msgstr "Vérifie si la communication est établie au travers du webservice et r msgid "The protocol to use is https://" msgstr "Le protocole à utiliser est https://" -#: includes/settings.php:264 includes/settings.php:328 +#: includes/settings.php:264 includes/settings.php:336 msgid "The webservice is not available. Please check the URL." msgstr "Le webservice n'est pas disponible. Merci de vérifier l'URL." @@ -170,3 +178,7 @@ msgstr "Intégration Dolibarr WooCommerc" #. Author of the plugin/theme msgid "GPC.solutions" msgstr "GPC.solutions" + +#. Author URI of the plugin/theme +msgid "http://gpcsolutions.fr" +msgstr "" diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index ac50aa7..694f9ea 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-03 13:49:19+00:00\n" +"POT-Creation-Date: 2015-03-03 15:12:59+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -24,6 +24,14 @@ msgstr "" "X-Poedit-Bookmarks: \n" "X-Textdomain-Support: yes\n" +#: doliwoo.php:231 +msgid "View WooCommerce Settings" +msgstr "" + +#: doliwoo.php:233 +msgid "Settings" +msgstr "" + #: includes/class-doliwoo-parameters.php:62 msgid "Dolibarr" msgstr "" From ff0e83e38d19755b23d52440f18319883076912c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 3 Mar 2015 16:14:58 +0100 Subject: [PATCH 67/88] Fixed strings --- doliwoo.php | 4 ++-- includes/settings.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doliwoo.php b/doliwoo.php index 8d38c06..5c90a00 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -228,9 +228,9 @@ public static function plugin_action_links( $links ) { 'settings' => '' . esc_attr( - __( 'Settings', 'woocommerce' ) + __( 'Settings', 'doliwoo' ) ) . '', ); diff --git a/includes/settings.php b/includes/settings.php index a27bf20..53cda92 100644 --- a/includes/settings.php +++ b/includes/settings.php @@ -64,7 +64,7 @@ class WC_Integration_Doliwoo_Settings extends WC_Integration { */ public function __construct() { $this->id = 'doliwoo'; - $this->method_title = __( 'DoliWoo Settings', 'doliwoo' ); + $this->method_title = __( 'DoliWoo', 'doliwoo' ); $this->method_description = __( 'Dolibarr webservices access', 'doliwoo' ); // Load the settings From c0788bee8af11555cf23f474e28cd57d22250991 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 3 Mar 2015 16:17:04 +0100 Subject: [PATCH 68/88] Translations sync --- languages/doliwoo-ca.po | 16 ++++++---------- languages/doliwoo-es_ES.po | 16 ++++++---------- languages/doliwoo-fr_FR.po | 16 ++++++---------- languages/doliwoo.pot | 12 ++++-------- 4 files changed, 22 insertions(+), 38 deletions(-) diff --git a/languages/doliwoo-ca.po b/languages/doliwoo-ca.po index 2201c24..cc6ccab 100644 --- a/languages/doliwoo-ca.po +++ b/languages/doliwoo-ca.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-03 15:12:59+00:00\n" -"PO-Revision-Date: 2015-03-03 15:13+0000\n" +"POT-Creation-Date: 2015-03-03 15:15:10+00:00\n" +"PO-Revision-Date: 2015-03-03 15:15+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/doliwoo/language/ca/)\n" "MIME-Version: 1.0\n" @@ -25,7 +25,7 @@ msgstr "" "X-Textdomain-Support: yes\n" #: doliwoo.php:231 -msgid "View WooCommerce Settings" +msgid "View DoliWoo Settings" msgstr "" #: doliwoo.php:233 @@ -52,9 +52,9 @@ msgstr "ID de l'usuari Dolibarr" msgid "VAT" msgstr "IVA" -#: includes/settings.php:67 -msgid "DoliWoo Settings" -msgstr "Paràmetres de DoliWoo" +#. Plugin Name of the plugin/theme +msgid "DoliWoo" +msgstr "DoliWoo" #: includes/settings.php:68 msgid "Dolibarr webservices access" @@ -163,10 +163,6 @@ msgstr "El protocol per utilitzar és https://" msgid "The webservice is not available. Please check the URL." msgstr "El servei webservice no està disponible. Siusplau, comprova la URL." -#. Plugin Name of the plugin/theme -msgid "DoliWoo" -msgstr "DoliWoo" - #. Plugin URI of the plugin/theme msgid "http://gpcsolutions.github.io/doliwoo" msgstr "http://gpcsolutions.github.io/doliwoo" diff --git a/languages/doliwoo-es_ES.po b/languages/doliwoo-es_ES.po index 0b7d459..4d62c65 100644 --- a/languages/doliwoo-es_ES.po +++ b/languages/doliwoo-es_ES.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-03 15:12:59+00:00\n" -"PO-Revision-Date: 2015-03-03 15:13+0000\n" +"POT-Creation-Date: 2015-03-03 15:15:10+00:00\n" +"PO-Revision-Date: 2015-03-03 15:15+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/doliwoo/language/es_ES/)\n" "MIME-Version: 1.0\n" @@ -25,7 +25,7 @@ msgstr "" "X-Textdomain-Support: yes\n" #: doliwoo.php:231 -msgid "View WooCommerce Settings" +msgid "View DoliWoo Settings" msgstr "" #: doliwoo.php:233 @@ -52,9 +52,9 @@ msgstr "ID de usuario Dolibarr" msgid "VAT" msgstr "IVA" -#: includes/settings.php:67 -msgid "DoliWoo Settings" -msgstr "Configuración de DoliWoo" +#. Plugin Name of the plugin/theme +msgid "DoliWoo" +msgstr "DoliWoo" #: includes/settings.php:68 msgid "Dolibarr webservices access" @@ -163,10 +163,6 @@ msgstr "El protocolo a usar es https://" msgid "The webservice is not available. Please check the URL." msgstr "El servicio webservice no está disponible. Por favor, comprueba la URL." -#. Plugin Name of the plugin/theme -msgid "DoliWoo" -msgstr "DoliWoo" - #. Plugin URI of the plugin/theme msgid "http://gpcsolutions.github.io/doliwoo" msgstr "http://gpcsolutions.github.io/doliwoo" diff --git a/languages/doliwoo-fr_FR.po b/languages/doliwoo-fr_FR.po index 4f4604e..b73ec3a 100644 --- a/languages/doliwoo-fr_FR.po +++ b/languages/doliwoo-fr_FR.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-03 15:12:59+00:00\n" -"PO-Revision-Date: 2015-03-03 15:13+0000\n" +"POT-Creation-Date: 2015-03-03 15:15:10+00:00\n" +"PO-Revision-Date: 2015-03-03 15:15+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/language/fr_FR/)\n" "MIME-Version: 1.0\n" @@ -25,7 +25,7 @@ msgstr "" "X-Textdomain-Support: yes\n" #: doliwoo.php:231 -msgid "View WooCommerce Settings" +msgid "View DoliWoo Settings" msgstr "" #: doliwoo.php:233 @@ -52,9 +52,9 @@ msgstr "Identifiant Utilisateur Dolibarr" msgid "VAT" msgstr "TVA" -#: includes/settings.php:67 -msgid "DoliWoo Settings" -msgstr "Réglages DoliWoo" +#. Plugin Name of the plugin/theme +msgid "DoliWoo" +msgstr "DoliWoo" #: includes/settings.php:68 msgid "Dolibarr webservices access" @@ -163,10 +163,6 @@ msgstr "Le protocole à utiliser est https://" msgid "The webservice is not available. Please check the URL." msgstr "Le webservice n'est pas disponible. Merci de vérifier l'URL." -#. Plugin Name of the plugin/theme -msgid "DoliWoo" -msgstr "DoliWoo" - #. Plugin URI of the plugin/theme msgid "http://gpcsolutions.github.io/doliwoo" msgstr "http://gpcsolutions.github.io/doliwoo" diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index 694f9ea..82d1c68 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-03 15:12:59+00:00\n" +"POT-Creation-Date: 2015-03-03 15:16:08+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -25,7 +25,7 @@ msgstr "" "X-Textdomain-Support: yes\n" #: doliwoo.php:231 -msgid "View WooCommerce Settings" +msgid "View DoliWoo Settings" msgstr "" #: doliwoo.php:233 @@ -52,8 +52,8 @@ msgstr "" msgid "VAT" msgstr "" -#: includes/settings.php:67 -msgid "DoliWoo Settings" +#. Plugin Name of the plugin/theme +msgid "DoliWoo" msgstr "" #: includes/settings.php:68 @@ -162,10 +162,6 @@ msgstr "" msgid "The webservice is not available. Please check the URL." msgstr "" -#. Plugin Name of the plugin/theme -msgid "DoliWoo" -msgstr "" - #. Plugin URI of the plugin/theme msgid "http://gpcsolutions.github.io/doliwoo" msgstr "" From 7177439269449050e203ab74a2708a41b0b37040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Wed, 4 Mar 2015 16:33:54 +0100 Subject: [PATCH 69/88] Improved namings and documentation --- doliwoo.php | 18 ++++++------- includes/class-dolibarr-soap-elements.php | 27 +++++++++---------- includes/class-dolibarr.php | 22 ++++++++------- ...{settings.php => class-wc-integration.php} | 10 ++++--- ...woo-parameters.php => class-wc-params.php} | 11 +++++--- ...class-tax-doliwoo.php => class-wc-tax.php} | 13 +++++---- 6 files changed, 56 insertions(+), 45 deletions(-) rename includes/{settings.php => class-wc-integration.php} (98%) rename includes/{class-doliwoo-parameters.php => class-wc-params.php} (94%) rename includes/{class-tax-doliwoo.php => class-wc-tax.php} (95%) diff --git a/doliwoo.php b/doliwoo.php index 5c90a00..4fedf11 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -5,7 +5,7 @@ Description: Dolibarr WooCommerce integration Version: 0.0.2-alpha Author: GPC.solutions -Author URI: http://gpcsolutions.fr +Author URI: https://gpcsolutions.fr License: GPL-3.0+ Text Domain: doliwoo Domain Path: /languages @@ -30,7 +30,7 @@ */ /** - * DoliWoo plugin + * DoliWoo plugin. * * Dolibarr WooCommerce integration. * @@ -72,8 +72,6 @@ if ( ! class_exists( 'Doliwoo' ) ) { /** - * Class Doliwoo - * * Dolibarr Integration for WooCommerce */ class Doliwoo { @@ -91,13 +89,13 @@ class Doliwoo { public $dolibarr; /** - * Constructor + * DoliWoo plugin */ public function __construct() { - require_once 'includes/class-doliwoo-parameters.php'; + require_once 'includes/class-wc-params.php'; require_once 'includes/class-dolibarr.php'; - $this->woocommerce_parameters = new Woocomerce_Parameters(); + $this->woocommerce_parameters = new Doliwoo_WC_Params(); $this->dolibarr = new Dolibarr(); // Initialize plugin settings @@ -161,16 +159,16 @@ public function __construct() { */ public function init() { - require_once 'includes/class-tax-doliwoo.php'; + require_once 'includes/class-wc-tax.php'; // Checks if WooCommerce is installed. if ( class_exists( 'WC_Integration' ) ) { // Include our integration class. - require_once 'includes/settings.php'; + require_once 'includes/class-wc-integration.php'; // Register the integration. add_filter( 'woocommerce_integrations', array( $this, 'add_integration' ) ); } - $this->dolibarr->taxes = new WC_Tax_Doliwoo(); + $this->dolibarr->taxes = new Doliwoo_WC_Tax(); } /** diff --git a/includes/class-dolibarr-soap-elements.php b/includes/class-dolibarr-soap-elements.php index 447e3ce..3495677 100644 --- a/includes/class-dolibarr-soap-elements.php +++ b/includes/class-dolibarr-soap-elements.php @@ -17,15 +17,18 @@ */ /** - * SOAP reprentations hinting classes + * SOAP reprentations hinting classes. + * + * Just hinting pseudo classes to ease development. + * These element can be used for or returned by Dolibarr SOAP requests. + * + * @package DoliWoo */ /** - * Class DolibarrOrder - * - * SOAP orders representation + * SOAP orders representation. */ -class DolibarrOrder { +class Dolibarr_Order { /** @var string */ public $id; @@ -38,16 +41,14 @@ class DolibarrOrder { /** @var int */ public $status; - /** @var DolibarrOrderLine[] */ + /** @var Dolibarr_Order_Line[] */ public $lines; } /** - * Class DolibarrOrderLine - * * SOAP order lines representation */ -class DolibarrOrderLine { +class Dolibarr_Order_Line { /** @var int */ public $type; @@ -80,11 +81,9 @@ class DolibarrOrderLine { } /** - * Class DolibarrThirdparty - * * SOAP third parties representation */ -class DolibarrThirdparty { +class Dolibarr_Thirdparty { /** @var string */ public $id; @@ -129,11 +128,9 @@ class DolibarrThirdparty { } /** - * Class DolibarrProduct - * * SOAP products representation */ -class DolibarrProduct { +class Dolibarr_Product { /** @var string */ public $id; diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 144f7a0..03aacdb 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -18,11 +18,15 @@ */ /** - * Dolibarr interactions + * Dolibarr interactions. + * + * All Dolibarr interactions triggerred by WooCommerce are managed here. + * + * @package DoliWoo */ /** - * Class Dolibarr + * Dolibarr interactions. */ class Dolibarr { /** @var WC_Logger Logging */ @@ -90,7 +94,7 @@ public function dolibarr_create_order() { return; } - $order = new DolibarrOrder(); + $order = new Dolibarr_Order(); // Fill this array with all data required to create an order in Dolibarr $user_id = get_current_user_id(); @@ -231,7 +235,7 @@ public function dolibarr_create_thirdparty( $user_id ) { $individual = 1; } - $new_thirdparty = new DolibarrThirdparty(); + $new_thirdparty = new Dolibarr_Thirdparty(); $new_thirdparty->ref = $ref; // Company name or individual last name $new_thirdparty->individual = $individual; // Individual @@ -270,7 +274,7 @@ private function create_order_lines( $order ) { /** @var WC_Product $woocommerce_product */ $woocommerce_product = $product['data']; - $line = new DolibarrOrderLine(); + $line = new Dolibarr_Order_Line(); $line->type = intval( get_post_meta( $product['product_id'], 'dolibarr_type', true ) ); $line->desc = $woocommerce_product->post->post_content; $line->product_id = intval( get_post_meta( $product['product_id'], 'dolibarr_id', true ) ); @@ -320,7 +324,7 @@ public function dolibarr_import_products() { return; } - /** @var DolibarrProduct[] $dolibarr_products */ + /** @var Dolibarr_Product[] $dolibarr_products */ $dolibarr_products = $result['products']; if ( 'OK' == $result['result']->result_code && ! empty( $dolibarr_products ) ) { @@ -385,7 +389,7 @@ private function dolibarr_product_exists( $dolibarr_id ) { /** * Update the product attributes * - * @param DolibarrProduct $dolibarr_product The dolibarr product + * @param Dolibarr_Product $dolibarr_product The dolibarr product * @param int $post_id The woocommerce product ID */ private function update_product_attributes( $dolibarr_product, $post_id ) { @@ -429,7 +433,7 @@ private function update_product_attributes( $dolibarr_product, $post_id ) { /** * Import Dolibarr product images * - * @param DolibarrProduct $dolibarr_product The Dolibarr product + * @param Dolibarr_Product $dolibarr_product The Dolibarr product * @param int $post_id The WooCommerce product */ private function import_product_images( $dolibarr_product, $post_id ) { @@ -445,7 +449,7 @@ private function import_product_images( $dolibarr_product, $post_id ) { /** * Webservice calls to get the product's images * - * @param DolibarrProduct $dolibarr_product SOAP product object + * @param Dolibarr_Product $dolibarr_product SOAP product object * @param int $post_id WooCommerce product ID * * @return int[] Attachment IDs diff --git a/includes/settings.php b/includes/class-wc-integration.php similarity index 98% rename from includes/settings.php rename to includes/class-wc-integration.php index 53cda92..3e3c8f8 100644 --- a/includes/settings.php +++ b/includes/class-wc-integration.php @@ -18,17 +18,21 @@ */ /** - * DoliWoo settings + * DoliWoo settings. * * WooCommerce settings integration. + * + * @package DoliWoo */ if ( ! class_exists( 'WC_Integration_Doliwoo_Settings' ) ) : /** * Doliwoo settings WooCommerce integration + * + * @see WC_Integration */ - class WC_Integration_Doliwoo_Settings extends WC_Integration { + class WC_Integration_Doliwoo extends WC_Integration { /** @var string The Dolibarr webservice URL */ public $dolibarr_ws_endpoint; @@ -195,7 +199,7 @@ public function init_form_fields() { * Display Dolibarr version and compatibility * * @param string $key Settings key - * @param array $data Setting valupe + * @param array $data Setting values * * @return string HTML to display */ diff --git a/includes/class-doliwoo-parameters.php b/includes/class-wc-params.php similarity index 94% rename from includes/class-doliwoo-parameters.php rename to includes/class-wc-params.php index b3cc5a7..0717e43 100644 --- a/includes/class-doliwoo-parameters.php +++ b/includes/class-wc-params.php @@ -18,13 +18,18 @@ */ /** - * Parameters management + * Parameters management. + * + * We store some properties to link imported Dolibarr elements to their WooCommerce counterparts. + * This class ties everything together. + * + * @package DoliWoo */ /** - * Class Woocomerce_Parameters + * Parameters management */ -Class Woocomerce_Parameters { +Class Doliwoo_WC_Params { /** * Save Dolibarr ID field on edit user pages diff --git a/includes/class-tax-doliwoo.php b/includes/class-wc-tax.php similarity index 95% rename from includes/class-tax-doliwoo.php rename to includes/class-wc-tax.php index b2891d7..099af59 100644 --- a/includes/class-tax-doliwoo.php +++ b/includes/class-wc-tax.php @@ -18,15 +18,18 @@ */ /** - * DoliWoo tax management + * Tax management + * + * Dolibarr and WooCommerce tax implementations differ vastly. + * We declare specific WooCommerce tax classes and rates to be used in Dolibarr syncing. + * + * @package DoliWoo */ /** - * Class WC_Tax_Doliwoo - * - * Extend WC_Tax() to insert and update tax rates + * Tax management */ -class WC_Tax_Doliwoo extends WC_Tax { +class Doliwoo_WC_Tax extends WC_Tax { /** * Get the tax class associated with a VAT rate From 19c5dfdbc7b6153d04c24ac2167f03df0d823859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Wed, 4 Mar 2015 16:34:17 +0100 Subject: [PATCH 70/88] Automate documentation generation (PHPDocumentor) --- Gruntfile.js | 15 ++++++++++++++- package.json | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Gruntfile.js b/Gruntfile.js index 4937cdf..4141a13 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -15,6 +15,7 @@ module.exports = function (grunt) { '*.php', '**/*.php', '!assets/**/*.php', + '!docs/**/*.php', '!node_modules/**/*.php', '!release/**/*.php', '!vendor/**/*.php', @@ -26,6 +27,7 @@ module.exports = function (grunt) { 'composer.json', 'composer.lock', 'CONTRIBUTING.md', + 'docs/.*', '.git/.*', '.gitignore', '.gitmodules', @@ -61,6 +63,15 @@ module.exports = function (grunt) { src: '<%= paths.php.files %>' } }, + phpdoc: { + target: { + src: [ + 'doliwoo.php', + 'includes' + ], + dest: 'docs' + } + }, makepot: { target: { options: { @@ -93,6 +104,7 @@ module.exports = function (grunt) { '!composer.json', '!composer.lock', '!CONTRIBUTING.md', + '!docs/**', '!.git/**', '!.gitignore', '!.gitmodules', @@ -170,7 +182,8 @@ module.exports = function (grunt) { grunt.registerTask('default', [ 'test', 'sync-json', - 'wp_readme_to_markdown' + 'wp_readme_to_markdown', + 'phpdoc' ]); grunt.registerTask('test', [ diff --git a/package.json b/package.json index 8b58c23..5751efd 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "grunt-contrib-copy": "^0.7.0", "grunt-exec": "^0.4.6", "grunt-phpcs": "^0.2.3", + "grunt-phpdoc": "^0.1.1", "grunt-phplint": "0.0.5", "grunt-po2mo": "^0.1.2", "grunt-sync-json": "^0.3.1", From 112683cd2bdf5a50f5b3b9bf9fa400acf8ecc107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Wed, 4 Mar 2015 16:34:53 +0100 Subject: [PATCH 71/88] PHP Codesniffer update --- composer.lock | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index 98a8310..62a34b3 100644 --- a/composer.lock +++ b/composer.lock @@ -207,20 +207,21 @@ "packages-dev": [ { "name": "squizlabs/php_codesniffer", - "version": "2.2.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "b301c98f19414d836fdaa678648745fcca5aeb4f" + "reference": "5046b0e01c416fc2b06df961d0673c85bcdc896c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/b301c98f19414d836fdaa678648745fcca5aeb4f", - "reference": "b301c98f19414d836fdaa678648745fcca5aeb4f", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5046b0e01c416fc2b06df961d0673c85bcdc896c", + "reference": "5046b0e01c416fc2b06df961d0673c85bcdc896c", "shasum": "" }, "require": { "ext-tokenizer": "*", + "ext-xmlwriter": "*", "php": ">=5.1.2" }, "bin": [ @@ -228,6 +229,11 @@ "scripts/phpcbf" ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "classmap": [ "CodeSniffer.php", @@ -271,7 +277,7 @@ "phpcs", "standards" ], - "time": "2015-01-21 22:44:05" + "time": "2015-03-04 02:07:03" }, { "name": "wp-coding-standards/wpcs", From 9c8134d164f01901324b39a59973c523daa9dc71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Wed, 4 Mar 2015 16:39:55 +0100 Subject: [PATCH 72/88] Updated contributor documentation --- CONTRIBUTING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3b7a96d..d192e04 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -38,6 +38,8 @@ We'll integrate your contributions a few weeks before release. Documentation ------------- -The documentation is maintained on the [Wiki](https://github.com/GPCsolutions/doliwoo/wiki). +The main documentation is maintained on the [Wiki](https://github.com/GPCsolutions/doliwoo/wiki). Access is currently restricted but you can suggest edits in the [Issues](https://github.com/GPCsolutions/doliwoo/issues). + +Code documentation can be generated with ```grunt phpdoc``` and is output into the ./docs subdirectory. From 6ed63f3e42df158440af044fb9129b9a677280a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 11:27:14 +0100 Subject: [PATCH 73/88] Fixed missing renames --- doliwoo.php | 8 ++++---- includes/class-dolibarr.php | 6 +++--- includes/class-wc-integration.php | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doliwoo.php b/doliwoo.php index 4fedf11..fe4a913 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -62,7 +62,7 @@ } // Make sure the settings class is available -if ( ! class_exists( 'WC_Integration_Doliwoo_Settings' ) ) : +if ( ! class_exists( 'WC_Integration_Doliwoo' ) ) : // If WooCommerce is active if ( in_array( @@ -76,13 +76,13 @@ */ class Doliwoo { - /** @var WC_Integration_Doliwoo_Settings Doliwoo Settings */ + /** @var WC_Integration_Doliwoo Doliwoo Settings */ public $settings; /** @var array SOAP authentication parameters */ public $ws_auth = array(); - /** @var Woocomerce_Parameters custom parameters */ + /** @var Doliwoo_WC_Params custom parameters */ public $woocommerce_parameters; /** @var Dolibarr external requests */ @@ -199,7 +199,7 @@ public function deactivation() { * @return string[] WooCommerce integrations */ public function add_integration( $integrations ) { - $integrations[] = 'WC_Integration_Doliwoo_Settings'; + $integrations[] = 'WC_Integration_Doliwoo'; return $integrations; } diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 03aacdb..7e0d861 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -32,10 +32,10 @@ class Dolibarr { /** @var WC_Logger Logging */ public $logger; - /** @var WC_Integration_Doliwoo_Settings Settings */ + /** @var WC_Integration_Doliwoo Settings */ public $settings; - /** @var WC_Tax_Doliwoo WooCommerce taxes informations */ + /** @var Doliwoo_WC_Tax WooCommerce taxes informations */ public $taxes; /** @var string Webservice endpoint */ @@ -265,7 +265,7 @@ public function dolibarr_create_thirdparty( $user_id ) { /** * Create order lines * - * @param DolibarrOrder $order The order to add lines to + * @param Dolibarr_Order $order The order to add lines to */ private function create_order_lines( $order ) { $order->lines = array(); diff --git a/includes/class-wc-integration.php b/includes/class-wc-integration.php index 3e3c8f8..e372645 100644 --- a/includes/class-wc-integration.php +++ b/includes/class-wc-integration.php @@ -25,7 +25,7 @@ * @package DoliWoo */ -if ( ! class_exists( 'WC_Integration_Doliwoo_Settings' ) ) : +if ( ! class_exists( 'WC_Integration_Doliwoo' ) ) : /** * Doliwoo settings WooCommerce integration From 233331f3c0686fd968758e7a78715508d9b62cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 11:33:35 +0100 Subject: [PATCH 74/88] Better renames --- doliwoo.php | 10 +++++----- includes/class-dolibarr.php | 32 +++++++++++++++---------------- includes/class-wc-integration.php | 8 ++++---- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/doliwoo.php b/doliwoo.php index fe4a913..f331c3b 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -62,7 +62,7 @@ } // Make sure the settings class is available -if ( ! class_exists( 'WC_Integration_Doliwoo' ) ) : +if ( ! class_exists( 'Doliwoo_WC_Integration' ) ) : // If WooCommerce is active if ( in_array( @@ -76,7 +76,7 @@ */ class Doliwoo { - /** @var WC_Integration_Doliwoo Doliwoo Settings */ + /** @var Doliwoo_WC_Integration Doliwoo Settings */ public $settings; /** @var array SOAP authentication parameters */ @@ -85,7 +85,7 @@ class Doliwoo { /** @var Doliwoo_WC_Params custom parameters */ public $woocommerce_parameters; - /** @var Dolibarr external requests */ + /** @var Doliwoo_Dolibarr external requests */ public $dolibarr; /** @@ -96,7 +96,7 @@ public function __construct() { require_once 'includes/class-dolibarr.php'; $this->woocommerce_parameters = new Doliwoo_WC_Params(); - $this->dolibarr = new Dolibarr(); + $this->dolibarr = new Doliwoo_Dolibarr(); // Initialize plugin settings add_action( 'plugins_loaded', array( $this, 'init' ) ); @@ -199,7 +199,7 @@ public function deactivation() { * @return string[] WooCommerce integrations */ public function add_integration( $integrations ) { - $integrations[] = 'WC_Integration_Doliwoo'; + $integrations[] = 'Doliwoo_WC_Integration'; return $integrations; } diff --git a/includes/class-dolibarr.php b/includes/class-dolibarr.php index 7e0d861..3c07da0 100644 --- a/includes/class-dolibarr.php +++ b/includes/class-dolibarr.php @@ -28,11 +28,11 @@ /** * Dolibarr interactions. */ -class Dolibarr { +class Doliwoo_Dolibarr { /** @var WC_Logger Logging */ public $logger; - /** @var WC_Integration_Doliwoo Settings */ + /** @var Doliwoo_WC_Integration Settings */ public $settings; /** @var Doliwoo_WC_Tax WooCommerce taxes informations */ @@ -45,7 +45,7 @@ class Dolibarr { private $ws_auth; /** - * Dolibarr webservices endpoints + * Doliwoo_Dolibarr webservices endpoints */ const ORDER_ENDPOINT = 'server_order.php'; const THIRDPARTY_ENDPOINT = 'server_thirdparty.php'; @@ -70,13 +70,13 @@ public function set_woocommerce() { /** * Hooks on process_checkout() * - * While the order is processed, use the data to create a Dolibarr order via webservice + * While the order is processed, use the data to create a Doliwoo_Dolibarr order via webservice * * @return void */ public function dolibarr_create_order() { /* - * We use non WSDL mode to workaround Dolibarr broken declaration marking all the fields as required + * We use non WSDL mode to workaround Doliwoo_Dolibarr broken declaration marking all the fields as required * when they're not. */ try { @@ -96,7 +96,7 @@ public function dolibarr_create_order() { $order = new Dolibarr_Order(); - // Fill this array with all data required to create an order in Dolibarr + // Fill this array with all data required to create an order in Doliwoo_Dolibarr $user_id = get_current_user_id(); if ( '' == $user_id ) { // default to the generic user @@ -129,7 +129,7 @@ public function dolibarr_create_order() { } /** - * Creates a thirdparty in Dolibarr via webservice using WooCommerce user data, if it doesn't already exists + * Creates a thirdparty in Doliwoo_Dolibarr via webservice using WooCommerce user data, if it doesn't already exists * * @param int $user_id a Wordpress user id * @@ -156,7 +156,7 @@ private function dolibarr_create_thirdparty_if_not_exists( } /** - * Checks if a thirdparty exists in Dolibarr + * Checks if a thirdparty exists in Doliwoo_Dolibarr * * @param int $user_id Wordpress ID of an user * @@ -177,7 +177,7 @@ private function dolibarr_thirdparty_exists( $user_id ) { $dol_id = get_user_meta( $user_id, 'dolibarr_id', true ); $dol_ref = get_user_meta( $user_id, 'billing_company', true ); - // If the user has a Dolibarr ID, use it, else search his company name + // If the user has a Doliwoo_Dolibarr ID, use it, else search his company name if ( $dol_id ) { $dol_ref = null; } else { @@ -201,7 +201,7 @@ private function dolibarr_thirdparty_exists( $user_id ) { } /** - * Creates a thirdparty in Dolibarr via webservice using WooCommerce user data + * Creates a thirdparty in Doliwoo_Dolibarr via webservice using WooCommerce user data * * @param int $user_id a Wordpress user id * @@ -209,7 +209,7 @@ private function dolibarr_thirdparty_exists( $user_id ) { */ public function dolibarr_create_thirdparty( $user_id ) { /* - * We use non WSDL mode to workaround Dolibarr broken declaration marking all the fields as required + * We use non WSDL mode to workaround Doliwoo_Dolibarr broken declaration marking all the fields as required * when they're not. */ try { @@ -295,7 +295,7 @@ private function create_order_lines( $order ) { } /** - * Pull products data from Dolibarr via webservice and save it in Wordpress + * Pull products data from Doliwoo_Dolibarr via webservice and save it in Wordpress * * @return void */ @@ -371,7 +371,7 @@ public function dolibarr_import_products() { /** * Checks for the existence of a product in Wordpress database * - * @param int $dolibarr_id ID of a product in Dolibarr + * @param int $dolibarr_id ID of a product in Doliwoo_Dolibarr * * @return WP_POST */ @@ -431,9 +431,9 @@ private function update_product_attributes( $dolibarr_product, $post_id ) { } /** - * Import Dolibarr product images + * Import Doliwoo_Dolibarr product images * - * @param Dolibarr_Product $dolibarr_product The Dolibarr product + * @param Dolibarr_Product $dolibarr_product The Doliwoo_Dolibarr product * @param int $post_id The WooCommerce product */ private function import_product_images( $dolibarr_product, $post_id ) { @@ -470,7 +470,7 @@ private function get_product_image( $dolibarr_product, $post_id ) { $attach_ids = array(); foreach ( $dolibarr_product->images as $images ) { - // Get the image from Dolibarr + // Get the image from Doliwoo_Dolibarr try { $result = $soap_client->getDocument( $this->ws_auth, diff --git a/includes/class-wc-integration.php b/includes/class-wc-integration.php index e372645..e4c96c2 100644 --- a/includes/class-wc-integration.php +++ b/includes/class-wc-integration.php @@ -25,14 +25,14 @@ * @package DoliWoo */ -if ( ! class_exists( 'WC_Integration_Doliwoo' ) ) : +if ( ! class_exists( 'Doliwoo_WC_Integration' ) ) : /** * Doliwoo settings WooCommerce integration * * @see WC_Integration */ - class WC_Integration_Doliwoo extends WC_Integration { + class Doliwoo_WC_Integration extends WC_Integration { /** @var string The Dolibarr webservice URL */ public $dolibarr_ws_endpoint; @@ -263,7 +263,7 @@ public function validate_dolibarr_ws_endpoint_field( $key ) { // Check that the server is available try { - new SoapClient( $value . Dolibarr::OTHER_ENDPOINT . Dolibarr::WSDL_MODE ); + new SoapClient( $value . Doliwoo_Dolibarr::OTHER_ENDPOINT . Doliwoo_Dolibarr::WSDL_MODE ); } catch ( SoapFault $exc ) { $this->errors[] = __( 'The webservice is not available. Please check the URL.' ); } @@ -335,7 +335,7 @@ public function display_errors( ) { private function test_webservice( $webservice, $ws_auth ) { // Check that the server is available try { - $soap_client = new SoapClient( $webservice . Dolibarr::OTHER_ENDPOINT . Dolibarr::WSDL_MODE ); + $soap_client = new SoapClient( $webservice . Doliwoo_Dolibarr::OTHER_ENDPOINT . Doliwoo_Dolibarr::WSDL_MODE ); } catch ( SoapFault $exc ) { $this->errors[] = __( 'The webservice is not available. Please check the URL.' ); $this->display_errors(); From dcd25e03804c5b670009940b0ce2f1a1ca3caa7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 11:42:36 +0100 Subject: [PATCH 75/88] Don't display error when plugin is not configured --- includes/class-wc-integration.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/includes/class-wc-integration.php b/includes/class-wc-integration.php index e4c96c2..7aecd92 100644 --- a/includes/class-wc-integration.php +++ b/includes/class-wc-integration.php @@ -333,6 +333,11 @@ public function display_errors( ) { * @param string[] $ws_auth The webservice authentication array */ private function test_webservice( $webservice, $ws_auth ) { + if ( empty ($webservice) ) { + // We don't want to check unconfigured plugin + return; + } + // Check that the server is available try { $soap_client = new SoapClient( $webservice . Doliwoo_Dolibarr::OTHER_ENDPOINT . Doliwoo_Dolibarr::WSDL_MODE ); From 6eaa8ad7728ebe6d7b12644086f8207269633c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 11:43:07 +0100 Subject: [PATCH 76/88] Translation update --- languages/doliwoo.pot | 98 +++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index 82d1c68..d2bf59a 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-03 15:16:08+00:00\n" +"POT-Creation-Date: 2015-03-05 10:40:38+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -24,144 +24,144 @@ msgstr "" "X-Poedit-Bookmarks: \n" "X-Textdomain-Support: yes\n" -#: doliwoo.php:231 +#: doliwoo.php:229 msgid "View DoliWoo Settings" msgstr "" -#: doliwoo.php:233 +#: doliwoo.php:231 msgid "Settings" msgstr "" -#: includes/class-doliwoo-parameters.php:62 -msgid "Dolibarr" -msgstr "" - -#: includes/class-doliwoo-parameters.php:65 -msgid "User ID" -msgstr "" - -#: includes/class-doliwoo-parameters.php:66 -msgid "The Dolibarr ID for this user" -msgstr "" - -#: includes/class-doliwoo-parameters.php:134 -msgid "Dolibarr User ID" -msgstr "" - -#: includes/class-tax-doliwoo.php:64 -msgid "VAT" -msgstr "" - #. Plugin Name of the plugin/theme msgid "DoliWoo" msgstr "" -#: includes/settings.php:68 +#: includes/class-wc-integration.php:72 msgid "Dolibarr webservices access" msgstr "" -#: includes/settings.php:116 +#: includes/class-wc-integration.php:120 msgid "Source application" msgstr "" -#: includes/settings.php:117 +#: includes/class-wc-integration.php:121 msgid "How this application will identify itself to the webservice." msgstr "" -#: includes/settings.php:123 +#: includes/class-wc-integration.php:127 msgid "URL" msgstr "" -#: includes/settings.php:124 +#: includes/class-wc-integration.php:128 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "" -#: includes/settings.php:133 +#: includes/class-wc-integration.php:137 msgid "Delay" msgstr "" -#: includes/settings.php:134 +#: includes/class-wc-integration.php:138 msgid "Choose the automatic update frequency" msgstr "" -#: includes/settings.php:138 +#: includes/class-wc-integration.php:142 msgid "Once Hourly" msgstr "" -#: includes/settings.php:139 +#: includes/class-wc-integration.php:143 msgid "Twice Daily" msgstr "" -#: includes/settings.php:140 +#: includes/class-wc-integration.php:144 msgid "Once Daily" msgstr "" -#: includes/settings.php:145 +#: includes/class-wc-integration.php:149 msgid "Key" msgstr "" -#: includes/settings.php:146 +#: includes/class-wc-integration.php:150 msgid "Enter your Dolibarr webservices key" msgstr "" -#: includes/settings.php:152 +#: includes/class-wc-integration.php:156 msgid "User login" msgstr "" -#: includes/settings.php:153 +#: includes/class-wc-integration.php:157 msgid "Dolibarr actions will be done as this user" msgstr "" -#: includes/settings.php:159 +#: includes/class-wc-integration.php:163 msgid "User password" msgstr "" -#: includes/settings.php:165 +#: includes/class-wc-integration.php:169 msgid "Entity" msgstr "" -#: includes/settings.php:166 +#: includes/class-wc-integration.php:170 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "" -#: includes/settings.php:172 +#: includes/class-wc-integration.php:176 msgid "Products category" msgstr "" -#: includes/settings.php:173 +#: includes/class-wc-integration.php:177 msgid "" "The ID of the products category you want to automatically import products " "from." msgstr "" -#: includes/settings.php:179 +#: includes/class-wc-integration.php:183 msgid "Generic thirdparty" msgstr "" -#: includes/settings.php:180 +#: includes/class-wc-integration.php:184 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "" -#: includes/settings.php:186 +#: includes/class-wc-integration.php:190 msgid "Dolibarr version" msgstr "" -#: includes/settings.php:187 +#: includes/class-wc-integration.php:191 msgid "If the webservice communication is OK, it displays your Dolibarr version" msgstr "" -#: includes/settings.php:254 +#: includes/class-wc-integration.php:258 msgid "The protocol to use is https://" msgstr "" -#: includes/settings.php:264 includes/settings.php:336 +#: includes/class-wc-integration.php:268 includes/class-wc-integration.php:345 msgid "The webservice is not available. Please check the URL." msgstr "" +#: includes/class-wc-params.php:67 +msgid "Dolibarr" +msgstr "" + +#: includes/class-wc-params.php:70 +msgid "User ID" +msgstr "" + +#: includes/class-wc-params.php:71 +msgid "The Dolibarr ID for this user" +msgstr "" + +#: includes/class-wc-params.php:139 +msgid "Dolibarr User ID" +msgstr "" + +#: includes/class-wc-tax.php:67 +msgid "VAT" +msgstr "" + #. Plugin URI of the plugin/theme msgid "http://gpcsolutions.github.io/doliwoo" msgstr "" @@ -175,5 +175,5 @@ msgid "GPC.solutions" msgstr "" #. Author URI of the plugin/theme -msgid "http://gpcsolutions.fr" +msgid "https://gpcsolutions.fr" msgstr "" \ No newline at end of file From a6018fe7d53cec2d710eb5eea00d15aa43f55f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 2 Mar 2015 15:20:53 +0100 Subject: [PATCH 77/88] BROKEN: Italian taxes try --- includes/class-wc-tax.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/includes/class-wc-tax.php b/includes/class-wc-tax.php index 099af59..19fc6b3 100644 --- a/includes/class-wc-tax.php +++ b/includes/class-wc-tax.php @@ -108,6 +108,30 @@ public function create_custom_tax_classes() { 'tax_rate_order' => '0', 'tax_rate_class' => 'zero', ), + array( + 'tax_rate_country' => 'IT', + 'tax_rate' => '22', + 'tax_rate_name' => $tax_name, + 'tax_rate_priority' => '1', + 'tax_rate_order' => '0', + 'tax_rate_class' => '', + ), + array( + 'tax_rate_country' => 'IT', + 'tax_rate' => '10', + 'tax_rate_name' => $tax_name, + 'tax_rate_priority' => '1', + 'tax_rate_order' => '0', + 'tax_rate_class' => 'reduced', + ), + array( + 'tax_rate_country' => 'IT', + 'tax_rate' => '4', + 'tax_rate_name' => $tax_name, + 'tax_rate_priority' => '1', + 'tax_rate_order' => '0', + 'tax_rate_class' => 'super-reduced', + ), ); $db_taxes = $wpdb->get_results( From 693307fb8004b491601d01863546318b3545a2b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 12:09:24 +0100 Subject: [PATCH 78/88] Made VAT rates independent Fixes #59 in a dumb way --- includes/class-wc-tax.php | 74 ++++----------------------------------- includes/tax_rates/fr.php | 43 +++++++++++++++++++++++ includes/tax_rates/it.php | 27 ++++++++++++++ 3 files changed, 76 insertions(+), 68 deletions(-) create mode 100644 includes/tax_rates/fr.php create mode 100644 includes/tax_rates/it.php diff --git a/includes/class-wc-tax.php b/includes/class-wc-tax.php index 19fc6b3..3bae082 100644 --- a/includes/class-wc-tax.php +++ b/includes/class-wc-tax.php @@ -66,73 +66,10 @@ public function create_custom_tax_classes() { global $wpdb; $tax_name = __( 'VAT', 'doliwoo' ); - // First, create the rates - $declared_rates = array( - array( - 'tax_rate_country' => 'FR', - 'tax_rate' => '20', - 'tax_rate_name' => $tax_name, - 'tax_rate_priority' => '1', - 'tax_rate_order' => '0', - 'tax_rate_class' => '', - ), - array( - 'tax_rate_country' => 'FR', - 'tax_rate' => '10', - 'tax_rate_name' => $tax_name, - 'tax_rate_priority' => '1', - 'tax_rate_order' => '0', - 'tax_rate_class' => 'reduced', - ), - array( - 'tax_rate_country' => 'FR', - 'tax_rate' => '5', - 'tax_rate_name' => $tax_name, - 'tax_rate_priority' => '1', - 'tax_rate_order' => '0', - 'tax_rate_class' => 'super-reduced', - ), - array( - 'tax_rate_country' => 'FR', - 'tax_rate' => '2.1', - 'tax_rate_name' => $tax_name, - 'tax_rate_priority' => '1', - 'tax_rate_order' => '0', - 'tax_rate_class' => 'minimum', - ), - array( - 'tax_rate_country' => 'FR', - 'tax_rate' => '0', - 'tax_rate_name' => $tax_name, - 'tax_rate_priority' => '1', - 'tax_rate_order' => '0', - 'tax_rate_class' => 'zero', - ), - array( - 'tax_rate_country' => 'IT', - 'tax_rate' => '22', - 'tax_rate_name' => $tax_name, - 'tax_rate_priority' => '1', - 'tax_rate_order' => '0', - 'tax_rate_class' => '', - ), - array( - 'tax_rate_country' => 'IT', - 'tax_rate' => '10', - 'tax_rate_name' => $tax_name, - 'tax_rate_priority' => '1', - 'tax_rate_order' => '0', - 'tax_rate_class' => 'reduced', - ), - array( - 'tax_rate_country' => 'IT', - 'tax_rate' => '4', - 'tax_rate_name' => $tax_name, - 'tax_rate_priority' => '1', - 'tax_rate_order' => '0', - 'tax_rate_class' => 'super-reduced', - ), - ); + $default_country = substr( strtolower( get_option( 'woocommerce_default_country' ) ), 0, 2 ); + + /** @var array $declared_rates The contry's VAT rate */ + include( 'tax_rates/' . $default_country . '.php' ); $db_taxes = $wpdb->get_results( 'SELECT tax_rate_id @@ -183,9 +120,10 @@ public function create_custom_tax_classes() { // Now declare the classes $declared_classes = array_map( 'ucfirst', $declared_classes ); $classes_names = implode( "\n", $declared_classes ); + $existing_classes = get_option( 'woocommerce_tax_classes' ); update_option( 'woocommerce_tax_classes', - $classes_names + $existing_classes . $classes_names ); } diff --git a/includes/tax_rates/fr.php b/includes/tax_rates/fr.php new file mode 100644 index 0000000..fb4c6e6 --- /dev/null +++ b/includes/tax_rates/fr.php @@ -0,0 +1,43 @@ + 'FR', + 'tax_rate' => '20', + 'tax_rate_name' => $tax_name, + 'tax_rate_priority' => '1', + 'tax_rate_order' => '0', + 'tax_rate_class' => '', + ), + array( + 'tax_rate_country' => 'FR', + 'tax_rate' => '10', + 'tax_rate_name' => $tax_name, + 'tax_rate_priority' => '1', + 'tax_rate_order' => '0', + 'tax_rate_class' => 'reduced', + ), + array( + 'tax_rate_country' => 'FR', + 'tax_rate' => '5', + 'tax_rate_name' => $tax_name, + 'tax_rate_priority' => '1', + 'tax_rate_order' => '0', + 'tax_rate_class' => 'super-reduced', + ), + array( + 'tax_rate_country' => 'FR', + 'tax_rate' => '2.1', + 'tax_rate_name' => $tax_name, + 'tax_rate_priority' => '1', + 'tax_rate_order' => '0', + 'tax_rate_class' => 'minimum', + ), + array( + 'tax_rate_country' => 'FR', + 'tax_rate' => '0', + 'tax_rate_name' => $tax_name, + 'tax_rate_priority' => '1', + 'tax_rate_order' => '0', + 'tax_rate_class' => 'zero', + ), +); diff --git a/includes/tax_rates/it.php b/includes/tax_rates/it.php new file mode 100644 index 0000000..939e4b1 --- /dev/null +++ b/includes/tax_rates/it.php @@ -0,0 +1,27 @@ + 'IT', + 'tax_rate' => '22', + 'tax_rate_name' => $tax_name, + 'tax_rate_priority' => '1', + 'tax_rate_order' => '0', + 'tax_rate_class' => '', + ), + array( + 'tax_rate_country' => 'IT', + 'tax_rate' => '10', + 'tax_rate_name' => $tax_name, + 'tax_rate_priority' => '1', + 'tax_rate_order' => '0', + 'tax_rate_class' => 'reduced', + ), + array( + 'tax_rate_country' => 'IT', + 'tax_rate' => '4', + 'tax_rate_name' => $tax_name, + 'tax_rate_priority' => '1', + 'tax_rate_order' => '0', + 'tax_rate_class' => 'super-reduced', + ), +); From a4bc89c9918edf3f70198131c08f957f6300074c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 12:27:52 +0100 Subject: [PATCH 79/88] Try to only display errors on the admin Fixes #61 --- includes/class-wc-integration.php | 37 ++++++++++++++++++------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/includes/class-wc-integration.php b/includes/class-wc-integration.php index 7aecd92..794cf94 100644 --- a/includes/class-wc-integration.php +++ b/includes/class-wc-integration.php @@ -86,16 +86,6 @@ public function __construct() { $this->dolibarr_category_id = $this->get_option( 'dolibarr_category_id' ); $this->dolibarr_generic_id = $this->get_option( 'dolibarr_generic_id' ); - // Get Webservice infos - $ws_auth = array( - 'dolibarrkey' => $this->dolibarr_key, - 'sourceapplication' => $this->sourceapplication, - 'login' => $this->dolibarr_login, - 'password' => $this->dolibarr_password, - 'entity' => $this->dolibarr_entity, - ); - $this->test_webservice( $this->dolibarr_ws_endpoint, $ws_auth ); - // Actions add_action( 'woocommerce_update_options_integration_' . $this->id, @@ -204,6 +194,9 @@ public function init_form_fields() { * @return string HTML to display */ protected function generate_info_html( $key, $data ) { + // Get Webservice infos + $this->test_webservice( ); + $field = $this->plugin_id . $this->id . '_' . $key; $version_ok = false; @@ -332,12 +325,28 @@ public function display_errors( ) { * @param string $webservice The webservice URL * @param string[] $ws_auth The webservice authentication array */ - private function test_webservice( $webservice, $ws_auth ) { - if ( empty ($webservice) ) { + private function test_webservice( + $webservice = '', + $ws_auth = array() + ) { + if ( empty ( $webservice ) && ! empty ( $this->dolibarr_ws_endpoint ) ) { + $webservice = $this->dolibarr_ws_endpoint; + } + if ( empty ( $webservice ) ) { // We don't want to check unconfigured plugin return; } + if ( empty ( $ws_auth ) ) { + $ws_auth = array( + 'dolibarrkey' => $this->dolibarr_key, + 'sourceapplication' => $this->sourceapplication, + 'login' => $this->dolibarr_login, + 'password' => $this->dolibarr_password, + 'entity' => $this->dolibarr_entity, + ); + } + // Check that the server is available try { $soap_client = new SoapClient( $webservice . Doliwoo_Dolibarr::OTHER_ENDPOINT . Doliwoo_Dolibarr::WSDL_MODE ); @@ -363,10 +372,8 @@ private function test_webservice( $webservice, $ws_auth ) { $this->dolibarr_version = explode( '.', $response['dolibarr'] ); } else { $this->errors[] = 'Webservice error:' . $response['result']->result_label; + $this->display_errors(); } - - // Not called by the framework - $this->display_errors(); } } endif; From 05b311c8e9831dda18f4a041313d3544bc367260 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 14:32:24 +0100 Subject: [PATCH 80/88] Don't put version into composer.json to be packagist compatible --- Gruntfile.js | 1 - composer.json | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 4141a13..e652dc1 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -164,7 +164,6 @@ module.exports = function (grunt) { options: { indent: 2, include: [ - 'version', 'description', 'keywords', 'homepage', diff --git a/composer.json b/composer.json index b6c7b9d..52e66e1 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,6 @@ { "name": "gpcsolutions/doliwoo", "description": "Integrate Dolibarr with a WooCommerce shop.", - "version": "0.0.2-alpha", "type": "wordpress-plugin", "keywords": [ "wordpress", @@ -56,4 +55,4 @@ "vendor/bin/phpcs --config-set installed_paths vendor/wp-coding-standards/wpcs" ] } -} \ No newline at end of file +} From a52edd97e1025e616db409e27b70272696f75fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 14:38:49 +0100 Subject: [PATCH 81/88] Translations sync --- composer.json | 2 +- composer.lock | 2 +- languages/doliwoo-ca.po | 100 +++++++++++++++++------------------ languages/doliwoo-es_ES.po | 100 +++++++++++++++++------------------ languages/doliwoo-fr_FR.po | 104 ++++++++++++++++++------------------- languages/doliwoo.pot | 50 +++++++++--------- 6 files changed, 179 insertions(+), 179 deletions(-) diff --git a/composer.json b/composer.json index 52e66e1..4e3bb1c 100644 --- a/composer.json +++ b/composer.json @@ -55,4 +55,4 @@ "vendor/bin/phpcs --config-set installed_paths vendor/wp-coding-standards/wpcs" ] } -} +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index 62a34b3..6d09ac9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "0b98b4ce55ad1e6f793fe8b6fec80676", + "hash": "c8a9e1d94124574e563e77c7b65f2aec", "packages": [ { "name": "composer/installers", diff --git a/languages/doliwoo-ca.po b/languages/doliwoo-ca.po index cc6ccab..3989f9f 100644 --- a/languages/doliwoo-ca.po +++ b/languages/doliwoo-ca.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-03 15:15:10+00:00\n" -"PO-Revision-Date: 2015-03-03 15:15+0000\n" +"POT-Creation-Date: 2015-03-05 11:10:46+00:00\n" +"PO-Revision-Date: 2015-03-05 11:10+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/doliwoo/language/ca/)\n" "MIME-Version: 1.0\n" @@ -24,145 +24,145 @@ msgstr "" "X-Poedit-SourceCharset: UTF-8\n" "X-Textdomain-Support: yes\n" -#: doliwoo.php:231 +#: doliwoo.php:229 msgid "View DoliWoo Settings" msgstr "" -#: doliwoo.php:233 +#: doliwoo.php:231 msgid "Settings" msgstr "" -#: includes/class-doliwoo-parameters.php:62 -msgid "Dolibarr" -msgstr "Dolibarr" - -#: includes/class-doliwoo-parameters.php:65 -msgid "User ID" -msgstr "ID de l'usuari" - -#: includes/class-doliwoo-parameters.php:66 -msgid "The Dolibarr ID for this user" -msgstr "" - -#: includes/class-doliwoo-parameters.php:134 -msgid "Dolibarr User ID" -msgstr "ID de l'usuari Dolibarr" - -#: includes/class-tax-doliwoo.php:64 -msgid "VAT" -msgstr "IVA" - #. Plugin Name of the plugin/theme msgid "DoliWoo" msgstr "DoliWoo" -#: includes/settings.php:68 +#: includes/class-wc-integration.php:72 msgid "Dolibarr webservices access" msgstr "Accés webservice de Dolibarr" -#: includes/settings.php:116 +#: includes/class-wc-integration.php:120 msgid "Source application" msgstr "Aplicació font" -#: includes/settings.php:117 +#: includes/class-wc-integration.php:121 msgid "How this application will identify itself to the webservice." msgstr "Com s'identificarà aquesta aplicació al webservice." -#: includes/settings.php:123 +#: includes/class-wc-integration.php:127 msgid "URL" msgstr "URL" -#: includes/settings.php:124 +#: includes/class-wc-integration.php:128 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "Entra la URL arrel del webservice de Dolibarr (i.e. https://mydolibarr.com/webservices)" -#: includes/settings.php:133 +#: includes/class-wc-integration.php:137 msgid "Delay" msgstr "Retard" -#: includes/settings.php:134 +#: includes/class-wc-integration.php:138 msgid "Choose the automatic update frequency" msgstr "Escull la freqüència de l'actualització automàtica" -#: includes/settings.php:138 +#: includes/class-wc-integration.php:142 msgid "Once Hourly" msgstr "Un cop cada hora" -#: includes/settings.php:139 +#: includes/class-wc-integration.php:143 msgid "Twice Daily" msgstr "Dos cops al dia" -#: includes/settings.php:140 +#: includes/class-wc-integration.php:144 msgid "Once Daily" msgstr "Un cop al dia" -#: includes/settings.php:145 +#: includes/class-wc-integration.php:149 msgid "Key" msgstr "Clau" -#: includes/settings.php:146 +#: includes/class-wc-integration.php:150 msgid "Enter your Dolibarr webservices key" msgstr "Entra la teva clau del webservice de Dolibarr" -#: includes/settings.php:152 +#: includes/class-wc-integration.php:156 msgid "User login" msgstr "Usuari d'inici de sessió" -#: includes/settings.php:153 +#: includes/class-wc-integration.php:157 msgid "Dolibarr actions will be done as this user" msgstr "Les accions de Dolibarr es duran a terme amb aquest usuari" -#: includes/settings.php:159 +#: includes/class-wc-integration.php:163 msgid "User password" msgstr "Paraula de pas de l'usuari" -#: includes/settings.php:165 +#: includes/class-wc-integration.php:169 msgid "Entity" msgstr "Entitat (empresa)" -#: includes/settings.php:166 +#: includes/class-wc-integration.php:170 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "Si utilitzes multiempresa, l'ID de l'entitat (empresa) que vols integrar. Déixa-ho amb 1 si no és així." -#: includes/settings.php:172 +#: includes/class-wc-integration.php:176 msgid "Products category" msgstr "" -#: includes/settings.php:173 +#: includes/class-wc-integration.php:177 msgid "" "The ID of the products category you want to automatically import products " "from." msgstr "La ID de la categoria de producte de la que vols importar productes automàticament." -#: includes/settings.php:179 +#: includes/class-wc-integration.php:183 msgid "Generic thirdparty" msgstr "Tercer per defecte" -#: includes/settings.php:180 +#: includes/class-wc-integration.php:184 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "La ID del tercer per defecte que serà utilitzat en les comandes anònimes." -#: includes/settings.php:186 +#: includes/class-wc-integration.php:190 msgid "Dolibarr version" msgstr "" -#: includes/settings.php:187 +#: includes/class-wc-integration.php:191 msgid "" "If the webservice communication is OK, it displays your Dolibarr version" msgstr "" -#: includes/settings.php:254 +#: includes/class-wc-integration.php:258 msgid "The protocol to use is https://" msgstr "El protocol per utilitzar és https://" -#: includes/settings.php:264 includes/settings.php:336 +#: includes/class-wc-integration.php:268 includes/class-wc-integration.php:345 msgid "The webservice is not available. Please check the URL." msgstr "El servei webservice no està disponible. Siusplau, comprova la URL." +#: includes/class-wc-params.php:67 +msgid "Dolibarr" +msgstr "Dolibarr" + +#: includes/class-wc-params.php:70 +msgid "User ID" +msgstr "ID de l'usuari" + +#: includes/class-wc-params.php:71 +msgid "The Dolibarr ID for this user" +msgstr "" + +#: includes/class-wc-params.php:139 +msgid "Dolibarr User ID" +msgstr "ID de l'usuari Dolibarr" + +#: includes/class-wc-tax.php:67 +msgid "VAT" +msgstr "IVA" + #. Plugin URI of the plugin/theme msgid "http://gpcsolutions.github.io/doliwoo" msgstr "http://gpcsolutions.github.io/doliwoo" @@ -176,5 +176,5 @@ msgid "GPC.solutions" msgstr "GPC.solutions" #. Author URI of the plugin/theme -msgid "http://gpcsolutions.fr" +msgid "https://gpcsolutions.fr" msgstr "" diff --git a/languages/doliwoo-es_ES.po b/languages/doliwoo-es_ES.po index 4d62c65..47e33ed 100644 --- a/languages/doliwoo-es_ES.po +++ b/languages/doliwoo-es_ES.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-03 15:15:10+00:00\n" -"PO-Revision-Date: 2015-03-03 15:15+0000\n" +"POT-Creation-Date: 2015-03-05 11:10:46+00:00\n" +"PO-Revision-Date: 2015-03-05 11:10+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/doliwoo/language/es_ES/)\n" "MIME-Version: 1.0\n" @@ -24,145 +24,145 @@ msgstr "" "X-Poedit-SourceCharset: UTF-8\n" "X-Textdomain-Support: yes\n" -#: doliwoo.php:231 +#: doliwoo.php:229 msgid "View DoliWoo Settings" msgstr "" -#: doliwoo.php:233 +#: doliwoo.php:231 msgid "Settings" msgstr "" -#: includes/class-doliwoo-parameters.php:62 -msgid "Dolibarr" -msgstr "Dolibarr" - -#: includes/class-doliwoo-parameters.php:65 -msgid "User ID" -msgstr "ID de usuario" - -#: includes/class-doliwoo-parameters.php:66 -msgid "The Dolibarr ID for this user" -msgstr "" - -#: includes/class-doliwoo-parameters.php:134 -msgid "Dolibarr User ID" -msgstr "ID de usuario Dolibarr" - -#: includes/class-tax-doliwoo.php:64 -msgid "VAT" -msgstr "IVA" - #. Plugin Name of the plugin/theme msgid "DoliWoo" msgstr "DoliWoo" -#: includes/settings.php:68 +#: includes/class-wc-integration.php:72 msgid "Dolibarr webservices access" msgstr "Acceso a webservices Dolibarr" -#: includes/settings.php:116 +#: includes/class-wc-integration.php:120 msgid "Source application" msgstr "Aplicación fuente" -#: includes/settings.php:117 +#: includes/class-wc-integration.php:121 msgid "How this application will identify itself to the webservice." msgstr "Cómo se identificará esta aplicación al webservice." -#: includes/settings.php:123 +#: includes/class-wc-integration.php:127 msgid "URL" msgstr "URL" -#: includes/settings.php:124 +#: includes/class-wc-integration.php:128 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "Entra la URL raíz del webservice de Dolibarr (ej.: https://mydolibarr.com/webservices)" -#: includes/settings.php:133 +#: includes/class-wc-integration.php:137 msgid "Delay" msgstr "Retraso" -#: includes/settings.php:134 +#: includes/class-wc-integration.php:138 msgid "Choose the automatic update frequency" msgstr "Escoje la frecuencia de actualización automática" -#: includes/settings.php:138 +#: includes/class-wc-integration.php:142 msgid "Once Hourly" msgstr "Una vez cada hora" -#: includes/settings.php:139 +#: includes/class-wc-integration.php:143 msgid "Twice Daily" msgstr "Dos veces al día" -#: includes/settings.php:140 +#: includes/class-wc-integration.php:144 msgid "Once Daily" msgstr "Una vez al día" -#: includes/settings.php:145 +#: includes/class-wc-integration.php:149 msgid "Key" msgstr "Llave" -#: includes/settings.php:146 +#: includes/class-wc-integration.php:150 msgid "Enter your Dolibarr webservices key" msgstr "Entra la llave del webservice de Dolibarr" -#: includes/settings.php:152 +#: includes/class-wc-integration.php:156 msgid "User login" msgstr "Inicio de sesión de usuario" -#: includes/settings.php:153 +#: includes/class-wc-integration.php:157 msgid "Dolibarr actions will be done as this user" msgstr "Las acciones de Dolibarr ser harán con este usuario" -#: includes/settings.php:159 +#: includes/class-wc-integration.php:163 msgid "User password" msgstr "Contraseña de usuario" -#: includes/settings.php:165 +#: includes/class-wc-integration.php:169 msgid "Entity" msgstr "Entidad (empresa)" -#: includes/settings.php:166 +#: includes/class-wc-integration.php:170 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "Si estás usando multiempresa, el ID de la entidad que quieres integrar. Déjalo en 1 si no es así." -#: includes/settings.php:172 +#: includes/class-wc-integration.php:176 msgid "Products category" msgstr "Categoría de productos" -#: includes/settings.php:173 +#: includes/class-wc-integration.php:177 msgid "" "The ID of the products category you want to automatically import products " "from." msgstr "El ID de la categoría de productos de la que quieres importar productos." -#: includes/settings.php:179 +#: includes/class-wc-integration.php:183 msgid "Generic thirdparty" msgstr "Tercero por defecto" -#: includes/settings.php:180 +#: includes/class-wc-integration.php:184 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "El ID del tercero que será usado para los pedidos anónimos." -#: includes/settings.php:186 +#: includes/class-wc-integration.php:190 msgid "Dolibarr version" msgstr "" -#: includes/settings.php:187 +#: includes/class-wc-integration.php:191 msgid "" "If the webservice communication is OK, it displays your Dolibarr version" msgstr "" -#: includes/settings.php:254 +#: includes/class-wc-integration.php:258 msgid "The protocol to use is https://" msgstr "El protocolo a usar es https://" -#: includes/settings.php:264 includes/settings.php:336 +#: includes/class-wc-integration.php:268 includes/class-wc-integration.php:345 msgid "The webservice is not available. Please check the URL." msgstr "El servicio webservice no está disponible. Por favor, comprueba la URL." +#: includes/class-wc-params.php:67 +msgid "Dolibarr" +msgstr "Dolibarr" + +#: includes/class-wc-params.php:70 +msgid "User ID" +msgstr "ID de usuario" + +#: includes/class-wc-params.php:71 +msgid "The Dolibarr ID for this user" +msgstr "" + +#: includes/class-wc-params.php:139 +msgid "Dolibarr User ID" +msgstr "ID de usuario Dolibarr" + +#: includes/class-wc-tax.php:67 +msgid "VAT" +msgstr "IVA" + #. Plugin URI of the plugin/theme msgid "http://gpcsolutions.github.io/doliwoo" msgstr "http://gpcsolutions.github.io/doliwoo" @@ -176,5 +176,5 @@ msgid "GPC.solutions" msgstr "GPC.solutions" #. Author URI of the plugin/theme -msgid "http://gpcsolutions.fr" +msgid "https://gpcsolutions.fr" msgstr "" diff --git a/languages/doliwoo-fr_FR.po b/languages/doliwoo-fr_FR.po index b73ec3a..05cd8e1 100644 --- a/languages/doliwoo-fr_FR.po +++ b/languages/doliwoo-fr_FR.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-03 15:15:10+00:00\n" -"PO-Revision-Date: 2015-03-03 15:15+0000\n" +"POT-Creation-Date: 2015-03-05 11:10:46+00:00\n" +"PO-Revision-Date: 2015-03-05 11:10+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/language/fr_FR/)\n" "MIME-Version: 1.0\n" @@ -24,145 +24,145 @@ msgstr "" "X-Poedit-SourceCharset: UTF-8\n" "X-Textdomain-Support: yes\n" -#: doliwoo.php:231 +#: doliwoo.php:229 msgid "View DoliWoo Settings" -msgstr "" +msgstr "Voir les réglages de DoliWoo" -#: doliwoo.php:233 +#: doliwoo.php:231 msgid "Settings" -msgstr "" - -#: includes/class-doliwoo-parameters.php:62 -msgid "Dolibarr" -msgstr "Dolibarr" - -#: includes/class-doliwoo-parameters.php:65 -msgid "User ID" -msgstr "Identifiant utilisateur" - -#: includes/class-doliwoo-parameters.php:66 -msgid "The Dolibarr ID for this user" -msgstr "L'identifiant Dolibarr pour cet utilisateur" - -#: includes/class-doliwoo-parameters.php:134 -msgid "Dolibarr User ID" -msgstr "Identifiant Utilisateur Dolibarr" - -#: includes/class-tax-doliwoo.php:64 -msgid "VAT" -msgstr "TVA" +msgstr "Réglages" #. Plugin Name of the plugin/theme msgid "DoliWoo" msgstr "DoliWoo" -#: includes/settings.php:68 +#: includes/class-wc-integration.php:72 msgid "Dolibarr webservices access" msgstr "Accès aux webservices Dolibarr" -#: includes/settings.php:116 +#: includes/class-wc-integration.php:120 msgid "Source application" msgstr "Nom de l'application" -#: includes/settings.php:117 +#: includes/class-wc-integration.php:121 msgid "How this application will identify itself to the webservice." msgstr "Comment cette application s'identifie auprès du webservice." -#: includes/settings.php:123 +#: includes/class-wc-integration.php:127 msgid "URL" msgstr "URL" -#: includes/settings.php:124 +#: includes/class-wc-integration.php:128 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "Entrez l'URL racine des webservices de Dolibarr (i.e. https://mydolibarr.com/webservices)" -#: includes/settings.php:133 +#: includes/class-wc-integration.php:137 msgid "Delay" msgstr "Délai" -#: includes/settings.php:134 +#: includes/class-wc-integration.php:138 msgid "Choose the automatic update frequency" msgstr "Choisissez la fréquence de mise à jour automatique" -#: includes/settings.php:138 +#: includes/class-wc-integration.php:142 msgid "Once Hourly" msgstr "Une fois par heure" -#: includes/settings.php:139 +#: includes/class-wc-integration.php:143 msgid "Twice Daily" msgstr "Deux fois par jour" -#: includes/settings.php:140 +#: includes/class-wc-integration.php:144 msgid "Once Daily" msgstr "Une fois par jour" -#: includes/settings.php:145 +#: includes/class-wc-integration.php:149 msgid "Key" msgstr "Clé" -#: includes/settings.php:146 +#: includes/class-wc-integration.php:150 msgid "Enter your Dolibarr webservices key" msgstr "Entrez votre clé du webservices de Dolibarr" -#: includes/settings.php:152 +#: includes/class-wc-integration.php:156 msgid "User login" msgstr "Identifiant utilisateur" -#: includes/settings.php:153 +#: includes/class-wc-integration.php:157 msgid "Dolibarr actions will be done as this user" msgstr "Les actions de Dolibarr seront attribuées à cet utilisateur" -#: includes/settings.php:159 +#: includes/class-wc-integration.php:163 msgid "User password" msgstr "Mot de passe utilisateur" -#: includes/settings.php:165 +#: includes/class-wc-integration.php:169 msgid "Entity" msgstr "Entité" -#: includes/settings.php:166 +#: includes/class-wc-integration.php:170 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "Si vous utilisez multi-société, l'ID de l'entité que vous souhaitez intégrer. Sinon laissez à 1." -#: includes/settings.php:172 +#: includes/class-wc-integration.php:176 msgid "Products category" msgstr "Catégorie des produits" -#: includes/settings.php:173 +#: includes/class-wc-integration.php:177 msgid "" "The ID of the products category you want to automatically import products " "from." msgstr "L'ID de la catégorie des produits que vous souhaitez importer automatiquement." -#: includes/settings.php:179 +#: includes/class-wc-integration.php:183 msgid "Generic thirdparty" msgstr "Tiers générique" -#: includes/settings.php:180 +#: includes/class-wc-integration.php:184 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "L'Id du tiers qui va être utilisé pour les commandes anonymes" -#: includes/settings.php:186 +#: includes/class-wc-integration.php:190 msgid "Dolibarr version" msgstr "Version de Dolibarr" -#: includes/settings.php:187 +#: includes/class-wc-integration.php:191 msgid "" "If the webservice communication is OK, it displays your Dolibarr version" msgstr "Vérifie si la communication est établie au travers du webservice et récupère la version de Dolibarr" -#: includes/settings.php:254 +#: includes/class-wc-integration.php:258 msgid "The protocol to use is https://" msgstr "Le protocole à utiliser est https://" -#: includes/settings.php:264 includes/settings.php:336 +#: includes/class-wc-integration.php:268 includes/class-wc-integration.php:345 msgid "The webservice is not available. Please check the URL." msgstr "Le webservice n'est pas disponible. Merci de vérifier l'URL." +#: includes/class-wc-params.php:67 +msgid "Dolibarr" +msgstr "Dolibarr" + +#: includes/class-wc-params.php:70 +msgid "User ID" +msgstr "Identifiant utilisateur" + +#: includes/class-wc-params.php:71 +msgid "The Dolibarr ID for this user" +msgstr "L'identifiant Dolibarr pour cet utilisateur" + +#: includes/class-wc-params.php:139 +msgid "Dolibarr User ID" +msgstr "Identifiant Utilisateur Dolibarr" + +#: includes/class-wc-tax.php:67 +msgid "VAT" +msgstr "TVA" + #. Plugin URI of the plugin/theme msgid "http://gpcsolutions.github.io/doliwoo" msgstr "http://gpcsolutions.github.io/doliwoo" @@ -176,5 +176,5 @@ msgid "GPC.solutions" msgstr "GPC.solutions" #. Author URI of the plugin/theme -msgid "http://gpcsolutions.fr" +msgid "https://gpcsolutions.fr" msgstr "" diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index d2bf59a..b1d13b0 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-05 10:40:38+00:00\n" +"POT-Creation-Date: 2015-03-05 13:38:35+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -40,105 +40,105 @@ msgstr "" msgid "Dolibarr webservices access" msgstr "" -#: includes/class-wc-integration.php:120 +#: includes/class-wc-integration.php:110 msgid "Source application" msgstr "" -#: includes/class-wc-integration.php:121 +#: includes/class-wc-integration.php:111 msgid "How this application will identify itself to the webservice." msgstr "" -#: includes/class-wc-integration.php:127 +#: includes/class-wc-integration.php:117 msgid "URL" msgstr "" -#: includes/class-wc-integration.php:128 +#: includes/class-wc-integration.php:118 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "" -#: includes/class-wc-integration.php:137 +#: includes/class-wc-integration.php:127 msgid "Delay" msgstr "" -#: includes/class-wc-integration.php:138 +#: includes/class-wc-integration.php:128 msgid "Choose the automatic update frequency" msgstr "" -#: includes/class-wc-integration.php:142 +#: includes/class-wc-integration.php:132 msgid "Once Hourly" msgstr "" -#: includes/class-wc-integration.php:143 +#: includes/class-wc-integration.php:133 msgid "Twice Daily" msgstr "" -#: includes/class-wc-integration.php:144 +#: includes/class-wc-integration.php:134 msgid "Once Daily" msgstr "" -#: includes/class-wc-integration.php:149 +#: includes/class-wc-integration.php:139 msgid "Key" msgstr "" -#: includes/class-wc-integration.php:150 +#: includes/class-wc-integration.php:140 msgid "Enter your Dolibarr webservices key" msgstr "" -#: includes/class-wc-integration.php:156 +#: includes/class-wc-integration.php:146 msgid "User login" msgstr "" -#: includes/class-wc-integration.php:157 +#: includes/class-wc-integration.php:147 msgid "Dolibarr actions will be done as this user" msgstr "" -#: includes/class-wc-integration.php:163 +#: includes/class-wc-integration.php:153 msgid "User password" msgstr "" -#: includes/class-wc-integration.php:169 +#: includes/class-wc-integration.php:159 msgid "Entity" msgstr "" -#: includes/class-wc-integration.php:170 +#: includes/class-wc-integration.php:160 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "" -#: includes/class-wc-integration.php:176 +#: includes/class-wc-integration.php:166 msgid "Products category" msgstr "" -#: includes/class-wc-integration.php:177 +#: includes/class-wc-integration.php:167 msgid "" "The ID of the products category you want to automatically import products " "from." msgstr "" -#: includes/class-wc-integration.php:183 +#: includes/class-wc-integration.php:173 msgid "Generic thirdparty" msgstr "" -#: includes/class-wc-integration.php:184 +#: includes/class-wc-integration.php:174 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "" -#: includes/class-wc-integration.php:190 +#: includes/class-wc-integration.php:180 msgid "Dolibarr version" msgstr "" -#: includes/class-wc-integration.php:191 +#: includes/class-wc-integration.php:181 msgid "If the webservice communication is OK, it displays your Dolibarr version" msgstr "" -#: includes/class-wc-integration.php:258 +#: includes/class-wc-integration.php:251 msgid "The protocol to use is https://" msgstr "" -#: includes/class-wc-integration.php:268 includes/class-wc-integration.php:345 +#: includes/class-wc-integration.php:261 includes/class-wc-integration.php:354 msgid "The webservice is not available. Please check the URL." msgstr "" From 0b581ba1c2987feeba0aa00a270080c3be790d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 14:43:20 +0100 Subject: [PATCH 82/88] Sync composer --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index 6d09ac9..063ebdf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "c8a9e1d94124574e563e77c7b65f2aec", + "hash": "556747e74bd6aa3b56d40bb22874eb5a", "packages": [ { "name": "composer/installers", From 81f6b22ce6df8d8a471de620228dae87a0d1709d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 15:05:08 +0100 Subject: [PATCH 83/88] Fixed missing text domains --- doliwoo.php | 8 ++++---- includes/class-wc-integration.php | 14 +++++++------- includes/class-wc-params.php | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/doliwoo.php b/doliwoo.php index f331c3b..840f8cd 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -49,15 +49,15 @@ // Check required extensions if ( false === extension_loaded( 'soap' ) && false === extension_loaded( 'openssl' ) ) { - esc_html_e( __( 'This plugin needs SOAP and OpenSSL PHP extensions.' ) ); + esc_html_e( __( 'This plugin needs SOAP and OpenSSL PHP extensions.', 'doliwoo' ) ); exit; } if ( false === extension_loaded( 'soap' ) ) { - esc_html_e( __( 'This plugin needs SOAP PHP extension.' ) ); + esc_html_e( __( 'This plugin needs SOAP PHP extension.', 'doliwoo' ) ); exit; } if ( false === extension_loaded( 'openssl' ) ) { - esc_html_e( __( 'This plugin needs OpenSSL PHP extension.' ) ); + esc_html_e( __( 'This plugin needs OpenSSL PHP extension.', 'doliwoo' ) ); exit; } @@ -250,7 +250,7 @@ public function set_settings() { } } else { // WooCommerce is not available - esc_html_e( __( 'This extension needs WooCommerce' ) ); + esc_html_e( __( 'This extension needs WooCommerce', 'doliwoo' ) ); exit; } diff --git a/includes/class-wc-integration.php b/includes/class-wc-integration.php index 794cf94..692f1b9 100644 --- a/includes/class-wc-integration.php +++ b/includes/class-wc-integration.php @@ -125,7 +125,7 @@ public function init_form_fields() { ), 'delay_update' => array( 'title' => __( 'Delay', 'doliwoo' ), - 'description' => __( 'Choose the automatic update frequency' ), + 'description' => __( 'Choose the automatic update frequency', 'doliwoo' ), 'type' => 'select', 'desc_tip' => false, 'options' => array( @@ -178,7 +178,7 @@ public function init_form_fields() { ), 'dolibarr_version' => array( 'title' => __( 'Dolibarr version', 'doliwoo' ), - 'description' => __( 'If the webservice communication is OK, it displays your Dolibarr version' ), + 'description' => __( 'If the webservice communication is OK, it displays your Dolibarr version', 'doliwoo' ), 'type' => 'info', 'desc_tip' => false, ), @@ -219,9 +219,9 @@ protected function generate_info_html( $key, $data ) { errors[] = __( 'The protocol to use is https://' ); + $this->errors[] = __( 'The protocol to use is https://', 'doliwoo' ); } // Make sure we have the trailing slash @@ -258,7 +258,7 @@ public function validate_dolibarr_ws_endpoint_field( $key ) { try { new SoapClient( $value . Doliwoo_Dolibarr::OTHER_ENDPOINT . Doliwoo_Dolibarr::WSDL_MODE ); } catch ( SoapFault $exc ) { - $this->errors[] = __( 'The webservice is not available. Please check the URL.' ); + $this->errors[] = __( 'The webservice is not available. Please check the URL.', 'doliwoo' ); } return $value; @@ -351,7 +351,7 @@ private function test_webservice( try { $soap_client = new SoapClient( $webservice . Doliwoo_Dolibarr::OTHER_ENDPOINT . Doliwoo_Dolibarr::WSDL_MODE ); } catch ( SoapFault $exc ) { - $this->errors[] = __( 'The webservice is not available. Please check the URL.' ); + $this->errors[] = __( 'The webservice is not available. Please check the URL.', 'doliwoo' ); $this->display_errors(); // No point in doing the next test diff --git a/includes/class-wc-params.php b/includes/class-wc-params.php index 0717e43..2aa9ece 100644 --- a/includes/class-wc-params.php +++ b/includes/class-wc-params.php @@ -68,7 +68,7 @@ public function get_customer_meta_fields() { 'fields' => array( 'dolibarr_id' => array( 'label' => __( 'User ID', 'doliwoo' ), - 'description' => __( 'The Dolibarr ID for this user' ), + 'description' => __( 'The Dolibarr ID for this user', 'doliwoo' ), ) ) ) From 9edc8dc4d0f935568307ae4531017b847ac5e332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 15:11:07 +0100 Subject: [PATCH 84/88] Translations update --- languages/doliwoo-fr_FR.po | 54 +++++++++++++++++++------------------- languages/doliwoo.pot | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/languages/doliwoo-fr_FR.po b/languages/doliwoo-fr_FR.po index 05cd8e1..1b6daa2 100644 --- a/languages/doliwoo-fr_FR.po +++ b/languages/doliwoo-fr_FR.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-05 11:10:46+00:00\n" -"PO-Revision-Date: 2015-03-05 11:10+0000\n" +"POT-Creation-Date: 2015-03-05 14:09:04+00:00\n" +"PO-Revision-Date: 2015-03-05 13:57+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/language/fr_FR/)\n" "MIME-Version: 1.0\n" @@ -40,106 +40,106 @@ msgstr "DoliWoo" msgid "Dolibarr webservices access" msgstr "Accès aux webservices Dolibarr" -#: includes/class-wc-integration.php:120 +#: includes/class-wc-integration.php:110 msgid "Source application" msgstr "Nom de l'application" -#: includes/class-wc-integration.php:121 +#: includes/class-wc-integration.php:111 msgid "How this application will identify itself to the webservice." msgstr "Comment cette application s'identifie auprès du webservice." -#: includes/class-wc-integration.php:127 +#: includes/class-wc-integration.php:117 msgid "URL" msgstr "URL" -#: includes/class-wc-integration.php:128 +#: includes/class-wc-integration.php:118 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "Entrez l'URL racine des webservices de Dolibarr (i.e. https://mydolibarr.com/webservices)" -#: includes/class-wc-integration.php:137 +#: includes/class-wc-integration.php:127 msgid "Delay" msgstr "Délai" -#: includes/class-wc-integration.php:138 +#: includes/class-wc-integration.php:128 msgid "Choose the automatic update frequency" msgstr "Choisissez la fréquence de mise à jour automatique" -#: includes/class-wc-integration.php:142 +#: includes/class-wc-integration.php:132 msgid "Once Hourly" msgstr "Une fois par heure" -#: includes/class-wc-integration.php:143 +#: includes/class-wc-integration.php:133 msgid "Twice Daily" msgstr "Deux fois par jour" -#: includes/class-wc-integration.php:144 +#: includes/class-wc-integration.php:134 msgid "Once Daily" msgstr "Une fois par jour" -#: includes/class-wc-integration.php:149 +#: includes/class-wc-integration.php:139 msgid "Key" msgstr "Clé" -#: includes/class-wc-integration.php:150 +#: includes/class-wc-integration.php:140 msgid "Enter your Dolibarr webservices key" msgstr "Entrez votre clé du webservices de Dolibarr" -#: includes/class-wc-integration.php:156 +#: includes/class-wc-integration.php:146 msgid "User login" msgstr "Identifiant utilisateur" -#: includes/class-wc-integration.php:157 +#: includes/class-wc-integration.php:147 msgid "Dolibarr actions will be done as this user" msgstr "Les actions de Dolibarr seront attribuées à cet utilisateur" -#: includes/class-wc-integration.php:163 +#: includes/class-wc-integration.php:153 msgid "User password" msgstr "Mot de passe utilisateur" -#: includes/class-wc-integration.php:169 +#: includes/class-wc-integration.php:159 msgid "Entity" msgstr "Entité" -#: includes/class-wc-integration.php:170 +#: includes/class-wc-integration.php:160 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "Si vous utilisez multi-société, l'ID de l'entité que vous souhaitez intégrer. Sinon laissez à 1." -#: includes/class-wc-integration.php:176 +#: includes/class-wc-integration.php:166 msgid "Products category" msgstr "Catégorie des produits" -#: includes/class-wc-integration.php:177 +#: includes/class-wc-integration.php:167 msgid "" "The ID of the products category you want to automatically import products " "from." msgstr "L'ID de la catégorie des produits que vous souhaitez importer automatiquement." -#: includes/class-wc-integration.php:183 +#: includes/class-wc-integration.php:173 msgid "Generic thirdparty" msgstr "Tiers générique" -#: includes/class-wc-integration.php:184 +#: includes/class-wc-integration.php:174 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "L'Id du tiers qui va être utilisé pour les commandes anonymes" -#: includes/class-wc-integration.php:190 +#: includes/class-wc-integration.php:180 msgid "Dolibarr version" msgstr "Version de Dolibarr" -#: includes/class-wc-integration.php:191 +#: includes/class-wc-integration.php:181 msgid "" "If the webservice communication is OK, it displays your Dolibarr version" msgstr "Vérifie si la communication est établie au travers du webservice et récupère la version de Dolibarr" -#: includes/class-wc-integration.php:258 +#: includes/class-wc-integration.php:251 msgid "The protocol to use is https://" msgstr "Le protocole à utiliser est https://" -#: includes/class-wc-integration.php:268 includes/class-wc-integration.php:345 +#: includes/class-wc-integration.php:261 includes/class-wc-integration.php:354 msgid "The webservice is not available. Please check the URL." msgstr "Le webservice n'est pas disponible. Merci de vérifier l'URL." @@ -177,4 +177,4 @@ msgstr "GPC.solutions" #. Author URI of the plugin/theme msgid "https://gpcsolutions.fr" -msgstr "" +msgstr "https://gpcsolutions.fr" diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index b1d13b0..5a21a3a 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-05 13:38:35+00:00\n" +"POT-Creation-Date: 2015-03-05 14:09:04+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" From 993c48802bad6a3674b1fe1e35517a9b85bbd892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 15:32:17 +0100 Subject: [PATCH 85/88] Fixed missing translations --- includes/class-wc-integration.php | 22 ++++++---- languages/doliwoo-ca.po | 68 +++++++++++++++++++------------ languages/doliwoo-es_ES.po | 68 +++++++++++++++++++------------ languages/doliwoo-fr_FR.po | 24 +++++++++-- languages/doliwoo.pot | 22 ++++++++-- 5 files changed, 136 insertions(+), 68 deletions(-) diff --git a/includes/class-wc-integration.php b/includes/class-wc-integration.php index 692f1b9..1251181 100644 --- a/includes/class-wc-integration.php +++ b/includes/class-wc-integration.php @@ -208,6 +208,11 @@ protected function generate_info_html( $key, $data ) { $version_ok = true; } + $not_configured = __( 'Please configure the plugin.', 'doliwoo' ); + $not_compatible = __( 'Not compatible! Please use at least Dolibarr v3.4.0.', 'doliwoo' ); + $configuration_ok = __( 'OK!', 'doliwoo' ); + $detected = sprintf( __( '(Detected v%s)', 'doliwoo' ), implode( '.', $this->dolibarr_version ) ); + ob_start(); ?> @@ -217,17 +222,16 @@ protected function generate_info_html( $key, $data ) { dolibarr_version ) ) { + esc_html_e( $not_configured ); } else { - esc_html_e( __( 'Not compatible! Please use at least Dolibarr v3.4.0.', 'doliwoo' ) ); + if ( $version_ok ) { + esc_html_e( $configuration_ok ); + } else { + esc_html_e( $not_compatible ); + } + esc_html_e( ' ' . $detected ); } - esc_html_e( - ' (v' - . implode( '.', $this->dolibarr_version ) - . ')' - ); ?> diff --git a/languages/doliwoo-ca.po b/languages/doliwoo-ca.po index 3989f9f..1922406 100644 --- a/languages/doliwoo-ca.po +++ b/languages/doliwoo-ca.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-05 11:10:46+00:00\n" -"PO-Revision-Date: 2015-03-05 11:10+0000\n" +"POT-Creation-Date: 2015-03-05 14:30:00+00:00\n" +"PO-Revision-Date: 2015-03-05 14:30+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/doliwoo/language/ca/)\n" "MIME-Version: 1.0\n" @@ -40,106 +40,122 @@ msgstr "DoliWoo" msgid "Dolibarr webservices access" msgstr "Accés webservice de Dolibarr" -#: includes/class-wc-integration.php:120 +#: includes/class-wc-integration.php:110 msgid "Source application" msgstr "Aplicació font" -#: includes/class-wc-integration.php:121 +#: includes/class-wc-integration.php:111 msgid "How this application will identify itself to the webservice." msgstr "Com s'identificarà aquesta aplicació al webservice." -#: includes/class-wc-integration.php:127 +#: includes/class-wc-integration.php:117 msgid "URL" msgstr "URL" -#: includes/class-wc-integration.php:128 +#: includes/class-wc-integration.php:118 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "Entra la URL arrel del webservice de Dolibarr (i.e. https://mydolibarr.com/webservices)" -#: includes/class-wc-integration.php:137 +#: includes/class-wc-integration.php:127 msgid "Delay" msgstr "Retard" -#: includes/class-wc-integration.php:138 +#: includes/class-wc-integration.php:128 msgid "Choose the automatic update frequency" msgstr "Escull la freqüència de l'actualització automàtica" -#: includes/class-wc-integration.php:142 +#: includes/class-wc-integration.php:132 msgid "Once Hourly" msgstr "Un cop cada hora" -#: includes/class-wc-integration.php:143 +#: includes/class-wc-integration.php:133 msgid "Twice Daily" msgstr "Dos cops al dia" -#: includes/class-wc-integration.php:144 +#: includes/class-wc-integration.php:134 msgid "Once Daily" msgstr "Un cop al dia" -#: includes/class-wc-integration.php:149 +#: includes/class-wc-integration.php:139 msgid "Key" msgstr "Clau" -#: includes/class-wc-integration.php:150 +#: includes/class-wc-integration.php:140 msgid "Enter your Dolibarr webservices key" msgstr "Entra la teva clau del webservice de Dolibarr" -#: includes/class-wc-integration.php:156 +#: includes/class-wc-integration.php:146 msgid "User login" msgstr "Usuari d'inici de sessió" -#: includes/class-wc-integration.php:157 +#: includes/class-wc-integration.php:147 msgid "Dolibarr actions will be done as this user" msgstr "Les accions de Dolibarr es duran a terme amb aquest usuari" -#: includes/class-wc-integration.php:163 +#: includes/class-wc-integration.php:153 msgid "User password" msgstr "Paraula de pas de l'usuari" -#: includes/class-wc-integration.php:169 +#: includes/class-wc-integration.php:159 msgid "Entity" msgstr "Entitat (empresa)" -#: includes/class-wc-integration.php:170 +#: includes/class-wc-integration.php:160 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "Si utilitzes multiempresa, l'ID de l'entitat (empresa) que vols integrar. Déixa-ho amb 1 si no és així." -#: includes/class-wc-integration.php:176 +#: includes/class-wc-integration.php:166 msgid "Products category" msgstr "" -#: includes/class-wc-integration.php:177 +#: includes/class-wc-integration.php:167 msgid "" "The ID of the products category you want to automatically import products " "from." msgstr "La ID de la categoria de producte de la que vols importar productes automàticament." -#: includes/class-wc-integration.php:183 +#: includes/class-wc-integration.php:173 msgid "Generic thirdparty" msgstr "Tercer per defecte" -#: includes/class-wc-integration.php:184 +#: includes/class-wc-integration.php:174 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "La ID del tercer per defecte que serà utilitzat en les comandes anònimes." -#: includes/class-wc-integration.php:190 +#: includes/class-wc-integration.php:180 msgid "Dolibarr version" msgstr "" -#: includes/class-wc-integration.php:191 +#: includes/class-wc-integration.php:181 msgid "" "If the webservice communication is OK, it displays your Dolibarr version" msgstr "" -#: includes/class-wc-integration.php:258 +#: includes/class-wc-integration.php:211 +msgid "Please configure the plugin." +msgstr "" + +#: includes/class-wc-integration.php:212 +msgid "Not compatible! Please use at least Dolibarr v3.4.0." +msgstr "" + +#: includes/class-wc-integration.php:213 +msgid "OK!" +msgstr "" + +#: includes/class-wc-integration.php:214 +msgid "(Detected v%s)" +msgstr "" + +#: includes/class-wc-integration.php:255 msgid "The protocol to use is https://" msgstr "El protocol per utilitzar és https://" -#: includes/class-wc-integration.php:268 includes/class-wc-integration.php:345 +#: includes/class-wc-integration.php:265 includes/class-wc-integration.php:358 msgid "The webservice is not available. Please check the URL." msgstr "El servei webservice no està disponible. Siusplau, comprova la URL." diff --git a/languages/doliwoo-es_ES.po b/languages/doliwoo-es_ES.po index 47e33ed..5d49a2f 100644 --- a/languages/doliwoo-es_ES.po +++ b/languages/doliwoo-es_ES.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-05 11:10:46+00:00\n" -"PO-Revision-Date: 2015-03-05 11:10+0000\n" +"POT-Creation-Date: 2015-03-05 14:30:00+00:00\n" +"PO-Revision-Date: 2015-03-05 14:30+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/doliwoo/language/es_ES/)\n" "MIME-Version: 1.0\n" @@ -40,106 +40,122 @@ msgstr "DoliWoo" msgid "Dolibarr webservices access" msgstr "Acceso a webservices Dolibarr" -#: includes/class-wc-integration.php:120 +#: includes/class-wc-integration.php:110 msgid "Source application" msgstr "Aplicación fuente" -#: includes/class-wc-integration.php:121 +#: includes/class-wc-integration.php:111 msgid "How this application will identify itself to the webservice." msgstr "Cómo se identificará esta aplicación al webservice." -#: includes/class-wc-integration.php:127 +#: includes/class-wc-integration.php:117 msgid "URL" msgstr "URL" -#: includes/class-wc-integration.php:128 +#: includes/class-wc-integration.php:118 msgid "" "Enter Dolibarr webservices root URL (i.e. " "https://mydolibarr.com/webservices)" msgstr "Entra la URL raíz del webservice de Dolibarr (ej.: https://mydolibarr.com/webservices)" -#: includes/class-wc-integration.php:137 +#: includes/class-wc-integration.php:127 msgid "Delay" msgstr "Retraso" -#: includes/class-wc-integration.php:138 +#: includes/class-wc-integration.php:128 msgid "Choose the automatic update frequency" msgstr "Escoje la frecuencia de actualización automática" -#: includes/class-wc-integration.php:142 +#: includes/class-wc-integration.php:132 msgid "Once Hourly" msgstr "Una vez cada hora" -#: includes/class-wc-integration.php:143 +#: includes/class-wc-integration.php:133 msgid "Twice Daily" msgstr "Dos veces al día" -#: includes/class-wc-integration.php:144 +#: includes/class-wc-integration.php:134 msgid "Once Daily" msgstr "Una vez al día" -#: includes/class-wc-integration.php:149 +#: includes/class-wc-integration.php:139 msgid "Key" msgstr "Llave" -#: includes/class-wc-integration.php:150 +#: includes/class-wc-integration.php:140 msgid "Enter your Dolibarr webservices key" msgstr "Entra la llave del webservice de Dolibarr" -#: includes/class-wc-integration.php:156 +#: includes/class-wc-integration.php:146 msgid "User login" msgstr "Inicio de sesión de usuario" -#: includes/class-wc-integration.php:157 +#: includes/class-wc-integration.php:147 msgid "Dolibarr actions will be done as this user" msgstr "Las acciones de Dolibarr ser harán con este usuario" -#: includes/class-wc-integration.php:163 +#: includes/class-wc-integration.php:153 msgid "User password" msgstr "Contraseña de usuario" -#: includes/class-wc-integration.php:169 +#: includes/class-wc-integration.php:159 msgid "Entity" msgstr "Entidad (empresa)" -#: includes/class-wc-integration.php:170 +#: includes/class-wc-integration.php:160 msgid "" "If you're using multicompany, the ID of the entity you want to integrate. " "Leave to 1 otherwise." msgstr "Si estás usando multiempresa, el ID de la entidad que quieres integrar. Déjalo en 1 si no es así." -#: includes/class-wc-integration.php:176 +#: includes/class-wc-integration.php:166 msgid "Products category" msgstr "Categoría de productos" -#: includes/class-wc-integration.php:177 +#: includes/class-wc-integration.php:167 msgid "" "The ID of the products category you want to automatically import products " "from." msgstr "El ID de la categoría de productos de la que quieres importar productos." -#: includes/class-wc-integration.php:183 +#: includes/class-wc-integration.php:173 msgid "Generic thirdparty" msgstr "Tercero por defecto" -#: includes/class-wc-integration.php:184 +#: includes/class-wc-integration.php:174 msgid "The ID of the thirdparty that'll be used for anonymous orders." msgstr "El ID del tercero que será usado para los pedidos anónimos." -#: includes/class-wc-integration.php:190 +#: includes/class-wc-integration.php:180 msgid "Dolibarr version" msgstr "" -#: includes/class-wc-integration.php:191 +#: includes/class-wc-integration.php:181 msgid "" "If the webservice communication is OK, it displays your Dolibarr version" msgstr "" -#: includes/class-wc-integration.php:258 +#: includes/class-wc-integration.php:211 +msgid "Please configure the plugin." +msgstr "" + +#: includes/class-wc-integration.php:212 +msgid "Not compatible! Please use at least Dolibarr v3.4.0." +msgstr "" + +#: includes/class-wc-integration.php:213 +msgid "OK!" +msgstr "" + +#: includes/class-wc-integration.php:214 +msgid "(Detected v%s)" +msgstr "" + +#: includes/class-wc-integration.php:255 msgid "The protocol to use is https://" msgstr "El protocolo a usar es https://" -#: includes/class-wc-integration.php:268 includes/class-wc-integration.php:345 +#: includes/class-wc-integration.php:265 includes/class-wc-integration.php:358 msgid "The webservice is not available. Please check the URL." msgstr "El servicio webservice no está disponible. Por favor, comprueba la URL." diff --git a/languages/doliwoo-fr_FR.po b/languages/doliwoo-fr_FR.po index 1b6daa2..8777f8e 100644 --- a/languages/doliwoo-fr_FR.po +++ b/languages/doliwoo-fr_FR.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-05 14:09:04+00:00\n" -"PO-Revision-Date: 2015-03-05 13:57+0000\n" +"POT-Creation-Date: 2015-03-05 14:30:00+00:00\n" +"PO-Revision-Date: 2015-03-05 14:30+0000\n" "Last-Translator: Raphaël Doursenaud \n" "Language-Team: French (France) (http://www.transifex.com/projects/p/doliwoo/language/fr_FR/)\n" "MIME-Version: 1.0\n" @@ -135,11 +135,27 @@ msgid "" "If the webservice communication is OK, it displays your Dolibarr version" msgstr "Vérifie si la communication est établie au travers du webservice et récupère la version de Dolibarr" -#: includes/class-wc-integration.php:251 +#: includes/class-wc-integration.php:211 +msgid "Please configure the plugin." +msgstr "Veuillez configurer l'extension." + +#: includes/class-wc-integration.php:212 +msgid "Not compatible! Please use at least Dolibarr v3.4.0." +msgstr "Version incompatible. Veuillez utiliser Dolibarr v3.4.0 minimum." + +#: includes/class-wc-integration.php:213 +msgid "OK!" +msgstr "OK !" + +#: includes/class-wc-integration.php:214 +msgid "(Detected v%s)" +msgstr "(v%s détectée)" + +#: includes/class-wc-integration.php:255 msgid "The protocol to use is https://" msgstr "Le protocole à utiliser est https://" -#: includes/class-wc-integration.php:261 includes/class-wc-integration.php:354 +#: includes/class-wc-integration.php:265 includes/class-wc-integration.php:358 msgid "The webservice is not available. Please check the URL." msgstr "Le webservice n'est pas disponible. Merci de vérifier l'URL." diff --git a/languages/doliwoo.pot b/languages/doliwoo.pot index 5a21a3a..5f88e1d 100644 --- a/languages/doliwoo.pot +++ b/languages/doliwoo.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: DoliWoo 0.0.2-alpha\n" "Report-Msgid-Bugs-To: https://github.com/GPCsolutions/doliwoo/issues\n" -"POT-Creation-Date: 2015-03-05 14:09:04+00:00\n" +"POT-Creation-Date: 2015-03-05 14:30:32+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -134,11 +134,27 @@ msgstr "" msgid "If the webservice communication is OK, it displays your Dolibarr version" msgstr "" -#: includes/class-wc-integration.php:251 +#: includes/class-wc-integration.php:211 +msgid "Please configure the plugin." +msgstr "" + +#: includes/class-wc-integration.php:212 +msgid "Not compatible! Please use at least Dolibarr v3.4.0." +msgstr "" + +#: includes/class-wc-integration.php:213 +msgid "OK!" +msgstr "" + +#: includes/class-wc-integration.php:214 +msgid "(Detected v%s)" +msgstr "" + +#: includes/class-wc-integration.php:255 msgid "The protocol to use is https://" msgstr "" -#: includes/class-wc-integration.php:261 includes/class-wc-integration.php:354 +#: includes/class-wc-integration.php:265 includes/class-wc-integration.php:358 msgid "The webservice is not available. Please check the URL." msgstr "" From 6627e97cd2d0ee1fa51493ee5b43fb16309a567d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 15:59:43 +0100 Subject: [PATCH 86/88] Added wordpress.org assets Fixes #20 --- README.md | 4 +++- assets/banner-1544x500.png | Bin 0 -> 84937 bytes assets/banner-772x250.png | Bin 0 -> 36808 bytes assets/screenshot-1.png | Bin 0 -> 64114 bytes readme.txt | 2 +- 5 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 91587ea..0a106de 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,9 @@ You may allow insecure requests by tweaking the source code if you know what you ## Screenshots ## -**1. FIXME:** Placeholder +### 1. The configuration page ### +![The configuration page](http://s.wordpress.org/extend/plugins/doliwoo/screenshot-1.png) + ## Changelog ## diff --git a/assets/banner-1544x500.png b/assets/banner-1544x500.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c3451d55d63d4f284b32e37c1ae3361482c29d06 100644 GIT binary patch literal 84937 zcmeFY^;cBy_da|EM!LHhkVd+@krt5d?vf6Hp+f{j>Fx#r>23uS6e($uM!NGk_Ta94FG>b3B7a<@W$)=^4XC)FI87 z;pJ)X>cXbxDr@a-@9hDz^YnBR=HRe&w>I~*_qMilb#``j@p#-6hm*afwTp+f2Zx0p zn~N0(4?8D^b!hA}0Du9CvQk>US$m5{Fj{?uPEc=Kt#)yiiw zEHI+`zL>N=5N}QYYIKcB&E0u8o>C-+QlI@o$$cTIWjM*&Fv&WdB}G=Th^(E-d*5B; zI_qY5FG=s&4*N%2phH4Dss{rp3>$F|W8<~QH%RpVyZ)a9{(q4`8BE#>ko|Y9!)OMZ zU9LCnH79KqLa=DQL(I70ia-Vohs5BciFw-NB7A2Y1dX(4srT851^CigDL+J?sZjjn z^_!p>>pW;Vs72C3R$3p1LU121?FiSUVA?L6P#KIpIq40m_V)@a$d^e@|C9RcI+5|IN8JMdQW}u~|EnrCj z26BNbSkaXv=k)!lVbEzx(N3P->ogb){5Neu>`}JQ-AfPA{T2dPT*pU%T~9H@=r>RR&;otHHSnP!cq&$vOhMtO+OX@`7Vp>tc>SMb zXd|FG+^Y_b97v)&RI$TnZCz5ScL&TwA2`XYl>@X>gk00YI6Uzpk?@^WkiIN=Q9e<~9 z#IFOV>VDGxcjhu3KY$k~8+Oy|+4T}GsnIV9$ec!t3ZUYB9tB@Qg0RiR(v6AJy+?i* zN16D2DLba7Qv`3=L@cNNGXQ7T`x5G|vo+7JfB5#V=`UE(B?Qj=zsHd$U0%3_1#Lz> zob_u=<^RO{-}9zhAiVt!T!3$<+GZSP>P}Y)o3u|A0`En1aRk6ii9-er=VPO%ql3}I zRC_2Eohx|pk*z%s&Hav(b7d2{+-G32JeRo@P)*RHYI~MksCK~Xiwy}_t=ky<3nEzzDbRHBYRA3bmasE$(FlZho+&o-ZT7LMKk3&w6DqsW$Fo?tZ zG0j_)E@Ex)xN$?`qQ)7}i%6F<_r!u;?5!hHlNsz_RLM&DOSa7xK;3iO~s=kJZibZMi}l5NC{G8*si7+hBqI1LwsSp zC{f6L+fQV_(I5?}G881%L13iFK-!mCtdldwdm8`SMoRz>FhQQkb>*{sU6p37^jqZM zx^zRf?+6Dzh<}#xXo^~1Nt&_qu6O&-_cbUL`2Od(70Kk1$UthPvwpj{*Of7-N+>jZ zQiLWZ#FHC0BJLc~20?QK(s1ynTh{yTb{J3rhJh@#V5KH)LZR+i>!H1U!>$EdSnyLA zQOb$eqi>e+qpX}9v_HfrRK^z?Y*!%ui*77o06ZO_*q1Y`8QK#Aa0CxL7&X%(DD7uRUC2PPm<{fF$`NBtSyM}=@3 z6kQ;r-KA_w(!cX&fGA&t21CG#8!LaC^7_vlv3<-X^?Srp6@V&>yrU&?phpkyNdz5U z?D5%O)3j%vYd*ln2lviLQOd$w%yxfNA_d>~AqHzvDmI$`XQUO1h;Z+y(%vbdH>br>u*&f z!P@HbM_K&nPeA6#Oic5Qo_#F*Il4+0McWN&!;KqY&k`R$rX zhz>)fOid_@5E@PORZ?>Bwn%E_OS<2bB7vEbVv^30a zK5iQKZJ3NgtM%v)*6y1(#8i8_lq$unwqf=xR1(+$?;fqPAXZy-*t4A)oAM*lpqKy5 z!tF)h>O8F{Bd=@cPRo$W5R$q44Q%XB`Q`odWn!_q3n*Lw@WkXuYV!?g-oD^b-OQBe z6PxdT%}f`BY2x{KELjIpvbZMW^Z!yxqS6q1B!do(YX2AUArDd*h%1^6gt2Dt0@V;# z4r_czogbgai(hnty!3}bWwV<%qE*K#PTc3tvC z@j~if#@w*2Xc2gXFXs;@FM`P=NqWTfx-9|609ywxbtlKr0t37SuNh;5`K2~fj|IqM z^s0y8~}Qb(?x#dFwbFV$LRnUavSWc;MjhD zF6F{mcQ-JBy7GCVe=Z3jf)3Mt@p;YF#lmf|2+aU7dNA>$bY!i)en3-}y&ouxTeiwK zNGcFNJ}nF~=;_=VIUu}vmN~Uu(ZL^tfC7WqW94K%g)raHSs`d*A=u>denqk3#z-f@ zIkM_zes50KXN&j!o`-f}%G#S+1Rwii2x$4ClN(f@mBAa0k-RnGnZC5d#D5bCY8dMv z<8N^7b`4?0+DAsx{pF+TW(&_$sWq{EjM_@0VGc+hC43{tYtsf zm0aqP7BI~!cO+SG@uBG?Z4BZ3+Fm4Un)sc)@j>rtNAG?Xzsy}va>wDGLw%VOqT>0* z>Niu;_d=W3hkEWSV_Xdvhjjzn0{)!BF@T0-V2>#9~}$^Zr4h;c>MX>6AO^EcP7mqzbak~ z#qZz4;QV^Vn3$$`N!9KWxkjjAS_trt-I{h@=h}Nrt9#>rIx70nxZJX??Am&EpK!14 z1xt=Z4W$V0NBoMfMTu0LWUu=4&*wLH#UEr&B3+98&bugbs8}>Ja7wl#a7^s%kSTDm z02E0?v+xp#^C<8clJ>>&he`+gS{-8a>A@T99AP`EfHO1Ng<{BIksN7QG80PaLPk7?n2c$0BcMd>#7;{TepkK7=Jbkfob@+(4KEZkQ>zK3uANIZbNIYmx9;$c z3;LciK6*xmAi^)*F7L@1s_T{Dpu@NwJr-1asDAW^0t83@1_f$Q^*>q9_PCfK>ERz3 z%ord%sP+uibfJ8I!x(JPzoxNa2&|NcRdx~D88Q^xQ$>)9FyX%wvuSZ{_Pd@K{l3;7 zkKl%YQrw|LA}LX|4_tEzo4fI6P`J`i|2ra%ee+bofXJ0}@VQlco9N8i_UK!I(=PzV zOu^_f`j%?OB(fdh<@=`397P*7GVUw9agp}Tq&1Plc;9PmKphs}mypyfj5oi1qlWi- zdx(QiLBX5tpZfS2GP4a%T_LY!z37sQ5XMUwqH#8r*!5p@5BcmHIwzAfF+gD$j+v#W z61>0hKPY~-!sEnGw6WOYXNFE7eO+Y0xOkEw0{z+CFLZNDMYqQBMb^rP`^QPWpT$GX z))!s1UI%+ld%L&&s9~!~zvLttEU%=w%q3;D28V78rFt9;L&j$0tVC@77?vc`_4pd# z+W};YFE{v6U#t+(@YLbV?XvFcMI zqqD@Zac42=D(_owA0l*!^fk)5obVDa$8o&M4E=Wg>|&tos=$Nk2s~*K}fP%a3YQ9Px$TQN4` z2PrDbGFHDtZCBx%LJI1*C619pQvz@E{Nk|H}m=Uj@VyIEB`A|(Hukiyf@Z4{S z;4!Of*rTpw1h`!NkUQvpC`h!cAKS3 zQVRteoel@=6*PhgPL@bw8?74DPn2IIA?+)12Qw{2rx?4c9)?@X5A_D}#PW|(7J z()S#5dfm~tzwtD*e`|=AYTnK&E?aG9a?Bi6s7nFx(p3jZNx@Dz(Z*O5%sw|6JNe2= z%PCsD7<^&X-I}5x~^nxQ_49+J?yy3tCOTB|Qp^<~{0XSpu+107`b3R=gM6t=bE%zrP|S z^`)C`J=ms-D*z1cRN zhK+i1LE(9oUiSp~BB`kTsL{Ww8;G!)`G};}PLdwUqAy*>c$Nip0%8rbn>UH>{B5ZOkyx;jPCUL?54tZR`g{*-8i*v~gQ7;Ns6b6$>CBb0Lc$kFrX7w&kG_?mVTi(bV2ocD+^vN+QRAwRj0 zBk>W-7tykfajjOON-sOdb#R~@h4D?``y4cBI7Ho z85)WuKcMtHHw~^36aD!c)NK(&q#Y}F7mG*rJ9>L@5|=T1@{=@K;#+FeW(;OSPZN(& zpq$UKdB1(%G&z=0w$50_gV48KeiS}F!5{qv>G|mIxubp&)4?rS$sNyY%U1pz zC>-1Pj3yWE>%&~gKs%xc{8bj=d`P0VGZjb7Ffmf*TAbjrRzoitv+wnDHHq4PYV3RV z-Pm`1)j0aO#g#6|pG<*~jIt+68`;8E1;TZL||5l06I9=0^^-q zDsTUfi?ehC6rj)$yJ%b{{^m0mM=~~6Ed$1|g`K>r4+pQxmYM=apN53eoo*LhMZ?>*>Ihww9Jgw8tV;D_k_Lf@vekKs zM)bu8P9xfaI8T}3UzzMfeWR(#)wX)6%Wt*kzYTZ1Azn?m5DV=W!Tzur5gq-xM%u#d z@GH<&DU8!@5ekb++C+}^Tg9{Z>Rf@qU-MTWO;DhxE*(yaE;H2M=622Qp=#`&-r%>- zbHwAiKpwQ+ECTl>hckaPAjs&I+HKZXjQsCGfcJV4OP%|?Eju-%G>DAZ1IeVh4U zLloYUcPfRCn~iT*(O*p6hVEj?`}lVV^)q_)2@VXrU#hFXr6EH`n6o|g6udZ@-J zl}LyW<;z2>kYUiFr?>M2OESRsHnEO#Y!(Q2tM*jOY5ehB(7ATb=l1?ym)aj^)eRjk z4`wJey<~*B8oaLr!uU^QWxdr$EPuAL(nP*TOdo83JYz#M0$^EP+tMhN za@iwRFG%CvERBmNvfwWKJ2^uMNSCk$61{R(nz$mtGC9%AL#*cN z55MnjApZTY6Mpug53SX{TcZ-s$B%gM@2|lUaG=<9`99)H^D@X7f}ZkxuZOSlr^g>n z;tKlpOQg5#2pN;;{Sv5c%~aAp(p&L!{$+PHD?2{-f*)_cx<>Y|Ax$8eiNhJQUmH6k*&8#H9P18L4giPPO_dl`m)(xd?&q65`8G+|2zUMsbZ> z!r{QD>n0n$`EmjY&4`+9fe(%+xVTR;Wm>M^3ot2SVW2nio9!CA%8cHYk63_ZH)`?j zM6E7mxG|Sh-oStsX~Q3phibJxH!u}SUhqqjuuD#6HmdJ3hV3>5FE{`BH42F$@6iH0 z%rPBAD=dJg0-8;4bv_SO-D9fB5*F~sLo7eA(InbFrVP#~Yw8HY?z z@<^!v3tm)rJ|P@YXLsf2__Mp9u5q>3zki8{KnLn$0*Ga`l#RrRYi=tA`gIR=@4A#Fu0<-7+vE+2;5LhfqK%6_n>u}@&TY|D9}PKG+Bmh6 zx=#7_=?wjyy$~WOQPq&0X+&?HPhz~f#`smv0$H%nT4+iHpRO5=x$+M}q8*|D{)Hye zkS|hG@3M+TFr3;fS;5e$L5YToo4h>u5VY1^Ij%mB0~QqofexyJFO8`+pURP_ZQaZN zV}?MiulaoUwmodKdlUWJG<`L&W9}uw`(&;?TH&F>_Iii-c(X@>m{zl-Y_XKdStIb- zXM=CfWSDdKPv%OVpjCRRJ&?Go+H!v&oDeHmd9&(RgyI;Wpn6f{RQdYFm{(Pl3<*fP zY3M&|b)YY)PAeCV)4)hYObz~HVED-a)Ox*pt5F?hMcBuu3@Gj_w@~N3hYz_1I;!~# z;j5whuA%#wQd`0+r!I$MotMZVe6HP7hfq-<12TrF9`&6NDSh8ILq2j_BcI?S2Cjy- zMqu2S$E`~3AqPKhqT_9dQD%`k0#+>+rdoc?j`EMVN|arlnZ?f!Ld8M+>HBZe&v-CZ zC;5qv=5TNc2bM{CMs{b)v7WNN$R%=VgVRxD3gt01FpKLwN12y4px4=GP!#j!#;3eGOK!4K)zHaZmaW$BAxvu2q9JRw zRK2_7RFa$d@2%rg%J>`E9i9(Y%vJO=eI6m7Hh*|uYjKEyA1y1Z?J)Pqr}qSO-_?mv zh0KDLbYtH1uDDi%$5eBP%*C_}g9Yc)&IvfW*oi>3TNC@0!?MT23BFz!i4THc?7L*C za#JDc5u|fgtOlW&J?x+1rS^ok!NyaGl zaaI0bny*&Sr>r-VsUvfZ6NjHB-D+4IJLn6@g>9;`-?S2Q$ewgGarvPBK5m_8vLpLN zq}mT!TH)p;X~*friSOTwcHD#kWePrxw|G4j!omEOfl(1d-3`L?6Tm1TZ_2=XFdQ`cgYr+r`C$Z5f{w zC0qtT@~A4AkcAlHwN zi2+64EEI-_Sm94ne?jW%oJBP?)IO#n>46NRa7kOGvQw+N7+XFyetr_laW3)DVA}7X z>W0y?Ey_CLxz6mal7K~b0qRRm$VX+|E33NGSZyR;xbcZpKDk8;_03Q1;(Jde38J_t zuk4N(6i@wY1M?}RqZ5wwIGUStHR|^;OV-e7$;uK`u2Sgt4})=h9v}Bhz(Drw0S7fF z51Y92!hOt$2RUKk4%R2uT9W`Pa0+$D`dbjf;*ASDNrL0 zZEu_}Q{`>#NivJ>SV`G}#X&HB{S!|{&tQCBU0~u&xX}FCHk7#I#ud}&J+&k`94qcy zA>ncAyL;WFgW3|L`-xApGfYP^UfwM5Zzp}B#e*aG8?zb>-PPorpKDP%|<#2vHVwx%5bK*2flPQCjNDs z?3BgEuU0!dS53;Hv@rt-Q!f-S2rx)N(_- zp7gX+d(aMP6bKp?3tV&pXaEnum&<*3v+b*=#H43Qvx+P)Rly3&!7nj+>)4jG>PU=> z$r%YME`U?@B#pOWDtN}Gt_e92#Rof~CUdMFvw<>mJc$2o$VA+;aqS_>L$lH4g=jx= zBIY-}Gb_U>-L1H1&Tm0fP$8R9v)VyEU5;frRx;)iGV0o%#SA94A*U(GEGC%K%Eh+} z3(D_5SA0b2hlou;S3MEixE946r%fq=qRD0;;KO5P(Dq!9cWWZzXC&*s`r} zlP|^6c?^aa^^1upw%j&cRUVKXe6kNm&b&WvtB(ti)T*{IZ2@{W{HM(0vVn}vri%E` z=;)Ec`+af=VlB$>Y)&aN!wN@qht3Io>9GCksEzV4_y+gRyf|*#ig7OQLXZI59x&i+ z!p!QbJ8^y;#3{=wKgds0CPX{z+;r!&!7j;7#}|@HAj|lud~LpBh+XCVxE=3^>(KCGMm(fM*y*-sgAAb zSR3kql3ifXo?RIMtw6AUeM_A(4BTd-Tn*2fJ5fD4dDhu{m7SUdXu07wk}W$mXSH2d z%f_laeir?q6b;#Ka46}fnIet z$4mfh+6Mp<sW%1Rq;@7)j@ub0vlG9X~!=6do=YuJntto#bgsC2ZXHJbexiqyTOee@I&`k$=2 zu^m6_+7a2;-`(gXOEn_`7-Q#umN%DYO3Xa(O^AthFd&T&h}ci%VN3mcq#28-Fz~IT zOIZ^50ARrDJw_i+Vb0JL_l32z4HYQt~M*=Eusp@rNLOqvo5X0gI~Tl+hFq0$bmB#l`Y6h zhpkpd?Vn0do+>WcS9TNWeY&Cr#Ptw6TQnBZp#9D1`=x4yJ;Tw_^7XxSgVXdUDI=fO zHB*&?)fkEwUSP{(?+HIEo_p#%5h{81oB@E5Mu8?Odh$zMZ}q5y@T<}}>$)R`+1>fu zivG`EK(G2T#i|W%(vS^(-gyqe?iog^%s+SMuUGVfdiO!4n z+%UX=;iM`I`6%;*yu#EnqL*VRgaf}9qb_>LvIJ9_7TqZ=p9g=5K#{D|o@ZIxxs6EW z2wUZSl%DcvrP*FcL(vWZ_J@sB$c-p0LA~OvTZb6{nM7aLqxPMF@EV~|XP@wC=LZ;o z*rTGyhK5E;N}%sD$tqO;<%|UPyI|S!cuKcbVE^1k@v_alTQNTXe6br}gNMgGA3elN z9*lbqvo2uu_q~AVRU>Ow)^i6U&55_K+83ve@P868KYw!m*MKQ`bhB^F>*R4)B5x-d z^PP`8r_4XZSw+I5%N*=AXCEp)pbkK#_$$U|^w$*$r3H;90^h)(%$n}qYpeQ}s z#&_-)GdC%6QTW{Q9YNv;;2M1)zFeLnAOc5;BgVAD?@4%BR(F?@q79B}5xs70RYh2t zO2&VV@D4!*rwBAP^r^6AR1}nVChB~HNSo6Uge=i~zOSCbJnfdQcf%Z;g3%)9A!bN$ zVFGamsirFhLk3F{`q#>`TF$Wx50&C-YJYrr>1XTlr4Y8>b{+lZqI+LEB1@3iX!z>s z+O+RL3=eWHS%$V6#ssTn=vwH{*k*R4&lhwu69xS-7dbs;H)k#1_KVbtkW`e@U!B$k*&N?oF7b= zEn@>P0RKylWw-pZ6zIfzJk=5u=h{H~s2!Z4B0rPN9h_(Q?kcI_=-+qBRUA)^AM@s{{<`Ig^3GqJN z2C;Yb&m-6`>_>xP)QS{0z<8(-wP#v=PZ&H?RbcZ0_Y%G-qa)rAlO#*BCza( zLf%>bicLS{yVQ=-a4)^cRi{LFoPkmoCP}Y;yY*%;9&}Bm(%2<5Ok6TgQ^X`hWB6qI zukP#W+`Xlv+*~Qz9}qJM`01$llPXu~oo1=uMiEIW`ba|iwg!y2Q*A~wy~G9l=X4QH zlp=e&A`q2$s^F`DocLtJuXec;l#P>tWgs7vftnU(+@0V<{WoOFKd%7U5`}lVcipEF z%Tgtj?Tj-E39nA}J|d=KwvRQX94r4%0is6Mf{&3G3869y@U?ry(TD(ml#I5?Th zgu`EzyMlvB4)dX-DLUikT!Xz5f3+z?tL@q%hvL83r7uTA5($~pPV)({^4D?THt%&aAH;lZ3 zuR$sJ^c@PAP#bu7m|nbGzT=0J0_S~gWS`Vk@WA2?ELOJOW%o_i-3GKVo_@0`!fq?& zX3apqs)oIP^?3_0V`xY6ez-0LC9p*?Jo;-RZ41?3JBpLNH^qO728X$jRM;jLgz6;p z0&XSL$T`0Xg)!D&V+MIvWxOp{E-mykA*XOD&5(qu3kXHGeUTc|6C($a7NeWP11iPb zoiNscX!N%*Mw()0EN3g3$Vo}CZ=hnxg%9Eauy4ThW^mo7&`U$afVj~TgbWa1@p-%3 z?bK7>wFnu(`dzPqr%rq__-{}{jhw`gq$&`w!$nP!STe8{m*G~yjBzV}e5R`xrYCR4 zg6{;XLf&Ba>`1iE@^?HQeX8a?K!%iaHy3<4v)Cc^2Gd(1ioCC^?+B$x*8L+n{KLC` zk?xeZQ+YFbu z?-j~d_`aho*!#}HeEA^y(d{IrE0yXN5nc{pAx?0*tAskO;s4q7MtQV!P1Nc*#Rs&d z;@N4+cEo>p>}OMvq~(a`;akcQYYhskJ~u4Hv);Q z{SXz&D2XIJk>Rbby1 znG*5WPJcGutJ$gNNH@W3IbOHUb-0ouA#CJv!~#voRVPSCjvsVzn($Q;B|J}un&~IG zaoFC0Ozwxy_x^ojL&rPAnoaKxI;gi`jT#Es5%6m;EKV1c*x! z7nk*D*d%!rZu-)`2YvP>u@QAIbKM;8La%hpUn@)VV%45*$yzFU+#+28N;-V3iq9!tGgPySK8~r$fYI$5OrZvCf+Hf|Cd+ZOb zuM*d7Vsp?4tCQzCR{y}DL~cG{55`4QLqpQ{_LuK=$LTE* zxd6sQzr7qMR~}tQQA33x{43&mu73NT84}5dZ4;0QQ7sc9eg>bY_@ls0_lvr>207;? zrTm=VPKVy>DL=hW_N~?JM$8fFhKSRP^^nSCZ<XeoJVnTKE|Yjq1!J4^icN zBK%XeX6&d8&ANpmt=$}V!$mKA68VM2McBCc0kvreuk%SmJd2(eHRh0I3u|bdQAo+D zYs0xW#?)EEr{lPF@=~ErNp1+wFNwkKt&#Dw^M#95*-t(!RUwT1GL>v}8a<#CG@O+I zL6ia8Gx0OiVAJONzs_VI>4au67s;V8mSdk#5ODV|!g(!M?}Be%-=5yT1ews&{6j7z z_eNThuG(8clD}`tu*?_0?5={N{g4*|wtX4BosH1s0{2_w;Y_MI0(w6a+lS zy38OpHJMR&FS;T(gKp{k<5LTo#Wm%4JjdF7aZ{X)t37+nwKIenEc=}^>u%flX0IAb z>n@H`)0y&Kl~)(`$!hpB7{rwJ(hotuhLi0Is9pSofVKU`boJc%jB&!^O@gF_Fue04 z%j?Kty3eUhkB;n4zW=*pZ}FR(D484*ghDO6y#%}CcE0w1_Z@5SjB3>IuxYCWY z)leU2|6<~gxaX$JSA&PWw&y)c7*@NnwG-2jracR$AJjT$Kj`rt%7@<(W0zxv+4ZU9 zEQYE(hJk30|2+5lLiAj;D#a_plQ*+Alcs3#mjx?` z7&IvRTAm20b4{fQ5wojr^)fm7%u@=$-I$v6Xp~g1h7z$0t2$| zYHDyFdiNzhUfsz4aShQ=RaEmkHu8zC*O5EwPK-Z)!AHeCG1WS}34%K=%sr`CY@(k( z&bOCQpjEr#A+&WvzI45G``O&NED~_H-`go-g20LTwD!X@A5ewSEX$|>t-pH$&Nz0^ zMEjnq=`@@^rc3Ry>mjyYq1e7IS0u~5fJusus2PcjEqXTB8z^EDnoQw~xEUWZ_=!m2 z1%j0lR+h0EO8%eA*}x*@!O;`~e5jT(ud&SV&LjO?F3TIA8gvs1>T+aRD++zdi}_co zR~gpeG)8I2$x;WF2fI-;<9;wfRL)|lFx?0UzN&mD4W4z{(0j`0QpQ)Srq9O;1a2^N zoMvtwjRhZ+?YK;qeM*CU{tPGCX=vgOsG-zpI}x2O(`-dijoQbg;hM1a714Qc{(YKn zXu0^DzKZ=R(yJQHqAW!O2CV3cG==tJ4;H7)qW!g(r7t&g0oc>*=du>Voz2MK=FiO+ z$^Di883ZM7DzSIK3^(a>Fb69PnKKj&BboS}<`xWlQ%8DXh$8IHrXG+aSKs8V`lVBi z^TUtAcSNS%$Uf8fj%Xd3kq*oI^}X#QWsYzyc=Vm*C{x)_-N(Z+r2Lj&DU2?2Mputp zwW2h+5Z>>&4N}hh?s*w-c=>QgNgJ5Fd}rKP=IS^wG%ry2>e^~5Ukf82_1Uja6ps;` zy6cXd!r!}lC$S7cYoFuD9iO?_BANX%&e6il0ix9Kt|IUydK7uve1cU`u%_8nBlW@S zKZdyocz=QOUb2L|Svm-3+Ybp-Jh&o4K?UD;WUqZCf+Ro@UJb^!#9bU?B>7L zx|TP?V{QqCLrD1nGEWWh%V<^Uo(6JShQU8@_IC#F`0X>As$zL!^^tk32*Ryu_^i@X zNQ|#?{{}UAsgf|$`^RU4(MYYBvpgYMOPCP2+w6NMq*GBr#~V_tTRY$I$L}u>uQ84kRJ;_dELCtOX0<(!tqMNaJhe7fCY+Mm-WUEXOMz$Me3wD)B6{)@ zI|zIgp=XyQorH-_5r}h9O^jW`#hJ=LRlU~z4ADdpi4sl;e6KX5?@A@#l zoRR9kXi&9PCS!7yn+W_=S%444kzD-X4}#=!VZ4HRF!fIA>gZlbgBUgJ{+l>RgwFpg zrkuSD`Rax&S|L;J3o`1N;%$WO!JYUof)2RSVvJh-S&&UTsZ(#SrtEU&D}+CcFv71= zpGl2|mS6tW4UVblFV%i7%U`^18XoPWto0IChx&U4lGx94@rSB6L57|aU|aTYO;@%Gxo)l>ZVOvIuT>oyxcXFv25ELY^+4>7E0{at!CxQUom zL1aRAtwu|_9r2+gon-6UdHm(_&B@Yc@HtLm97Hg#jvkr25#_Vc2H=!L0aQVyiqV_G zwW1`oyg`ss+veiv{or2;7W2=6(Wa_CaFW2%J#T=>*&x0;H;5H<0MHL!f=ux5w(*Ya zFClp7{4;B9-2vnva;Xv~sAq11eXd}+CLt@h?MNtt^{?T64q;#9S?hQap3wQ)(f!bq z6%GNo;;QK(Jx3@YFCa&=h66Tk5Cox>a=ky7vL&t>SG^^E>-$a-e!D*RNsCtDTf;@k zml714pm0H1wAbEArJc1x0H?7?vBB<_?Is99A2?ecwjW}s7SD#%vlaohrx&l-bW^4K zo99>_(9?BFZWKyKQaNJOmBT=GVx;C*8}W{)Cm!Pk)l0BtAS9~xn0178v~?@7MC>!T zNN4UA=Z`XjuY}^ey|ugqwOzlLtUr#rOn91%8ez5d_sAV|Qk=acKl&4VPxZs95gB}g zONwFW^P4UP=_QHLS9gm#GD(F$UJV;EJ&wLzfdiQa2%|MYK9A)jQe|a+n9Li3Bszs! zNu}&zI*0})p3DP-$+kEB0y81qd{-BCk0X$Q|4!lMa)ZP@A;yL44v}%)ca7yHRJ8*Z zQcBLTE%3G8d~%#fd}$t-C*p)BN?c^q5lBoK|*gFS1sh*Hn*7Oobw-(AoylBjg zYmX}9$jP#{uD?DKdac#SpDAF6Y%K?s}z5QNY%bcvv;?~TG3yw)Rw>2 zcVQC$FIg(7>VZrj!uwF)OUG_$+L5F8pZlO8s(-5M%_xKC)O>)KZFvli29- zI_YCP;jr1+kpyat!pnmbi3c|LvXD$Q&B5LoIfiRL%jz+^yyo<%m8kO94me3$sFf^& z8Sl%XzMG`goYdcp=b~J0hjTNULlpZ_Q_1Rr&pWO*h=rRZyNHlR@S&ZIZRQMLW4kO8 zQA0;?9UOa3Pi*qbEx8fihoPvU_O8Cl2{clQQ8<9LC3xna9NJU(9pS`x-h#|dcwgC6 zX4@x3tY)5vP(oS|5_K_}JQ|uxhR~DD{SK_hB%|&S>9Pd|5!TgQt*C5?Kqb)323KGG zj_qzC`ZtrI`LZNe0N+sD>nYV`Ujpv-=()!S2eADsE90*7?x)IKjDf8qV>o;to#y*; zxu5X2b{==%8RVqzJk=j-K2da4vCjA+Y%7NR^rOg1i>?^eOVF75@&30^1eRJZ)D1zB zv8v8Rx^BNP`fj^B7_yQIgtrII@jkyhy^5S!t`J(R<}`ZAyJ`n75qc7iFMXm6Vy!ea$xp0bp}*cJt$_)$+$1G#{vSsb#rg1F|xLGDY2M`pi(+hyhu_kIgN>d zZ_ADZj3$i5(@5;lYue5ijT4q{ynyPD*Gc^E+6kpfBo>e_txj zdP03XozYJ&fEwThyao{7^^bQ`3Eke3lU#*y-VK{y-~F6lox#9Ph5+SXLZz2&oBYyQ zF44C&nHq~2F+T`<{L3>~&4^w85=d>nq0Wq;K$L5Qu|c6kO^TfNdQrMC5*alSJkCK? zChYg+2Aw{ay?Jx@zQ!n{CO>cv17z}lI(9Et3x^kc1*w_h70mkBEibupA?OP)t4$N*_RF9FlIO7WmT z#rKHiAn|2%cC^d2SrB2Z-@T|czcP?K?Qga}_{QzNoxQwI#@pKP^}3(l(MDrMf0g4dKFCxf93K)YafK(;B@om0B7C zM$~T<<+o4>GK| zsJus_XF%?ty<>0LmMk-Qrgr!r)m>--Rz$0y8HP14l?oG#Mqm~wuNPX{aG*~ z#+HRs;pi}G%#gF=Go}elL2Q`X1W@b{;)m=H-1$F604fM8JzLX=b4f_$Cp?`mt$d$N zrhsqt-Hhtc&6Viy`OqvL7DkECbkmXNuFBEQSU;H=vcdzaIHU(7(o3H?e8?^(v@VMjXKbgO;sM zP~eN#f62L=<-8i}nURAndmQGp!BIN2br1z(lDo_g{7N7LTWYEeQeR!arpA0$%{)zbk&ul`C93`SeEZE zRci~tw(ZAkEPdS z-MGVP7kXs(K4Iq?aavJJXv#ElggIj#JD-#jK~?w0wmK6X2JMNeOOQ&u*L`)uL9|=HL z+(bab@ZdG>FAfgkBP&tWBns zT66cjP{9SYN91w7oD%}}{;$66;y7WIV@1S%1l!h?ZC(^_hn}jjX&PhqN?X$A`Go>S z8`)jgi12(G57tm=yeCg}McqxBZdx~R-({CCZO%7pl{zIaMwpc6vT<=Pja=5zVRMU> zCKkyyu}2;guCoN?SwO-K=DtqI8a~9owKJX07shxbIi94lYlGcDzff^7mCJ$LwZ~TL z9XRt0_NJL9w4%QHm>@rLk_0T8W}1}z3*Odz4?`>&6Hxx8AbJL7yG6ORr{O)3^EFnL z31ncany4W3p)N8Hp{$0WVxmB35eG{ke6;hU%iP8Z#1{hPyq`ua&&A*#V=O?k4Kq%w zRw88n1io{1Tc`CSQ%H%6@Y2$6(Wn}zAJlY8l5TY%Df|Cu`s%PK-{jM%3(jf>erF1FXAl*wh2q>M>-CY8r0#X9fCEeZdK7OzF_b;$}?K3;~%$ak}+z9=i z0+fZc|1R@F8cUOmJbS&G@9h6&^6#e;rKOLz_p0rMFM>1l{R9ObC)1a)oI%ry&+Yng z0ViX@4v+1-g<-1E8tcX#o~_5a%SES;defPQhlXE%PEJm?6s?{8&9D&a&5%)Ku!_V6 zIGRSYA71#kwpB}Yi=7K`?QMo(4dRC0OO+ieCyI?vbp(~b| zG>BkdiMKsIZz%g_60AUkfaYE#X9pmVpv-13#Be0p+cNna|0?Qy;yzW%ur(#^w)Kuv z8u*bzj zWJE~ycGiCRa5dgroR=c6?Rlf>s=D!EB;S&<5xkeKiYiJE?ctRbv0tuX`_Ss6bQ?b0gs=a-S!z#c zc!HNmyC)$;Xkr&?m*Fu6d~gi+SmTLX6tU;mvA)%Pf`fN<7{p(Hu-HFN5**d@gHdo4 zmAI>gMwH<&NW86(f0wwOIg4OFe?}#n+$l$ikPQIo5?bCGdW-I-f7zFOAQCtMCF5+P z!6=4G_lwVkY(w4(+a1ok=T*a>oH9Zn@t@OS5~IpWkc5D;&8FYvpnV_GPn$TPlU6IY zmUZfCpnt6KGnRMdYacEdMjvdOUtXWAPgZt~Uxs&%)$S(=P8xUC$LV(QMd#6-X^5mV zr@Rmkw0!YvHo7&!or(Tu-X>1&O{(L6sC|Mx6FWKCsl`@82cONHu*&k;?K#ozS?Jt% zuJ?`?F%#v(JWP}6--feWL@bwnP=nGBW?~b$>3X+naLSdP@Yt}M*Oq)h2_#kdg!~^D zSZ)0sxef1rPLwOJ2tmnVrK3KJ)DMHfV&Gi^d{D*o`YKSrj28MB~D&+l6mYQ5fh(v(uuU)d_B6DHE@y>_Y`w&T)DYAU1A$pUDq~ukt07o$K|GQYZ{H2 zeW{KXc^Dy(z<%}bi9or~TX9eJ&SSbx+=i_X2kp(7+vD`nmeTZp+4|?IbKm1~K%U3b zKBIw^8gm&UndvC_!W(rn}0 z8}a7r7=6g@ApKEE0-S98kF;Cet#g8FNAJS4(^rLj^)PB4VmZr)mxW-YEEkXSb{>D- zyEbx-VyWAfA%RbZ(@csDDdwrKN=%~2I|(dVVolw^iZ+iy0Y^ee1+zPe=Kx(n>OqjOrOtI(RM#V&P$+zWX+C|pM);=qo@?rDgd5KLuRuH4nw=Q&xdP#KQ4`i^^ z!{UVMUB1x2;%{_5tj?gE=LjX%i=du;UCaZb5WUyHmXZy?MhxNwLxNFoY-dSJHeoglvZ?O{N1Fcg%gt4KfhXb-4YRm zL%t}KB78cl}w<#7M@70SC0pVXq{M*v3(5G>d*g1bwFMit%%`E{PnexDIXtJv~-?j+G=F!G^!Xr747f())Aqn)lU$jSx( zLjZR3v81zMw=T4h?&3yA9h^T9nwC0kjABha(?_F+3i@x@v(&(CG=#WnFFq-I?0Q$B zGsI+N;knz(E=|!-nLFw;rA3aZ-E6f6D=D| z6|M6X+2n^)pnN_CG%9leYZrp;+I~2O}D7t@b*|H{xENa+S(sd%Q$}K!v}Q zuXGU#9~uH8QJZp{x2d@XWurBOBY-!?w+zh@F1MJIW&V~ zklX{UAAf#Q9g?qZV`7nFD6y-nVI=n=)SJJ-zyu3H$_P!UnrV(AE>er+REfo$JlC9@ zlx^Su*R`^@KRth%MuXEIQg<_0#rojZo3%kPWROw@ko&b~{bpkO9x|P-Pr#H{;{A4KOT(oV(jgZtl;P_ho)wj}O3RX=2m3-1`U!)PK)3Iqg z8+PfaOQFV4i(u&D;T(9o-(};o_gh?&>c`8FpO8T7lTIyg&I~k=2vW}y7QK8M0Qk+D!nqGcPyrjS;EHx7k>!|HJzL` z3mJT?&D&H=4x`XE5eG6$Cw-KMv%_k+;9dFfk(ee)_5Q=cKa_v5!exX7^^08`bJ;it zLfZT_EnP6rLfSEpPw0HCp^*H3F4XZxiy-2yD_nV?=CoI^S|F&GLXxQFUi$Xvw~=2q zfaa){A>aWr=el>m>+z+~1CVe@-;r1mMKE1F8-sKJLv0l zfD}$8U1|k6Y-k)80C(@8mU$9XAn->Sy{3o0eP^%!5kg5r0#Gm#=1id(VLhFKcXeS* zgv}-|u^uk)Q;;vr)J-xsw-2o*;r>z{(@iv6*#B=;(c;|$y`@wSr2e-ypP3$SS(wvs z7F)Y}rWV=sng@2#!Q)F!Sjx;^yut*_G#&nu99|M}aKfb@&GEtWsf9+Y<5(seKFU11 zV&bb6Dj-8->YsT2q6918|_!b4Z-)ZBz3LM_+$Cq({}P5u5=HRW3%YVJAdSDitgR3g!ub zA_H`DUuHZb2}huyQU&a%4@CID0<={9+4Is_Vxv0$-aQf34y+2}N}U>0-=5X+b{#xO z(!E`sEFs*I5G@lV!%CF!QIGB}AZ71?iLeh00^Ub50+^`gsV{kPnsa}8rBxDE@ znJS$3@u>4?`NCImWOkEpbLpYXEY}#;%@Kez%77D{@%W|>!bRdJ)VMmig#K10QLfT# z#5a!f^)Mq}b|8_~zjmmPu%uQ?s6OvB0CFd#F&BU8nRcPKfume=w)bhhg|+znQG}k4 zulU*@rCUel7jmt*9qJtwOdJ$zUF$rRY}`(92f z2?Vbmw1t6?jvQ^wr1O%n-oM6$?L$Fq*4rA@a0q{s^SU+-zE3aAzhfV%6 z6w`fA%WGOp(0_GOJX7T6w>M~Y^yYviK(z8OZn6)h8;r_1n~a2;u2p1A=dWC0=G(O2 ziHvL+u3{B(zs`C01sH=|C&m*Yxlro_qmJ|1;{!VwbN;_LPLW!{@&cqfzZO4@gBRbR zg{jmEfI*{expdNPZ~t{eUV()=8r8c?d7X4MK6Qm}i*ZXs0AL%?_TGKgeltv-VDMej zD0NMzS)!X_L@Y*U)vN4B!yp-mLu*EXQ&mZBcf7Xbn{Pq=ZSCRp{k;Ym1Pxsb^7?a;L6kqD?UdH@Tk{@{9x)4BC=8b%rhu0R&UBfXcs zj@aJ|-y^R|kqFs~{)K-|{qVWEpalX$&e*Scs({ zMyV%DT$DT5_{r9-rRnBqbyVar1`59aPnFm6*AgTU5fR?R%GCPGPA=j0t3NxLJ5NsNf(=L5Y_`;&@^KNSJOCpQ2+JFsY&382*G}+B zO7oJCS$zG0*L0ZealOKvBiy`cq95O^E(3P#V0`1?49|zL1aMipVknsQX71+uru*UK z)#8mZU<50SH{L)p{>w%1#eH2ZN64rX6u9~Qt(-p#>7w*r$$og!(*F|l3bYA&?@Gl( zRM(7zTkf?B-^$Xks1@$F+P1#c$V`@@mC~v^-VVg zJz@FFdn>BFqjm|nUCedoqI5)!M!t4RnuQ$(z?#JrQLRx(vGm-CG_79yUlH19a3tGClSUmYb#-b^Lvv>LUexzkk}u_F*o`gy|og$hJzHLz)dwP>TLAv z&5p$eV(C!Lh`^tOK;)6%hnT;7%39iM-LJdk%J8{%w^;PtVF{q9w}j-E9=YM5`yCEa z$4Yw)e>S|?$y?`EJe5NQ_;m)CO1T<&mURF2d?aVH-&b1u&3;%T(CZGg1KVbHZI$A) zoXcJKhsqrjJCt39_Zo=}FK(;?CEOR9O-{LWGQl zF4NFg{>b3+sPfrIcg5*hZk5if^{!#=UzGvR{$}(vpf?W+nuQ^|^Ra}eA9EkG%0i3s zVb4acjSvbImhbFP+%s;E_Th@veyUA)ZnXlrY?)<2jBtG+=T8k-e@+uI5h0#zDvT$o z)Uc=UFB@+1ujrpJ3YPb;3=q@^6tJPqg^e|t#Wy_3`jWz(6VEMyeZ1?tu%F%{vHULW zHg?GB$flr;NmZU%prXq9g`U-eXne(|kq3!={g`9mP<5 z?#m5FA0?28#kW6;l-=b&p4kv$-z|ofNl8eAPYoSyhS`o<-8$?vw>lF7P>?TwB)fF{Qzs3(kT?uQj=$1bNPU&;-`GWTK zwe^MAddIFF`m>Rk+g7Agtq9OLST+FO_83p(Wj%NNFA_8u~`G@OWvgF+TU(O8jUB!<_IIh3~Ezog5l-!O=MN#H~#^%oNG5a1Ye0Q z0&IRNS5?MY6{Z-wD9WE}Of3PEuyOM%7dl>j+r|0)r0bdBf_LJ$@QK>5N$}4v(y7{eFS}?) zEZ|5Xf>+^RovMFS_1dCkg(AVG92K&}9IurWOK+!J4<6Qi6T><$MN*^WL7dosnTBjC zKpRq$6;@#=-)iBkZ{9(I`n6xa+AEInn%PiJ(vObZhDPu`kim*2#>O+h_C3iT=cN|= zaX|9sK(BWecR+!_&EpMXOM8Zt!h&P>Osa$GW~|LBpakzcc#r-6ya44wE?ZEbWb@%I zoEH94UH;K^MQeEf4X62-{6J=U){u(x3<0HRG2t}4zBw)D{P%s@K1TSK4;z0S+TzFe z+t;D?Ut!T~=*&j8^mE|*-ae)F+k0;7ZOkpO&?a`Yy7JwR3x1Vse249bI#IKB8hx-r+1Br>rK$TM?VXby}q(Uidm;$2}~HudP>!?QZ|pcUxZnph>mV zgqM&sZ9OKe^fG-w$;g-T@y_3$@KEegWnoo9xTSy^kUQdztGXT?mnRPEFB+a3lvd}! z=Z%aF^Gz^;+m2T1%qms`4B;$B=AWgz-XwJIxSfuw`?g~$vwV;3I!bnk6+7)8`D;GV zRYZnk?Pm|UZh0laNta=7v6dvg4hKot?=Q5qvvi79TrPj2`>QzE{u(pDMB?KM`-c!! zmizRFGcYv%)FVvvZOcKQlS z78&f#wV--YhG}j%P=opA9!ImZvR;lf=0hC(F11AO9`D3{b-2zx43lfMUsRAEUuC~k z=haGBdga#O@t>{=pkH1u0_fE-dF&ne(a~mSuykDeo`P35PT0t@UiKq4kkWrT?YMbs z{b_87|99kL=QN2h6*b!AZpk?t5>g+M zOj0-B_g(VdxxQa8XT_e-OTr{?6%U1(cTIp!R(FFI3T zu+Nmv=Kc2DxV2mVJI=p+!t$5BMBIgM=Kz%{o)O!IZ(b68@oGBA*QsF25u<6HRV zORh}N3iQ2>zp=-N^%t-7HLq-%%x_JPYj2%)lGiHtPv`ZD{v{`*;g3fvIrn&%Z%PB! zG(w)lw)vmZt`7)*%kuu$V(mxkbZwu0Sv#47fuhi5d~p)Ze(REMX@hHrrc9zt3J2zT z>|Ob*S*l(C7tx(9T0z&=gwO&r*~F4$wTE*VJWXO~^o3RZA_ISdaecK=2hUAV*HvA= zi^D^LE(-@KSs_w85Q4_0GB5WP z%9kEx8N%=RNdlAhK!mbWO`Pd^c=!zgGUIT`(3CCcKU&R0+G`-_kzJrZpFn~g;Ljil zlXy~soQJ!~HyzoP5rqSLeYfC^CW`d5pdWqS!9PgJC0vErmLI!ZJx9Df$pS0Z#77q%H%2ihAMu_OYd;uA-&R8Ji+3X=2Qz zGdwzfqh^b>N2sNGI1{~`-WV=xh-d^_W)>2gHvt1rRuWnxSaV$2rDE6W!WY0)-wI_Y zCCCfw`E9vazV`cqb6Fr-J+r0@$GJT`$f84+Bv35|b+Vq-cNr3im1eH#B!+8Cck%wf zuIMO_uhaLBx4@)y4YE&G?i@4pqTD)i_int6{3ui0gF>k;YRJ}OUypnBch6D^@U31FPK>q#i}F3>G{~lg zSAtz#-_JK)7B8iM{A7u#=Rx2}mbiTPItbbd55A-HE_a<{$1WS0FY40i0 z6pUr51Af%EKfc)+v_ErEnaI7_`ueO=FuB;AL874*?Z#%w<@J$Nf1ufV=X1+_2Mgdj z;V*B#h^>1Nn-Ow?pIrN`?7O_am}|2FZ3h}(uFcdu`G;11l!NNC`nSxx{Pm`WHyUcH`)}QGAV4xa~_B89djSj&#qU}@ngbjICeh9c%iZK51 zlJ3Hjvuvgt=WkpOCqKUVZfX5SFlP~n*6t)5ev+y@IAi2j40r6ybN6iS2y_Z0kL_7%XGH(k&|{T#JDw+&c zRE(j&nZVT{#QgbL6(salJ4KfaiwvLK<;ma8BD)uiS$>P|cnk`l0yski=U~)N|6_Pi z$wSUIL80Fc=|>R87X@|uuI)O1iS;c^AWE<6gJ8DudCmB{>A9GcT3_L7R&d1-xN99Oifk^;k1H>U@g2O5Ky5q(cGSM@}k``G>`63QeZD zot*TSH}$mwJuc-fo{U79fX~8MYJlzV%aa}LC($=($e#E7jyC=xUV>hXoYBN2&Yq$d zOP#}C5H+O0j4=^Nr8nIcVc^dYY&_A?L)MNjcJd#-xLWKq%FVr~Mw!so!1+u1dGp&Q`a8j;gp?JE^v9=G4tB?>p?sr=B z5X`nB63!wS?H+&(3>2p3mMDPtX;UJS*fM*wZI*6pymMuVaKUg#U!yAi(q`Qy!Ck;4 z_@cIpv}LZmYKvIWfUNqYrTuuMf5La)Ri72r{h6lc&?*#gaY-HX*zk!4AtL^GJ=z0= zL9dd^bz{J9I^ZdPFfre6csJcHkXi?AB~HP4bS3gM20XJdR_?wiKkf38K|IC&8Ut798p3l@0dUo6&e-zfs>lj zZuQny5!R$QrIRWtAV*#iCwudqbNR=PQnEsvC=C{}|MqBJKa25%DwpW+r$%DK0u(NH zo{#Rp6$X7P=6Ox|tK74;He;qjdTx2N?a6sTLGcVyx5L>t25j>9aJ9e>veZWsVJ3@d zYS$~ZTLUX5}k=qlQH7qs|i zGne=}!gE)^Pta$C(JM)J!yIZQt+TB zB_h5~L?eF3VL(OcI}3T0;k7OXJas4{;x+bM(^-9u%}@X%c|54G!nI?lM@5dxNI?RWlMb%lZ$i-O%--ZOPLUheZPO4OqGhk%o!lC1h%# zM6=Q1-mlK&M-oLQi#{=j;sH^==Y+#cBXG0cpV)#JV9gRB&>x>e{9s~2AYle@Tw${q zA`;;i+_z~Iz9S33phHyNVV78T`yooIGl1^Se@W7wbzqicu>JggT07mCokLE)s?FEM z*x#<>slTB$Pf;`sL&pEc?Nn;Nq><*0_#wKB0$2cHA{OmC(`Aq8Ovb>PImPm3` zfk~p`IjsDkZQKnT^b7PoPW-Z~3y`)tH2`@F;3ORXSO+$^M4IIz@*tA2xY)HEz-$sY z2IhMaf78XMyJXoWS7jrM`osX-(z^Tkp@Je(Tmgz@+D=m$fky3s>@|}}=IOJ<&e4ph zoWC|AV)VuUe*u43-TD45pYVI~!Ij*-fp}HZA79J;rJ!NLS3&EK_mJECKiV!yUU<&^ z&2p)oLJ?A2BeT(=mg}sc@W`;5<19Nsr-pKzMt`=X!VaA%j30dWb)Ek`phgoqC^fgL zHhCNmiUZ`F+LZb4z7R$WU!$@@>L!}fJPyXac7|omI&(8q=A$S0aN#{MxfMNV!1Cg5X)8Y8!?+|v@80!*AWW`0m*peAIW7y)q z>ylp82QYGIoxG^N39>ukh{^C1M6dXvzwxCdBrqWniZM788~SiKF9qVkl{jeM=gTHx zEXjtD(tn%t91b+!9>N32O2GacjQs=foIN5Bv}dq$a3pZb=_J^vL;PsTKHU;e8MMCQ z!oj}M&jC{_yB1D~wxhL{6nUd`HF;hAP=MujY<8L~Wo-7m7LZ=!rTzmdav(W2X%n7n zwLlNqHx)xUUL!}>>|Oh%y`6{o)xBNj zX28(!4HMYeyD9PWZKDTafP-fV?#^!i%4}8zA{E~DfmK|!ml$UR>61Ws{gTj@GT+NE zKcnczQ1F>_nUb*?V=+%0_UR3A&k8^Otx}{;+q08ILt)CBeA5p}(No8weyV&-fMfrp zV_KS@w0Cw6wXInZHuc~ZUaRdZi}{M6o^PScAez=iumcH5`HOh>l?M}ewKz}it{iBq zs80_~7QGMb{_;J%iqeeuv{+wu88#_s=V)hSe=@)H2s~3il_0vC^J&W35n`2@GS0! z>>ac5GXwJ&$hqEi{Uk5mk2I)cCU8PTr?i3~$m~2L+7MI&^qyH_d%8Q-U?Mi=Sqa&M z7SNi^yL}&=6Ej9RU5Ry`VhY^}zcuEUm}(?Bq@4IGv;5L;;$j~ZQvcPRFyn=Y_Hm&e znF=?9ovI&-RbsE;xB`#>|8Kj6b)njU6;$L<3~&PNI*o03Eb z_N}4Dl)_OOi4A)4`|y>%;Y>l_orzIvy)$X0ce0MY%8>ls{w>#QR{pf znhkeIdRo3_D_5C8UDmflLMSNyfZ$vBzAiwx8BfOS0yB~@P$YQf+~d^^V`yF8A}D6M zrY7%Odj4@r3q^52yEcgxqoNM8uI1bQ>Gx)#c~QO#S`G;9%cxqk9#74QoQIpGI+L+Rb-& zU81?>eDXLm=*1z%!OFEL7~tc(gh0SKm*vx|LcGqwFFbYR!Dpd*n0YnN1@8c`h?PK6 z{Dr%qJ6-j#+ZF*e<-n6d|NbL3u3_JEO8`U&5^H`4ctXmHQ7K+5Hyt`A%E8eTqb`GO zqxP*XfuH)b(>l|eR90@OL2EAHnS8U73e&oT=V6|At00juwMdD>IQ~VOZFGsQSBuRtBzzSW2(+OPe1`3jVKpeC6$q$y%m@ zp;$-%c;`h|ir3i?V^oO^-t}c1%8#S>v+Chg_}Wp-)NKBAMwmN^cmcW6 z<5Jjpa&-DX89bB|5Z^NV&Y}MtLEBQ;)d%P7fGdh-DK1^#XOnu-_uJzb&r_97YTQ5s z3+p}#AAq#wye_l5pHs0wa)aeBj(026j6cU4lNlhnNQNNV6yjGEbd1>|YC~KQpiF#r zZ$CJ!#*}J!0nMEXBpoeH*v-rsRUW2hmBXjlTIBQUdNY6<_=((br*n5AyFl>@pN$p% zj&qMjOL7ZN4FVA|g(r|`N+n&TQ9TBI+=)Qj3MErUme5LW3kHwrlz))3F|cPW7ipfR zETSwQ8GRl@AsEkYq2aGyW?<8~3r*a-%QR=1rIco&H3vp*Kp}kS{!&{*#md1)9HWcI z@W#MzL@Y1>iR#H@tlS^Ldo~igcC-fg)lJyvbFDL1#B8XS!qR~diQe`z4~OO5#Gg83 z%DK_^0>>qRQE}q_;g}Ivv&qvGj}niXi%HgN7<(}(1IfQ+uP9n-G^m)pC@o>}$cA&oy)X6CgU=V%-n>Wp!s#33vZ&m<0rEGT0 z5KWzf#Oa^K4)CbZ$}amhODqeNXUle6XV{Pl=TMfvtAG6{crHh->3o+yv#H51dA(}| zQcA4yy~HAk;tMJ8B(4*hM4-qd5uro{U#jFt{n&-y4te=is36(Eq@rYGIfX#7!Z=p?Bsf7KB_6u|ESq_uhJtdCR~V`zya9MQ$XPe zcKNrNh2lJV0bK+tW?}UO{Hn%aB6BB(j7N8X<3E7y9DkAAXoX$|k;*5;NX~uPrPkp7d7|5i1%-D|prQk&j!&UBKX@9Wla$$Ylt1k5d(ho()%# zGdfjCqq1OeR89|*xdTaW)IIokM-7mcYxC(v+UcW0(C~(*)N^-7S(CAL>F8B{Yv_N; z>i!oB2Y`w|arVstzRP9JK%jqAyOLiwJ(qZ1)S(6qOm?Mo+Ikzs{Gy^HW3~j4ezN64;4!y6zdJOVTAsn|UEOH(3V>`0X-SkI!Wy>Sq$P$gTNA2Z5;00rI<)jZ{j3+8omakDj*ko&pLi>&HlHWAaMEnC%J6h ziM?mxHB*?Rkgh3#C9$OewZ>~^C(P&N8*-2lF0)p6VXYOQ$%UR=? z#+N5o^g}Vj)dIb|s8ysZTY=W-j@3}K%Gy3%XAdCdrevq|{=UYVGUtEILYU!giTvji ziqa%TD~%bQb{J4;E04rHmm$!MWcrSlk|lg|=50;yEj7#;SX?^%5^ZV`&z&-tC>&An z*OCplo5Nn?u)ExiC5AdXxlt#A4D{pd7p4Ht@rBVib)$f|P^~y#yC(&ptg!GR)ea8Z zSJtva$i`|RY3o4Exi8}PG62Xq06M88e$`cQ(k-l6`J}%4e67uf1L%8qeH;MRVVIo5 zX2S-)s-%^LvN3@_z%wk3Hhf!9h?;uoj*eC2sDS|fFY({m&WvZkYs!{0|6J`M zK)wUUK8hmhQoy;L(cn~sjzbz!?~ZMD^M)c81Ij$Rt7Bmu1OJt@zW_p_VUC`(*q z(L##NjaSWmSMV#lt)qMeO1!p4^)P{+iwizbXp;8N=RNJ!cE_rEu80l?IhTsZ*eHEW zr+LX9Muaip1qYuguGAB4FIG&PIP>E%8-f;x!oZp%e0RvxCAMiIVK6eZ@#FXDkijzAzgJNwzqpuaoIo*W-)<(yS zv3Kp_E*bw0deSYoN8N?7?sQ!-DW(snir4*3gU~g*U6bK)&PQ#e)!h1FavqjBh~yI& zwI?=oau@E1JC?B@@aLn7bQFT8^^Zw)`>MH(kDVMhsOG*f`{5~DxU?w?h9ov`SL;19 zA@2MC^8zed2Q@U%S_Ml*7J#J)x0g<+oRutabxU*A7x4K^x^0C&oW3c!Cz+}>Tg(vs zN*&AiItx#N1{Lr(K+qJxhGXLsz;dY3ScARnd9tk(_N(xM%t4!jXZEsiK*kAVtxVM$ zTCEts2NWSv)G`upAoGdSLYLj2g#Fs(28Rx)*16|_Bu+GKTlZ{m=n89SI{|IyD4yooOK`{%d_CO@e`n=<%S6%+YiACfvLa=X!h;9e92P78N6 zBVDN1oyaDl;1K+}^IQ{L_DsO$6kHI^QBIIdKG#5ziKNTi+IgLE43IYP4C*7VVix1M zdv8F<7Rf82Sfx3*+pyVI#$2_p7OD#fDe-)JG1=w%J^8-5XNB3&y`q}WhO2ASKd>7s z%$kEn-ddI?FC1_jt^QRS0Nw(7f}GjcfBysqIqXG;5G&05-mQ4WqxeMAPK+B1)BG^K z!r|GoArKNrscxjKpW(O9)RW!ROY2R_Tm}$?H>sEjo`jEj2+$Ob1@SUg5RduV{S3QC`Gql5Tr}p8YVbrD@6jXugDr&OwGEkA;_-jv#$EuFx~ahtMmK? z=)0ZZ-R}X`PS_hn2VxcXG>7^pQyCF_-|WF+f%}ot3-4LcqR%U*Y`> zg-8;OHOwwh5~?_z4TRMQ?W_C_A=l0@>>e*~Nb@!9kAR`F@O&E`646f+U4$;q0CK81 zatR$G^(rUw9VW1-q#1mk|0QH9{&esg#;UnP>42wE+{6-VPfi*VY4s8fA?ST`J`Dr5 zjZ7BM#3stsiD1xIR(gh-hQ-=l!uO)Q+V~4Ek{1P~Fh&XYm*$^6ec?wKEENuI^2qHn zUMTArD<(m~BZDFpjRrd7#9+#rHr#qY6ieyrg7k2JfuViC+=hCjTeVJ%dfJBY;Tg1>dqQOm1 z_HH*i>R$OPDDSZR#z~#oYTu!(^P?(2%lzAkvf=Xqu3O(xyvfe_LO}_9w_7@N(PL8p z)av#wML=go&1^t$?Kd#p0kl=hlV?HulXBvjKH!D{RWB6HMax-ZShcDFX z&Wle@MW89vAGG?XQ$#LFGd+Er z>YpEMy_`p655K!XiKxj)z8Y}8ikJqdhTxVO9pE8@7sl8nw?~)_y~uGAhZDKV`u5hJ z06)iFhXfV@4HYXm-i9)40`#UI0J)G3g=&}t=lhK~NPzCLE6h3siOmo`w*EQU&ofzs zvtk}*-J$~rEdk69CX|# zUH~R*wcD3Ht{Qqy+x(6~0=?cjg!W`Cu8|)kpeO|;lHJ4kpR>^tqjifqfr!a;{Jsj) z)gg-Cd8Z+-3gUwsb5#Z|*Z89*PK8{L0M47I=Mb2sXzljj@O~)ryv1~=76`;rRRU?+{?{%*p9XV+_NwS zHOKt3x2&i0CRKNhaz_(Wbd=coc}r~24-D{>I5G28bS9;lom4OMDav^FzK#AT`1{xa zxOMt`HVe4vF^7bO)_wcNf$qTh%%{13tO)4BE|CpyGo?a@ILf8hVobd^z2eP8=B3^4T2Ekh|GAl)z^3eo}s(jg_? zNO!lCAl)q>DJ9(@-5rujO27B_U+ewChgqyybI(0{pS_>`JkQC}BEUL71Mdq)nysIf z5Cy@rQ+MfAqT#vAH~CsR(6m*|#u)>R2P3dmX-|9T(E9s>0MG*k;LH`MS!e)P!uOBj zpm=g`Oq@H(-)A!LKb_EDKE>svQ)w8 zL%u30k*19CC179&{A5>ql>vHx(pM_SMbESLQ*`YAQbs^M{(-J`T6jl!Lh4B z?R(3VuMQc1`@4ei&DAjrGL1ZUM|mJ?b&of;n+%F2s#6*8{kc9TS3xf+-Y%HVQX1?~x0Z>7lNY-l z5GA@3Ycjy1UO1^!3UOBm3d$ci%dQ78He7m90zuy{_E2^<mio7KYW)VPmTe;>2N3Dsp~=iLCXM^uyz--O>@P|Y zrd1belgpr1=714}+2&UKMpCMW14IvU?jnD2+Q%bbM${wHb)@s%mdDme)`f_%XaKX6 zReqwus34wNtNy`@cSj4G_JSx+VG#c;Y?2dDyNXEkeYT(o%AmHw0uBROV-zKc;a2i< z&5EQTJD4HMq3uCCH?QZ4r6U{Cm#&Lo-nx^Bi@_oe_S($KGbwmvFpiN}UAm_LBKXhI zlA$@3@^S0tMUd$bQS@rQyPrbQ#>tMdv~S{2fx5VM;2qjj0`17f%7${XlPwVwwVuB5 zw!X#1%k&CO?G-#0sU-EWX8;n`$8MY4^%oD+xF&&cHKoO>&!f1-TWEncw62h-^n8Wy z2OoD&LaQOI_r?f1hlhjL&_ByZY^cr4jB>@|$jfyl9BYFCFu6&gMI6_)*4qh8%oD;S z%});-*={YVPOIECjqlD)hhxANFpx!(c~ti~{{sc|ElfK8RIQ5I+y>%w$Kg@(O1yq( z=no7s$~SdeJMkzXAQt)-#5-!Jfx6ToeL|_X#UD|Enk%lZugZy70cf@=b4^R}-CB~k zR>i75Q=i$V@BThiT)=u|EB^B9;yL9ca#+O`|8TpmkTpSgkX z`|Lq3u=;=j2Y^-~>w`Ypw|BJJ-aB=U1ozZ&@~oOJv^0jQkGlc4~?qLckZ zt97Qkge20I*Y3&3!P{gm1=k*S=tn^IcU&(*D4ZeuwYc;*s#|^I96kYU_5e6ksF|bb zZw#mhf=LxW8dB0s$({V3UAIpQIXKAUU03!XNfq1#Rl1Pxc>k>O9mhh%Ww3uc`jMm` zR=tE1`x~Bq6@mD#Vuzu2{MNj-uwwlu5?!VTk$G{$L)HR3?*7rd=U71d`qV3}7^Nt~ zc{oF7$!O=LT(0C30PDKI5>R>PlUISQ?eed!O-<)$>$Q?18nVS^Hq=%1jXq~Tfr{h@ zpB|5DJt4xTYNHV?xamEcv9-z8~s9O6#TtWh$*^1IyoB|_{(6I z)baUHiEd)v_<%o9C7T?Sj{o>qBkZwdls3@gYT z__R?FzgqVh07THe0rM!!zltC+R>R-YDsNEYiNhw6_5S7@v6(5ir~)q{wuM<5H2`MC z=w!WGD;kZ;pM$gJO~sqfsM}jlIqhQFzkn6YT3&nxs)$CeN%vzg$2}56hW;DXS}*Fu z>0#>cdZw=5^j+n3ONA90$DH)N8Etpzy(*DC>^QM>0iPq|vS}@8Y|H-lGKh-(fllob zKws$xc1-@ejronJ$9=(PL9G;>O3JQ*-L#!w_sU$vrf266W-3EDfzC}7mmsS>R$zH9 z@H*v_<$KnJS}u0hYMtV2zlezFtnjYt6m5?zVkJPu((%LUEdT=&_-u1q7<7)-TwJ_D z+%j$|KWe(|pu*OAWGV5_6API@KEtGV_#Ssp6-;pCJfPq2Q4v zhlp5D9m#6-kG}qX;2ygp7N?HquY#hQyNM?m<69kExN5M!ZP9q#pKKu@6dAC$im~&-4NFz_wJpogLSjUDi&4eNWaYnbP{@J^ zX531qbPEgJFk-Hb!_}znsklLXlRha@z1AsW4nm%o#batX+dR=CYTID}_VmVqe20zy z@W@)^RA?VpPz;CMDEox&y!+0n%VpxLZCgZy!r~{(QZ;!fAb!QHXSD`aCWAFnNEpdl z%$o{7=_IWiA1N4=Y5&jhM?V)Cm;%Fvz-6z%95a*&9VR8(dX$MezHcL4)naMGFh259 zz;2r_)P$|P>UkNi>7-d+DyQN8R}rCsi~#t?H6%ejdu}ujL-!RN?Yz99h@7`dLWRml zx$isgkFb)n<1iL|87xq=VgVBgGHJgu2O8Z$LMc;XaeL2-SMOpVT^h~t1mDY(%C(UN zBGx{|2;SQ7TNR@pY3h>+;Xq;Ac0q}7gU0W$MA~XOnX{YOA#5L-(uxgj-{!ic}?gK(;nLke^ z3`GMv7XJ{xq>k|&FIr^YshN+em##S6bU2d9Ri;*CDnb+_MGzCsIc+5Xhz9&Nd<0y| z;q&tRE2kpiGa^Y3R|fSUL?~eBZEf#)vNWKH1#m$6H$8TJKY4IWuX%TPQ0DYjO`5fl zdtJ>p6&ooy(Z(WRQ2ol6pqW7ZN&_g`ReS@Qcp=-f7;37v&yPDwmMTd@M(V_>s=h;y=Y1+4UfjIiU7ZmRIzXLO6(&`rCZZ0K z>d}uu%-PRsNb8t@P^28lQ~F+M(bfH>I;5TmU+O#*OCcl6*+&A}7MpDOy&a1AL~`vh zjC>`lD!04yzr9meyr8NXxJeBTY;vl(K8{>%4Q9=LL53fm8Hf$DB)8?TUSmd6$G`6M zp8(Irob!55Jij!7f7*`TT-0C3uhdCwRUH^H` zIoZ7#UD_c`V=opxiIcecmWAXc777X-BBra(jFRxUa5OzLwx~>f%mKHn(0GM2U zh{X0B*1=E?1tn89h|j1t>&zVLV6q1woeh<@&Fj#$Xc1NXzJ_%RF17V$|6#ww+rRhO zJjkWOpXI?o_EXmt9)J5}gG=$cO}EIMSO7WjbgcQaKJ&u9o%u)5o(^QH&X~D}#Er@5 za*lBDwL}+>p+TNV+9%m}p4@+m2Wf+>_WlUjKSh&ffpC`m=VN-0PtSIieYFSBA*$-~ zENNfkYB2rWiwgwglKzRavLXTwPv5WEFBLEb^xQNoLo0}$Ca?Z-Q(()OZBrV42-%C? zv4Vb+@YA;)x&JHF0ZpF-Ph-A2yPVSA|6EjP&Pt`AK%6iJ$nbj+l z8HyD^Y<&Frk7^kKNirHFH(gs29sY6N{lFH&96)VmFZ&O?Jg6T)Zo^>(aS1dS*)&1q zm0}1DJZ*N2#!Rc)Pk%i%O}*coEe4o>fg$ChFOBRlp*kmvxGY=F%Zy5VFs8jlQLU@h zzQy}2eb_iwQnTdnF5dS1kf=xY*Tylltk*Q9@#@6tf2xM6;y4YBK4yZcgl^^7&fl z4*PDG%+HXR)t2@cR11(8{}!BCt_H_|Uro_nW7g(s?Pf0;-ei$6vx8!G8vl-yyo%l4 z|BfA&TpwD8WkWgA_M+i5+N^D56w`lVdQ-os!D2@kj79&rvLi}S=fKlA7V4`BkEcn* zen3#?;uFZ&rG_^j^2gVBD3Ur?7LCaVH3w2W$C&r0WeGPOtv7`#sf+o;4#C0VcdMN_ z>>|)hZMbvp+Kw2UJwE5m>C_c{(dttb&1%WP>V|Qww*w7CmcOEOaPW8tBmOBmvj`+4hrmZWVo_|wfjLwsGQPQGa*eFo0YGV;7Amq`D&|q zdN#|DQua{W6^kzdF_C?LzBG}rV2YNjrF`OoyKc}E%k%X>yq;U;BiU2$PX^3$0S&m5(fl87 zZTS~v&+}!&sV!yYC`TMGhu=rX^jZ|mFY}nYjU5Y3$!)~E)(-zA`!#;U4uu`qXn_!G_DcOODp|E@%aMR~5arm(5=1Zjf`Y1=*B zvbQ<=cJ^)w*L$J@?xvfU)X=(1^Oy^J{D6ei>tEY*Z>OlQ=um;bXxf-4(6{|5MRUT` zQ%Pln!G#UKcnboSfrQzB_W0Y-$o@xH9UkqT&VK5dqva0msI#e-X znD}e4CHL0dlGLpoVz~Jkfz^&BAY)!P^%S zhX4Id=V}qv;i5nR4Dzqxbbed4h)2IbVnf$RDLyo9dMx%P^wM44jLM3AZAbr)9+2it zD2hKKI2?hF_U1S{f_sS1^1%clasSpIqgT~aeDlR zO@38Qj72qbN`d3pidKV*)}NO0zDQQHyy~XPbHAjiiRdTIPN?~^9m4QXa=f{X2E4*+ zP#s;#hyTd}2+HS_B?-0jyEaQ;{2ZLhwduoZ6lIie>CLa#&$Tgm2ChRVj%n%Qty9ID zv{q>+Wo+=15GvSLd;!oo?6~_6BJNHPKtd^w$MFQE%QEl;@;+88h(c;N$Aa>awa@#1 ziUn-dzW#fdy;CnwtfwfcrxQ>KQmcOkoqupf)QNhEi@V**Ss&iW8XNJ>l3gej5qXPq zE!CE>jknsUWmnj>Q`-v3VlGVAp%quZlJ$pmtEhc?(@yg%iAPX@8dkH;w`p}WkGe)f z{t3qYM5Lz$hUHzwXyo93(MWpXIKP@G|QfG}+=P`Re#L_-=2$32*Zx zHnBCDSsqr`=-JI;ScM_ku?-@iSUp?l+A}{E13Pf+;0;&1j3;Am7RNTG>{2!=2n`b@ zTyX27N}?PyGFR@d_A5;aI@ECCKy#-Qp%WYNV`dvTLYBhaahbB+hUe#A=m8&JCc%J! zirdU3R7g7lV?FVV-+nb%(FJ#Zf$)1i*FJ4pO`KNh-F4@-fPSRnO6r(CNeH2~|3sni z@kit<_N3Da9D`IXinbRhYk~mpk(agn<_^QyEu{#p=4P1>Uo|?*6pUrgFZXCC|7q}M zw?Fd`A^;FtYI!Ec21T5O7z{^dQ!_}4N4Q#-VZ8rwQtHU&)p&RRM|j|cglLy`P#PvL zbYgrWZ2JA}CWqUJ7HEf-ZY{x4 zdaJ5m^=*N5Fg~N#cism5b^(lsvK35Pk!$2>y2p}mgZF`H8&}VYHdmfyZ(|P4PjQMdjnBPH?f%qV@D=X#ajysad6L`* zOJS4n5E6@9RBw~+t1P>`TizZugr%q`km%!Uk`xIJeU4O7D=j1O@{14k3-({@FM3jY zpX&NexE2Qn#pO^wh5=OgSDXK4SDSgp3yAdv%{#>LAwq^dcH+0Pm47E@C>XPXdTrf8 zXSFlS#lDlCOs?egYzy%vKRY^uZmP%r@Rj^QO4b^k5=}NXFwy_Bm!lmKp%}pYzH;qv z+D5P{4FceUP-&13*YVN;aW6;k0cf`aI-~)aBTbgWq#=nSCM0sx`o*pNZ){0j4`UR+ zP6!vhUXwXE?FBR@(OxW+32{lt_4$AT;FSJe44-kIy{>k4G|DT+ltP5e0^(*QX7xSo zmAoV#Qn}~NWHQ4K^W8qBj(;OLYd$X}n_febR`L}CB1duU41UW z6Mv1GE!@+&M=g9iAM(2-DP}~ET-2d!#-vi>8|Lz&r;S*l-q+g|mhX0l-N(Cl-$)D0 zq(+RKZI61-M+RzUV%>itkw<5UI8yd`i1+n%s^sd_u{A>nc zFCS51*WdUaw2$WP#QXb?I)P_dBv8Cl+`co=bOIDE;jEY*`?m=7#au-Qx*tA=P~?{SbP^n z=B7U;9{&M;%v-6DY0J}3h__L9#eFXRzlWiqL(%-7|8mO0J>Z3F2 zX~vXBy>}U%75lcPxtO24&9oJ+sXKIOU6cG~Y!YCcH6#Xe9y!#cy!zGJwTuo?oQ7wB zoZ{+5@Z)J~8DFMl1%S{ZWLVzZ zqb#m0`mWB4=JXQh4X~v$c4-438H?I2zO`8{=`a__Rt)=>VkPc%4ph&!-Gqh*PneQF zLCtFv_zG895{w&r5obl*pCMxuW#5jAsCU0M7uZp1ySZ)7RrnpwJXOc!zKs0b5cd(= zA29?+T_5q2HQe&)_c7kO{dy}skdb1iv-SK3t-lM?jFup^()(dNrCQP)GsgC)WS7fs z%BPT@IkDo_L)C|7rXH9LF$SoH%!|FNv}Vuag?OF$bG)52KOJ~!U;Xm8J4{UDrJw(B$7i^WPbD=y~GSOFL`W7=Zv}e~$CR{rbf( z2ia0wXyjZ}6h}l0BCa_!SoHv4OZFBIfK%Hc>wr=-nNr*V{N4uLC8_QeHV4M^*Wtfy%*7YGh*?Vq_}#!bd*D)oKy555^*CL zMjm6muo``S5$|-`pSDw$C^sYHzYRxZi%0V^$$6|+`kOM?>;635qEB>>s3Yey(M-)b zian8Z0)f1~n)KRLafet(%kw*%kYB0tj|?J%+GE&Hpsq~J=xaBr7rI|Qj<+=pT@38+ z%9tt6$0C|ql*?L_QITVKZl3VsH$C;b++P>$uV?~IDDUp)-+@MWvOkXy^v630dxz?4 zd-Yi)A5-3MzR5rY02sfhp<$#k?m?M82#M5uujg0EnBA+%5%aL8{AkCX1gefUZHI4g zlH75LZ!-^s;&hw=B7oGGXm)pJ<#v>IFRdoOH#wWhWIE#mO~T(?%!~7@F8i^e#=YhD zOjc>PLI(IuLX$P!%x%S)kv|Nzb-F2f7!)lj5>Bk#R%2@|GJX34sOU3$;n;7e2({Vw@vi7{YRn4mCmXdxF13 ztMy_4iBuR2?!&S@hfw}VBlzfW)#_zry}~nQP_=n1f*z`t6%^QdPw+NDATlAV$z$NF z@g^-AjMoO+nEi<7;vBXNA;s2-`w;R{vnHR zfCpdb467nb{vj=YDvwXsPH;_sppp0zy8YpgR4SbaA^VAknM9|}v9fV`tdkJvY6Le3 zH#)Arjg|r6A2Cy+z@#5Nmp0VNnp|{*Ex+z+T1r7@*@7J7aEq-+_X~~}QoG!A%_Ey` z^7p$kkI87fWwBs^UgF~h-eUKCgaQvUBeBP*2v|+~)Xi7wV%s^?;sh<(F;+7~F|k2* z2^%8JI20i_%qinEr8M*KmJiLw26OzP?u**$^{N`%nFBBhM{d<0qasP@tOea((_6^VZ`N8D`ghPCFHU0k!81jhahMaQKLNz@0;~5Qo&Vht z`@I5_#seD{-j>hkyPMtgl(84tyTj=~T&l+|m0dw{p)X9)pHheW@A2;_iP|hoMjCX* zb2J`wi0`Oe|CyMZKHau2np+*WU0gYBPB~WSCf$zcnj{h?xl4M`0=xA22M>s*8@e1z zsIAIm7EJKiy2~EaYZIgw~1`KgEVEGDMo(60#}5CGOD|0e=FVK5nJz#lI7obdmn28cwEIbbX@}w zl8JZAxqC$MtAT!7UZbt5r+TlNCYLVC1O?3R<{cS^bqYBA-dzYbeb^6v%x&-5U&10R zbC@xnQrNA3B7b=h3;lKy{4)74olkxfn_To$-r8wX4n;ZpmN0WOk?&k=n|CmY%)09p z73^?W0s!nkMOjye{Vdj>v+uvpt5CcMaB@rGUnx3BT@jvxk?Y5P+II4kQ{Xp zeS+0%n;-=LoCf|0ZlTCMJ#0`WRt}Q&2ix*PqJHBWS`KQn;+%?!*Kf*=J`Jv{YNhQT zyYD{8`qjY{=pa8sF!*c1)LCe!lvc~I|Ij`C5GIiIZo6gz6}<|~2*oV7qCW-ee&Rxd z?Q0WaHs664Y*lz>eS#qp_OQ7%Wg4qJRhR$e5 zTgOs{a8OV6rzLTh+AWU;W&Alrw3xNv6#hWg<5eMy8hV(i6l$cJ%<&WTOFHhGIboDkcCG8h-=xN5F>1rc2})OIgMftj3eNyU$B} zy{LNo?{pB{b9Q5VM|$)$dwgfNW0Po8Ja+RTQJY96`pKQ&M$sOep;4#uwtn zf9l%2w!L~jqjy%J^AvjVG2dY;+OMlRZhjHm692krxtRDvljAkO4WC=v#8OiJN^_|~;UW~(-gEd``%eIO(mt`%(-87s zU=~CraN8Fd&Nh)J3s5uyLuz=K-4Z`8-1Xpni_r=rhLD z%*k<$sk2C~%}!pxdwXWy4%IJ>S>iXHRcrq8D|pmIX#n*wIV@kajLuxUm@H}G=}GDLY|kYuO3^@I7PELve97CsqO?dA?J&I&YUz+<)S<7v-5;9tWPE2;@doQ_EB1Nyl@&J zOMin+?z=2)ZHdb^$^R^UcPdE0mnqHf@93)tvc-qg_TJ>@{b`QRb4Y*y8XbLffJ+4* z9dee_j4p@5PBMhUUfvy;t!1nW!0)5QBwx!jqa|^l-JqaBhK`u zp`gjZ&0H&kVi)@{txFjrI5;M%e=>Qrt_2`|9Y1VMO@F)pyZqnV9w;*@JXUsV!jR0* z3kNgfoV!Kjvr|q5-6y8(kRqu@|7=og&&Vq2FWtp{_UwT!aDd(a;zwFO@}K3~1Ufk% zfju-D48Bu*q`b7%1){NbsJw)Fe|ZWWkY*;8ENGiZ-~zI-HGLjPqZlX3-bczuKbFln zWm5Qkx$$Dw8#!V{G?eUKQm}yG35|W@ z*x337fP=lGM52@?;rQq3oV|ZZ@5yt5<*wUEhh$W2wQ`Kn1C50+<&sE%!P60+1BWj2M zP=xE9XTL|rJRApvTQ83;jpKxjy#tvAM*o~$7KP%I+xWlR?YEpQ6QKuCcoGq#zTmqQ zVbi`@cpqsfa*u!VNBZ<4IR5=)tJ%^q%k@}ogT-m3eGSQ38^I~-r}?5ECN%_J2p&XF z00#mrR%KfU(MPz%;*uj!6Y1-Cuk}4NT>bXsq_DR~IcJ%XPW5AY&$6hSR^N=?CGGVy zNy_)w!2@Wrr&O99kAK2=7(-Cvfizg&liGv&sjFMpFLg?nyi|*ocrkkFIoDS=+o@dV zFt1@{j@pKzvsDV+*RwNEqV%XsJ#H~1E>aH;vf)WPPx{TyJ8di?u-;zw9{jm{c4=s9 zfeye=kzsT{z$HN%^Bv!KzCO6A|HbwRXDq6|9ziW{JiQ#40)2}F@oCc6yIPUPREy%@ zhKQ~MG*rJ?A7&&r<+DvFQ=`p|-U9dy9O z<~J`h@*SGeRld<_H$4QP|3|3-c9Y*r2Yv+kD zONR=qbnu05tj=m2u}n^4Q`^S=Mf|{p0^`j&AQ)Ru7Y1<^^Yp7DFMQ!+nOXV&wRzW=gU}W;ga& z03u9$Gde1EYdEqpAIb84deJ<@aLV^-iwet$|I+oeI}R}xt@N1}hX95@o*}MZruLU6 z2xL$DmsEwwS*Xe@CK2i{h%f{+j#8(K`M6cqv9N&I>i!3MvM}Gcy`anBR}2u9zjO

3`(QZ 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�!_lzSOQpgpL~ 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 u=$>~pbA*ldEW>?mQi!xC(~4+s#%8Ek$n21 zzm{YMQ4`C`sqUAuyzTPGUW!`>r8E3p{_mKd(X^i-2!K1|8ggV;u6J6T8=v zMjG4y+vPw@MPgGMVRHj9%p3&pi_h(;0X+1NOwzob;YYD~pn6dOIf>-fNqz5h&)!g>fU^%(5uWz8VGYn#JNGD zO`R$D-N3%W2rcUDb^ZzGtLeZv!yHW54(DtrrnZsQW{13Ip$dGk%7QhY7vlG3m;1{; z>xz`I&#)lq{V5%qaDEpBO8%S*LTqK#u$(;JG{QXh`hc}<<0Y~Dj?YI;B z%?GY2>be?>^s@BJA0h!A=jT=pC0y;#1{>zU8!-j8v}6ZdOORkCq~HUpaz|aDq`1`j#>R&iSp}mahdZ5D_+W#Wgo4R8VfPH0Ve|rrLh@>|E*a&K(m9YY+ z0X%>4YR@#+?MBSi-P%*bRFMV;sEgTsA1^e9>={8?phQG9>+pNg^J|rpjB9S%enF5V z4SXjYNY=OHVL2z-XhVmIxqnGYt{U_^CB>ra-31aARfXECd%9dRVN)!ov!2gn=nc0XdNU49(c(`j`o;Z#)CnwhXFs`ZbBUFRhBM zr3-Rol0_q4hgnE`Y(G0$*YjZ#1D{XIW;|g8pIaMY`6=T>b;nd5B=qnLl{*`vJMX2K zu=}Pw?`e^a+MmNisoL=DtPba4s30bbSEtm|=92Ioldyn_?Ykq>VC(0P(e$4dNc!^z zRwT1A3E$Q5^~5Icq%&EYg`%hA=l z(#uL{vw1I2H76H!&*?MB`h6Z>AJzoer86znc8IMMbQxJY`a9aIyybQ)>6JkVG~9h? z9BCpCT5)sVTdEBM4K?&G3Zd%#x&!M$O_${ll3xy-53H2m1xB4s*^)hGg?OJBmrGjn z2Bmp)q3F%5@lcERNM1lRUgEFEkxDtLTYcz~C7h;9F>=bkM=xCHihD^rNRG%ebPl9ph2h>X!1m^Cr~Uw_-%D1LmYm@bW}o};8rB2 ze8ip)WjezjB87V}k!6JuWkkQbENqW(9Nwd*mbH=Tlh;F8r6v;x#|U2^Bsvxcynmji zmW*tu)$OlVfvr75zyk8A=vZFb#Hj)pA|S^9A=B$w%Z6z=8Zs?@#VW9#c^a zA>lHh%e!}jvw0YM16Bb(wog!p#RB?%(1w-M(W19-M@*s5G*73T^JgIn(Yo4f8!OFM zEx8~hkf$|@`x^M`g20(cV@*dU4gXFrNhAm(H!3wrEQv&poNbeH7t_dmD%p-Rump7_ ze+jHmGsUtSB3?BESP@?>6zM1D5zQUqNXCaV^e0~=LYIPJIrVo6$!Fuei*%KMzvR-I zT=7D=w66}f8zK>|SDFkVJdjo|~!s0unNo4w4bHjmT?n!h}EK#~2 zOr?3q}rwj@+2YH{Ei3US`BQ6EVttHRIt$H+ddo zrcd5utwYjQ-Sh#fdoaN^4;`^JCl@22nM_{I&BvXI7ZZ=!YsJfN?m1S{(N|(;hy1Xm|L; z9=Q9viHc@c*SVy2_%{-&mKBbH41s`JWU@jaTe$p1&;ci39W?FT(3S>sb^4h$Wk)fx*L0KScclhduK_ zW33Hkh=&Bv4hhOcbUP#93FZ5aV%!`eO}xWtch<8$RT3|3xfI;kg)gGsNARykQf0@Y2I2eURN?vnvG-evY- zfj`Ddyhu-8zkRpTg8pylHyo}Tr+Qy^p)g=bUM`C*`49%p5I0F_4+SD?uF)CHn3L<8 z*mNl;XGp~J<+W0NNxBe}qwyGK^~>5A=X|ti^jGNg*KN3ClB9A77MKY0OeoSAj9H`v z2gkfS4$IjRXzXq4b6|sB3sMec%XEm6?OH!@dg?P?Cpx%)(7=I`k3IdePHC|%=cXRS zzZ5O%nm(r#`KP&S8p)X&iWM=cwnIs=i3B2HW^k+1NJh&fkY-Tjw>lq&aP`G1l=jc? zdv5s$wP|=sfsh(t35V7$ZK4`kV6(#ZFKm$?L>DPk z5GtM@_eXDZ!j_0KU05r4bB0lgcp*^^AxLG5&q95~zz9wnEyX#WeBLq6(jFHbp(?Bx zn4aA0>Ov2faKI2fa^d7T5LC+enD&#Ro?lTJ1;((?N8cwgXvEpQmsg(HEIEjyXt?ml|3Z(;xq4xv?lNK`GJVpj-DuIcU5^VQ&SFXz~ug>(l# zOxqzBTJZ-u#jmZ7f|c&Y-S?*KyEy(}_x2LH zE{gtyejCY6nQR;2P3hNSD{ftn2fIh4+lf&3?v9w+&bXY~Dor=6<#j){_%<$$#a%W0 zFoMb0az+>HmJrEZa?bbDm?i!7g>N@yRsj!_=p)7=d8_c35;8bq`G`wd`4>8J%^*-_ zZE+?9J~Q5QVKPD*t@=3l3fH;am!nG0E}g-OZS!YWF0nsb85fG^iSFw#jQqmTt}T}Q z4A~ofO*0wBbbwHI0UpQiROr;z{?7F{r8C&Xp`!+IPi^$f2KtbFH$}5Q6>d=fMT8bW z9>9&q$FcfHRZwmmuH3O~wgFl2t9Nq3UkCn{@c@Yhj49OCR)4sW*DZOGX{magysHc? z=YP$Kx~@(69s5K3ZAzJw<0Hv*=`2-NrO}#1oym+zl@$sZg=0ClQOpCq*+=mfZPBu& z8@j4+8SF5!GU;x$4`B_Rnyu*~zmNvW$|TG*r4#j#ACEN3|IEX<8;E892Ze$U-}ZfJ z3;P|lR6_B_H&MY;;uhBcAqdKuA1$!LFB@Nk)63XP7~Pq^YM-~tuKF)e*@?Y`ym66| zQ8^4If4eEMnbF)kgBKQ$&lM`3nn>;}7@b!v<2r+Uf_)@!*SMqwN?;<3# zRWx1g`JxBjfhl)CwXVv4hTH^mY29}_mw%^U&S@p*gAB=ucoBSB_(OIe=|&b52!<*W zqQpeURK?moh5c!aXD#e2HO=1x9fs}>n91JGYt}T(gY9jHGeim<&8Aud*@Bt>U>mQ7EH^ard+P_`Z ze$9+$dKxXm(gY%rNhZvHxZ(Uy|Bb77uu^eK4a6UC$8b|#1LtaM3-|Vp#tFW%+IS6S z>}uHok20gcUV>h161QP1DNW1mg8lf99NDJ@(%u`9%!HnJ;ptLILUZsK%i9AY)?rko zI5drCNAv~tgHHG*BaklFGvxIl7MG(x^SRh%a7#< z3!h%Bva0T}IShEoj2!C>UJ7|2wF?teKj0u_T!@)7QZ2`}lC6uxzmB>8b3yVBpVrIm z1d>npXvbJX=&#R8+mED-qC>~8MGEAGu?Ig+yYhyb%D9znph-<>*gf|$SPc6p84B@m zr}r`36n|L4^vae99l)NKkToMaO75`9Ul%#~;~}`g?=l(ZOdUV}0oVz3$RBi~ufX%i`9bkRNDe^|YgRXbsAw5*A5Hd-dD38BRw6>w)+0XP*uUwh9s_O`c~6 z9ZlE7yho5e$XhHnyCSqUk@h`zz0mwR4F`@Y-7RbG)@7yNzrx5GPGS}X3v63)T2v7NG#{LgzC`m({*b!-g-$iO&yk8 z81HYZT@Q~fR17!`LF}Oa43)U}rNU*^b>0_Emby8Qn4IfyzeLaL>t(_r%cu(H=e0f8Grj@3Uu?K&69QIt7mYY?c8z1v->IsPXeqF!~7oD)h~VLA3Tg%7yJ^r4DS4$!xl1Msm|ZmBpJs z?nHVXV16MR#30UnASXp0_d$@N#15@7!}^B@DP!ydh@`vrUU}C7TF%z-ZWJedNuWfV zqdb;3M)L~j92B|@BWX0Oe7C_W9KHy5)P*Otu-<{`);|#;^{#rkz7? zEci%AQRpDzKc-y(`Z=Br%ByU)YhpTo@aFocCWZNi@EVvaFvi zrBdL;5{je7FEGb8%*qmMx!!s<)Xi=OlD?e~DC4!diHmf`eu<1$gkGo^T(mVj@B?y2 z)cdFjT(FaxRb<1@Ez}x)?!#rcX~=?Bw;s{#cj^t`jhuaM=g$v?KwtzOM!m&|yYAa0 z&vp%I8yes?)#sAbC1gAO`;@%x&ZL7%D*2~((Ey#_Pys{3?Y7y@Gd`dr;!RxZ`>u0h zzlu5tfk(S5GMV$wS@nW$Ep5Ay#NZ0f8$|of^JNlNRkI%Ao~Y=J+AuO8%bvl8gC+5M zPcYTi`90|%;7yJ%pB@?lo9Mw8oxXB#38??D;)5bO}Kn+}UYP6Da;xy8jVKTV-1tvms?X;z0-B627CZKW_XQ4_8BDo{V$xZYq z7k@Wm>EvrAjBU74)%tFzXL_8OC6V}0W(;pX4EFK1TZ;fJ8jwyyseqW#iCBccbG;r~ zF?o?YDzv~2T#I2Y|5vAW#EbTEJSiUE|4NRJkR=M{>owDw%J)ofE4JGcPSb5bX!gKEmhnt&c(5_*u zkaBR@ov79N#F7Ked`p^-3xPW~My=$@kq(yEH<=0odo}kFX~o?r)?A&0?S#%tF(9$V z`m)EY#WY887Z)lcAAHxfAU4CDGHHk2IsLQ9T zXn+nh0v%m5ovAoRHoHvvV4_wNB{aPc4p4Vx!a>off&8q6-@|*(Sl*u7(cdO~`Gka- z=KlaOh7Kxw?oi9r1*Wr$ZVC3MIG#1R%gbT1Kz=Bj#<1ZMwIIb;otEq6)*&W^;7Hyy z;SsCUZS8;7R{H?+*3#?W9f@~!r~M=-l*1FyHaD+@e*I110qPR-Ssi=|BXTy@Ab_F# z+xe5YMs?+%d5+UMEInZkEsz6UXMI}9a$Ug~06L<$-xfMJ@UZV#-RDMzf6HXrK75kk zZGFQqR$v?Vo00nUkR|7|rGCSDuYeyeZmAZ76rO-;TwaX+ir~%qhflH*LZR}HisJlo zfc3svO%SwE{gPK@>DMEp#ky3Js68&mVBRKxw|2!r#g-gGj+Pqm)s6rcmF4cr>f}UG3^B6*J~$WKtTcpU zfC0SiWPE}-ZO+NKlD{4pv(Am~!d&-mgIa(G+bBATtK=pD3t~E}`L(HlZ#0SP!glce z#_8Pbz-T_~Kuw*K);uQiK8_r~v(uACC~miuTsh^-SCLOr3$7@{MQ!( zH?_Y&F3dc&2QDl^b(QycdUJ`8Owo1+q8*`P2tRvZL#+{kDw(y+Y;`da7MS2GS^m4f zh(5!a>V!6!kNjh z;Y~+pgIq$zud}a>c3IPUNu}1xG4!tLVcKeibjuYse1uaJ_)}!SXI&&{)-kw0&|4H( zWyBZ)3r+ZOMh)lIUjHDnvwN~PTTFgIITBqwB_`2jM1q)Q^$nSdEfetC{xP0LxnASE zg(OQF*h?^sd($E!j+ikX=yX0Uz6ypHakEll>g~3$Ibd(W0qU~H*qg|XV+whZvuG<5 z=OMF}e9q6Xr#oE=0c2`~BJXR>P$hJx@)PWSB`6-Gnx*KTBc_#iG*@J_jw?%{q!&%V z-J;bup7!x`?b>wFXMhH3I5*0<4@U+nT&}-et%OlQi1(;bmB|3Pdh^2du%jbPzMNVq z5rPu|qwrtSVZLZl{-_A1AH-xhwj}X`oYAIooux};A_W^3c(f2rP9h#BNqOo$sXqLO z;2IkyoHvnV&3|_!|HV~>2qJyf55>|OsMBiC-TIm@%UWiouK~<*jg}@Y>|oQ+-O) zMUoYEEA3;97V|`O*u*j*;E`l1N`x#s+8$l#2RqfE_O_@8>Mfzl;#{h76Apf|m!j0W zE4sj#6NuoZbJ>t%h+xa5|4ig+FGRf@TA7qPYzUCAMH6Jyd_dR%=tvAZ>A6BYSXeQP zP_S#%beqG6f7D8$Vy?j)ia#?=g)M+GWK4kR`Uozz@Y@cV;YtAmuQosf33 zNB#uzyeJ(l@XbdT9}X*9FUs_yKU>9EB>KT zgK+w%iGQ9q@G8l#>X{m?`WYWFac`H^wFF~yTOkymDmyS)L0l6_VhHd3?}4+sd^j7e z)1xMipjr3Cql5mzPrEc7bl4Z$ifjuUG035OnJgBcscu8xt=uF1Hb;-|J{tk-xeemJ z;8u+_mbXxYWK@!1NhVWe`M3}(>sFt;-h8u9ZK|w;s7}}qr?8wNW(zf8L3;d(f4|zr z4f1prvD6l@)LT#Ez>pOROJzBlMwZ$*-PeFYyqy)Dt$uXhZWeDBtpQWG0c2!y)7uDO zZ+a$GAbI~YCFbLi$+->}8sJP=X#^Z%v!FrX9~Wj4z`1gXe0LaNNnma@!35!ovIP1* z&bwD=jkob3R#72kCLEZ0Fl{}uXF(mpCyM;N)?;un5khCzlQ1&IkYAwK1tI%@@x@*l zYBHtR*iaDVNme^|Gp>rW5sX}s_qpvORUerW?*GVkS2AYLIDHQpnpd4&z!igyK3tjj zB6f{O2GuZHry`{)O|SS(46vlQw)1dZFaY(sBFB;gjDS|R8bN7;7Rep*&x&JsycpET zCUSWo=Z5^ZR+OKS|BeYBrouMQtfeF+4NX=MRZWZPbenq7xmc$0fTjiUM$PCYU-IA4 zVmzGaJ_NCMEwc>q%!tJQY5ohb3wdU zAoyY`OIws&7@T|bw3wve0W^!85m1sGF#a+@cVimF86r3=@%m(|8feD&D~EGQ!c1Gx z0Ym;+1B{5UB)m;q^_JN5)cK=E05K(%E#_E6N3Zd6zSnAdR!Da@LlFVIrAQDKb?4P7 zdUDak|4vTNROtF)d{4~@p>ilvW8JFkXW(c2H*(Gp6l?mDd(GC+MD3l$}&e`p;I zW8aftXlNFJO(6wy^T-h)7-(N!>He^kzglaGRd*5{EAAU83B8Tes*-aW9Nq9ReRl6r z=V=Oq;#7ctzPDJ5(uU}$KT1B;(LG8+qcbIa`^q;?t`aHy(?lus!%t8tO ze|>mz^H&Lm<3CHfQvmAKa#|R3n;XD|D343FF=7JoH)-b=K)Jyq!lrXlZZ}#K{fF3% z-;)_HZVVo{rOm9xrHQxg^m)e?dF#lD!-qnFf-ngbtz-=BpS4HBDApjnxT_nRC9DNh zgzYH{{IH<(<1z`|fj5 zoLl$mPX+og*u8B}pRD?UIpLmSzXcIaut|#vJ1)@Dpd*pYDO7ZlIsIHmxRgVB2g4B< z%>ghAu3fkTTHSI)-dZjYnSEJ(T|p~(>txHZ-HA6+hXj6$;ux@Evl!uiMG9cTj~I@W z?ctCl<%t_vH9`eCGLd&N@ zq?*NBz-I>3Iw!s#9isGd*i`ktFLG_iG5PH3-%hH!uN$kSDtE_-itU;W0s%P;>581S z^oQsDc|<~&?|l_76I!`hHas2L1LnDBbHk5>lTz7HT4xnaYlmt8LT$Nr#(6Bpb;c1e_;JPDn8x zEOj}Y*lhXcn0BqkvA@I!cU^y_t!CPrO`M2rEqyCJCC@qn9|u%v)lw8?_Qg`yWkgqs zstFuq4N;waT@(!4R5Kp(ZlraajjysgrIJju zbVWLQv)eTMCMl1%@mWOW@rzxy8J5_B4PHG2^0%?A4le~LF>c09f%I5of32A8r=}svD=}zhHMx>;>LqQtp+66=@Dd|oL>26p` zx>-7(3%x(z|KZ_v{lxBGbLPzH^PZVJPh-Ht&W;E1IEG+lW0I_PhVci9_bES#WBv;& zD+Uh=1HUa#<>rfaVj|@(av}s=ghP`RUmQg6^hr2EKqJZP1tW}xeE(KQPKVt}XffF@%U)@2G9Q{=k&N+T_ z3fJz;1!!YTsTH|c235SM0ea5A!b&~Q2SuIX-Xh&iyZXQuYPF=p7leN zohHS$N5Y|$H}0`(Gyb$MB~#7R`cmW#<39ndn7xl1d9ZM!0BeOH!kdJbxrgywQEC6O zz@g*LGp#0;QwiF!b-0@yUOw_ayA@TrASM0GIV{E-)cI%AxOK6{wFkyW=w6Qw7w`$5 z#drT9)q0C2PDw~Y{6#xz;g3pSvl=v2zQBew2L7Wz%Rj;l%ij=`=Y)dYX_G>7)`YtAp7*;$Jog;9C%TlZLjmW zATnj=K|qnI-Y?FY%P`_H#^U}LP|p?D4E`YWaVD^dHepF-CnI(YPZBUOfCD2&MJ18W z#Fhad0N+G}^xPFuNL_F+6lc`rVyQ)^v5exszS97d-4>l~k6g~g35^onxQ5H~}ebjSGQGsU^1o{QHhF(bv7w5?*l0vDrF)7tL7 zEHrG_<>#KDZLKdH->mzI$KFWA#7^Blp=I9Bst@A-yc@O__<}0Z(y z&FSKY?GoGAK?_XL7I~rqz)6{XvJHJBcf9oz$9RVD!0On)5p;9ETzX`_FMLeq32zl^|Mn#ksb zy_nZ(=_klF{B$9~qx_HJTB~{4kTGwvGP0-82!P!%g>V{;#9cJ|+|?jwGe=);nYszS z#`w1E(|(VCih{6Nq_dSf(VRJflkd%9u=JoqWcrgGF3){qfsbE>fQS{9ZExYsPd1=% zZ!b0Q&h8OaPG_sI8y@0BMk*S^46N0=!qPgWAXKSOZNVn*JuPIp7mhN}gY1Lp4Y&49YVjOzXWgx{d6cS|tbTew5Mz+<64)cD(Ez!an4K?)$Z>L97fq|4o#U=@s9}UBNIEMr)3bV`^;X5-_>Jc+1rYQ|md7RJ)ar~a!_9W^_ z!&B9fAJ3MBkGt&SfPYnSAWX!;Ppu>Lwf#`F44)F5Zp+r?z{&W4+J7aiZf?_`aYsxvR|b( z{n^*Wks&mz!9_0V=Wt{J494OiC!#aGNYt0(!;T-=A%0(%M;o{btowICi62maRt<1P zHi3Q5%YA=uAkLm=n8(QNA=R%S6wF$poyX9*xyX(_Tj_tA@7b63EJAxpT_7)&BBP9W zL#er)0Z)hbIY9vq#NEKh?d-OY2q~smLR7NgxS^wfQ~lJ&zIQ-+THHxL5o)b^`W-$Ur5&!bj$Q;pR$!OXJ0VodFi?pOJP8R$h3 z;5f@TGkqNg5kW1D=Y=up=JRryMG#ljR zYus+iD0b@IgSq?~BiG-p1#@M3Gw$ne@Em*jVVmJ^o&hkRo(rotKt=(aS4+15lsyS% z0)aFClqxoWa`gY)l5I(zO@%d0Cz^N2zBR3hL^#;wQ=pqtFgR9nh@>;9tRF8T(Kma~ z?_f1K13Y8u#={jd!HTrV;b?LBtjW8d2D{#!sGQ&Ckjyun_pEl%HLDjiL={z|hE$j)+dzZ+V-wUK^gV9Ha zejCBQ;|Q_|98zs?^;j|=jC*M?la60&hwH4ie^5yZ70&&^JwA}Gt4*qR-cRUwH2_bk zM&U+oD)1|%cV<;%`L=m<0613(Pxo?V&kfn$saCiJuJpj(Yp=Hq&%R$T+C3)65kMNg z2YfR2^U&%wyTGf>LTi>zG*raetD;XbXRJcuXo_?;s{U=c3bHzpU$~qLpM8s9n@Ccu zJo=qmwt>Z(SmpdOY{CgX%p%Q7Q=i-{hx>>YTbG}7iS)6#Q|wzf0^L@d5m=8F$ncw0 zP{|6A*;_xD_KxGNf98Gsl_?syr&EySxkHF{@>O?WGTj>DO#YqdT%va*y+G*qLV6h! zP{IRh&maqz%B>Zy-qbsXi2Oc*Aif|qU6Wg786TYMyIOpw1;7eGEBD$K-`u$Npb0Rz zOB|=yudRd)nixM4ve$6eEE0LGxhp?DByQ`rn51dcdO8wnFWsWKDS0lZ6*?0ATpdeR zB_No2n0uaE%Ky<`rJT?nUK}_`!Ia}|pd#P_!Vuw+n`bgfzNOe7Ku-27IXp29QPqww z=U3Lt?Ofno=rK#vo`E=wl=5!lTE=TOEAm25I!H0L4B=%0{|MDc@mhg1B`f@(aj-94 zaCVDQ@UB81YI)ge3+fSM8k?qE6ktt&LlEb|QDebg3ENUQ}9VdXr}?SZUe@ zepH3rwk0U!roGmGUKnb4*>|o23*28zCrl7q`N*nL@~eBsFfyHRux!WK*Td6nWgj)tdvZb}4g!e=(|U}+Qk$r`ZOU$yYKqIU#( zi#RQ{2bRmXku-x9D15}%`6!rj7cf!oaC2$F`PRqPJyx|1KmqQN`;cW{uRez07Y`Bm z`dJ`P3)h47F|kwj{T%Rswsq6vE`o$(?py>$tx&5n81An}pf>Ax3^=O|xebd!M@3Xd zG;*XzCR)W)ViN14|N7#!>0terYKcY`XiK2YWxwpSO=ZctTU0O~(4Ag9X2wV>@W>VO z1}9dH#<`C939&5fKV)k7%`)*nE=|KC5e1a@Tm_b_I?hXUHJBWRyj`EFy|L=}#Jo2FHkGIaPA27pU^i z$~(y;dmtn@S~$b;s@0wQUri?0J(-Vpf+iUO9Rwy{xFX*0q{{3?^INA2REt_&>9}J$ta&)#zcu^fAPo*o;UaqtxHgd0;9cg9 z2T?W?@{Hv)yID_lwgvQB1)`Y7S{vlb_3k1()%u|ibDlbM{#x1<0EX$Ql*PP*cP#326e54#}vg?NEgxVr{%i5I z`O`-cwRAr|1inX@x2j$LA=*km>c-&H`xI}>ov9#Zu&F(E-S(Vx#*z2>wq8*g-WNEQ z-?#?tVAxUUDoeZoY%mp~Q9=OCd>A9p?0=q1QlW8Qt)9Dn!XXtr_?_{K=u{~7#FU$v zx#`63j^`|&J%F2hCSq$aFw`gq5{0aq31!W_!80p0fi8l*xj+}mI5H`jXr&tZmXRYn z(Iq}-GFb_&J@f>x2}iWzb~tMJw!xBc={Uk*RAl|e&ksdusMHz~z?QK9Tyz%yiIcJ6 zJ7-pSK0HQA8qvI)%dd&J-nb*u;CRvGXgYNT=XU!x7eR2pQ}RF&B9p`j5;?P|S?h>w z%c8~zy>066Ibn=B)XrAe2a}@?U#Ne#;6of@giPrr0>ZTLnSlDQx6QYKTF}R)zeyOD zhmhSFlL~f#Y7`n!J&Y+k=soTz55TBm7pY_J1*Q9+c!&ixd&&Xi1^={ zq)qx!nkZKc?QmFvUD<_~!Q94nLy?T#P`#7s-Wm;p0b$_fI9A~5JgofTSck)XdI1(e)%BVc;2dVgLV=EBG;p5mjzAL7 zL!o!5CIaPrXSjI2AFvVe6;hs@A)If9f*_qmOO^rw!yGJUZ8)5>f_sMEToWMgmfj)B zV~-5|6!wM0E8lm9T%lLrII3cONE1D|P$+Myt0~$*))H0~{uLywP)o(n7mT%h=e&I1 zhDEyDy?JeieMEsZE0(MFQfTor;e#a=^lr8IWO$?vYhw8M;kUTNCV>i@2V0;D7@YU^ zDFiYerCX$*4=a3vl_UVo-5=HCbgjF(c;LMPhu9re+;{E8_Z=7YTgrXnUE29bmqaTw#un~cLf~W|2MHFi7QKlfkEC+YNc{1am zn$DMzR#~g+55sRGa*(t?YuU@@A8mR_KQg&s;B8sItMgyU-@JG^Lx@ZBMSUGGUwEt& z@2RFI)%zZc@szWTjhG~c>2o$2kcm^%*a~Foo*#N$H+*feYh>VMY2Q{3w>lH4yS1g; zXi#@`e63BkZivpnF zEw;BQq5kX0$D3F!&nxIX)gYW3W+jg_MI>l4Yjiq@8sb-_za3jG-_eiSAreSBbR4>~kzec2uYksKb1 z*A+R^qCK8>X+NyjzTm&tDY)|KiIOw@43Ps789~3p4Z?HOSskqV`b>+odO~j>Pwltb z&Ly+$GKIG!UFe~&tk$d@G9x#OxWR zhqLy^);=XyP|s@H0!KmR0WG!{>n|Y4s)eJ*e3E5o*PLZ>ctA0C zrFm+U+6pTu9b)zL5<)Vg&K@+s2SCL$Q3l8PSj_~fhJpOUO>6MgikzR^dx&0J*Z{U~ zw5kAIxJfWR3MNF3k~;tg+58_C;I*b+HvsW(}zuHxB?l9Q=+AsyR zZ+8m=n(Aj1+Z_NR4*Tfa3pPN8KRLbYItzSZFO~F!^d+wA&+jv%ooY8zB~!t+5J>wW zreV1)kJI>rNJEL!k*WAv)02wRhjGf)dU>>L26Ny#$*?vU{ugIj*vZCElh5gy>p%VG zqQq8aDzILd=oo zwG3Bw-(`~kpZP^zKY5nTO`v%Cjwx*OV#nGcJ9u;Yf*CECDwwmd`&E)3u|AdWk6VtG zGz!J%8Vj@udu|o7vV=nLkor>(`dzM@3C(fe5fQ_XV z;s{%YzJAP(jjW}S|01>$lrchWu>ZndhL(}PqeOdZJXQ?obkF42p{3C7| z#n0n#nB0~(%|HWufc~Ha%O7QTsvbAt z%s4EESc>J=TFQbLnBNqrX8!Q6E%ryJR@!Y`Vab!OTstbCv@%^Mxza3U zU6yWwL6nsJ}POR z>7{@iwmB0j+|F2%wFVIVpoDx5F0#H!x2DMj8ZFw~2np}5M$^bAXRx&ji$j0gnW-t9 z{aGB2%>wU-NxcS#sbeJ2ibwLmCA=#UU%$U!XYe?G_gOh@Im?~M z1dY%X1^!tSY@Lp`B@%uE<^T^@E{84UB!C&Wr2VN-a}q-^zTLLPB)MiM(h58q20 zP$>uy=S6-9%j3_N?I{G12B-gx9cW&H}Rz--pWg6M!W3UQT zHA3T`+q1$3QfiSTX)YOkC_@DK`+I$>ql5-EK9E{TAQ6LK{`x&VA@~^P6c#%2-lon)YB^k&A=o zP+m{eT$h)bxf9=5O@XN3cwz;Ac=SYw7@XKxD%@e1L3fk?Mjw|u9@73A3l2)j=F&rA zx(q&Ye?_B;+zXht2GrDjxiT^iE)DJ*dTx5&`N7smrofR=c8l43w@zz;eb4n#EDz6! zfF+ogYI-pez^HcV>*LtjNR~8cU0pp>ocUTTZIR=ghoUqrsWW`nub~rV5qfnz{BEQJ z@^Qf!YC?~;%_ltSHGH5-K7Ep6FS?Oj@GN-7#oh|Y4KYGsaD!akbIDPazTC&3jH+0%$eeP~f6vGbfx8~35-zJJ?w}g;ta)At^Ps^+_GUuXQ*|X=}Cc@x8ZNUn5(<)aRbHSLk^g@?b-U+Z&u`{afDP@C}$aaKq@Wz})IZ;2?J+A86L3SUd_* zIhMP){yhK1(SN zqeA*_T1_;55WD~W1qC3Ni_^!UY4V)<+y-AxoRpkT8!ij4s)IBDqO^UQsj*e zQpd}Uj49`meN@5C{#LDxYO?kQzAAIQ!!&0X`UQR-1)EuZMEM*o9w;rDYbpR-lUAD8dhQ`2$UQyC0z+93{Xc)!np&(niv1{+jC<+Q2 z2Pxe&>XT}?>?FF-J6Cc*mwCooZoPm`6wbtZv>*%&aZ0O1(h>Lms%(Sw6ODjU($B^p zrz(anV9<$>o}F~#jCtXagRDKF5!a?ICEe^DAz;VZuw|XyfS+HLlJ?dh+hg-4O`I+$ z>iVa-r;1a*Y=KbqQ17i{(J=gO8P7+9~h**z8a1H;ibK zn7aZ->L{#I36bk3DhB(6MKOjX%5Rmh({lHg%vJJU zgE9q;@{K7ad`60QhIMae`skY;`>NPbLSCTkua%Sq>JAFd(Zh=ZJfsd@;QBTE2DlDg zbuEZrbm-y}E7m~j!Qrz;8)#W~&^NK;covayw+ZA&^Jla>AE&Mj{>Mkm#P1Z#l`9LP z1opB?sFHc~(Z?u=+QT4Gpg|-EFDNUadD=fb)~+F5@w{Aw`MjRmn%}A?q@78^}!^tOcRw;OLs|*89c z4LL3Mcivq3`QQn*n(A7R*xqEi27_!SGIva0s3ImPEkP&g19SGvgSP`k6_sP5tY#eG z$Gi%u$V6Cj^q1X@3=d`+Auc34fF(OhlST%>-IWjTEC5^VA9D<@_wjv<3NTH-pp z!QFW$T%@$_X8xGd>Y+Dj_NeNV$BA*9>*@9==$n3SjSTf0-}r}5Tb*uA9^9ZMMH3$F z+rv@+xjkF7#P3s8=!AiH=pzAN6MTGr;nhYe=@v>+I{onSDf$%F0KXfSiuMCAzFSF^ zokM0eGfS%1tv}N;;#Myx?pJ!>ZrAQx_OEMJN4gFuzyyjdbd?~RLzA6fb+HhsaFa%0 zNX9@XwRXyxGu?RLoi%HwWAIpHA!>oab8qQP4BI(PnS(}LSC%8?jjmFR%+z}nIOG2M z%ogp*AFpl+Q0|0gyt8<;--N<7?F|k!?Eg{3%ml6`eNn&EHs~S6iUqgl2PjXOL+;`2 zo=IS3Uc)urCm8sz=7?jT5B$VjJdO#i!;E}GyE_`y%wr5e^@x3>ykV}bWZ3s|em%=y zDB8WQRa24rDVCz}!4QqP z;g0=FJv{nmp{9ez!U}^;?^XjNygWYg;2dtpOOchy$o3uojzcKE_TaU3YN|3TO4_gH z4gb}L%)`5av`;45CxK6p8{m=RZ_vdEyt#xqF1?!n;*-T*eC_2>kBXRAWB|=rFCC8%@HkQxx`b=;AKb}u zA56V$tKF%Zxu0`;n;@ckBKn^gqFCXh?!$Q5uZD@o!Y0uHxWoF{6!S=`r3Y-YdJl(} z;iLE5P@knT9^V2EDAv-Ld5A((S)$2{cZ(!WveyPeh)i=-Id$Uo7)Ma!K|f7nEDg_F zVD-hj({)JDem&K8`SX3!$*E;Qr9Hvc6wdaP-u5QPAEpuNfy#;VA(n?*?=sn)hYgRR z4(iyMqWvu)UE#~p6qb9hUx4KHBCB3#X! zIj@{7>Uis;977qr_TSJ5WP`y29wr4%{Hdk+9>-vsv3lW;_lE47ZY&+eVk^9lUWcA) z1HZ;69UDGN6I)dv+08aVPg`}~zo~0M{{l6fGokwDuEVR$+CAGIt~>+S=VN^U@Uw3T zb8fRqvDUaxP_H+sb_sZK(*~PBv;A6VI`>)7l!(LiyBa84tY?dg4uK6kAna&)feaA`6UY2a!d^Uzn<9O$e8OA>{1O8@-$ z1dn-oVmZPd8#hi20+|7_X@3kA*ujm=gl)uQ1+NG}xSI@Yl|Zb0p`dSC8X0)VZ3l&Fb3@)H(ZKK}K=0f!TZg?3A* ztu3Kd%?Cn4TA^X?I+qW;8_wIXNRY=~=_bJR$063%=__|On9xjVmgvv4x+*%wS))Yd z4%?p#r#9EkT0YvnwfY{+00&a!mj`wMkF|Ah`kU!-5jvqvb~_VzyH`}D3!A__P6s`b z{B!$bX&j)(lk?CzC_SL$bb|z>V~9J7D@Ea*=Fp*hjialUr#UqK4_RV=3}aVbvp~@l{5LNK---F`oU%? z^O{4fpQv*HB3zSqu_c$83;i2-<(az7#Fh;6;H3xc-k%u)Lk6r1-Pcs%mE@oJObNE6 z@qb3SX7J+Gp6~-6I!UvVd!yn;e$<#q-txKw2tafh7Y8cys7eg<_NNgo1`Ka@9l? z8ITLUsh_icHqzj(&^u5w04u3=eQm%BoK4YBFGzB5I(8t^nd#|JDpvBrscK9S+xvGS z=7@in0@T}IMUdw3EBo@b5z-x+=H-8O*Xs*MhwlD}quy1iQm&E>;x^q<79|+989ta_ zsd#;%JM?*ze5;Z4R8gg^ayj?WA8ba^0?thPl5vg^ok*kZr6E+@?;I;{&YQ}ONJlEu zIRtP?o*T!vHxI6(Y!JZRg(C`S6nHyz-G0S2YbV{(Hueq$wjCeD+E`^jnTjz$YZioi zE%FZ_`iNoo>4#f$L+kH6d}(j?=IpNh=!-hi2b-JL8@`9g1s z;cqUjJGj_%jOIyYs|D@ak_~sx4;X(6W^B!DSn~9Ojj*OoxC&k{J=`80rp=TnsK8%w9A*EP z0TUx3^&Do=6|`Q4S~(_4lT65cDmBNWUt|tZ9{!{bZlFe+4K%aXfs3&vpVPv>=d0Uy za^*e^=TwFnAMbL*_Jsb#psOPu?}8|uDI2|gd>6c{zDF-AOEVB^$G&gkUfO5uV8Kqx4+tgWb*7ZR z-qyaj4~Gv}#sYyx7OxaFDoY=GK>^VdN8SGgCl-l_zlKZ#@20n;NXElIwS>?R8(T@( z?B=c6Y#dh#%4n`S`!o$@Ub3!gm8|kF16(=Y6EN`NmQp zsN3TH>NS@5inexh${gi0ge<0!z!f9HH+KT5Ljw*YUd3nN4=5x6t?UwTuYf4TtmZ>c z)ToBY(boOo4v|@y&Nfr_B@M{iBX*?f4o;<8MS5SHpaI0jjSxb=Z%6Mi8~X!kT$^-!>(G-K z=x~Y4Yaq4eA>u6!-{kILb3D8HThip_fTD`1iKPA9_>%6QdQu~Q{A8sWaX%qC_^8}w zZ4rK~^`TP^8weQuCLt)zS4H3Tl}ax*+(mqxY4y$Oh84O~Wf==otlM2N*n2%9VO7s@ zo;Rn&Q+|Sn77?li6)fJiEc>u-)!?Epj#pLo+NOIN;iKH7JJiK3ope4ZVs&=xb2}!7 zEu56D;P}YHlKc(;iEo14juc<6WRB69HNUTQ7{wKG==N*FG46jXXr3MOun}7 zc^I$VeUOyGs;gYpP679u&{?L|`N5LT<&T<#EW>nYk6B*SAM9~E)_lk}?)S{24%Pr` z_^AC-(#4docM-@Z3poABeaM`+iY*(?^UIu>8b- zRTha3GqIcQlC|zQ4Nr+xnjgs!{q-7Z{fx`??KOT6{Nr2cQo`W&xT-OsBm6DGa&x#N z!c5~Ctx8sv=H-L%ZS@G%l{Y3f-Y=Lilh*TuU{HknNKkTQh|pdx0G(>%F4at{j6%mV z&RP-=*AeQi{e~MKWM%7#QE>HhWlQ9bEPi36nCe<9`;w=!Ldlg9=n=(M?O$Yu^Ooo* zVSBk1;g+y;rI$V?N@}t}W^RmKdMx zOA12$`W|}QeWSGnif69jY7vhy(8To?H6aq{mVIu##pRe+g2fN!}(unAR%jc)-T``)+MWh)<`A#=iS zJL1O93fMI}IslbMgInKyl27ui*)LqRXm%T)f(UELZ3`K0agcTq#ZLB77F&0_Ml*(&pk)M2lgl6~3ln;OO|bwp6zcg7><$);-eN90R4mrm}jDG$qBZ3U-CxfKBozxlP7?1tk#@v&xn(q->sH% z_z>XQx<7o(O#n6->rzaLAi^D|vbM2SdexrLAZhxj9BW{7J<(0w}i_OpZ;FTLx%YJ&x?WU?C-yp9`vVuV#%rEl}m8rMA#HFcg<07#g=4A z!$+8XHCBs@h@)2q!p5_g`j~*gK|2p@M{&+<{maO7VisHfsfUY1Cl zb`fT^D82Z=qK1&G-iJyO(1acCGlP(1_y;eZ%KB?NlgMw8 zl@=%oGgI6YHb{=>_;dD_>o=i^;wfT|ZM!efAuy_Z*I8v2urKWDx(AGNg)=4)4~%l?y>fJTr}4Iz3)-T@7pG9su!gIP)apuqcLKG6REboJJub^L2K>h3owA&f&{pfKr$2}U`^8_`_*r}1CMoaJfqpsu0M$rOzDzfXfv zhDW;P*{E7(p`aTNWQUhG7LSDld1mL3xoTdt;GOa4k9ak-+WNDGUAIswjtYkYQI?4DyBr=1TH$Q|#u{HCdFr&bYt+JJF- zr%IQFA~@yJ73qed{cBDJQ;1X3#a`-~|DCj^w5<=XV50nK@F5Ej)RB8TFYom$+!`Ce z2xt5^IpsbG1d*r)j-(v7yPfCVm$xv_10CORMhUEfm9MVE%AE=9xlP)X;T&sqelk1g ztNMO6N|!;qlsEGcugx0hnXvBhQiOml1K~ng0Xt=$RQb!8D>S+GMH&hA2?9q)FZ|e9 z=COen7K&S71Lxx27MJQU?@%<4yZvxinv{I}jR<$u7Tb~(Y@0krIbPa@)QGG}A&{2k zLk0q&(Y=)t*KC8LF7Tsg3abSTzXYmf?SA(Wjt6%)od%-)=2v{6T{H%-_XK07Gr2KO zOF&JFtx4#zcvX-R>%smeoLaFKTZ#vDUXMbGcZQGCIa+QD=T|FKwDMT-6ks%*1U#l#9m6YaWQ^cl&^JWz@w$&8# zW1TEiQ}~I6?Q4}^DzSxW9Z^Z-9_pdb5j=Z3>gFIjQ5Ma~)+J|n1$y_@`CCqcE==XtR%h*9#4XzsymXzn@jr`R1vA-FThpVtPnM`UOZ0}ab z`9U{*=3aPRYtvni&W?ktT|6fh!r4M9AkZt^OCv7toBf2{>2T}NOmbz_R?m7aC^G~; zC;QbImhOrd*`7t`XV1}B_YXds{Let9@lBow(+YcFdYZM!alM<_;9ut}HY5eSA{qiH zVr@>ZpUdt|x2%hKo=>b-XIH|5Mrro)dnm{ctIHLc0vV~vSs?`~tR@MVWlUti7<`l< z)340#qgz2ZprA(sJKMXa^U=|3*N@TJ%#ecR@AxDxe*zqd5YD0*6hR9`T{-VEznNpxu7oxHu?7`Qy_|aCtA%N zzMNR(!MJBD3wQSvK7+QAF;Skrar1kTavipb^itGFK!ql++U&A_2_eq{#0_By`}_GM z>|?aWD{3T#Et>@J`aMn4{4zTPA*YY~-_M^uF0Ok1T0}qD+o`TG55_=FPnt&+}x$^%G|O#kz9Cwmbsw> z(N9o5jjkKyQ4ZF-+XR&I4@i)AARW+Gm0kY^lE~ zAzA^>n0}g(DNcj$`5yzCyuR?W+HpM}+N~cVp6|Al+L*`?b8P-i`bGSz5$}D;lug@u zgLu#NWghHI?8mNc^%LFW|3>+4%<=mw3g@JM+`Dnx5s(F&Z-O$HshIGiw8V(OFrcW( zc=4WrA9=D!FDaNIMGD4R2cpL(<5ZvwnZFYX3JD^X`ktA>u6jSXTcGKG^G?J*yhGz>S2Uk2Rs0s^ft?&Uk)s1;|t*Dpyqu2$VJ2U#SGe&RwW{;IAVl zx>7$oqFgt@^qeP5!Gs${{3maG4wogZ>r4Do2Gnaxc~zw4q*DvB0+|8o0?1-E{}EkZ z<6(cZ3az>@N>FbUpeARBY}Nnq@!vuDKUz@dL@NCm4@8|LDFD&q`{}lFrsBWeQ=oth z$N2Ui|L|TnTDUz1V!X~`h3r^jOnzbZYhte6)jc= zg1+YFxop5X|s~vc7m(G2gjDHf`sg^Z++w1R`=4EQ0 z?}QnY4R==RmD-t0$S1CU>>Xebo8~0(t=tJTo4+FRy zod0-7k`0CJ1Y&s3uujB znr9fWjJSD!Ulrl$vE(&7XPLusXZ*9Hx~f?e@4#@Cz)_Y|!u-BoxFk}eI`)B-2)vT3b0_(_$1p)zg zFu{I#&!n~I`i|ELgr35{_arGVAWhm!?z@${E1RS?69X8pTW#wn0&;X3KtBKJm9*9R zS&x-IP{3nL`i1dk* VjZ7t`Md4{4Z>5!`$|Ouf{vVfka_s;B literal 0 HcmV?d00001 diff --git a/assets/banner-772x250.png b/assets/banner-772x250.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f8afae1e7c256b88c0ea024b19f773333fdcbbe0 100644 GIT binary patch literal 36808 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 U55u1q0|AHQ376wFHi7v60tQF`djJ3c literal 0 HcmV?d00001 diff --git a/assets/screenshot-1.png b/assets/screenshot-1.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0c40ad5d1f5606ddece42cd331ce9eb387d41be6 100644 GIT binary patch literal 64114 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

haXe(t5#7=1XlR0F3 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 literal 0 HcmV?d00001 diff --git a/readme.txt b/readme.txt index 912d9ed..f5acb3d 100644 --- a/readme.txt +++ b/readme.txt @@ -87,7 +87,7 @@ You may allow insecure requests by tweaking the source code if you know what you == Screenshots == -1. FIXME: Placeholder +1. The configuration page == Changelog == From d4d314e7e72c38381f907abb2dfd5b03e339be7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 16:04:27 +0100 Subject: [PATCH 87/88] Prepare v1.0.0 release --- README.md | 19 ++++++++++++++----- doliwoo.php | 2 +- package.json | 2 +- readme.txt | 19 ++++++++++++++----- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 0a106de..8d1dac3 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ **Plugin URI:** https://gpcsolutions.github.io/doliwoo **Requires at least:** 3.7.1 **Tested up to:** 3.7.1 -**Stable tag:** master +**Stable tag:** 1.0.0 **License:** GPL-3.0+ **License URI:** http://www.gnu.org/licenses/gpl-3.0.html @@ -30,7 +30,6 @@ It leverages Dolibarr webservices feature to exchange data. **Known missing (TODO)** -* International VAT rates management * Products stock informations resync on orders * Invoicing * Payments @@ -39,18 +38,21 @@ It leverages Dolibarr webservices feature to exchange data. **Known issues** WooCommerce VAT management vastly differs from Dolibarr and we need equivalence tables. -Only French equivalence table is shipped at the moment. +Only French and italian equivalence tables are shipped at the moment. ### Requirements ### **PHP extensions** + * SOAP * OpenSSL **WordPress plugins** + * Woocommerce >= 2.0.0 **Dolibarr** + * HTTPS access with a valid certificate * Dolibarr >= 3.4.0 * Modules: @@ -93,6 +95,13 @@ You may allow insecure requests by tweaking the source code if you know what you ## Changelog ## +### 1.0.0 ### + +* First stable release +* Polished errors reporting +* Polished interface +* Basic international VAT rates management + ### 0.0.1 ### * First beta release @@ -103,6 +112,6 @@ You may allow insecure requests by tweaking the source code if you know what you ## Upgrade Notice ## -### 0.0.1 ### +### 1.0.0 ### -N.A. +Stable release diff --git a/doliwoo.php b/doliwoo.php index 840f8cd..0dd49cf 100644 --- a/doliwoo.php +++ b/doliwoo.php @@ -3,7 +3,7 @@ Plugin Name: DoliWoo Plugin URI: http://gpcsolutions.github.io/doliwoo Description: Dolibarr WooCommerce integration -Version: 0.0.2-alpha +Version: 1.0.0 Author: GPC.solutions Author URI: https://gpcsolutions.fr License: GPL-3.0+ diff --git a/package.json b/package.json index 5751efd..354a5c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "doliwoo", - "version": "0.0.2-alpha", + "version": "1.0.0", "description": "Integrate Dolibarr with a WooCommerce shop.", "keywords": [ "wordpress", diff --git a/readme.txt b/readme.txt index f5acb3d..3b33b6f 100644 --- a/readme.txt +++ b/readme.txt @@ -5,7 +5,7 @@ Author URI: https://gpcsolutions.fr Plugin URI: https://gpcsolutions.github.io/doliwoo Requires at least: 3.7.1 Tested up to: 3.7.1 -Stable tag: master +Stable tag: 1.0.0 License: GPL-3.0+ License URI: http://www.gnu.org/licenses/gpl-3.0.html @@ -30,7 +30,6 @@ It leverages Dolibarr webservices feature to exchange data. **Known missing (TODO)** -* International VAT rates management * Products stock informations resync on orders * Invoicing * Payments @@ -39,18 +38,21 @@ It leverages Dolibarr webservices feature to exchange data. **Known issues** WooCommerce VAT management vastly differs from Dolibarr and we need equivalence tables. -Only French equivalence table is shipped at the moment. +Only French and italian equivalence tables are shipped at the moment. = Requirements = **PHP extensions** + * SOAP * OpenSSL **WordPress plugins** + * Woocommerce >= 2.0.0 **Dolibarr** + * HTTPS access with a valid certificate * Dolibarr >= 3.4.0 * Modules: @@ -91,6 +93,13 @@ You may allow insecure requests by tweaking the source code if you know what you == Changelog == += 1.0.0 = + +* First stable release +* Polished errors reporting +* Polished interface +* Basic international VAT rates management + = 0.0.1 = * First beta release @@ -101,6 +110,6 @@ You may allow insecure requests by tweaking the source code if you know what you == Upgrade Notice == -= 0.0.1 = += 1.0.0 = -N.A. +Stable release From 05c8ccb4a4384c0579b6d1578b97cbf62df8c1cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 5 Mar 2015 16:06:27 +0100 Subject: [PATCH 88/88] Try to get screenshot to display in GitHub --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d1dac3..e23c4e0 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ You may allow insecure requests by tweaking the source code if you know what you ## Screenshots ## ### 1. The configuration page ### -![The configuration page](http://s.wordpress.org/extend/plugins/doliwoo/screenshot-1.png) +![The configuration page](/assets/screenshot-1.png) ## Changelog ##