/** * Function that return vat rate of a product line (according to seller, buyer and product vat rate) * Si vendeur non assujeti a TVA, TVA par defaut=0. Fin de regle. * Si le (pays vendeur = pays acheteur) alors TVA par defaut=TVA du produit vendu. Fin de regle. * Si (vendeur et acheteur dans Communaute europeenne) et (bien vendu = moyen de transports neuf comme auto, bateau, avion) alors TVA par defaut=0 (La TVA doit etre paye par acheteur au centre d'impots de son pays et non au vendeur). Fin de regle. * Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = particulier ou entreprise sans num TVA intra) alors TVA par defaut=TVA du produit vendu. Fin de regle * Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = entreprise avec num TVA) intra alors TVA par defaut=0. Fin de regle * Sinon TVA proposee par defaut=0. Fin de regle. * @param societe_vendeuse Objet societe vendeuse * @param societe_acheteuse Objet societe acheteuse * @param idprod Id product * @return float Taux de tva a appliquer, -1 si ne peut etre determine */ function get_default_tva($societe_vendeuse, $societe_acheteuse, $idprod = 0) { global $conf; if (!is_object($societe_vendeuse)) { return -1; } if (!is_object($societe_acheteuse)) { return -1; } dol_syslog("get_default_tva: seller use vat=" . $societe_vendeuse->tva_assuj . ", seller country=" . $societe_vendeuse->pays_code . ", seller in cee=" . $societe_vendeuse->isInEEC() . ", buyer country=" . $societe_acheteuse->pays_code . ", buyer in cee=" . $societe_acheteuse->isInEEC() . ", idprod=" . $idprod . ", SERVICE_ARE_ECOMMERCE_200238EC=" . $conf->global->SERVICES_ARE_ECOMMERCE_200238EC); // Si vendeur non assujeti a TVA (tva_assuj vaut 0/1 ou franchise/reel) if (is_numeric($societe_vendeuse->tva_assuj) && !$societe_vendeuse->tva_assuj) { //print 'VATRULE 1'; return 0; } if (!is_numeric($societe_vendeuse->tva_assuj) && $societe_vendeuse->tva_assuj == 'franchise') { //print 'VATRULE 2'; return 0; } //if (is_object($societe_acheteuse) && ($societe_vendeuse->pays_id == $societe_acheteuse->pays_id) && ($societe_acheteuse->tva_assuj == 1 || $societe_acheteuse->tva_assuj == 'reel')) // Le test ci-dessus ne devrait pas etre necessaire. Me signaler l'exemple du cas juridique concerne si le test suivant n'est pas suffisant. // Si le (pays vendeur = pays acheteur) alors la TVA par defaut=TVA du produit vendu. Fin de regle. if ($societe_vendeuse->pays_code == $societe_acheteuse->pays_code) { //print 'VATRULE 3'; return get_product_vat_for_country($idprod, $societe_vendeuse->pays_code); } // Si (vendeur et acheteur dans Communaute europeenne) et (bien vendu = moyen de transports neuf comme auto, bateau, avion) alors TVA par defaut=0 (La TVA doit etre paye par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de regle. // Non gere // Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = entreprise) alors TVA par defaut=0. Fin de regle // Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = particulier) alors TVA par defaut=TVA du produit vendu. Fin de regle if ($societe_vendeuse->isInEEC() && $societe_acheteuse->isInEEC()) { $isacompany = $societe_acheteuse->isACompany(); if ($isacompany) { //print 'VATRULE 4'; return 0; } else { //print 'VATRULE 5'; return get_product_vat_for_country($idprod, $societe_vendeuse->pays_code); } } // If services are eServices according to EU Council Directive 2002/38/EC (ec.europa.eu/taxation_customs/taxation/v.../article_1610_en.htm) // we use the buyer VAT. if (!empty($conf->global->SERVICE_ARE_ECOMMERCE_200238EC)) { //print "eee".$societe_acheteuse->isACompany();exit; if (!$societe_vendeuse->isInEEC() && $societe_acheteuse->isInEEC() && !$societe_acheteuse->isACompany()) { //print 'VATRULE 6'; return get_product_vat_for_country($idprod, $societe_acheteuse->pays_code); } } // Sinon la TVA proposee par defaut=0. Fin de regle. // Rem: Cela signifie qu'au moins un des 2 est hors Communaute europeenne et que le pays differe //print 'VATRULE 7'; return 0; }
/** * Function that return vat rate of a product line (according to seller, buyer and product vat rate) * Si vendeur non assujeti a TVA, TVA par defaut=0. Fin de regle. * Si le (pays vendeur = pays acheteur) alors TVA par defaut=TVA du produit vendu. Fin de regle. * Si (vendeur et acheteur dans Communaute europeenne) et (bien vendu = moyen de transports neuf comme auto, bateau, avion) alors TVA par defaut=0 (La TVA doit etre paye par acheteur au centre d'impots de son pays et non au vendeur). Fin de regle. * Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = particulier ou entreprise sans num TVA intra) alors TVA par defaut=TVA du produit vendu. Fin de regle * Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = entreprise avec num TVA) intra alors TVA par defaut=0. Fin de regle * Sinon TVA proposee par defaut=0. Fin de regle. * * @param Societe $thirdparty_seller Objet societe vendeuse * @param Societe $thirdparty_buyer Objet societe acheteuse * @param int $idprod Id product * @param int $idprodfournprice Id product_fournisseur_price (for supplier order/invoice) * @return float Taux de tva a appliquer, -1 si ne peut etre determine * @see get_default_npr, get_default_localtax */ function get_default_tva($thirdparty_seller, $thirdparty_buyer, $idprod = 0, $idprodfournprice = 0) { global $conf; if (!is_object($thirdparty_seller)) { return -1; } if (!is_object($thirdparty_buyer)) { return -1; } // Note: possible values for tva_assuj are 0/1 or franchise/reel $seller_use_vat = is_numeric($thirdparty_seller->tva_assuj) && !$thirdparty_seller->tva_assuj || !is_numeric($thirdparty_seller->tva_assuj) && $thirdparty_seller->tva_assuj == 'franchise' ? 0 : 1; $seller_country_code = $thirdparty_seller->country_code; $seller_in_cee = $thirdparty_seller->isInEEC(); $buyer_country_code = $thirdparty_buyer->country_code; $buyer_in_cee = $thirdparty_buyer->isInEEC(); dol_syslog("get_default_tva: seller use vat=" . $seller_use_vat . ", seller country=" . $seller_country_code . ", seller in cee=" . $seller_in_cee . ", buyer country=" . $buyer_country_code . ", buyer in cee=" . $buyer_in_cee . ", idprod=" . $idprod . ", idprodfournprice=" . $idprodfournprice . ", SERVICE_ARE_ECOMMERCE_200238EC=" . (!empty($conf->global->SERVICES_ARE_ECOMMERCE_200238EC) ? $conf->global->SERVICES_ARE_ECOMMERCE_200238EC : '')); // If services are eServices according to EU Council Directive 2002/38/EC (http://ec.europa.eu/taxation_customs/taxation/vat/traders/e-commerce/article_1610_en.htm) // we use the buyer VAT. if (!empty($conf->global->SERVICE_ARE_ECOMMERCE_200238EC)) { if ($seller_in_cee && $buyer_in_cee && !$thirdparty_buyer->isACompany()) { //print 'VATRULE 0'; return get_product_vat_for_country($idprod, $thirdparty_buyer, $idprodfournprice); } } // If seller does not use VAT if (!$seller_use_vat) { //print 'VATRULE 1'; return 0; } // Le test ci-dessus ne devrait pas etre necessaire. Me signaler l'exemple du cas juridique concerne si le test suivant n'est pas suffisant. // Si le (pays vendeur = pays acheteur) alors la TVA par defaut=TVA du produit vendu. Fin de regle. if ($seller_country_code == $buyer_country_code || in_array($seller_country_code, array('FR,MC')) && in_array($buyer_country_code, array('FR', 'MC'))) { //print 'VATRULE 2'; return get_product_vat_for_country($idprod, $thirdparty_seller, $idprodfournprice); } // Si (vendeur et acheteur dans Communaute europeenne) et (bien vendu = moyen de transports neuf comme auto, bateau, avion) alors TVA par defaut=0 (La TVA doit etre paye par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de regle. // Not supported // Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = entreprise) alors TVA par defaut=0. Fin de regle // Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = particulier) alors TVA par defaut=TVA du produit vendu. Fin de regle if ($seller_in_cee && $buyer_in_cee) { $isacompany = $thirdparty_buyer->isACompany(); if ($isacompany) { //print 'VATRULE 3'; return 0; } else { //print 'VATRULE 4'; return get_product_vat_for_country($idprod, $thirdparty_seller, $idprodfournprice); } } // Sinon la TVA proposee par defaut=0. Fin de regle. // Rem: Cela signifie qu'au moins un des 2 est hors Communaute europeenne et que le pays differe //print 'VATRULE 5'; return 0; }