Generacion Addenda XML de Remision de SORIANA

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

Introduccion
La cadena que regresa esta funcion aunque es XML no forma parte de la especificacion del SAT en su famoso Anexo 20, sin embargo se debe de de agregar dentro del nodo Addenda de la factura electronica.
Lo correcto seria que tuviera su propio NameSpace, pero como no quiero definir el mio propio y Soriana todavia no ha dicho cual ocupar por lo pronto que siga ocupando el espacio de la Factura Electronica.
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
155
156
157
158
159
160
<?php
//
// +-------------------------------------------------------------------------------+
// | satxsori.php : Genera Remision electronica soriana XML                        |
// +-------------------------------------------------------------------------------+
// | 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>                                |
// +-------------------------------------------------------------------------------+
// | 31/01/2007 Se corrige etiqueta id y roworder                                  |
// |                                                                               |
// | 14/02/2007 Mas correcciones a varios campos                                   |
// +-------------------------------------------------------------------------------+
//
function satxsori($nufa) {
// {{{ carga librerias 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/clproduc.class.php");      // Datos Generales del Producto
require_once("dbi/clclient.class.php");      // Datos Generales del Producto
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);
$remi = "";
$fact = new Clfactur($conn,$nufa);
$clie = new Clclient($conn,(int)$fact->row["factnucl"]);
$fali = new Clflinea($conn, $nufa);
// }}}
// {{{ Encabesados generales 
// +--------------------------------------------------------------------+
// | Genera el nodo raiz de la remision                                 |
// +--------------------------------------------------------------------+
$g_nufa = substr($nufa,0,4)."-".substr($nufa,4);
$g_folio = $conn->getOne("select cfdsoriana from clfacedi where fedinufa = '$nufa'"); // Lee el folio anterior si existe
if (!$g_folio) $g_folio = getfolio("cte",6,"SATXINVO",13); // Toma folio consecutivo para cada mensaje EDI
 
 
global $xml, $root;
$xml = new DOMdocument("1.0","UTF-8");
$root = $xml->createElement("DSCargaRemisionProv");
$root = $xml->appendChild($root);
 
$Remision = $xml->createElement("Remision");
$Remision->setAttribute("Id","Remision1");
$Remision->setAttribute("RowOrder",1);
$sucu = $clie->row["cliesucu"];
switch ($sucu) {
case 509:  $entr = 2; /// CEDIS MExico
    break;
case 598: $entr = 3;  // Cedis Salinas
    break;
case 572: $entr = 4; // CAD Mexico
    break;
case 578: $entr = 5; // CEDIS Queretaro
    break;
default: $entr = 1;  // Directo en  tienda
}
$ele = array( "Proveedor"=>20073, // NUestro numero de proveedor
              "Remision"=>$g_nufa, // Nuestra factura ya con el guion
              "Consecutivo"=>0, // Siempre en cero para nacionales
              "FechaRemision"=>fix_fech($fact->row["factfech"]),
              "Tienda"=>$sucu,
              "TipoMoneda"=>1,    // SOlo facturamos en Pesos
              "TipoBulto"=>1,         // Cajas
              "EntregaMercancia"=>$entr,
              "CumpleReqFiscales"=>"True",
              "CantidadBultos"=>$fact->row["facttoun"],
              "Subtotal"=>$fact->row["factimbr"],
              "Descuentos"=>((double)$fact->row["factdepr"]+(double)$fact->row["factdec2"]),
              "IEPS"=>0,
              "IVA"=>$fact->row["factimpu"],
              "OtrosImpuestos"=>0,
              "Total"=>$fact->row["factimto"],
              "CantidadPedidos"=>1,
              "FechaEntregaMercancia"=>fix_fech($fact->row["factfech"]),
              "EmpaqueEnCajas"=>"false",
              "EmpaqueEnTarimas"=>"false"
              );
carga_eles($Remision,$ele);
 
$Pedidos = $xml->createElement("Pedidos");
$Pedidos->setAttribute("Id","Pedidos1");
$Pedidos->setAttribute("RowOrder",1);
$cant=sizeof($fali->faliprod);
echo "size=$cant";
$ele = array("Proveedor"=>20073, // Nuestro numero de proveedor
             "Remision"=>$g_nufa, // Nuestra factura ya con el guion
             "FolioPedido"=>$fact->row["factnpec"],  // Orden de compra de soriana
             "Tienda"=>$clie->row["cliesucu"],
             "CantidadArticulos"=>$cant // Cantidad de lineas de facturas
         );
carga_eles($Pedidos,$ele);
// }}}
// {{{   Para cada linea/partida de la factura (para cada producto
// +--------------------------------------------------------------------+
// | AHora si procesa la ocurrencia de productos de la factura          |
// +--------------------------------------------------------------------+
//
for ($i=0; $i<$cant; $i++) {
    $nupr = (int)$fali->faliprod[$i];
    $prod = new Clproduc($conn, $nupr,'renglon');
 
    $Articulos = $xml->createElement("Articulos");
    $Articulos->setAttribute("Id","Articulos".($i+1));
    $Articulos->setAttribute("RowOrder",($i+1));
    $ele = array("Proveedor"=>20073,  // Nuestro numero de proveedor
                 "Remision"=>$g_nufa, // Nuestra factura ya con el guion
                 "FolioPedido"=>$fact->row["factnpec"],  // Orden de compra de soriana
                 "Tienda"=>$clie->row["cliesucu"],
                 "Codigo"=>$prod->row["prodea13"],
                 "CantidadUnidadCompra"=>$fali->faliunif[$i],
                 "CostoNetoUnidadCompra"=>$fali->falineto[$i],
                 "PorcentajeIEPS"=>0, // Si impuesto IEPS
                 "PorcentajeIVA"=>$fali->falipoim[$i]
                );
    carga_eles($Articulos,$ele);
    $Articulos=null;
}
// }}}
// {{{ Finaliza el documento XML
// Guarda el folio usado para esta factura, sirve para marcar que esta factura ya se envio y ademas guarda en la tabla 
// el conseutuvo de envio
$ret=$conn->replace("cfdsoriana",array("fedinufa"=>$nufa,"fedifoli"=>$g_folio),"fedinufa",true);
 
$remi = $xml->saveXML();
return($remi);
}
// }}}
// {{{ fix_fech : Convierta la fecha en formato Informix d/m/a a formato SORIANA con horas y meniutos
function fix_fech($fech) {
    return ("20".substr($fech,6,2)."-".substr($fech,3,2)."-".substr($fech,0,2))."T00:00:000";
}
// }}}
// {{{ carga_eles : carga los  elementos en el XML
function carga_eles($obj, $ele) {
global $root, $xml;
foreach ($ele as $key => $val) {
    $tmp = $xml->createElement($key, utf8_encode(trim($val)));
    $tmp = $obj->appendChild($tmp);
}
$tmp = $root->appendChild($obj);
}
// }}}
?>
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
<?php
########
#    Generacion de las facturas electronicas para Soriana
########
DEFINE(BDD,cte);
require_once("lib/conecta.php");
require_once("satxsori.php");
file_put_contents("satcsori.xml",satxsori("XAFB102749"));
?>
Al ejecutarse este programa genera el mensaje XML que se puede consultar aqui.
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<?xml version="1.0" encoding="UTF-8"?>
<DSCargaRemisionProv>
  <Remision Id="Remision1" RowOrder="0">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <Consecutivo>1</Consecutivo>
    <FechaRemision>2006-02-20</FechaRemision>
    <Tienda>578</Tienda>
    <TipoMoneda>1</TipoMoneda>
    <TipoBulto>1</TipoBulto>
    <EntregaMercancia>5</EntregaMercancia>
    <CumpleReqFiscales>True</CumpleReqFiscales>
    <CantidadBultos>363</CantidadBultos>
    <Subtotal>44463.6</Subtotal>
    <Descuentos>4446.36</Descuentos>
    <IEPS>0</IEPS>
    <IVA>6002.59</IVA>
    <OtrosImpuestos>0</OtrosImpuestos>
    <Total>46019.83</Total>
    <CantidadPedidos>1</CantidadPedidos>
    <FechaEntregaMercancia>2006-02-20</FechaEntregaMercancia>
    <EmpaqueEnCajas>True</EmpaqueEnCajas>
    <EmpaqueEnTarimas>False</EmpaqueEnTarimas>
  </Remision>
  <Pedidos Id="Pedidos1" RowOrder="1">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <CantidadArticulos>363</CantidadArticulos>
  </Pedidos>
  <Articulos Id="Articulos1" RowOrder="2">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>7501026006340</Codigo>
    <CantidadUnidadCompra>47</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>5215.59</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos2" RowOrder="3">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>7501026031052</Codigo>
    <CantidadUnidadCompra>5</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>554.85</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos3" RowOrder="4">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>7501026005374</Codigo>
    <CantidadUnidadCompra>42</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>4660.74</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos4" RowOrder="5">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>7501026005381</Codigo>
    <CantidadUnidadCompra>15</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>1664.55</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos5" RowOrder="6">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>7501026005671</Codigo>
    <CantidadUnidadCompra>157</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>17422.29</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos6" RowOrder="7">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>7501026005688</Codigo>
    <CantidadUnidadCompra>28</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>3107.16</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos7" RowOrder="8">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>7501026001161</Codigo>
    <CantidadUnidadCompra>3</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>316.98</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos8" RowOrder="9">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>7501026001147</Codigo>
    <CantidadUnidadCompra>2</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>211.32</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos9" RowOrder="10">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>7501026006852</Codigo>
    <CantidadUnidadCompra>7</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>739.62</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos10" RowOrder="11">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>0012005107011</Codigo>
    <CantidadUnidadCompra>13</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>1373.58</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos11" RowOrder="12">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>0012005107004</Codigo>
    <CantidadUnidadCompra>17</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>1796.22</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos12" RowOrder="13">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>7501026006654</Codigo>
    <CantidadUnidadCompra>15</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>1584.9</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos13" RowOrder="14">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>7501026006784</Codigo>
    <CantidadUnidadCompra>4</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>456.48</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos14" RowOrder="15">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>0012005120126</Codigo>
    <CantidadUnidadCompra>2</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>228.24</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
  <Articulos Id="Articulos15" RowOrder="16">
    <Proveedor>20073</Proveedor>
    <Remision>XAFB-102749</Remision>
    <FolioPedido>266851</FolioPedido>
    <Tienda>578</Tienda>
    <Codigo>0012005120157</Codigo>
    <CantidadUnidadCompra>6</CantidadUnidadCompra>
    <CostoNetoUnidadCompra>684.72</CostoNetoUnidadCompra>
    <PorcentajeIEPS>0</PorcentajeIEPS>
    <PorcentajeIVA>15.0</PorcentajeIVA>
  </Articulos>
</DSCargaRemisionProv>