Generacion Addenda EDIFACT de factura de Grupo Corvi (Sahuayo)

Contenido/contents:
Introducion
Codigo Fuente
Uso de la funcion
Pagina anterior/Previous page

Introduccion
Codigo Fuente
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<?php
//
// +-------------------------------------------------------------------------------+
// | satxcorv.php : Genera factura EDIFACT D01B leyendo la BD                      |
// |                       Formato para Grupo Corvi                                |
// +-------------------------------------------------------------------------------+
// | Copyright (c) 2006  Fabrica de Jabon la Corona, SA de CV                      |
// +-------------------------------------------------------------------------------+
// | This program is free software; you can redistribute it and/or                 |
// | modify it under the terms of the GNU General Public License                   |
// | as published by the Free Software Foundation; either version 2                |
// | of the License, or (at your option) any later version.                        |
// |                                                                               |
// | This program is distributed in the hope that it will be useful,               |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of                |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                 |
// | GNU General Public License for more details.                                  |
// |                                                                               |
// | You should have received a copy of the GNU General Public License             |
// | along with this program; if not, write to the Free Software                   |
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.   |
// +-------------------------------------------------------------------------------+
// | Autor: Fernando Ortiz <fortiz@lacorona.com.mx>                                |
// +-------------------------------------------------------------------------------+
// |  14/jun/2006  Se corrige el codigo de barras, en caso de aceite es ean8 y     |
// |               viene con 0s a la izquierda, se le quitan.                      |
// |                                                                               |
// |  11/ago/2009  Se trunca NAD+SU a 35 posiciones                                |
// +-------------------------------------------------------------------------------+
//
function satxcorv($nufa) {
// {{{ carga librerisa requeridas para obtener los datos
require_once("dbi/clfactur.class.php");      // Es el registro maestro de la factura
require_once("dbi/clflinea.class.php");      // Contiene un regisro por linea/partida de la factura
require_once("dbi/clclient.class.php");      // Archivo maestro de clientes
require_once("dbi/clproduc.class.php");      // Maestro de productos
require_once "lib/getfolio.php";             // Le suma uno al foliador y regresa el siguiente folio
global $conn;                                // Conexion adodb a la base de datos
// }}}
// {{{ Inicialice varibles / contadores globales
error_reporting(E_ALL);
$edidata = "";
$dc1 =  "'"; // chr(17);
$dc2 =  "'"; // chr(18);
$fact = new Clfactur($conn,$nufa);
if (!is_object($fact)) die ("no existe factura $nufa");
if ($fact->row['factnufa']!=$nufa) die ("no es la factura $nufa");
$clie = new Clclient($conn,(int)$fact->row["factnucl"],'renglon');
// }}}
// {{{ Encabesados generales 
// +--------------------------------------------------------------------+
// | Genera los primeros segmentos del mensaje EDI                      |
// +--------------------------------------------------------------------+
//
$serie = substr($nufa,0,4);
$folio = substr($nufa,4);
$forig = substr($fact->row["factobs3"],0,10);
$tran = (int)($fact->row["facttran"]);
$g_c_prod = 0; $g_t_seg = 0;
$g_ref_num = $conn->getOne("select fedifoli from cfdcorvi where fedinufa = '$nufa'"); // Lee el folio anterior si existe
if (!$g_ref_num) $g_ref_num = getfolio("cte",6,"SATXINVO",12); // Toma folio consecutivo para cada mensaje EDI
$edidata .= "UNB+UNOA:2+JABON-CORONA:ZZ+CORVI:ZZ+".date("ymd").":".date("Hi")."+".$nufa."+INVOICE".$dc2;
$edidata .= "UNH+".$nufa."+INVOIC:D:01B:UN:AMC7.1".$dc2;
if ($tran == 11) { // Nota de Debito
   $edidata .= "BGM+383+".$folio."+9".$dc2; // 
} else { // Factura
   $edidata .= "BGM+380+".$folio."+9".$dc2; // 
}
$edidata .= "DTM+137:".iso_fech($fact->row["factfdoc"]). ":102".$dc2;
$edidata .= "RFF+IV:".$forig.$dc2; // 
$edidata .= "DTM+171:".iso_fech($fact->row["factfdoc"]). ":102".$dc2;
 
$npec = trim($fact->row["factnpec"]);
 
$eancode = $conn->getOne("select eancode from ediean where eannucl = ".$fact->row["factnucl"]);
if (!$eancode) $eancode = $conn->getOne("select eancode from ediean where eansucu = ".$clie->row["cliesucu"]);
if (!$eancode) $eancode = "7500";
$edidata .= "NAD+BY+".$eancode."::9++".satxcorv_fix($fact->row["factnopr"],35).$dc2;
$edidata .= "NAD+SU+7504000065005::9++".satxcorv_fix("FABRICA DE JABON LA CORONA SA DE CV",35).$dc2;
$edidata .= "PAT+1++5:3:D:30".$dc2;
 
$g_t_seg += 9;
// }}}
// {{{   Para cada linea/partida de la factura (para cada producto
// +--------------------------------------------------------------------+
// | AHora si procesa la ocurrencia de productos de la factura          |
// +--------------------------------------------------------------------+
//
$fali = new Clflinea($conn, $nufa);
for ($i=0; $i<sizeof($fali->faliprod); $i++) {
    $g_c_prod++;
    $ean = $fali->falicbar[$i];     // se pone para nuevas pruebas  09/07/08
    $ean = ltrim($ean,"0");  // Para quitarle los 0s a la izquierda en un ean8
    if (substr($nufa,0,4)=='FIVA') {
        $edidata .= "LIN+".$g_c_prod."++".$dc2;
        $edidata .= "IMD+F++:::".satxcorv_fix(trim($fact->row['factobs1']).' '.
                                              trim($fact->row['factobs2']).' '.
                                              trim($fact->row['factobs3'])).$dc2;
    } else {
        $edidata .= "LIN+".$g_c_prod."++".trim($ean).":EN:9".$dc2;
        $edidata .= "IMD+F++:::".satxcorv_fix(trim($fali->falideco[$i]),35).$dc2;
    }
    $unif = (float)$fali->faliunif[$i]; if ($unif==0) $unif=1;
    $edidata .= "QTY+47:".$unif.":CA".$dc2;
    $edidata .= "QTY+192:0:CA".$dc2;
    $neto = (double)$fali->falineto[$i] / $unif;
    $edidata .= "PRI+AAA:".round($neto,6).$dc2;
    $edidata .= "PRI+AAB:".round($neto,6).$dc2;
    $edidata .= "RFF+ON:".$npec.$dc2;
    $edidata .= "PAC+++CS".$dc2;
    $edidata .= "TAX+7+VAT+++:::".$fali->falipoim[$i].$dc2;
    $edidata .= "MOA+124:".$fali->faliimpu[$i].$dc2;
    $g_t_seg += 10;
}
// }}}
// {{{ Final del mensaje edifact
// +--------------------------------------------------------------------+
// | Agrega los segmentos finales con los totales y cifras de control   |
// +--------------------------------------------------------------------+
//
$edidata .= "UNS+S".$dc2;
$edidata .= "CNT+2:".$g_c_prod.$dc2;
$edidata .= "MOA+9:".$fact->row["factimto"].$dc2;
$edidata .= "TAX+7+VAT+++:::".$fact->row["factpoim"]."+B".$dc2;
$edidata .= "MOA+124:".$fact->row["factimpu"].$dc2;
 
$g_t_seg += 5;
$edidata .= "UNT+".$g_t_seg."+".$nufa.$dc2;
$edidata .= "UNZ+1+".$nufa.$dc2;
$ret=$conn->replace("cfdcorvi",array("fedinufa"=>$nufa,"fedifoli"=>$g_ref_num),"fedinufa",true);
return($edidata);
}
// }}}
// }}}
// {{{ Convierta la fecha en formato ISO YYYY-mm-ddThh:mm:ss
function iso_fech($fech) {
    if (strpos($fech,"/")!==FALSE) { // tiene diagonales viene dd/mm/yyyy hh:mm
        list($f,$h)=explode(" ",$fech);
        list($d,$m, $y)=explode("/",$f);
        $fech = "$y-$m-$d $h";
    }
    $ffac = (str_replace(array(":","-"," "),"",$fech));  // Le quita los ':' porque es separador EDI
    return (substr($ffac,0,8));
}
// }}}
// {{{ Convierte los caracteres no valides EDI a espacio (: + |)
function satxcorv_fix($str,$largo=-1) {
    $tmp = trim($str);
    $tmp = str_replace(array(":","+","|")," ",$tmp);
    if ($largo>0) $tmp = substr($tmp,0,$largo-1);
    return ($tmp);
     }
// }}}
?>
Ejemplo de uso de la funcion
Este programa genera los datos de la remision que se van a agregar como Addenda a la factura electronica del SAT.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
########
#    Generacion de las facturas electronicas para Sahuayo
########
DEFINE(BDD,cte);
require_once("lib/conecta.php");
require_once("satxcorv.php");
require_once("satxarre.php");
require_once("satxmls.php");
$nufa = "XAFA790669";
$edidata = satxcorv($nufa);
$data = satxarre($nufa);
$xml = satxmls($data,$edidata,"./");
?>
Al ejecutarse este programa genera el mensaje XML que se puede consultar aqui.