Menu
Добре дошли, Гост
Username: Парола: Запомни ме
OpenERP версия 7 - преводи,модули и др.

ТЕМА: Изписване на сума във фактура словом в OpenERP

Изписване на сума във фактура словом в OpenERP 03 Юли 2013 15:51 #7

  • vassy
  • vassy's Avatar
  • Offline
  • Administrator
  • Мнения: 7
  • Thank you received: 1
  • Карма: 1
Пренасям част от дискусия от LinkedIn, понеже там не е възможно да се огражда код, да се прикачи файл и има ограничение до 4000 символа на пост, а цитираните по-долу въпроси и отговори биха били полезни за всички сблъскали се с проблема с изписване на суми словом във фактура в OpenERP.

...по въпроса за изписване с думи на сумата по фактура - forum.openerp.com/forum/topic31741.html и ако в PDF-а излизат квадрати или въпросителни, се сменя шрифта с такъв, поддържащ кирилица. Ако останалия текст на кирилица се изписва коректно, шрифта е ок.
А от къде се взима самият код на Python, който прави конвертирането на числото към български? Аз не можах да го намеря и си го написах, но все някъде трябва да го има...

В OpenERP в account_print_invoice.py има French и Dutch, a в account_print_invoice_en.py - English. Из интернет има за доста езици, но за български не срещнах. Файла е /opt/openerp70/server/openerp/tools/amount_to_text.py и разбира се трябва да се добави български - Bulgarian (секция с думите и някой специфични неща в граматиката) по подобие на другите езици. Файла може и да се отдели като amount_to_text_bg.py, като за основа се ползва amount_to_text_en.py. Освен това във файла /opt/openerp70/server/openerp/addons/account/report/account_print_invoice.py се добавя
from tools.translate import _
from tools import amount_to_text
from tools.amount_to_text import amount_to_text_bg
и след
'time': time
се добавя това
'amount_to_text_bg': amount_to_text_bg

а в /opt/openerp70/server/openerp/addons/account/report/account_print_invoice.rml се заменя tr за Total:

това
<tr>
        <td>
          <para style="terp_default_8">
            <font color="white"> </font>
          </para>
        </td>
        <td>
          <para style="terp_tblheader_Details"><b>Total:</b></para>
        </td>
        <td>
          <para style="terp_default_Bold_Right_9"><b>[[ formatLang(o.amount_total, digits=get_digits(dp='Account'), currency_obj=o.currency_id) ]]</b></para>
        </td>
      </tr>

с това
<tr>
<td>
<para style="terp_default_8">
<font color="white"> </font>
</para>
</td>
<td>
<para style="terp_tblheader_Details">Total:</para>
</td>
<td>
<para style="terp_default_Bold_Right_9">[[ formatLang(o.amount_total, digits=get_digits(dp='Account'), currency_obj=o.currency_id) ]]</para>
</td> 
</tr>
<tr>
<td>
<para style="terp_default_8">
<font color="white"> </font>
</para>
</td>
<td>
<para style="terp_default_9">Amount in words:</para>
</td>
<td>
<para style="terp_default_Bold_9">[[ str(amount_to_text_bg(o.amount_total,"лева")) ]]</para> 
</td>
</tr>

(съответните изрази трябва да ги има в _bg.po файл или да се добавят от администрацията - Settings - .... - Translated Terms)

Повечето неща са описани подробно в цитираната тема - http://forum.openerp.com/forum/topic31741.html и ако се съпоставят сорсовете на трита файла от форума и от OpenERP ясно се вижда какво и къде да се добави. Там се разисква добавянето на индийски - Indian.

За улеснение и заради спецификата на българската граматика, за основа може да се ползва този php скрипт - http://georgi.unixsol.org/programs/num2bgmoney.php/get/, прикачам го тук. (скрипта не работи коректно)

Прикачен файл:

Име на файл: num2bgmoney.php.txt
Размер: 7 KB



Посочените пътища се отнасят за версия 7.0, 6.1 и 8.0 и където аз ги инсталирам - /opt/openerp70/server (/opt/openerp61/server, /opt/openerp80/server). За 6.0 пътищата са /opt/openerp604/server/bin/tools/amount_to_text.py, /opt/openerp604/server/bin/addons/account/report/account_print_invoice.py и /opt/openerp604/server/bin/addons/account/report/account_print_invoice.rml. Разлики в кода на практика няма.
Последна промяна: 04 Юли 2013 14:56 от vassy.
Администраторите са забранили публикуването за гости.

Изписване на сума във фактура словом в OpenERP 04 Юли 2013 15:02 #8

  • vassy
  • vassy's Avatar
  • Offline
  • Administrator
  • Мнения: 7
  • Thank you received: 1
  • Карма: 1
Понеже PHP скрипта, който дадох за примерен, е с грешна логика, поствам друг, който проверено работи. Вижте демо тук - www.openerp.bg/test/slovom.php. Прикачам го тук в темата.


Прикачен файл:

Име на файл: slovom.php.txt
Размер: 6 KB


можете да го свалите и от тук - www.openerp.bg/openerp/%D0%B8%D0%B7%D1%8...ne-na-suma-kam-tekst

Ето и самия скрипт (основното е function read_numbers($number), останалото е за демонстрация):
<?

function read_numbers($number) {
$number=str_replace(',','.',"$number");
$number=@money_format('%.2n',$number);
$number=explode('.',$number);
if (!empty($number[1])) $decimals=$number[1]; else $decimals=0;
$number=$number[0];
$char_count=strlen($number);
for ($i=1;$i<=$char_count;$i++) {
if ($i<=3) {
$pos[1]=substr($number,-$i,1).$pos[1];
}
if ($i<=6 AND $i>3) {
$pos[2]=substr($number,-$i,1).$pos[2];
}
if ($i<=9 AND $i>6) {
$pos[3]=substr($number,-$i,1).$pos[3];
}
}
for ($k=1;$k<=3;$k++) {
for ($i=1;$i<=strlen($pos[$k]);$i++) {
$cur=substr($pos[$k],-$i,1);
unset($temp);
if ($i==3) {
switch($cur) {
case 1: $temp='сто'; break;
case 2: $temp='двеста'; break;
case 3: $temp='триста'; break;
case 4: $temp='четиристотин'; break;
case 5: $temp='петстотин'; break;
case 6: $temp='шестстотин'; break;
case 7: $temp='седемстотин'; break;
case 8: $temp='осемстотин'; break;
case 9: $temp='деветстотин'; break;
}
$pos_hunds[$k]=$temp;
}
if ($i==2) {
switch($cur) {
case 2: $temp='двадесет'; break;
case 3: $temp='тридесет'; break;
case 4: $temp='четиридесет'; break;
case 5: $temp='петдесет'; break;
case 6: $temp='шестдесет'; break;
case 7: $temp='седемдесет'; break;
case 8: $temp='осемдесет'; break;
case 9: $temp='деветдесет'; break;
}
$pos_decs[$k]=$temp;
}
if ($i==1) {
switch($cur) {
case 1: $temp='ед'; break;
case 2: $temp='дв'; break;
case 3: $temp='три'; break;
case 4: $temp='четири'; break;
case 5: $temp='пет'; break;
case 6: $temp='шест'; break;
case 7: $temp='седем'; break;
case 8: $temp='осем'; break;
case 9: $temp='девет'; break;
}
if($pos[$k]>9 AND substr($pos[$k],-2,1)==1) {
if($temp=='ед') $temp=$temp."и";
if($temp=='дв') $temp=$temp."а";
if(substr($pos[$k],-2,1)==1 AND substr($pos[$k],-1,1)==0) $temp='десет';
else $temp=$temp."надесет";
}
if(substr($pos[$k],-2,1)!==1 AND $k!==2) {
if($temp=='ед') $temp=$temp."ин";
if($temp=='дв') $temp=$temp."а";
}
if($k==2) {
if($temp=='ед') $temp=$temp."на";
if($temp=='дв') $temp=$temp."е";
if($pos[$k]==1) $temp='хиляда';
}
$pos_sings[$k]=$temp;
}
}
}
unset($read);
for ($i=1;$i<=3;$i++) {
if (!empty($pos_hunds[$i]) AND !empty($pos_decs[$i]) AND !empty($pos_sings[$i])) $read[$i]=$pos_hunds[$i]." ".$pos_decs[$i]." и ".$pos_sings[$i];
if (!empty($pos_hunds[$i]) AND !empty($pos_decs[$i]) AND empty($pos_sings[$i])) $read[$i]=$pos_hunds[$i]." и ".$pos_decs[$i];
if (!empty($pos_hunds[$i]) AND empty($pos_decs[$i]) AND empty($pos_sings[$i])) $read[$i]=$pos_hunds[$i];
if (!empty($pos_hunds[$i]) AND empty($pos_decs[$i]) AND !empty($pos_sings[$i])) $read[$i]=$pos_hunds[$i]." и ".$pos_sings[$i];;
if (empty($pos_hunds[$i]) AND !empty($pos_decs[$i]) AND !empty($pos_sings[$i])) $read[$i]=$pos_decs[$i]." и ".$pos_sings[$i];
if (empty($pos_hunds[$i]) AND !empty($pos_decs[$i]) AND empty($pos_sings[$i])) $read[$i]=$pos_decs[$i];
if (empty($pos_hunds[$i]) AND empty($pos_decs[$i]) AND !empty($pos_sings[$i])) $read[$i]=$pos_sings[$i];
if (empty($pos_hunds[$i]) AND empty($pos_decs[$i]) AND empty($pos_sings[$i])) $read[$i]='';
switch($i) {
case 1: if ($pos[1]>1 OR $pos[2]>0 OR $pos[3]>0) $read[$i]=$read[$i]." лева"; else $read[$i]=$read[$i]." лев";break;
case 2: if($pos[2]>1) $read[$i]=$read[$i]." хиляди";break;
case 3: if ($pos[3]>1) $read[$i]=$read[$i]." милиона"; else if(!empty($pos[3])) $read[$i]=$read[$i]." милион";break;
}
}
if ($pos[1]=='000') $pos[1]=0;
if ($pos[2]=='000') $pos[2]=0;
if (!empty($pos[3]) AND !empty($pos[2]) AND !empty($pos[1]) AND substr($pos[1],-2,2)==0) $ready=$read[3]." ".$read[2]." и ".$read[1];
if (!empty($pos[3]) AND !empty($pos[2]) AND !empty($pos[1]) AND substr($pos[1],-2,2)>0) $ready=$read[3]." ".$read[2]." ".$read[1];
if (!empty($pos[3]) AND !empty($pos[2]) AND empty($pos[1]) AND substr($pos[2],-2,2)==0) $ready=$read[3]." и ".$read[2];
if (!empty($pos[3]) AND !empty($pos[2]) AND empty($pos[1]) AND substr($pos[2],-2,2)>0) $ready=$read[3]." ".$read[2];
if (!empty($pos[3]) AND empty($pos[2]) AND !empty($pos[1]) AND substr($pos[1],-2,2)==0) $ready=$read[3]." и ".$read[1];
if (!empty($pos[3]) AND empty($pos[2]) AND !empty($pos[1]) AND substr($pos[1],-2,2)>0) $ready=$read[3]." ".$read[1];
if (!empty($pos[3]) AND empty($pos[2]) AND empty($pos[1])) $ready=$read[3];
if (empty($pos[3]) AND !empty($pos[2]) AND !empty($pos[1]) AND substr($pos[1],-2,2)==0) $ready=$read[2]." и ".$read[1];
if (empty($pos[3]) AND !empty($pos[2]) AND !empty($pos[1]) AND substr($pos[1],-2,2)>0) $ready=$read[2]." ".$read[1];
if (empty($pos[3]) AND !empty($pos[2]) AND empty($pos[1])) $ready=$read[2];
if (empty($pos[3]) AND empty($pos[2]) AND !empty($pos[1])) $ready=$read[1];
if (empty($pos[3]) AND empty($pos[2]) AND empty($pos[1])) $ready='';
if (empty($pos[1])) $ready=$ready." лева";
$ready=$ready." и $decimals ст.";
if (!empty($pos[1]) OR !empty($pos[2]) OR !empty($pos[3])) return $ready;
}



    header("Content-type: text/html; charset=UTF-8");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                      "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
    <title>Конверсия на числа в текстов вид</title>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <style type="text/css">
    <!--
        body    { background:#f5f5f5; font:11pt Verdana,Arial,Helvetica,sans-serif; }
        a       { color: #2020E0;      text-decoration: underline; padding:3px; border:1px solid #f5f5f5;}
        a:hover { background: #cdcdff; text-decoration: underline; border:1px solid blue; }
        form { margin:0px; }
    -->
    </style>
</head>

<body>
<h2>Сума -> Словом</h2>

<?php
    $numbers = (float)preg_replace("/[^0-9\.]/","",@$_GET["num"]);

    if (!$numbers)
        $numbers = 0.001;

    if ($numbers) {
        print "Сума: <b>".number_format($numbers,2,".",",") . " лв.</b><br>";
        print "Словом: <b>".read_numbers($numbers)."</b><br><br>";
    }

    $numbers = number_format($numbers,2,".","");
?>
<form action="<?=$_SERVER['PHP_SELF']?>" method="GET">
Въведете сумата: <input type="text" size="10" maxlength="10" name="num" value="<?=$numbers?>"><input type="submit" value="Покажи като текст">
</form>


</body>
</html>
Последна промяна: 04 Юли 2013 15:08 от vassy.
Администраторите са забранили публикуването за гости.

Изписване на сума във фактура словом в OpenERP 10 Авг 2016 09:24 #13

  • vassy
  • vassy's Avatar
  • Offline
  • Administrator
  • Мнения: 7
  • Thank you received: 1
  • Карма: 1
В последно време гледам, че има доста посещения в тази стара тема. За всички, които се интересуват от решение за изписване на сума словом в Odoo 8, имаме разработен модул за целта. Можете да го изтеглите от github.com/Vassy/vassy-odoo-addons/tree/8.0/invoice_amount_text Принципа е същия и за версия 9. Макар изписването словом да не е задължителен реквизит, повечето ни клиенти го изискват, понеже се е наложило в практиката.
От github.com/Vassy/vassy-odoo-addons/tree/8.0 можете да изтеглите и други модули, които решават някои специфични проблеми, като например превода на базови полета в Odoo, които по принцип са непреводими.
Последна промяна: 10 Авг 2016 09:38 от vassy.
Администраторите са забранили публикуването за гости.
Time to create page: 0.200 seconds
Създадено с Kunena форум

Вход или Регистрирай се